Browse Source

Merge remote-tracking branch 'origin/dev' into dev

wangmh 8 years ago
parent
commit
7633380e87
19 changed files with 447 additions and 35 deletions
  1. 1 0
      sso-manage-console-web/package.json
  2. 34 0
      sso-manage-console-web/src/assets/js/utils.js
  3. 30 12
      sso-manage-console-web/src/components/accounts/appeals/AppealHome.vue
  4. 1 0
      sso-manage-console-web/src/components/accounts/common/CommonHome.vue
  5. 2 1
      sso-manage-console-web/src/components/accounts/enterprises/EnterpriseAdmin.vue
  6. 6 3
      sso-manage-console-web/src/components/accounts/enterprises/EnterpriseHome.vue
  7. 10 0
      sso-manage-console-web/src/components/accounts/enterprises/EnterpriseMembers.vue
  8. 0 1
      sso-manage-console-web/src/components/accounts/users/UserBasicInfo.vue
  9. 1 1
      sso-manage-console-web/src/store/modules/enterprises.js
  10. 1 1
      sso-manage-console-web/webpack/webpack.base.conf.js
  11. 12 0
      sso-manage-console-web/yarn.lock
  12. 2 2
      sso-manage-console/src/main/java/com/uas/sso/sso/backend/ManageConsoleApplication.java
  13. 17 0
      sso-manage-console/src/main/java/com/uas/sso/sso/backend/dao/AdminChangeRecordDao.java
  14. 117 0
      sso-manage-console/src/main/java/com/uas/sso/sso/backend/entity/AdminChangeRecord.java
  15. 19 0
      sso-manage-console/src/main/java/com/uas/sso/sso/backend/entity/AdminChangeType.java
  16. 98 0
      sso-manage-console/src/main/java/com/uas/sso/sso/backend/entity/FlowBase.java
  17. 37 1
      sso-manage-console/src/main/java/com/uas/sso/sso/backend/service/impl/AppealServiceImpl.java
  18. 41 13
      sso-manage-console/src/main/java/com/uas/sso/sso/backend/service/impl/UserSpaceServiceImpl.java
  19. 18 0
      sso-server/build.gradle

+ 1 - 0
sso-manage-console-web/package.json

@@ -12,6 +12,7 @@
   },
   "dependencies": {
     "axios": "^0.17.1",
+    "babel-polyfill": "^6.26.0",
     "bootstrap": "3",
     "element-ui": "^2.0.11",
     "font-awesome": "^4.7.0",

+ 34 - 0
sso-manage-console-web/src/assets/js/utils.js

@@ -0,0 +1,34 @@
+function formatDate (row, column, value) {
+  if (!value) {
+    return ''
+  }
+
+  const date = new Date(value)
+  let str = ''
+  str += date.getFullYear() + '-'
+  if (date.getMonth() + 1 < 10) {
+    str += '0'
+  }
+  str += (date.getMonth() + 1) + '-'
+  if (date.getDate() < 10) {
+    str += '0'
+  }
+  str += date.getDate() + ' '
+  if (date.getHours() < 10) {
+    str += '0'
+  }
+  str += date.getHours() + ':'
+  if (date.getMinutes() < 10) {
+    str += '0'
+  }
+  str += date.getMinutes() + ':'
+  if (date.getSeconds() < 10) {
+    str += '0'
+  }
+  str += date.getSeconds()
+  return str
+}
+
+export {
+  formatDate
+}

+ 30 - 12
sso-manage-console-web/src/components/accounts/appeals/AppealHome.vue

@@ -61,8 +61,8 @@
         width="100">
         <template slot-scope="scope">
           <span v-if="scope.row.status === 2">已认证</span>
-          <span v-if="scope.row.status === 0">未认证</span>
-          <span v-if="scope.row.status === 1" style="color: #E68615;">待认证</span>
+          <!--<span v-if="scope.row.status === 0">未认证</span>-->
+          <span v-if="scope.row.status === 1" style="color: #E68615;">申诉中</span>
           <span v-if="scope.row.status === 3">未通过</span>
         </template>
       </el-table-column>
@@ -267,11 +267,26 @@
         </div>
       </div>
 
+      <div v-if="!canApprove">
+        <div>
+          <div class="row">
+            <div class="col-lg-6">
+              <div class="message-label">审核状态</div>
+              <div class="message-value" v-if="selectedAppeal.status === 2" style="color: #008000;">已通过</div>
+              <div class="message-value" v-if="selectedAppeal.status === 3" style="color: #FF0000;">未通过</div>
+            </div>
+          </div>
+        </div>
+      </div>
+
       <!-- 对话框尾部 -->
-      <span slot="footer" class="dialog-footer">
+      <span slot="footer" class="dialog-footer" v-if="canApprove">
         <el-button type="primary" @click="approveAppeal(selectedAppeal.id, true)">通过</el-button>
         <el-button @click="approveAppeal(selectedAppeal.id, false)">不通过</el-button>
       </span>
+      <span slot="footer" class="dialog-footer" v-if="!canApprove">
+        <el-button @click="isShowDialog = false">关闭</el-button>
+      </span>
     </el-dialog>
   </common-home>
 </template>
@@ -350,11 +365,7 @@
       key: 'AUTHENTICATED',
       value: 2
     }, {
-      label: '未认证',
-      key: 'NOT_APPLYING',
-      value: 0
-    }, {
-      label: '待认证',
+      label: '申诉中',
       key: 'TO_BE_CERTIFIED',
       value: 1
     }, {
@@ -401,7 +412,8 @@
         searchKeys: searchKeys,
         isShowDialog: false,
         approveType: '',
-        selectedAppeal: {}
+        selectedAppeal: {},
+        canApprove: false
       }
     },
     computed: {
@@ -440,7 +452,7 @@
 
         this.fetchData()
       },
