Pārlūkot izejas kodu

Merge branch 'dev' into dev_lx

skyline 1 gadu atpakaļ
vecāks
revīzija
75d3cea822

+ 1 - 1
admin-web/src/components/form/ExtUpload.vue

@@ -20,7 +20,7 @@
       </el-icon>
     </template>
     <template v-else>
-      <SvgIcon name="ele-Remove"></SvgIcon>
+      <SvgIcon  v-if="showImageList.length>0"  name="ele-Remove" class="color-danger" style="position: absolute;top:2px;right: 2px;" @click.stop="handleRemove(0)"></SvgIcon>
       <img v-if="showImageList[0]" :src="showImageList[0]" class="avatar"/>
       <el-icon v-else class="avatar-uploader-icon">
         <Plus/>

+ 57 - 10
admin-web/src/views/admin/user/dialog.vue

@@ -87,6 +87,21 @@
             <el-checkbox v-for="role in state.roleList" :key="role.id" :label="role.id">{{ role.roleName }}</el-checkbox>
           </el-checkbox-group>
         </el-card>
+
+        <el-card header="管理站点" style="margin-top: 20px;">
+          <ext-select
+              v-model="state.adminUserStationIdList"
+              multiple
+              placeholder="关联站点"
+              url="station/list"
+              url-method="get"
+              label-key="stationName"
+              value-key="stationId"
+              data-key=""
+              clearable
+              class="w100 mt5">
+          </ext-select>
+        </el-card>
       </el-form>
 
       <template #footer>
@@ -107,6 +122,8 @@ import u from '/@/utils/u'
 import type {FormInstance, FormRules} from 'element-plus';
 import ExtDSelect from "/@/components/form/ExtDSelect.vue";
 import ExtUpload from "/@/components/form/ExtUpload.vue";
+import ExtSelect from "/@/components/form/ExtSelect.vue";
+import {Session} from "/@/utils/storage";
 
 // 引入组件
 // const ExtDetailForm = defineAsyncComponent(() => import('/@/components/form/ExtDetailForm.vue'));
@@ -128,13 +145,15 @@ const initState = () => ({
   },
   rules: {
     username: [u.validator.required],
-    mobilePhone: [u.validator.required,u.validator.mobile],
+    mobilePhone: [u.validator.required, u.validator.mobile],
     nickname: [u.validator.required],
     status: [u.validator.required],
     password: [u.validator.required],
   },
   roleList: [],
-  checkRoleIdList: []
+  checkRoleIdList: [],
+  adminUserStationList: [],
+  adminUserStationIdList: []
 })
 
 // 定义变量内容
@@ -150,6 +169,7 @@ const open = (action: string = 'add', row: any) => {
   state.dialog.isShowDialog = true;
   if (action !== 'add') {
     loadData(row.id);
+
   }
 
 };