-      approveRequest (appeal) {
+      handleAppeal (appeal) {
         if (appeal.type !== 'resetPassword' && appeal.type !== 'validAccount' &&
           appeal.type !== 'changeAdmin') {
           this.$message.error(`不支持的申诉类型${appeal.type()}`)
@@ -453,12 +465,18 @@
         if (appeal.type === 'changeAdmin' && !this.selectedAppeal.admin) {
           this.selectedAppeal.admin = {}
         }
+      },
+      approveRequest (appeal) {
+        this.handleAppeal(appeal)
         this.isShowDialog = true
+        this.canApprove = true
 
         console.log(this.selectedAppeal)
       },
-      showDetail () {
-        this.$message.info('此功能暂未开通')
+      showDetail (appeal) {
+        this.handleAppeal(appeal)
+        this.isShowDialog = true
+        this.canApprove = false
       },
       approveAppeal (appealId, isPass) {
         const success = result => {

+ 1 - 0
sso-manage-console-web/src/components/accounts/common/CommonHome.vue

@@ -102,6 +102,7 @@
   .el-main {
     height: 463px;
     padding: 0;
+    -ms-flex-preferred-size: 463px;
   }
   .el-footer {
     height: 64px;

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

@@ -103,7 +103,7 @@
               const routeLocation = {name: 'UserBasicInfo', params: enterprise.admin, replace: true}
               this.$router.push(routeLocation)
             }
-          } else if (info.label === '申诉状态' && info.value) {
+          } else if (info.label === '申诉状态' && info.value && info.value === '申诉中') {
             info.suffixClass = 'admin-message'
             info.action = () => {
               const routeLocation = {name: 'AppealHome', replace: true}
@@ -160,6 +160,7 @@
           this.$store.commit(types.CHOOSE_ENTERPRISE, userSpace)
 
           this.$message.success('保存成功')
+          this.changeAdminVisible = false
         }
         const error = response => {
           this.$message.error(response)

+ 6 - 3
sso-manage-console-web/src/components/accounts/enterprises/EnterpriseHome.vue

@@ -54,7 +54,7 @@
         width="100">
         <template slot-scope="scope">
           <span v-if="scope.row.validCode === 0">未申请</span>
-          <span v-if="scope.row.validCode === 1">待认证</span>
+          <span v-if="scope.row.validCode === 1" style="color: #E68615;">待认证</span>
           <span v-if="scope.row.validCode === 2">已认证</span>
           <span v-if="scope.row.validCode === 3">未通过</span>
         </template>
@@ -69,7 +69,8 @@
       </el-table-column>
       <el-table-column
         prop="registerDate"
-        label="注册时间">
+        label="注册时间"
+        :formatter="formatDate">
       </el-table-column>
     </el-table>
   </common-home>
@@ -78,6 +79,7 @@
 <script>
   import _ from 'lodash'
   import axios from '@/assets/js/axios'
+  import { formatDate } from '@/assets/js/utils'
   import * as types from '@/store/mutation-types'
   import {ValidCode} from '@/Constant'
   import CommonHome from '../common/CommonHome'
@@ -168,7 +170,8 @@
         this.$store.commit(types.CHOOSE_ENTERPRISE, row)
         const routeLocation = {name: 'EnterpriseBasicInfo', params: row}
         this.$router.push(routeLocation)
-      }
+      },
+      formatDate: formatDate
     }
   }
 </script>

+ 10 - 0
sso-manage-console-web/src/components/accounts/enterprises/EnterpriseMembers.vue

@@ -20,6 +20,11 @@
             prop="vipName"
             label="用户名称"
             width="110">
+            <template slot-scope="scope">
+              <el-button type="text" size="small" @click="routeToUserDetail(scope.row)">
+                {{ scope.row.vipName }}
+              </el-button>
+            </template>
           </el-table-column>
           <el-table-column
             prop="userUU"
@@ -134,6 +139,10 @@
 
         axios.put(`/api/user/space/${this.enterprise.spaceUU}/unbindUser`, {}, {params}).then(
           success).catch(error)
+      },
+      routeToUserDetail (user) {
+        const routeLocation = {name: 'UserBasicInfo', params: user, replace: true}
+        this.$router.push(routeLocation)
       }
     },
     watch: {
@@ -149,6 +158,7 @@
   .el-main {
     height: 463px;
     padding: 0;
+    -ms-flex-preferred-size: 463px;
   }
   .el-footer {
     height: 64px;

+ 0 - 1
sso-manage-console-web/src/components/accounts/users/UserBasicInfo.vue

@@ -114,7 +114,6 @@
         const success = () => {
           this.isChange = false
           this.$message.success('保存成功')
-          this.$router.go(-1)
         }
         const error = error => {
           this.$message.error(error)

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

@@ -7,7 +7,7 @@ const state = {
   allApps: []
 }
 
-const validStatus = ['未申请', '申诉中', '已认证', '未通过']
+const validStatus = ['未申请', '申诉中', '未申请', '未申请']
 
 // Getters
 const getters = {

+ 1 - 1
sso-manage-console-web/webpack/webpack.base.conf.js

@@ -22,7 +22,7 @@ const createLintingRule = () => ({
 module.exports = {
   context: path.resolve(__dirname, '../'),
   entry: {
-    app: './src/main.js'
+    app: ['babel-polyfill', './src/main.js']
   },
   output: {
     path: config.build.assetsRoot,

+ 12 - 0
sso-manage-console-web/yarn.lock

@@ -736,6 +736,14 @@ babel-plugin-transform-vue-jsx@^3.5.0:
   dependencies:
     esutils "^2.0.2"
 
+babel-polyfill@^6.26.0:
+  version "6.26.0"
+  resolved "http://registry.npm.taobao.org/babel-polyfill/download/babel-polyfill-6.26.0.tgz#379937abc67d7895970adc621f284cd966cf2153"
+  dependencies:
+    babel-runtime "^6.26.0"
+    core-js "^2.5.0"
+    regenerator-runtime "^0.10.5"
+
 babel-preset-env@^1.3.2:
   version "1.6.1"
   resolved "http://registry.npm.taobao.org/babel-preset-env/download/babel-preset-env-1.6.1.tgz#a18b564cc9b9afdf4aae57ae3c1b0d99188e6f48"
@@ -4589,6 +4597,10 @@ regenerate@^1.2.1:
   version "1.3.3"
   resolved "http://registry.npm.taobao.org/regenerate/download/regenerate-1.3.3.tgz#0c336d3980553d755c39b586ae3b20aa49c82b7f"
 
+regenerator-runtime@^0.10.5:
+  version "0.10.5"
+  resolved "http://registry.npm.taobao.org/regenerator-runtime/download/regenerator-runtime-0.10.5.tgz#336c3efc1220adcedda2c9fab67b5a7955a33658"
+
 regenerator-runtime@^0.11.0:
   version "0.11.1"
   resolved "http://registry.npm.taobao.org/regenerator-runtime/download/regenerator-runtime-0.11.1.tgz#be05ad7f9bf7d22e056f9726cee5017fbf19e2e9"

+ 2 - 2
sso-manage-console/src/main/java/com/uas/sso/sso/backend/ManageConsoleApplication.java

@@ -11,8 +11,8 @@ import org.springframework.data.jpa.repository.config.EnableJpaRepositories;
  * @author huxz
  */
 @SpringBootApplication
-@EntityScan(basePackages = {"com.uas.sso.entity"})
-@EnableJpaRepositories(basePackages = {"com.uas.sso.dao"})
+@EntityScan(basePackages = {"com.uas.sso.entity", "com.uas.sso.sso.backend.entity"})
+@EnableJpaRepositories(basePackages = {"com.uas.sso.dao", "com.uas.sso.sso.backend.dao"})
 public class ManageConsoleApplication {
 
     public static void main(String[] args) {

+ 17 - 0
sso-manage-console/src/main/java/com/uas/sso/sso/backend/dao/AdminChangeRecordDao.java

@@ -0,0 +1,17 @@
+package com.uas.sso.sso.backend.dao;
+
+import com.uas.sso.sso.backend.entity.AdminChangeRecord;
+import org.springframework.data.jpa.repository.JpaRepository;
+import org.springframework.data.jpa.repository.JpaSpecificationExecutor;
+import org.springframework.stereotype.Repository;
+
+/**
+ * A repository stores enterprises admin change records.
+ *
+ * @author huxz
+ */
+@Repository
+public interface AdminChangeRecordDao extends JpaRepository<AdminChangeRecord, Long>,
+        JpaSpecificationExecutor<AdminChangeRecord> {
+
+}

+ 117 - 0
sso-manage-console/src/main/java/com/uas/sso/sso/backend/entity/AdminChangeRecord.java

@@ -0,0 +1,117 @@
+package com.uas.sso.sso.backend.entity;
+
+import javax.persistence.Column;
+import javax.persistence.Entity;
+import javax.persistence.EnumType;
+import javax.persistence.Enumerated;
+import javax.persistence.GeneratedValue;
+import javax.persistence.Id;
+import javax.persistence.Table;
+
+/**
+ * Record logs when super admin changed enterprise' admin.
+ *
+ * @author huxz
+ */
+@Entity
+@Table(name = "sso$us_admin_change_record")
+public class AdminChangeRecord extends FlowBase {
+
+    @Id
+    @GeneratedValue
+    private Long id;
+
+    @Column(name = "space_uu")
+    private Long spaceUU;
+
+    /**
+     * 原管理员姓名
+     */
+    @Column(name = "admin_name_old", length = 50)
+    private String oldAdminName;
+
+    /**
+     * 原管理员手机
+     */
+    @Column(name = "admin_tel_old", length = 24)
+    private String oldAdminTel;
+
+    /**
+     * 新管理员姓名
+     */
+    @Column(name = "admin_name_new", length = 50)
+    private String newAdminName;
+
+    /**
+     * 新管理员手机
+     */
+    @Column(name = "admin_tel_new", length = 24)
+    private String newAdminTel;
+
+    /**
+     * 管理更换方式
+     */
+    @Column(name = "change_type")
+    @Enumerated(EnumType.STRING)
+    private AdminChangeType changeType;
+
+    public AdminChangeRecord() {
+        super();
+    }
+
+    public Long getId() {
+        return id;
+    }
+
+    public void setId(Long id) {
+        this.id = id;
+    }
+
+    public Long getSpaceUU() {
+        return spaceUU;
+    }
+
+    public void setSpaceUU(Long spaceUU) {
+        this.spaceUU = spaceUU;
+    }
+
+    public String getOldAdminName() {
+        return oldAdminName;
+    }
+
+    public void setOldAdminName(String oldAdminName) {
+        this.oldAdminName = oldAdminName;
+    }
+
+    public String getOldAdminTel() {
+        return oldAdminTel;
+    }
+
+    public void setOldAdminTel(String oldAdminTel) {
+        this.oldAdminTel = oldAdminTel;
+    }
+
+    public String getNewAdminName() {
+        return newAdminName;
+    }
+
+    public void setNewAdminName(String newAdminName) {
+        this.newAdminName = newAdminName;
+    }
+
+    public String getNewAdminTel() {
+        return newAdminTel;
+    }
+
+    public void setNewAdminTel(String newAdminTel) {
+        this.newAdminTel = newAdminTel;
+    }
+
+    public AdminChangeType getChangeType() {
+        return changeType;
+    }
+
+    public void setChangeType(AdminChangeType changeType) {
+        this.changeType = changeType;
+    }
+}

+ 19 - 0
sso-manage-console/src/main/java/com/uas/sso/sso/backend/entity/AdminChangeType.java

@@ -0,0 +1,19 @@
+package com.uas.sso.sso.backend.entity;
+
+/**
+ * Enum class represents methods of changing admin.
+ *
+ * @author huxz
+ */
+public enum AdminChangeType {
+
+    /**
+     * 管理员操作
+     */
+    ADMIN_OPERATION,
+
+    /**
+     * 人工申诉
+     */
+    USER_APPEAL
+}

+ 98 - 0
sso-manage-console/src/main/java/com/uas/sso/sso/backend/entity/FlowBase.java

@@ -0,0 +1,98 @@
+package com.uas.sso.sso.backend.entity;
+
+import java.util.Date;
+import javax.persistence.Column;
+import javax.persistence.MappedSuperclass;
+
+/**
+ * Represent approval flow base info when user launched a request.
+ *
+ * @author huxz
+ */
+@MappedSuperclass
+public class FlowBase {
+
+    /**
+     * 审批流发起人姓名
+     */
+    @Column(name = "sponsor_name", length = 50)
+    private String sponsorName;
+
+    /**
+     * 审批发起人手机
+     */
+    @Column(name = "sponsor_tel", length = 24)
+    private String sponsorTel;
+
+    /**
+     * 发起日期
+     */
+    @Column(name = "launch_time")
+    private Date launchTime;
+
+    /**
+     * 审核人姓名
+     */
+    @Column(name = "auditor_name", length = 50)
+    private String auditorName;
+
+    /**
+     * 审核人手机
+     */
+    @Column(name = "auditor_tel", length = 24)
+    private String auditorTel;
+
+    /**
+     * 审核时间
+     */
+    @Column(name = "audit_time")
+    private Date auditTime;
+
+    public String getSponsorName() {
+        return sponsorName;
+    }
+
+    public void setSponsorName(String sponsorName) {
+        this.sponsorName = sponsorName;
+    }
+
+    public String getSponsorTel() {
+        return sponsorTel;
+    }
+
+    public void setSponsorTel(String sponsorTel) {
+        this.sponsorTel = sponsorTel;
+    }
+
+    public Date getLaunchTime() {
+        return launchTime;
+    }
+
+    public void setLaunchTime(Date launchTime) {
+        this.launchTime = launchTime;
+    }
+
+    public String getAuditorName() {
+        return auditorName;
+    }
+
+    public void setAuditorName(String auditorName) {
+        this.auditorName = auditorName;
+    }
+
+    public String getAuditorTel() {
+        return auditorTel;
+    }
+
+    public void setAuditorTel(String auditorTel) {
+        this.auditorTel = auditorTel;
+    }
+
+    public Date getAuditTime() {
+        return auditTime;
+    }
+
+    public void setAuditTime(Date auditTime) {
+        this.auditTime = auditTime;
+    }
+}

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

@@ -6,20 +6,26 @@ 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.dao.AdminChangeRecordDao;
+import com.uas.sso.sso.backend.entity.AdminChangeRecord;
+import com.uas.sso.sso.backend.entity.AdminChangeType;
 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.Date;
 import java.util.List;
 import java.util.Map;
 import javax.persistence.criteria.CriteriaBuilder;
 import javax.persistence.criteria.CriteriaQuery;
+import javax.persistence.criteria.Order;
 import javax.persistence.criteria.Predicate;
 import javax.persistence.criteria.Root;
 import javax.validation.constraints.NotNull;
 import org.apache.log4j.Logger;
+import org.hibernate.jpa.criteria.OrderImpl;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.data.domain.Page;
 import org.springframework.data.domain.Pageable;
@@ -51,12 +57,15 @@ public class AppealServiceImpl implements AppealService {
 
     private final UserspaceDao spaceDao;
 
+    private final AdminChangeRecordDao recordDao;
+
     @Autowired
     public AppealServiceImpl(AppealDao appealDao, UserDao userDao,
-            UserspaceDao spaceDao) {
+            UserspaceDao spaceDao, AdminChangeRecordDao recordDao) {
         this.appealDao = appealDao;
         this.userDao = userDao;
         this.spaceDao = spaceDao;
+        this.recordDao = recordDao;
     }
 
     @Override
@@ -95,6 +104,13 @@ public class AppealServiceImpl implements AppealService {
                 predicates.toArray(array);
                 Predicate predicate = builder.and(array);
                 query.where(predicate);
+
+                List<Order> orderList = new ArrayList<>();
+                Order order = new OrderImpl(root.get("status"), true);
+                orderList.add(order);
+                order = new OrderImpl(root.get("submitDate"), false);
+                orderList.add(order);
+                query.orderBy(orderList);
                 return null;
             }
         }, page);
@@ -144,6 +160,26 @@ public class AppealServiceImpl implements AppealService {
                         String.format("拥有手机号[%s]的用户不存在", appeal.getMobile()));
             }
 
+            // 记录管理员更换记录
+            AdminChangeRecord record = new AdminChangeRecord();
+            record.setSpaceUU(spaceUU);
+
+            User oldAdmin = space.getAdmin();
+            record.setSponsorName(appeal.getContactName());
+            record.setSponsorTel(appeal.getContactTel());
+            record.setLaunchTime(new Date());
+            record.setOldAdminName(oldAdmin.getVipName());
+            record.setOldAdminTel(oldAdmin.getMobile());
+
+            record.setAuditorName("系统管理员");
+            record.setAuditorTel("123456789");
+            record.setAuditTime(new Date());
+            record.setNewAdminName(user.getVipName());
+            record.setNewAdminTel(user.getMobile());
+
+            record.setChangeType(AdminChangeType.USER_APPEAL);
+            recordDao.save(record);
+
             space.setAdmin(user);
             space.setAdminUU(user.getUserUU());
             // 更新企业信息

+ 41 - 13
sso-manage-console/src/main/java/com/uas/sso/sso/backend/service/impl/UserSpaceServiceImpl.java

@@ -9,7 +9,10 @@ import com.uas.sso.entity.App;
 import com.uas.sso.entity.User;
 import com.uas.sso.entity.Userspace;
 import com.uas.sso.entity.UserspaceValid;
+import com.uas.sso.sso.backend.dao.AdminChangeRecordDao;
 import com.uas.sso.sso.backend.dto.UpdateSpaceInfo;
+import com.uas.sso.sso.backend.entity.AdminChangeRecord;
+import com.uas.sso.sso.backend.entity.AdminChangeType;
 import com.uas.sso.sso.backend.exceptions.ValidationFailedException;
 import com.uas.sso.sso.backend.service.UserSpaceService;
 import java.text.SimpleDateFormat;
@@ -19,9 +22,11 @@ import java.util.Date;
 import java.util.List;
 import javax.persistence.criteria.CriteriaBuilder;
 import javax.persistence.criteria.CriteriaQuery;
+import javax.persistence.criteria.Order;
 import javax.persistence.criteria.Predicate;
 import javax.persistence.criteria.Root;
 import javax.validation.constraints.NotNull;
+import org.hibernate.jpa.criteria.OrderImpl;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.data.domain.Page;
 import org.springframework.data.domain.Pageable;
@@ -47,13 +52,17 @@ public class UserSpaceServiceImpl implements UserSpaceService {
 
     private final UserspaceValidDao spaceValidDao;
 
+    private final AdminChangeRecordDao recordDao;
+
     @Autowired
     public UserSpaceServiceImpl(UserspaceDao userspaceDao, UserDao userDao,
-            AppDao appDao, UserspaceValidDao spaceValidDao) {
+            AppDao appDao, UserspaceValidDao spaceValidDao,
+            AdminChangeRecordDao recordDao) {
         this.userspaceDao = userspaceDao;
         this.userDao = userDao;
         this.appDao = appDao;
         this.spaceValidDao = spaceValidDao;
+        this.recordDao = recordDao;
     }
 
     @Override
@@ -91,6 +100,13 @@ public class UserSpaceServiceImpl implements UserSpaceService {
                 predicates.toArray(array);
                 Predicate predicate = builder.and(array);
                 query.where(predicate);
+
+                List<Order> orderList = new ArrayList<>();
+                Order order = new OrderImpl(root.get("registerDate"), false);
+                orderList.add(order);
+                order = new OrderImpl(root.get("validCode"), true);
+                orderList.add(order);
+                query.orderBy(orderList);
                 return null;
             }
         }, page);
@@ -141,6 +157,28 @@ public class UserSpaceServiceImpl implements UserSpaceService {
             throw new ValidationFailedException("企业管理员必须是当前企业用户");
         }
 
+        // 记录管理员更换记录
+        AdminChangeRecord record = new AdminChangeRecord();
+        record.setSpaceUU(spaceUu);
+
+        User oldAdmin = space.getAdmin();
+        record.setSponsorName("系统管理员");
+        record.setSponsorTel("123456789");
+        if (oldAdmin != null) {
+            record.setOldAdminName(oldAdmin.getVipName());
+            record.setOldAdminTel(oldAdmin.getMobile());
+        }
+        record.setLaunchTime(new Date());
+
+        record.setAuditorName("系统管理员");
+        record.setAuditorTel("123456789");
+        record.setAuditTime(new Date());
+        record.setNewAdminName(admin.getVipName());
+        record.setNewAdminTel(admin.getMobile());
+
+        record.setChangeType(AdminChangeType.ADMIN_OPERATION);
+        recordDao.save(record);
+
         // 更新管理员信息
         space.setAdminUU(userUU);
         space.setAdmin(admin);
@@ -191,19 +229,9 @@ public class UserSpaceServiceImpl implements UserSpaceService {
     @Override
     @Transactional(rollbackFor = RuntimeException.class)
     public void addUserToSpace(Long spaceUu, Long userUu) {
-        if (spaceUu == null || userUu == null) {
-            throw new ValidationFailedException("企业UU和用户UU不能为空");
-        }
-
-        Userspace space = userspaceDao.findOne(spaceUu);
-        if (space == null) {
-            throw new ValidationFailedException(String.format("UU %d 对应企业不存在", spaceUu));
-        }
+        Userspace space = assertSpaceExist(spaceUu);
 
-        User user = userDao.findOne(userUu);
-        if (user == null) {
-            throw new ValidationFailedException(String.format("UU %d 对应用户不存在", userUu));
-        }
+        User user = assertUserExist(userUu);
 
         List<User> users = space.getUsers();
         if (!users.contains(user)) {

+ 18 - 0
sso-server/build.gradle

@@ -1,7 +1,20 @@
+buildscript {
+    repositories {
+        maven { url "https://plugins.gradle.org/m2/" }
+        maven { url 'http://113.105.74.141:8081/artifactory/libs-release-local' }
+        maven { url "http://maven.aliyun.com/nexus/content/groups/public/" }
+        jcenter()
+    }
+    dependencies {
+        classpath 'com.uas.demo.mesh:spring-boot-docker-plugin:1.0.2'
+    }
+}
+
 plugins {
     id "org.springframework.boot" version '1.5.9.RELEASE'
 }
 
+apply plugin: 'com.uas.docker.spring.boot'
 apply from: "$rootDir/gradle/persist-publish.gradle"
 
 configurations {
@@ -47,3 +60,8 @@ dependencies {
 
     testCompile("org.springframework.boot:spring-boot-starter-test")
 }
+
+customDocker {
+    baseImage 'hub.c.163.com/library/java:8-jre-alpine'
+    registry '10.10.100.200:5000'
+}