@@ -174,27 +194,39 @@ const onCancel = () => {
 // 提交
 const onSubmit = () => {
   formRef.value.validate((valid, fields) => {
-    // console.log('basic checkForm!', valid,fields)
     if (valid) {
       state.btnLoading = true;
       const url = state.ruleForm.id > 0 ? "admin-user/modify" : "admin-user/add"
       $body(url, state.ruleForm).then((id) => {
-        console.log(id)
-        if(id){
+        if (id) {
           state.ruleForm.id = id;
         }
-        state.btnLoading = false;
+
         Msg.message('操作成功');
-        console.log('submit!')
         if (state.ruleForm.id > 0) {
           $body(`admin-user/updateRole`, {userId: state.ruleForm.id, roleIdList: state.checkRoleIdList}).then(() => {
-            onClose();
             emit('refresh');
+            state.btnLoading = false;
+            if(state.adminUserStationIdList.length ===0){
+              onClose()
+            }
           })
         } else {
-          onClose();
           emit('refresh');
         }
+        if (state.adminUserStationIdList.length > 0) {
+          let adminUserStationList = state.adminUserStationIdList.map(k => {
+            return {
+              adminUserId: state.ruleForm.id,
+              stationId: k
+            }
+          })
+          $body(`admin-user-station/save`, adminUserStationList).then(() => {
+            emit('refresh');
+            state.btnLoading = false;
+            onClose()
+          })
+        }
       }).catch(() => {
         state.btnLoading = false;
       })
@@ -233,9 +265,24 @@ const loadData = (id: number) => {
     let {adminUser, roles} = res;
     state.ruleForm = adminUser;
     state.checkRoleIdList = roles.map(k => k.roleId)
+    loadAdminUserStationList()
   })
+}
 
-
+const loadAdminUserStationList = () => {
+  if(state.ruleForm.id<=0){
+    return;
+  }
+  let param = {
+    userId: state.ruleForm.id,
+    pageNum: 1,
+    pageSize: 1024
+  }
+  $get(`admin-user-station/list`, param).then((res: any) => {
+    let {list} = res;
+    state.adminUserStationIdList = list.map(k => k.stationId)
+    state.adminUserStationList = res.list;
+  })
 }
 
 // 暴露变量

+ 55 - 0
admin/src/main/java/com/kym/admin/controller/AdminUserStationController.java

@@ -0,0 +1,55 @@
+package com.kym.admin.controller;
+
+import cn.dev33.satoken.annotation.SaCheckPermission;
+import com.kym.common.R;
+import com.kym.common.annotation.SysLog;
+import com.kym.common.controller.IController;
+import com.kym.entity.admin.AdminUserStation;
+import com.kym.entity.admin.queryParams.CommonQueryParam;
+import com.kym.service.admin.AdminUserStationService;
+import org.springframework.web.bind.annotation.GetMapping;
+import org.springframework.web.bind.annotation.ModelAttribute;
+import org.springframework.web.bind.annotation.PostMapping;
+import org.springframework.web.bind.annotation.RequestBody;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RestController;
+
+import java.util.List;
+
+
+/**
+ * <p>
+ * admin用户站点
+ * </p>
+ *
+ * @author skyline
+ * @since 2023-07-11
+ */
+@RestController
+@RequestMapping("/admin-user-station")
+public class AdminUserStationController extends IController {
+
+    private final AdminUserStationService adminUserStationService;
+
+
+    public AdminUserStationController(AdminUserStationService adminUserStationService) {
+        this.adminUserStationService = adminUserStationService;
+    }
+
+
+    @GetMapping("/list")
+    @SysLog("admin用户站点-查询")
+    public R<?> list(@ModelAttribute CommonQueryParam commonQueryParam) {
+        return resp(() -> adminUserStationService.listUserStation(commonQueryParam));
+    }
+
+
+    @PostMapping("/save")
+    @SaCheckPermission("user.modify")
+    @SysLog("admin用户站点-保存")
+    public R<?> saveUserStation(@RequestBody List<AdminUserStation> userStationList) {
+        return resp((t) -> adminUserStationService.saveUserStation(userStationList));
+    }
+
+
+}

+ 13 - 0
admin/src/main/java/com/kym/admin/controller/StationController.java

@@ -44,6 +44,19 @@ public class StationController {
         return R.success(stationService.listStation(params));
     }
 
+
+    /**
+     * 站点列表,管理后台配置使用
+     * @return
+     */
+    @SysLog("站点列表")
+    @GetMapping("list")
+    R<?> list() {
+        return R.success(stationService.list());
+    }
+
+
+
     @SysLog("修改站点信息")
     @PostMapping("modify")
     R<?> modifyStation(@RequestBody Station station) {

+ 10 - 0
common/src/main/java/com/kym/common/R.java

@@ -4,6 +4,7 @@ import com.kym.common.constant.ResponseEnum;
 import lombok.AllArgsConstructor;
 import lombok.Data;
 import lombok.NoArgsConstructor;
+import org.slf4j.MDC;
 
 import java.io.Serializable;
 
@@ -22,10 +23,19 @@ public class R<T> implements Serializable {
     private Integer code;
     private String message;
     private T data;
+    private String tid;
 
     public R(Integer code, String message) {
         this.code = code;
         this.message = message;
+        this.tid = MDC.get("seq");
+    }
+
+    public R(Integer code, String message,T data) {
+        this.code = code;
+        this.message = message;
+        this.data  = data;
+        this.tid = MDC.get("seq");
     }
 
     public static R success() {

+ 11 - 0
common/src/main/java/com/kym/common/utils/CommUtil.java

@@ -50,6 +50,17 @@ public class CommUtil {
         }
     }
 
+    /**
+     * 断言非空
+     * @param obj
+     * @param error
+     */
+    public static void assertsNonNull(Object obj, String error) {
+        if (!isNotEmptyAndNull(obj)) {
+            throw new BusinessException(ResponseEnum.FAILED.getCode(), error);
+        }
+    }
+
 
     /**
      * 断言

+ 8 - 0
service/src/main/java/com/kym/service/admin/AdminUserStationService.java

@@ -1,7 +1,12 @@
 package com.kym.service.admin;
 
 import com.github.yulichang.base.MPJBaseService;
+import com.kym.entity.admin.Activity;
 import com.kym.entity.admin.AdminUserStation;
+import com.kym.entity.admin.queryParams.CommonQueryParam;
+import com.kym.entity.common.PageBean;
+
+import java.util.List;
 
 /**
  * <p>
@@ -13,4 +18,7 @@ import com.kym.entity.admin.AdminUserStation;
  */
 public interface AdminUserStationService extends MPJBaseService<AdminUserStation> {
 
+    PageBean<AdminUserStation> listUserStation(CommonQueryParam commonQueryParam);
+
+    void saveUserStation(List<AdminUserStation> userStationList);
 }

+ 41 - 0
service/src/main/java/com/kym/service/admin/impl/AdminUserStationServiceImpl.java

@@ -2,16 +2,26 @@ package com.kym.service.admin.impl;
 
 import com.baomidou.dynamic.datasource.annotation.DS;
 import com.baomidou.dynamic.datasource.toolkit.DynamicDataSourceContextHolder;
+import com.github.pagehelper.PageHelper;
 import com.github.yulichang.base.MPJBaseServiceImpl;
+import com.kym.common.utils.CommUtil;
+import com.kym.entity.BaseEntity;
 import com.kym.entity.admin.AdminUserStation;
+import com.kym.entity.admin.Station;
+import com.kym.entity.admin.queryParams.CommonQueryParam;
+import com.kym.entity.common.PageBean;
 import com.kym.mapper.admin.AdminUserStationMapper;
 import com.kym.service.admin.AdminUserStationService;
+import com.kym.service.admin.StationService;
 import com.kym.service.cache.KymCache;
 import jakarta.annotation.PostConstruct;
+import jakarta.annotation.Resource;
 import org.springframework.stereotype.Service;
+import org.springframework.transaction.annotation.Transactional;
 
 import java.util.ArrayList;
 import java.util.List;
+import java.util.Map;
 import java.util.stream.Collectors;
 
 /**
@@ -26,6 +36,9 @@ import java.util.stream.Collectors;
 @DS("db-admin")
 public class AdminUserStationServiceImpl extends MPJBaseServiceImpl<AdminUserStationMapper, AdminUserStation> implements AdminUserStationService {
 
+    @Resource
+    private StationService stationService;
+
     @PostConstruct
     private void init() {
         DynamicDataSourceContextHolder.push("db-admin");
@@ -44,4 +57,32 @@ public class AdminUserStationServiceImpl extends MPJBaseServiceImpl<AdminUserSta
         KymCache.INSTANCE.putAdminUser2Stations(adminUser2Stations);
         DynamicDataSourceContextHolder.poll();
     }
+
+    @Override
+    public PageBean<AdminUserStation> listUserStation(CommonQueryParam commonQueryParam) {
+        PageHelper.startPage(commonQueryParam.getPageNum(), commonQueryParam.getPageSize());
+        List<AdminUserStation> list = lambdaQuery().eq(commonQueryParam.getUserId() > 0, AdminUserStation::getAdminUserId, commonQueryParam.getUserId()).list();
+        return new PageBean<>(list);
+    }
+
+    @Transactional(rollbackFor = Exception.class)
+    @Override
+    public void saveUserStation(List<AdminUserStation> userStationList) {
+        List<Station> list = stationService.list();
+        Map<String, String> stationMap = list.stream().collect(Collectors.toMap(k -> String.valueOf(k.getStationId()), Station::getStationName));
+        userStationList.forEach(k -> {
+                    CommUtil.asserts(k.getAdminUserId() > 0, "管理用户ID不能为空");
+                    CommUtil.assertsNonNull(k.getStationId(), "站点信息不能为空");
+                    String name = stationMap.get(k.getStationId());
+                    CommUtil.assertsNonNull(name, "站点信息不存在");
+                    k.setStationName(name);
+                }
+        );
+        Map<String, Object> deleteMap = Map.of("admin_user_id", userStationList.get(0).getAdminUserId());
+        removeByMap(deleteMap);
+        saveBatch(userStationList);
+        //刷新缓存
+        Map<Long, List<String>> userStationMap = userStationList.stream().collect(Collectors.groupingBy(AdminUserStation::getAdminUserId, Collectors.mapping(AdminUserStation::getStationId, Collectors.toList())));
+        KymCache.INSTANCE.putAdminUser2Stations(userStationMap);
+    }
 }

+ 2 - 0
service/src/main/java/com/kym/service/cache/KymCache.java

@@ -15,6 +15,7 @@ import com.kym.service.admin.StationService;
 import org.springframework.beans.factory.annotation.Value;
 import org.springframework.boot.context.event.ApplicationStartedEvent;
 import org.springframework.context.ApplicationListener;
+import org.springframework.data.redis.core.SetOperations;
 import org.springframework.data.redis.core.StringRedisTemplate;
 import org.springframework.stereotype.Component;
 
@@ -127,6 +128,7 @@ public enum KymCache {
         map.forEach((k, v) -> {
             String key = RedisKeys.ADMIN_USER_STATION_IDS + k;
             String[] values = v.toArray(new String[0]); // 优化数组创建方式,使用varargs来避免不必要的数组拷贝
+            KymCacheInjector.redisTemplate.delete(key);
             KymCacheInjector.redisTemplate.opsForSet().add(key, values);
         });
     }