swy 1 miesiąc temu
rodzic
commit
975bb99d85
20 zmienionych plików z 1800 dodań i 0 usunięć
  1. 182 0
      jp-console/jeeplus-module/ly/src/main/java/com/jeeplus/jsbb/controller/LoginMessController.java
  2. 37 0
      jp-console/jeeplus-module/ly/src/main/java/com/jeeplus/jsbb/domain/LoginMess.java
  3. 23 0
      jp-console/jeeplus-module/ly/src/main/java/com/jeeplus/jsbb/mapper/LoginMessMapper.java
  4. 25 0
      jp-console/jeeplus-module/ly/src/main/java/com/jeeplus/jsbb/mapper/xml/LoginMessMapper.xml
  5. 29 0
      jp-console/jeeplus-module/ly/src/main/java/com/jeeplus/jsbb/service/LoginMessService.java
  6. 46 0
      jp-console/jeeplus-module/ly/src/main/java/com/jeeplus/jsbb/service/dto/LoginMessDTO.java
  7. 24 0
      jp-console/jeeplus-module/ly/src/main/java/com/jeeplus/jsbb/service/mapstruct/LoginMessWrapper.java
  8. 200 0
      jp-console/jeeplus-module/ly/src/main/java/com/jeeplus/loginacea/controller/LoginAceController.java
  9. 55 0
      jp-console/jeeplus-module/ly/src/main/java/com/jeeplus/loginacea/domain/LoginAce.java
  10. 29 0
      jp-console/jeeplus-module/ly/src/main/java/com/jeeplus/loginacea/mapper/LoginAceMapper.java
  11. 91 0
      jp-console/jeeplus-module/ly/src/main/java/com/jeeplus/loginacea/mapper/xml/LoginAceMapper.xml
  12. 36 0
      jp-console/jeeplus-module/ly/src/main/java/com/jeeplus/loginacea/service/LoginAceService.java
  13. 74 0
      jp-console/jeeplus-module/ly/src/main/java/com/jeeplus/loginacea/service/dto/LoginAceDTO.java
  14. 24 0
      jp-console/jeeplus-module/ly/src/main/java/com/jeeplus/loginacea/service/mapstruct/LoginAceWrapper.java
  15. 60 0
      jp-ui/src/api/jsbb/loginMessService.js
  16. 61 0
      jp-ui/src/api/loginacea/loginAceService.js
  17. 105 0
      jp-ui/src/views/modules/jsbb/LoginMessForm.vue
  18. 278 0
      jp-ui/src/views/modules/jsbb/LoginMessList.vue
  19. 124 0
      jp-ui/src/views/modules/loginacea/LoginAceForm.vue
  20. 297 0
      jp-ui/src/views/modules/loginacea/LoginAceList.vue

+ 182 - 0
jp-console/jeeplus-module/ly/src/main/java/com/jeeplus/jsbb/controller/LoginMessController.java

@@ -0,0 +1,182 @@
+/**
+ * Copyright © 2021-2025 <a href="http://www.jeeplus.org/">JeePlus</a> All rights reserved.
+ */
+package com.jeeplus.jsbb.controller;
+
+import javax.servlet.http.HttpServletResponse;
+import javax.validation.Valid;
+import com.google.common.collect.Lists;
+import com.jeeplus.core.excel.EasyExcelUtils;
+import com.jeeplus.core.excel.ExcelOptions;
+import com.jeeplus.core.excel.annotation.ExportMode;
+import com.jeeplus.core.query.QueryWrapperGenerator;
+import com.jeeplus.aop.logging.annotation.ApiLog;
+import io.swagger.annotations.Api;
+import io.swagger.annotations.ApiOperation;
+import org.springframework.http.ResponseEntity;
+import org.springframework.security.access.prepost.PreAuthorize;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.web.bind.annotation.*;
+import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
+import com.baomidou.mybatisplus.core.metadata.IPage;
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import com.jeeplus.jsbb.domain.LoginMess;
+import com.jeeplus.jsbb.service.dto.LoginMessDTO;
+import com.jeeplus.jsbb.service.mapstruct.LoginMessWrapper;
+import com.jeeplus.jsbb.service.LoginMessService;
+import org.springframework.web.multipart.MultipartFile;
+
+import java.io.IOException;
+import java.util.List;
+
+/**
+ * 角色维度报表Controller
+ * @author 孙伟宇
+ * @version 2025-04-25
+ */
+
+@Api(tags ="角色维度报表")
+@RestController
+@RequestMapping(value = "/jsbb/loginMess")
+public class LoginMessController {
+
+	@Autowired
+	private LoginMessService loginMessService;
+
+	@Autowired
+	private LoginMessWrapper loginMessWrapper;
+
+	/**
+	 * 角色维度报表列表数据
+	 */
+	@ApiLog("查询角色维度报表列表数据")
+	@ApiOperation(value = "查询角色维度报表列表数据")
+	@PreAuthorize("hasAuthority('jsbb:loginMess:list')")
+	@GetMapping("list")
+	/*public ResponseEntity<IPage<LoginMess>> list(LoginMessDTO loginMessDTO, Page<LoginMess> page) throws Exception {
+		QueryWrapper queryWrapper = QueryWrapperGenerator.buildQueryCondition (loginMessDTO, LoginMessDTO.class);
+		IPage<LoginMess> result = loginMessService.page (page, queryWrapper);
+		return ResponseEntity.ok (result);
+	}*/
+	public ResponseEntity<IPage<LoginMessDTO>> list(LoginMessDTO loginMessDTO, Page<LoginMessDTO> page) throws Exception {
+		QueryWrapper queryWrapper = QueryWrapperGenerator.buildQueryCondition (loginMessDTO, LoginMessDTO.class);
+		IPage<LoginMessDTO> result = loginMessService.findPage (page, queryWrapper,loginMessDTO.getName(),loginMessDTO.getRoleId());
+		return ResponseEntity.ok (result);
+	}
+
+
+	/**
+	 * 根据Id获取角色维度报表数据
+	 */
+	@ApiLog("根据Id获取角色维度报表数据")
+	@ApiOperation(value = "根据Id获取角色维度报表数据")
+	@PreAuthorize("hasAnyAuthority('jsbb:loginMess:view','jsbb:loginMess:add','jsbb:loginMess:edit')")
+	@GetMapping("queryById")
+	public ResponseEntity<LoginMessDTO> queryById(String id) {
+		return ResponseEntity.ok ( loginMessWrapper.toDTO ( loginMessService.getById ( id ) ) );
+	}
+
+	/**
+	 * 保存角色维度报表
+	 */
+	@ApiLog("保存角色维度报表")
+	@ApiOperation(value = "保存角色维度报表")
+	@PreAuthorize("hasAnyAuthority('jsbb:loginMess:add','jsbb:loginMess:edit')")
+	@PostMapping("save")
+	public  ResponseEntity <String> save(@Valid @RequestBody LoginMessDTO loginMessDTO) {
+		//新增或编辑表单保存
+		loginMessService.saveOrUpdate (loginMessWrapper.toEntity (loginMessDTO));
+        return ResponseEntity.ok ( "保存角色维度报表成功" );
+	}
+
+
+	/**
+	 * 删除角色维度报表
+	 */
+	@ApiLog("删除角色维度报表")
+	@ApiOperation(value = "删除角色维度报表")
+	@PreAuthorize("hasAuthority('jsbb:loginMess:del')")
+	@DeleteMapping("delete")
+	public ResponseEntity <String> delete(String ids) {
+		String idArray[] = ids.split(",");
+        loginMessService.removeByIds ( Lists.newArrayList ( idArray ) );
+		return ResponseEntity.ok( "删除角色维度报表成功" );
+	}
+	
+	/**
+     * 导出角色维度报表数据
+     *
+     * @param loginMessDTO
+     * @param page
+     * @param response
+     * @throws Exception
+     */
+    @ApiLog("导出角色维度报表数据")
+    @PreAuthorize("hasAnyAuthority('jsbb:loginMess:export')")
+    @GetMapping("export")
+    public void exportFile(LoginMessDTO loginMessDTO, Page <LoginMessDTO> page, ExcelOptions options, HttpServletResponse response) throws Exception {
+       /* String fileName = options.getFilename ( );
+		QueryWrapper queryWrapper = QueryWrapperGenerator.buildQueryCondition (loginMessDTO, LoginMessDTO.class);
+        if ( ExportMode.current.equals ( options.getMode ( ) ) ) { // 导出当前页数据
+            
+        } else if ( ExportMode.selected.equals ( options.getMode ( ) ) ) { // 导出选中数据
+            queryWrapper.in ( "id", options.getSelectIds () );
+        } else { // 导出全部数据
+            page.setSize ( -1 );
+            page.setCurrent ( 0 );
+        }
+        List < LoginMess> result = loginMessService.page ( page, queryWrapper ).getRecords ( );
+        EasyExcelUtils.newInstance ( loginMessService, loginMessWrapper ).exportExcel ( result,  options.getSheetName ( ), LoginMessDTO.class, fileName,options.getExportFields (), response );*/
+			String fileName = options.getFilename();
+			QueryWrapper<LoginMessDTO> queryWrapper = QueryWrapperGenerator.buildQueryCondition(loginMessDTO, LoginMessDTO.class);
+			// 根据导出模式处理查询条件
+			if (ExportMode.current.equals(options.getMode())) { // 导出当前页数据
+				// 不需要额外处理,直接使用分页参数
+			} else if (ExportMode.selected.equals(options.getMode())) { // 导出选中数据
+				queryWrapper.in("id", options.getSelectIds());
+			} else { // 导出全部数据
+				page.setSize(-1); // 设置分页大小为-1,表示查询全部数据
+				page.setCurrent(0); // 设置当前页为0
+			}
+			// 查询数据
+			IPage<LoginMessDTO> resultPage = loginMessService.findPage(page, queryWrapper,loginMessDTO.getName(),loginMessDTO.getRoleId());
+			List<LoginMessDTO> resultDTOs = resultPage.getRecords();
+
+			// 转换为DTO
+			/*List<LoginMessDTO> resultDTOs = result.stream()
+					.map(loginMess -> new LoginMessDTO(loginMess)) // 假设LoginMessDTO有对应的构造函数或转换方法
+					.collect(Collectors.toList());*/
+
+			// 导出Excel
+			EasyExcelUtils.newInstance(loginMessService, loginMessWrapper)
+					.exportExcel(resultDTOs, options.getSheetName(), LoginMessDTO.class, fileName, options.getExportFields(), response);
+
+    }
+
+    /**
+     * 导入角色维度报表数据
+     *
+     * @return
+     */
+    @PreAuthorize("hasAnyAuthority('jsbb:loginMess:import')")
+    @PostMapping("import")
+    public ResponseEntity importFile(MultipartFile file) throws IOException {
+        String result = EasyExcelUtils.newInstance ( loginMessService, loginMessWrapper ).importExcel ( file, LoginMessDTO.class );
+        return ResponseEntity.ok ( result );
+    }
+
+    /**
+     * 下载导入角色维度报表数据模板
+     *
+     * @param response
+     * @return
+     */
+    @PreAuthorize ("hasAnyAuthority('jsbb:loginMess:import')")
+    @GetMapping("import/template")
+    public void importFileTemplate(HttpServletResponse response) throws IOException {
+        String fileName = "角色维度报表数据导入模板.xlsx";
+        List<LoginMessDTO> list = Lists.newArrayList();
+        EasyExcelUtils.newInstance ( loginMessService, loginMessWrapper ).exportExcel ( list,  "角色维度报表数据", LoginMessDTO.class, fileName, null, response );
+    }
+
+}

+ 37 - 0
jp-console/jeeplus-module/ly/src/main/java/com/jeeplus/jsbb/domain/LoginMess.java

@@ -0,0 +1,37 @@
+/**
+ * Copyright © 2021-2025 <a href="http://www.jeeplus.org/">JeePlus</a> All rights reserved.
+ */
+package com.jeeplus.jsbb.domain;
+
+import com.baomidou.mybatisplus.annotation.TableField;
+import com.baomidou.mybatisplus.annotation.TableName;
+import com.jeeplus.core.domain.BaseEntity;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+/**
+ * 角色维度报表Entity
+ * @author 孙伟宇
+ * @version 2025-04-25
+ */
+@Data
+@EqualsAndHashCode(callSuper = false)
+@TableName("ly_login_Mess")
+public class LoginMess extends BaseEntity {
+
+	private static final long serialVersionUID = 1L;
+
+	/**
+     * 登入名称
+     */
+	private String name;
+	/**
+     * 是否登入
+     */
+	private String sfdr;
+	/**
+     * 登入时间
+     */
+    @TableField("Login_date")
+	private String LoginDate;
+
+}

+ 23 - 0
jp-console/jeeplus-module/ly/src/main/java/com/jeeplus/jsbb/mapper/LoginMessMapper.java

@@ -0,0 +1,23 @@
+/**
+ * Copyright © 2021-2025 <a href="http://www.jeeplus.org/">JeePlus</a> All rights reserved.
+ */
+package com.jeeplus.jsbb.mapper;
+
+import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import com.baomidou.mybatisplus.core.metadata.IPage;
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import com.jeeplus.jsbb.domain.LoginMess;
+import com.jeeplus.jsbb.service.dto.LoginMessDTO;
+
+/**
+ * 角色维度报表MAPPER接口
+ * @author 孙伟宇
+ * @version 2025-04-25
+ */
+public interface LoginMessMapper extends BaseMapper<LoginMess> {
+
+
+    IPage<LoginMessDTO> findList(Page<LoginMessDTO> page, QueryWrapper queryWrapper,String name,String roleId);
+
+}

+ 25 - 0
jp-console/jeeplus-module/ly/src/main/java/com/jeeplus/jsbb/mapper/xml/LoginMessMapper.xml

@@ -0,0 +1,25 @@
+<?xml version="1.0" encoding="UTF-8" ?>
+<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
+<mapper namespace="com.jeeplus.jsbb.mapper.LoginMessMapper">
+
+    <select id="findList" resultType="com.jeeplus.jsbb.service.dto.LoginMessDTO">
+        SELECT a.name AS name,
+               CASE WHEN a.login_date IS NULL THEN '否' ELSE '是' END AS sfdr,
+               a.login_date AS loginDate
+        FROM sys_user a
+                 LEFT JOIN sys_user_role b ON a.id = b.user_id
+                 LEFT JOIN sys_role c ON c.id = b.role_id
+        WHERE a.login_name != 'admin'
+      AND a.name IS NOT NULL
+      AND a.name != ''
+      and a.del_flag=0
+        <if test="name != null and name !=''">
+            and (a.name like concat('%',#{name}, '%'))
+        </if>
+        <if test="roleId != null and roleId !=''">
+            and c.id=#{roleId}
+        </if>
+        ORDER BY a.login_date IS NULL, a.login_date
+    </select>
+
+</mapper>

+ 29 - 0
jp-console/jeeplus-module/ly/src/main/java/com/jeeplus/jsbb/service/LoginMessService.java

@@ -0,0 +1,29 @@
+/**
+ * Copyright © 2021-2025 <a href="http://www.jeeplus.org/">JeePlus</a> All rights reserved.
+ */
+package com.jeeplus.jsbb.service;
+
+import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
+import com.baomidou.mybatisplus.core.metadata.IPage;
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import com.jeeplus.jsbb.service.dto.LoginMessDTO;
+import org.springframework.stereotype.Service;
+import org.springframework.transaction.annotation.Transactional;
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import com.jeeplus.jsbb.domain.LoginMess;
+import com.jeeplus.jsbb.mapper.LoginMessMapper;
+
+/**
+ * 角色维度报表Service
+ * @author 孙伟宇
+ * @version 2025-04-25
+ */
+@Service
+@Transactional
+public class LoginMessService extends ServiceImpl<LoginMessMapper, LoginMess> {
+
+    public IPage<LoginMessDTO> findPage(Page<LoginMessDTO> page, QueryWrapper queryWrapper,String name,String roleId) {
+       // queryWrapper.eq ("a.del_flag", 0 ); // 排除已经删除
+        return  baseMapper.findList (page, queryWrapper,name,roleId);
+    }
+}

+ 46 - 0
jp-console/jeeplus-module/ly/src/main/java/com/jeeplus/jsbb/service/dto/LoginMessDTO.java

@@ -0,0 +1,46 @@
+/**
+ * Copyright © 2021-2025 <a href="http://www.jeeplus.org/">JeePlus</a> All rights reserved.
+ */
+package com.jeeplus.jsbb.service.dto;
+
+import com.jeeplus.core.query.Query;
+import com.jeeplus.core.query.QueryType;
+import com.alibaba.excel.annotation.ExcelProperty;
+import com.jeeplus.core.service.dto.BaseDTO;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+/**
+ * 角色维度报表DTO
+ * @author 孙伟宇
+ * @version 2025-04-25
+ */
+@Data
+@EqualsAndHashCode(callSuper = false)
+public class LoginMessDTO extends BaseDTO {
+
+	private static final long serialVersionUID = 1L;
+
+	        
+	/**
+     * 登入名称
+     */
+    @Query(type = QueryType.EQ)
+	@ExcelProperty("登入名称") 
+	private String name;
+	        
+	/**
+     * 是否登入
+     */
+	@ExcelProperty("是否登入") 
+	private String sfdr;
+	        
+	/**
+     * 登入时间
+     */
+	@ExcelProperty("登入时间") 
+	private String loginDate;
+
+	@ExcelProperty("角色")
+	private String roleId;
+
+}

+ 24 - 0
jp-console/jeeplus-module/ly/src/main/java/com/jeeplus/jsbb/service/mapstruct/LoginMessWrapper.java

@@ -0,0 +1,24 @@
+/**
+ * Copyright © 2021-2025 <a href="http://www.jeeplus.org/">JeePlus</a> All rights reserved.
+ */
+package com.jeeplus.jsbb.service.mapstruct;
+
+
+import com.jeeplus.core.mapstruct.EntityWrapper;
+import com.jeeplus.jsbb.service.dto.LoginMessDTO;
+import com.jeeplus.jsbb.domain.LoginMess;
+import org.mapstruct.Mapper;
+import org.mapstruct.ReportingPolicy;
+import org.mapstruct.factory.Mappers;
+
+/**
+ *  LoginMessWrapper
+ * @author 孙伟宇
+ * @version 2025-04-25
+ */
+@Mapper(componentModel = "spring", unmappedTargetPolicy = ReportingPolicy.IGNORE, uses = {} )
+public interface LoginMessWrapper extends EntityWrapper<LoginMessDTO, LoginMess> {
+
+    LoginMessWrapper INSTANCE = Mappers.getMapper(LoginMessWrapper.class);
+}
+

+ 200 - 0
jp-console/jeeplus-module/ly/src/main/java/com/jeeplus/loginacea/controller/LoginAceController.java

@@ -0,0 +1,200 @@
+/**
+ * Copyright © 2021-2025 <a href="http://www.jeeplus.org/">JeePlus</a> All rights reserved.
+ */
+package com.jeeplus.loginacea.controller;
+
+import javax.servlet.http.HttpServletResponse;
+import javax.validation.Valid;
+import com.google.common.collect.Lists;
+import com.jeeplus.core.excel.EasyExcelUtils;
+import com.jeeplus.core.excel.ExcelOptions;
+import com.jeeplus.core.excel.annotation.ExportMode;
+import com.jeeplus.core.query.QueryWrapperGenerator;
+import com.jeeplus.aop.logging.annotation.ApiLog;
+import com.jeeplus.jsbb.service.dto.LoginMessDTO;
+import io.swagger.annotations.Api;
+import io.swagger.annotations.ApiOperation;
+import org.springframework.http.ResponseEntity;
+import org.springframework.security.access.prepost.PreAuthorize;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.web.bind.annotation.*;
+import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
+import com.baomidou.mybatisplus.core.metadata.IPage;
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import com.jeeplus.loginacea.domain.LoginAce;
+import com.jeeplus.loginacea.service.dto.LoginAceDTO;
+import com.jeeplus.loginacea.service.mapstruct.LoginAceWrapper;
+import com.jeeplus.loginacea.service.LoginAceService;
+import org.springframework.web.multipart.MultipartFile;
+
+import java.io.IOException;
+import java.util.List;
+import java.util.Map;
+
+/**
+ * 地区登入报表Controller
+ * @author 孙伟宇
+ * @version 2025-04-26
+ */
+
+@Api(tags ="地区登入报表")
+@RestController
+@RequestMapping(value = "/loginacea/loginAce")
+public class LoginAceController {
+
+	@Autowired
+	private LoginAceService loginAceService;
+
+	@Autowired
+	private LoginAceWrapper loginAceWrapper;
+
+	/**
+	 * 地区登入报表列表数据
+	 */
+	@ApiLog("查询地区登入报表列表数据")
+	@ApiOperation(value = "查询地区登入报表列表数据")
+	@PreAuthorize("hasAuthority('loginacea:loginAce:list')")
+	@GetMapping("list")
+	/*public ResponseEntity<IPage<LoginAce>> list(LoginAceDTO loginAceDTO, Page<LoginAce> page) throws Exception {
+		QueryWrapper queryWrapper = QueryWrapperGenerator.buildQueryCondition (loginAceDTO, LoginAceDTO.class);
+		IPage<LoginAce> result = loginAceService.page (page, queryWrapper);
+		return ResponseEntity.ok (result);
+	}*/
+
+	public ResponseEntity<IPage<LoginAceDTO>> list(LoginAceDTO loginAceDTO, Page<LoginAceDTO> page) throws Exception {
+		QueryWrapper queryWrapper = QueryWrapperGenerator.buildQueryCondition (loginAceDTO, LoginAceDTO.class);
+		IPage<LoginAceDTO> result = loginAceService.findPage (page, queryWrapper,loginAceDTO.getRoleId(),loginAceDTO.getDes1(),loginAceDTO.getDtime());
+		return ResponseEntity.ok (result);
+	}
+
+
+	/**
+	 * 根据Id获取地区登入报表数据
+	 */
+	/*@ApiLog("根据Id获取地区登入报表数据")
+	@ApiOperation(value = "根据Id获取地区登入报表数据")
+	@PreAuthorize("hasAnyAuthority('loginacea:loginAce:view','loginacea:loginAce:add','loginacea:loginAce:edit')")
+	@GetMapping("queryById")
+	public ResponseEntity<LoginAceDTO> queryById(String id) {
+		return ResponseEntity.ok ( loginAceWrapper.toDTO ( loginAceService.getById ( id ) ) );
+	}*/
+	@ApiLog("根据Id获取地区登入报表数据")
+	@ApiOperation(value = "根据Id获取地区登入报表数据")
+	@PreAuthorize("hasAnyAuthority('loginacea:loginAce:view','loginacea:loginAce:add','loginacea:loginAce:edit')")
+	@GetMapping("queryById")
+	public ResponseEntity<List<LoginAceDTO>> queryById(@RequestParam Map<String, Object> params) {
+		List<LoginAceDTO> result = loginAceService.findList1(params);
+		return ResponseEntity.ok(result);
+	}
+
+	/**
+	 * 保存地区登入报表
+	 */
+	@ApiLog("保存地区登入报表")
+	@ApiOperation(value = "保存地区登入报表")
+	@PreAuthorize("hasAnyAuthority('loginacea:loginAce:add','loginacea:loginAce:edit')")
+	@PostMapping("save")
+	public  ResponseEntity <String> save(@Valid @RequestBody LoginAceDTO loginAceDTO) {
+		//新增或编辑表单保存
+		loginAceService.saveOrUpdate (loginAceWrapper.toEntity (loginAceDTO));
+        return ResponseEntity.ok ( "保存地区登入报表成功" );
+	}
+
+
+	/**
+	 * 删除地区登入报表
+	 */
+	@ApiLog("删除地区登入报表")
+	@ApiOperation(value = "删除地区登入报表")
+	@PreAuthorize("hasAuthority('loginacea:loginAce:del')")
+	@DeleteMapping("delete")
+	public ResponseEntity <String> delete(String ids) {
+		String idArray[] = ids.split(",");
+        loginAceService.removeByIds ( Lists.newArrayList ( idArray ) );
+		return ResponseEntity.ok( "删除地区登入报表成功" );
+	}
+	
+	/**
+     * 导出地区登入报表数据
+     *
+     * @param loginAceDTO
+     * @param page
+     * @param response
+     * @throws Exception
+     */
+    /*@ApiLog("导出地区登入报表数据")
+    @PreAuthorize("hasAnyAuthority('loginacea:loginAce:export')")
+    @GetMapping("export")
+    public void exportFile(LoginAceDTO loginAceDTO, Page <LoginAce> page, ExcelOptions options, HttpServletResponse response) throws Exception {
+        String fileName = options.getFilename ( );
+		QueryWrapper queryWrapper = QueryWrapperGenerator.buildQueryCondition (loginAceDTO, LoginAceDTO.class);
+        if ( ExportMode.current.equals ( options.getMode ( ) ) ) { // 导出当前页数据
+            
+        } else if ( ExportMode.selected.equals ( options.getMode ( ) ) ) { // 导出选中数据
+            queryWrapper.in ( "id", options.getSelectIds () );
+        } else { // 导出全部数据
+            page.setSize ( -1 );
+            page.setCurrent ( 0 );
+        }
+        List < LoginAce> result = loginAceService.page ( page, queryWrapper ).getRecords ( );
+        EasyExcelUtils.newInstance ( loginAceService, loginAceWrapper ).exportExcel ( result,  options.getSheetName ( ), LoginAceDTO.class, fileName,options.getExportFields (), response );
+    }*/
+	@ApiLog("导出地区登入报表数据")
+	@PreAuthorize("hasAnyAuthority('loginacea:loginAce:export')")
+	@GetMapping("export")
+	public void exportFile(LoginAceDTO loginAceDTO, Page<LoginAceDTO> page, ExcelOptions options, HttpServletResponse response) throws Exception {
+		String fileName = options.getFilename();
+		QueryWrapper<LoginAceDTO> queryWrapper = QueryWrapperGenerator.buildQueryCondition(loginAceDTO, LoginAceDTO.class);
+
+		// 根据导出模式处理查询条件
+		if (ExportMode.current.equals(options.getMode())) { // 导出当前页数据
+			// 不需要额外处理,直接使用分页参数
+		} else if (ExportMode.selected.equals(options.getMode())) { // 导出选中数据
+			queryWrapper.in("id", options.getSelectIds());
+		} else { // 导出全部数据
+			page.setSize(-1); // 设置分页大小为-1,表示查询全部数据
+			page.setCurrent(0); // 设置当前页为0
+		}
+
+		// 查询数据
+		IPage<LoginAceDTO> resultPage = loginAceService.findPage (page, queryWrapper,loginAceDTO.getRoleId(),loginAceDTO.getDes1(),loginAceDTO.getDtime());
+
+		List<LoginAceDTO> resultDTOs = resultPage.getRecords();
+
+		// 转换为DTO
+		/*List<LoginAceDTO> resultDTOs = result.stream()
+				.map(loginAce -> new LoginAceDTO(loginAce)) // 假设LoginAceDTO有对应的构造函数或转换方法
+				.collect(Collectors.toList());*/
+
+		// 导出Excel
+		EasyExcelUtils.newInstance(loginAceService, loginAceWrapper)
+				.exportExcel(resultDTOs, options.getSheetName(), LoginAceDTO.class, fileName, options.getExportFields(), response);
+	}
+
+    /**
+     * 导入地区登入报表数据
+     *
+     * @return
+     */
+    @PreAuthorize("hasAnyAuthority('loginacea:loginAce:import')")
+    @PostMapping("import")
+    public ResponseEntity importFile(MultipartFile file) throws IOException {
+        String result = EasyExcelUtils.newInstance ( loginAceService, loginAceWrapper ).importExcel ( file, LoginAceDTO.class );
+        return ResponseEntity.ok ( result );
+    }
+
+    /**
+     * 下载导入地区登入报表数据模板
+     *
+     * @param response
+     * @return
+     */
+    @PreAuthorize ("hasAnyAuthority('loginacea:loginAce:import')")
+    @GetMapping("import/template")
+    public void importFileTemplate(HttpServletResponse response) throws IOException {
+        String fileName = "地区登入报表数据导入模板.xlsx";
+        List<LoginAceDTO> list = Lists.newArrayList();
+        EasyExcelUtils.newInstance ( loginAceService, loginAceWrapper ).exportExcel ( list,  "地区登入报表数据", LoginAceDTO.class, fileName, null, response );
+    }
+
+}

+ 55 - 0
jp-console/jeeplus-module/ly/src/main/java/com/jeeplus/loginacea/domain/LoginAce.java

@@ -0,0 +1,55 @@
+/**
+ * Copyright © 2021-2025 <a href="http://www.jeeplus.org/">JeePlus</a> All rights reserved.
+ */
+package com.jeeplus.loginacea.domain;
+
+import com.baomidou.mybatisplus.annotation.TableName;
+import com.jeeplus.core.domain.BaseEntity;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+/**
+ * 地区登入报表Entity
+ * @author 孙伟宇
+ * @version 2025-04-26
+ */
+@Data
+@EqualsAndHashCode(callSuper = false)
+@TableName("ly_lgoin_ace")
+public class LoginAce extends BaseEntity {
+
+	private static final long serialVersionUID = 1L;
+
+	/**
+     * 地区
+     */
+	private String des1;
+	/**
+     * 关联总数
+     */
+	private String totalCount;
+	/**
+     * 已登入用户数
+     */
+	private String loginYesc;
+	/**
+     * 未登入用户数
+     */
+	private String loginNotc;
+	/**
+     * 用户名
+     */
+	private String loginName;
+	/**
+     * 姓名
+     */
+	private String name;
+	/**
+     * 挂钩企业
+     */
+	private String ggqy;
+	/**
+     * 最近登入时间
+     */
+	private String loginDate;
+
+}

+ 29 - 0
jp-console/jeeplus-module/ly/src/main/java/com/jeeplus/loginacea/mapper/LoginAceMapper.java

@@ -0,0 +1,29 @@
+/**
+ * Copyright © 2021-2025 <a href="http://www.jeeplus.org/">JeePlus</a> All rights reserved.
+ */
+package com.jeeplus.loginacea.mapper;
+
+import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import com.baomidou.mybatisplus.core.metadata.IPage;
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import com.jeeplus.loginacea.domain.LoginAce;
+import com.jeeplus.loginacea.service.dto.LoginAceDTO;
+
+import java.util.List;
+import java.util.Map;
+
+/**
+ * 地区登入报表MAPPER接口
+ * @author 孙伟宇
+ * @version 2025-04-26
+ */
+public interface LoginAceMapper extends BaseMapper<LoginAce> {
+
+
+    IPage<LoginAceDTO> findList(Page<LoginAceDTO> page, QueryWrapper queryWrapper,String roleId,String des1,String dtime);
+
+
+    List<LoginAceDTO> findList1(Map<String, Object> params);
+
+}

+ 91 - 0
jp-console/jeeplus-module/ly/src/main/java/com/jeeplus/loginacea/mapper/xml/LoginAceMapper.xml

@@ -0,0 +1,91 @@
+<?xml version="1.0" encoding="UTF-8" ?>
+<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
+<mapper namespace="com.jeeplus.loginacea.mapper.LoginAceMapper">
+
+    <select id="findList" resultType="com.jeeplus.loginacea.service.dto.LoginAceDTO">
+        SELECT
+            ei.des1 AS des1,
+            COUNT( su.ID) AS totalCount,
+            COUNT( CASE WHEN su.login_date IS NOT NULL THEN su.ID END) AS loginYesc,
+            COUNT( CASE WHEN su.login_date IS NULL THEN su.ID END) AS loginNotc
+        FROM
+            ly_enterprise_info AS ei
+                LEFT JOIN
+            sys_user AS su
+            ON
+                su.login_name IN (ei.des13, ei.bz6, ei.phone)
+                LEFT JOIN
+            sys_user_role AS sur
+            ON
+                sur.user_id = su.ID
+                LEFT JOIN
+            sys_role AS sr
+            ON
+                sr.ID = sur.role_id
+        WHERE
+            ei.del_flag=0
+          and sr.id not in ('ade960e8f02544998b07397304c059c1','17bac1f980264e3e8193bc965538e2c6')
+        <if test="roleId != null and roleId !=''">
+            and sr.id=#{roleId}
+        </if>
+        <if test="des1 != null and des1 !=''">
+            and ei.des1=#{des1}
+        </if>
+        <if test="dtime != null and dtime ==1">
+/*            and su.login_date >= DATE_FORMAT(CURDATE(), '%Y-01-01') AND su.login_date <![CDATA[<]]> DATE_FORMAT(CURDATE(), '%Y-01-01') + INTERVAL 1
+*/
+            and YEAR(su.login_date) = YEAR(CURDATE())
+        </if>
+        <if test="dtime != null and dtime ==2">
+            and su.login_date >= DATE_FORMAT(CURDATE(), '%Y-%m-01') AND su.login_date <![CDATA[<]]> DATE_FORMAT(CURDATE(), '%Y-%m-01') + INTERVAL 1 MONTH
+        </if>
+        <if test="dtime != null and dtime ==3">
+            and su.login_date >= DATE_FORMAT(CURDATE() - INTERVAL (DAYOFWEEK(CURDATE()) - 1) DAY, '%Y-%m-%d') AND su.login_date <![CDATA[<]]> DATE_FORMAT(CURDATE() - INTERVAL (DAYOFWEEK(CURDATE()) - 1) DAY, '%Y-%m-%d') + INTERVAL 1 YEAR
+        </if>
+        GROUP BY
+            ei.des1
+    </select>
+
+    <select id="findList1" resultType="com.jeeplus.loginacea.service.dto.LoginAceDTO">
+        SELECT
+            su.login_name AS loginName,
+            su.name AS name,
+            su.login_date AS loginDate,
+            ei.name AS ggqy
+        FROM
+            ly_enterprise_info AS ei
+                LEFT JOIN
+            sys_user AS su ON su.login_name IN (ei.des13, ei.bz6, ei.phone)
+                LEFT JOIN
+            sys_user_role AS sur ON sur.user_id = su.ID
+                LEFT JOIN
+            sys_role AS sr ON sr.ID = sur.role_id
+        WHERE
+            ei.del_flag = 0
+          AND sr.id NOT IN ('ade960e8f02544998b07397304c059c1', '17bac1f980264e3e8193bc965538e2c6')
+        <if test="roleId != null and roleId !=''">
+            and sr.id=#{roleId}
+        </if>
+        <if test="des1 != null and des1 !=''">
+            and ei.des1=#{des1}
+        </if>
+        <if test="dtime != null and dtime ==1">
+            and YEAR(su.login_date) = YEAR(CURDATE())
+        </if>
+        <if test="dtime != null and dtime ==2">
+            and su.login_date >= DATE_FORMAT(CURDATE(), '%Y-%m-01') AND su.login_date <![CDATA[<]]> DATE_FORMAT(CURDATE(), '%Y-%m-01') + INTERVAL 1 MONTH
+        </if>
+        <if test="dtime != null and dtime ==3">
+            and su.login_date >= DATE_FORMAT(CURDATE() - INTERVAL (DAYOFWEEK(CURDATE()) - 1) DAY, '%Y-%m-%d') AND su.login_date <![CDATA[<]]> DATE_FORMAT(CURDATE() - INTERVAL (DAYOFWEEK(CURDATE()) - 1) DAY, '%Y-%m-%d') + INTERVAL 1 YEAR
+        </if>
+        <if test="status != null and status ==1">
+            and su.login_date IS NOT NULL
+        </if>
+        <if test="status != null and status ==2">
+            and su.login_date IS  NULL
+        </if>
+        GROUP BY
+            su.login_name, su.name, su.login_date, ei.name;
+    </select>
+
+</mapper>

+ 36 - 0
jp-console/jeeplus-module/ly/src/main/java/com/jeeplus/loginacea/service/LoginAceService.java

@@ -0,0 +1,36 @@
+/**
+ * Copyright © 2021-2025 <a href="http://www.jeeplus.org/">JeePlus</a> All rights reserved.
+ */
+package com.jeeplus.loginacea.service;
+
+import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
+import com.baomidou.mybatisplus.core.metadata.IPage;
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import com.jeeplus.loginacea.service.dto.LoginAceDTO;
+import org.springframework.stereotype.Service;
+import org.springframework.transaction.annotation.Transactional;
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import com.jeeplus.loginacea.domain.LoginAce;
+import com.jeeplus.loginacea.mapper.LoginAceMapper;
+
+import java.util.List;
+import java.util.Map;
+
+/**
+ * 地区登入报表Service
+ * @author 孙伟宇
+ * @version 2025-04-26
+ */
+@Service
+@Transactional
+public class LoginAceService extends ServiceImpl<LoginAceMapper, LoginAce> {
+
+    public IPage<LoginAceDTO> findPage(Page<LoginAceDTO> page, QueryWrapper queryWrapper,String roleId,String des1,String dtime) {
+        // queryWrapper.eq ("a.del_flag", 0 ); // 排除已经删除
+        return  baseMapper.findList (page, queryWrapper,roleId,des1,dtime);
+    }
+
+    public List<LoginAceDTO> findList1(Map<String, Object> params) {
+        return  baseMapper.findList1(params);
+    }
+}

+ 74 - 0
jp-console/jeeplus-module/ly/src/main/java/com/jeeplus/loginacea/service/dto/LoginAceDTO.java

@@ -0,0 +1,74 @@
+/**
+ * Copyright © 2021-2025 <a href="http://www.jeeplus.org/">JeePlus</a> All rights reserved.
+ */
+package com.jeeplus.loginacea.service.dto;
+
+import com.alibaba.excel.annotation.ExcelProperty;
+import com.jeeplus.core.service.dto.BaseDTO;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+/**
+ * 地区登入报表DTO
+ * @author 孙伟宇
+ * @version 2025-04-26
+ */
+@Data
+@EqualsAndHashCode(callSuper = false)
+public class LoginAceDTO extends BaseDTO {
+
+	private static final long serialVersionUID = 1L;
+
+	        
+	/**
+     * 地区
+     */
+	@ExcelProperty("地区") 
+	private String des1;
+	        
+	/**
+     * 关联总数
+     */
+	@ExcelProperty("关联总数") 
+	private String totalCount;
+	        
+	/**
+     * 已登入用户数
+     */
+	@ExcelProperty("已登入用户数") 
+	private String loginYesc;
+	        
+	/**
+     * 未登入用户数
+     */
+	@ExcelProperty("未登入用户数") 
+	private String loginNotc;
+	        
+	/**
+     * 用户名
+     */
+	/*@ExcelProperty("用户名")*/
+	private String loginName;
+	        
+	/**
+     * 姓名
+     */
+	/*@ExcelProperty("姓名") */
+	private String name;
+	        
+	/**
+     * 挂钩企业
+     */
+	/*@ExcelProperty("挂钩企业") */
+	private String ggqy;
+	        
+	/**
+     * 最近登入时间
+     */
+	/*@ExcelProperty("最近登入时间") */
+	private String loginDate;
+
+	private String roleId;
+
+	private String dtime;
+
+}

+ 24 - 0
jp-console/jeeplus-module/ly/src/main/java/com/jeeplus/loginacea/service/mapstruct/LoginAceWrapper.java

@@ -0,0 +1,24 @@
+/**
+ * Copyright © 2021-2025 <a href="http://www.jeeplus.org/">JeePlus</a> All rights reserved.
+ */
+package com.jeeplus.loginacea.service.mapstruct;
+
+
+import com.jeeplus.core.mapstruct.EntityWrapper;
+import com.jeeplus.loginacea.service.dto.LoginAceDTO;
+import com.jeeplus.loginacea.domain.LoginAce;
+import org.mapstruct.Mapper;
+import org.mapstruct.ReportingPolicy;
+import org.mapstruct.factory.Mappers;
+
+/**
+ *  LoginAceWrapper
+ * @author 孙伟宇
+ * @version 2025-04-26
+ */
+@Mapper(componentModel = "spring", unmappedTargetPolicy = ReportingPolicy.IGNORE, uses = {} )
+public interface LoginAceWrapper extends EntityWrapper<LoginAceDTO, LoginAce> {
+
+    LoginAceWrapper INSTANCE = Mappers.getMapper(LoginAceWrapper.class);
+}
+

+ 60 - 0
jp-ui/src/api/jsbb/loginMessService.js

@@ -0,0 +1,60 @@
+import request from '@/utils/httpRequest'
+
+export default {
+  save: function (inputForm) {
+    return request({
+      url: '/jsbb/loginMess/save',
+      method: 'post',
+      data: inputForm
+    })
+  },
+
+  delete: function (ids) {
+    return request({
+      url: '/jsbb/loginMess/delete',
+      method: 'delete',
+      params: {ids: ids}
+    })
+  },
+
+  queryById: function (id) {
+    return request({
+      url: '/jsbb/loginMess/queryById',
+      method: 'get',
+      params: {id: id}
+    })
+  },
+
+  list: function (params) {
+    return request({
+      url: '/jsbb/loginMess/list',
+      method: 'get',
+      params: params
+    })
+  },
+
+  exportTemplate: function () {
+    return request({
+      url: '/jsbb/loginMess/import/template',
+      method: 'get',
+      responseType: 'blob'
+    })
+  },
+
+  exportExcel: function (params) {
+    return request({
+      url: '/jsbb/loginMess/export',
+      method: 'get',
+      params: params,
+      responseType: 'blob'
+    })
+  },
+
+  importExcel: function (data) {
+    return request({
+      url: '/jsbb/loginMess/import',
+      method: 'post',
+      data: data
+    })
+  }
+}

+ 61 - 0
jp-ui/src/api/loginacea/loginAceService.js

@@ -0,0 +1,61 @@
+import request from '@/utils/httpRequest'
+
+export default {
+  save: function (inputForm) {
+    return request({
+      url: '/loginacea/loginAce/save',
+      method: 'post',
+      data: inputForm
+    })
+  },
+
+  delete: function (ids) {
+    return request({
+      url: '/loginacea/loginAce/delete',
+      method: 'delete',
+      params: {ids: ids}
+    })
+  },
+
+  queryById: function (params) {
+    return request({
+      url: '/loginacea/loginAce/queryById',
+      method: 'get',
+      /* params: {id: id} */
+      params: params
+    })
+  },
+
+  list: function (params) {
+    return request({
+      url: '/loginacea/loginAce/list',
+      method: 'get',
+      params: params
+    })
+  },
+
+  exportTemplate: function () {
+    return request({
+      url: '/loginacea/loginAce/import/template',
+      method: 'get',
+      responseType: 'blob'
+    })
+  },
+
+  exportExcel: function (params) {
+    return request({
+      url: '/loginacea/loginAce/export',
+      method: 'get',
+      params: params,
+      responseType: 'blob'
+    })
+  },
+
+  importExcel: function (data) {
+    return request({
+      url: '/loginacea/loginAce/import',
+      method: 'post',
+      data: data
+    })
+  }
+}

+ 105 - 0
jp-ui/src/views/modules/jsbb/LoginMessForm.vue

@@ -0,0 +1,105 @@
+<template>
+<div>
+  <el-dialog
+    :title="title"
+    :close-on-click-modal="false"
+     v-dialogDrag
+    :visible.sync="visible">
+    <el-form :model="inputForm" size="small" ref="inputForm" v-loading="loading" :class="method==='view'?'readonly':''"  :disabled="method==='view'"
+             label-width="120px">
+      <el-row  :gutter="15">
+        <el-col :span="12">
+            <el-form-item label="登入名称" prop="name"
+                :rules="[
+                 ]">
+              <el-input v-model="inputForm.name" placeholder="请填写登入名称"     ></el-input>
+           </el-form-item>
+        </el-col>
+        <el-col :span="12">
+            <el-form-item label="是否登入" prop="sfdr"
+                :rules="[
+                 ]">
+              <el-input v-model="inputForm.sfdr" placeholder="请填写是否登入"     ></el-input>
+           </el-form-item>
+        </el-col>
+        <el-col :span="12">
+            <el-form-item label="登入时间" prop="LoginDate"
+                :rules="[
+                 ]">
+              <el-input v-model="inputForm.LoginDate" placeholder="请填写登入时间"     ></el-input>
+           </el-form-item>
+        </el-col>
+        </el-row>
+    </el-form>
+    <span slot="footer" class="dialog-footer">
+      <el-button size="small" @click="visible = false">关闭</el-button>
+      <el-button size="small" type="primary" v-if="method != 'view'" @click="doSubmit()" v-noMoreClick>确定</el-button>
+    </span>
+  </el-dialog>
+</div>
+</template>
+
+<script>
+  import loginMessService from '@/api/jsbb/loginMessService'
+  export default {
+    data () {
+      return {
+        title: '',
+        method: '',
+        visible: false,
+        loading: false,
+        inputForm: {
+          id: '',
+          name: '',
+          sfdr: '',
+          LoginDate: ''
+        }
+      }
+    },
+    components: {
+    },
+    methods: {
+      init (method, id) {
+        this.method = method
+        this.inputForm.id = id
+        if (method === 'add') {
+          this.title = `新建角色维度报表`
+        } else if (method === 'edit') {
+          this.title = '修改角色维度报表'
+        } else if (method === 'view') {
+          this.title = '查看角色维度报表'
+        }
+        this.visible = true
+        this.loading = false
+        this.$nextTick(() => {
+          this.$refs.inputForm.resetFields()
+          if (method === 'edit' || method === 'view') { // 修改或者查看
+            this.loading = true
+            loginMessService.queryById(this.inputForm.id).then(({data}) => {
+              this.inputForm = this.recover(this.inputForm, data)
+              this.loading = false
+            })
+          }
+        })
+      },
+      // 表单提交
+      doSubmit () {
+        this.$refs['inputForm'].validate((valid) => {
+          if (valid) {
+            this.loading = true
+            loginMessService.save(this.inputForm).then(({data}) => {
+              this.visible = false
+              this.$message.success(data)
+              this.$emit('refreshDataList')
+              this.loading = false
+            }).catch(() => {
+              this.loading = false
+            })
+          }
+        })
+      }
+    }
+  }
+</script>
+
+  

+ 278 - 0
jp-ui/src/views/modules/jsbb/LoginMessList.vue

@@ -0,0 +1,278 @@
+<template>
+    <div class="page">
+      <el-form size="small" :inline="true" class="query-form" ref="searchForm" :model="searchForm" @keyup.enter.native="refreshList()" @submit.native.prevent>
+          <!-- 搜索框 -->
+          <el-form-item prop="name">
+              <el-input size="small" v-model="searchForm.name" placeholder="登入名称" clearable></el-input>
+          </el-form-item>
+          <!-- 角色选择框 -->
+          <el-form-item prop="roleId">
+              <el-select size="small" v-model="searchForm.roleId" placeholder="选择角色" clearable>
+                  <el-option label="都企供需-挂钩干部" value="1910141956174053377"></el-option>
+                  <el-option label="区“企业大走访”办公室" value="1910175386924417025"></el-option>
+                  <el-option label="办理部门" value="1910175949166673921"></el-option>
+                  <el-option label="大走访-挂钩干部/部门" value="1915280292672946177"></el-option>
+                  <el-option label="企业用户" value="38a14f1f42ed424eab4cb5d489596b0d"></el-option>
+              </el-select>
+          </el-form-item>
+          <!-- 操作按钮 -->
+          <el-form-item>
+              <el-button type="primary" @click="refreshList()" size="small" icon="el-icon-search">查询</el-button>
+              <el-button @click="resetSearch()" size="small" icon="el-icon-refresh-right">重置</el-button>
+          </el-form-item>
+      </el-form>
+
+     <div class="bg-white top">
+        <vxe-toolbar :refresh="{query: refreshList}" import export print custom>
+          <template #buttons>
+           <!-- <el-button v-if="hasPermission('jsbb:loginMess:add')" type="primary" size="small" icon="el-icon-plus" @click="add()">新建</el-button>
+            <el-button v-if="hasPermission('jsbb:loginMess:edit')" type="warning" size="small" icon="el-icon-edit-outline" @click="edit()" :disabled="$refs.loginMessTable && $refs.loginMessTable.getCheckboxRecords().length !== 1" plain>修改</el-button>
+            <el-button v-if="hasPermission('jsbb:loginMess:del')" type="danger"   size="small" icon="el-icon-delete" @click="del()" :disabled="$refs.loginMessTable && $refs.loginMessTable.getCheckboxRecords().length === 0" plain>删除</el-button> -->
+          </template>
+          <template #tools>
+            <vxe-button
+    		  type="default"
+    		  title="下载导入模板"
+    		  v-if="hasPermission('jsbb:loginMess:import')"
+    		  class="el-icon-document m-r-12"
+    		  @click="downloadTpl()"
+    		  circle
+            >
+            </vxe-button>
+          </template>
+        </vxe-toolbar>
+        <div style="height: calc(100% - 80px);">
+        <vxe-table
+            border="inner"
+            auto-resize
+            resizable
+            height="auto"
+            :loading="loading"
+            size="small"
+            ref="loginMessTable"
+            show-header-overflow
+            show-overflow
+            highlight-hover-row
+            :menu-config="{}"
+            :print-config="{}"
+            :import-config="{
+            importMethod: importMethod,
+                types: ['csv', 'xls', 'xlsx'],
+                remote: true,
+            }"
+            :export-config="{
+                remote: true,
+                filename: `角色维度报表数据${moment(new Date()).format(
+            		'YYYY-MM-DD'
+                )}`,
+                sheetName: '角色维度报表数据',
+                exportMethod: exportMethod,
+                types: ['xlsx'],
+                modes: ['current', 'selected', 'all'],
+            }"
+            @sort-change="sortChangeHandle"
+            :sort-config="{remote:true}"
+            :data="dataList"
+            :checkbox-config="{}">
+            <vxe-column type="seq" width="40"></vxe-column>
+            <vxe-column type="checkbox"  width="100px"></vxe-column>
+    <vxe-column
+        field="name"
+        sortable
+        title="登入名称">
+            <!-- <template slot-scope="scope">
+              <el-link  type="primary" :underline="false" v-if="hasPermission('jsbb:loginMess:edit')" @click="edit(scope.row.id)">{{scope.row.name}}</el-link>
+              <el-link  type="primary" :underline="false" v-else-if="hasPermission('jsbb:loginMess:view')"  @click="view(scope.row.id)">{{scope.row.name}}</el-link>
+              <span v-else>{{scope.row.name}}</span>
+            </template> -->
+      </vxe-column>
+    <vxe-column
+        field="sfdr"
+        sortable
+        title="是否登入">
+      </vxe-column>
+    <vxe-column
+        field="loginDate"
+        sortable
+        title="登入时间">
+      </vxe-column>
+      <!-- <vxe-column
+        fixed="right"
+        align="center"
+        width="200"
+        title="操作">
+        <template  slot-scope="scope">
+          <el-button v-if="hasPermission('jsbb:loginMess:view')" type="text" icon="el-icon-view" size="small" @click="view(scope.row.id)">查看</el-button>
+          <el-button v-if="hasPermission('jsbb:loginMess:edit')" type="text" icon="el-icon-edit" size="small" @click="edit(scope.row.id)">修改</el-button>
+          <el-button v-if="hasPermission('jsbb:loginMess:del')" type="text"  icon="el-icon-delete" size="small" @click="del(scope.row.id)">删除</el-button>
+        </template>
+      </vxe-column> -->
+    </vxe-table>
+    <vxe-pager
+      background
+      size="small"
+      :current-page="tablePage.currentPage"
+      :page-size="tablePage.pageSize"
+      :total="tablePage.total"
+      :page-sizes="[10, 20, 100, 1000, {label: '全量数据', value: 1000000}]"
+      :layouts="['PrevPage', 'JumpNumber', 'NextPage', 'FullJump', 'Sizes', 'Total']"
+      @page-change="currentChangeHandle">
+    </vxe-pager>
+    </div>
+    </div>
+        <!-- 弹窗, 新增 / 修改 -->
+    <LoginMessForm  ref="loginMessForm" @refreshDataList="refreshList"></LoginMessForm>
+  </div>
+</template>
+
+<script>
+  import LoginMessForm from './LoginMessForm'
+  import loginMessService from '@/api/jsbb/loginMessService'
+  export default {
+    data () {
+      return {
+        searchForm: {
+          name: '',
+          roleId:''
+        },
+        dataList: [],
+        tablePage: {
+          total: 0,
+          currentPage: 1,
+          pageSize: 999
+        },
+        loading: false
+      }
+    },
+    components: {
+      LoginMessForm
+    },
+    activated () {
+      this.refreshList()
+    },
+    methods: {
+      // 获取数据列表
+      refreshList () {
+        this.loading = true
+        loginMessService.list({
+          'current': this.tablePage.currentPage,
+          'size': this.tablePage.pageSize,
+          'orders': this.tablePage.orders,
+          ...this.searchForm
+        }).then(({data}) => {
+          this.dataList = data.records
+          this.tablePage.total = data.total
+          this.loading = false
+        })
+      },
+      // 当前页
+      currentChangeHandle ({ currentPage, pageSize }) {
+        this.tablePage.currentPage = currentPage
+        this.tablePage.pageSize = pageSize
+        this.refreshList()
+      },
+      // 排序
+      sortChangeHandle (obj) {
+        this.tablePage.orders = []
+        if (obj.order != null) {
+          this.tablePage.orders = [{ column: obj.column.sortBy || this.$utils.toLine(obj.property), asc: obj.order === 'asc' }]
+        } else {
+          this.tablePage.orders = [{ column: 'create_date', asc: false }]
+        }
+        this.refreshList()
+      },
+      // 新增
+      add () {
+        this.$refs.loginMessForm.init('add', '')
+      },
+      // 修改
+      edit (id) {
+        id = id || this.$refs.loginMessTable.getCheckboxRecords().map(item => {
+          return item.id
+        })[0]
+        this.$refs.loginMessForm.init('edit', id)
+      },
+      // 查看
+      view (id) {
+        this.$refs.loginMessForm.init('view', id)
+      },
+      // 删除
+      del (id) {
+        let ids = id || this.$refs.loginMessTable.getCheckboxRecords().map(item => {
+          return item.id
+        }).join(',')
+        this.$confirm(`确定删除所选项吗?`, '提示', {
+          confirmButtonText: '确定',
+          cancelButtonText: '取消',
+          type: 'warning'
+        }).then(() => {
+          this.loading = true
+          loginMessService.delete(ids).then(({data}) => {
+            this.$message.success(data)
+            this.refreshList()
+            this.loading = false
+          })
+        })
+      },
+      // 下载模板
+      downloadTpl () {
+        this.loading = true
+        loginMessService.exportTemplate().then(({data}) => {
+    // 将二进制流文件写入excel表,以下为重要步骤
+          this.$utils.downloadExcel(data, '请假表单导入模板')
+          this.loading = false
+        }).catch(function (err) {
+          this.loading = false
+          if (err.response) {
+            console.log(err.response)
+          }
+        })
+      },
+      // 自定义服务端导入
+      importMethod ({ file }) {
+      // 处理表单
+        const formBody = new FormData()
+        formBody.append('file', file)
+        this.loading = true
+        loginMessService.importExcel(formBody).then(({data}) => {
+          this.$message.success({
+            dangerouslyUseHTMLString: true,
+            message: data
+          })
+          this.refreshList()
+        })
+      },
+      // 自定义服务端导出
+      exportMethod ({ options }) {
+      // 传给服务端的参数
+        const params = {
+          current: this.tablePage.currentPage,
+          size: this.tablePage.pageSize,
+          orders: this.tablePage.orders,
+          ...this.searchForm,
+          filename: options.filename,
+          sheetName: options.sheetName,
+          isHeader: options.isHeader,
+          original: options.original,
+          mode: options.mode,
+          selectIds: options.mode === 'selected' ? options.data.map((item) => item.id) : [],
+          exportFields: options.columns.map((column) => column.property && column.property.split('.')[0])
+        }
+        this.loading = true
+        return loginMessService.exportExcel(params).then(({data}) => {
+      // 将二进制流文件写入excel表,以下为重要步骤
+          this.$utils.downloadExcel(data, options.filename)
+          this.loading = false
+        }).catch(function (err) {
+          if (err.response) {
+            console.log(err.response)
+          }
+        })
+      },
+      resetSearch () {
+        this.$refs.searchForm.resetFields()
+        this.refreshList()
+      }
+    }
+  }
+</script>

+ 124 - 0
jp-ui/src/views/modules/loginacea/LoginAceForm.vue

@@ -0,0 +1,124 @@
+<template>
+  <div>
+    <el-dialog
+      :title="title"
+      :close-on-click-modal="false"
+      v-dialogDrag
+      :visible.sync="visible">
+      <el-table
+        :data="dataList"
+        size="small"
+        border
+        stripe
+        style="width: 100%">
+        <el-table-column
+          prop="loginName"
+          label="用户名"
+          width="180">
+        </el-table-column>
+        <el-table-column
+          prop="name"
+          label="姓名"
+          width="180">
+        </el-table-column>
+        <el-table-column
+          prop="ggqy"
+          label="挂钩企业"
+          width="200">
+        </el-table-column>
+        <el-table-column
+          prop="loginDate"
+          label="最近登入时间"
+         >
+        </el-table-column>
+      </el-table>
+    </el-dialog>
+  </div>
+</template>
+
+<script>
+  import loginAceService from '@/api/loginacea/loginAceService'
+  export default {
+    data () {
+      return {
+        title: '地区登入报表数据',
+        visible: false,
+        loading: false,
+        dataList: [], // 用于存储查询结果
+        inputForm: {
+          id: '',
+          des1: '',
+          roleId: '',
+          dtime: '',
+          status: ''
+        }
+      }
+    },
+    components: {
+    },
+   /* methods: {
+      init (method, id, des1, roleId, dtime,status) {
+        this.method = method
+        this.inputForm.id = id
+        if (method === 'add') {
+          this.title = `新建地区登入报表`
+        } else if (method === 'edit') {
+          this.title = '修改地区登入报表'
+        } else if (method === 'view') {
+          this.title = '查看地区登入报表'
+        }
+        this.visible = true
+        this.loading = false
+        this.$nextTick(() => {
+          this.$refs.inputForm.resetFields()
+          if (method === 'edit' || method === 'view') { // 修改或者查看
+            this.loading = true
+            loginAceService.queryById({id:this.inputForm.id,des1:des1,roleId:roleId,dtime:dtime,status:status}).then(({data}) => {
+              this.inputForm = this.recover(this.inputForm, data)
+              this.loading = false
+            })
+          }
+        })
+      }, */
+       methods: {
+         init (method, id, des1, roleId, dtime, status) {
+           this.visible = true;
+           this.loading = true;
+           this.inputForm.id = id;
+           this.inputForm.des1 = des1;
+           this.inputForm.roleId = roleId;
+           this.inputForm.dtime = dtime;
+           this.inputForm.status = status;
+
+           loginAceService.queryById({
+             id: this.inputForm.id,
+             des1: this.inputForm.des1,
+             roleId: this.inputForm.roleId,
+             dtime: this.inputForm.dtime,
+             status: this.inputForm.status
+           }).then(({ data }) => {
+             this.dataList = data; // 将查询结果存储到dataList中
+             this.loading = false;
+           }).catch(() => {
+             this.loading = false;
+           });
+         },
+      // 表单提交
+      doSubmit () {
+        this.$refs['inputForm'].validate((valid) => {
+          if (valid) {
+            this.loading = true
+            loginAceService.save(this.inputForm).then(({data}) => {
+              this.visible = false
+              this.$message.success(data)
+              this.$emit('refreshDataList')
+              this.loading = false
+            }).catch(() => {
+              this.loading = false
+            })
+          }
+        })
+      }
+    }
+  }
+</script>

+ 297 - 0
jp-ui/src/views/modules/loginacea/LoginAceList.vue

@@ -0,0 +1,297 @@
+<template>
+    <div class="page">
+      <el-form size="small" :inline="true" class="query-form" ref="searchForm" :model="searchForm" @keyup.enter.native="refreshList()" @submit.native.prevent>
+            <el-form-item prop="roleId">
+                <el-select size="small" v-model="searchForm.roleId" placeholder="选择角色" clearable>
+                    <el-option label="都企供需-挂钩干部" value="1910141956174053377"></el-option>
+                    <el-option label="区“企业大走访”办公室" value="1910175386924417025"></el-option>
+                    <el-option label="办理部门" value="1910175949166673921"></el-option>
+                    <el-option label="大走访-挂钩干部/部门" value="1915280292672946177"></el-option>
+                    <el-option label="企业用户" value="38a14f1f42ed424eab4cb5d489596b0d"></el-option>
+                </el-select>
+            </el-form-item>
+            <el-form-item prop="des1">
+                <el-select size="small" v-model="searchForm.des1" placeholder="选择地区" clearable>
+                    <el-option label="台创园" value="台创园"></el-option>
+                    <el-option label="大冈" value="大冈"></el-option>
+                    <el-option label="大纵湖" value="大纵湖"></el-option>
+                    <el-option label="学富" value="学富"></el-option>
+                    <el-option label="尚庄" value="尚庄"></el-option>
+                    <el-option label="张庄" value="张庄"></el-option>
+                    <el-option label="楼王" value="楼王"></el-option>
+                    <el-option label="潘黄" value="潘黄"></el-option>
+                    <el-option label="盐渎" value="盐渎"></el-option>
+                    <el-option label="秦南" value="秦南"></el-option>
+                    <el-option label="郭猛" value="郭猛"></el-option>
+                    <el-option label="高新区" value="高新区"></el-option>
+                    <el-option label="龙冈" value="龙冈"></el-option>
+                </el-select>
+            </el-form-item>
+            <el-form-item prop="dtime">
+                <el-select size="small" v-model="searchForm.dtime" placeholder="选择时间" clearable>
+                    <el-option label="本年" value="1"></el-option>
+                    <el-option label="本月" value="2"></el-option>
+                    <el-option label="本周" value="3"></el-option>
+                </el-select>
+            </el-form-item>
+            <!-- 搜索框-->
+          <el-form-item>
+            <el-button type="primary" @click="refreshList()" size="small" icon="el-icon-search">查询</el-button>
+            <el-button @click="resetSearch()" size="small" icon="el-icon-refresh-right">重置</el-button>
+          </el-form-item>
+      </el-form>
+
+     <div class="bg-white top">
+        <vxe-toolbar :refresh="{query: refreshList}" import export print custom>
+          <template #buttons>
+           <!-- <el-button v-if="hasPermission('loginacea:loginAce:add')" type="primary" size="small" icon="el-icon-plus" @click="add()">新建</el-button>
+            <el-button v-if="hasPermission('loginacea:loginAce:edit')" type="warning" size="small" icon="el-icon-edit-outline" @click="edit()" :disabled="$refs.loginAceTable && $refs.loginAceTable.getCheckboxRecords().length !== 1" plain>修改</el-button>
+            <el-button v-if="hasPermission('loginacea:loginAce:del')" type="danger"   size="small" icon="el-icon-delete" @click="del()" :disabled="$refs.loginAceTable && $refs.loginAceTable.getCheckboxRecords().length === 0" plain>删除</el-button> -->
+          </template>
+          <template #tools>
+            <vxe-button
+    		  type="default"
+    		  title="下载导入模板"
+    		  v-if="hasPermission('loginacea:loginAce:import')"
+    		  class="el-icon-document m-r-12"
+    		  @click="downloadTpl()"
+    		  circle
+            >
+            </vxe-button>
+          </template>
+        </vxe-toolbar>
+        <div style="height: calc(100% - 80px);">
+        <vxe-table
+            border="inner"
+            auto-resize
+            resizable
+            height="auto"
+            :loading="loading"
+            size="small"
+            ref="loginAceTable"
+            show-header-overflow
+            show-overflow
+            highlight-hover-row
+            :menu-config="{}"
+            :print-config="{}"
+            :import-config="{
+            importMethod: importMethod,
+                types: ['csv', 'xls', 'xlsx'],
+                remote: true,
+            }"
+            :export-config="{
+                remote: true,
+                filename: `地区登入报表数据${moment(new Date()).format(
+            		'YYYY-MM-DD'
+                )}`,
+                sheetName: '地区登入报表数据',
+                exportMethod: exportMethod,
+                types: ['xlsx'],
+                modes: ['current', 'selected', 'all'],
+            }"
+            @sort-change="sortChangeHandle"
+            :sort-config="{remote:true}"
+            :data="dataList"
+            :checkbox-config="{}">
+            <vxe-column type="seq" width="40"></vxe-column>
+            <vxe-column type="checkbox"  width="100px"></vxe-column>
+    <vxe-column
+        field="des1"
+        sortable
+        title="地区">
+      </vxe-column>
+    <vxe-column
+        field="totalCount"
+        sortable
+        title="关联总数">
+      </vxe-column>
+    <vxe-column
+        field="loginYesc"
+        sortable
+        title="已登入用户数">
+     <template slot-scope="scope">
+        <el-link  type="primary" :underline="false" v-if="hasPermission('loginacea:loginAce:edit')" @click="edit(scope.row.id,scope.row.des1, searchForm,1)">{{scope.row.loginYesc}}</el-link>
+        <el-link  type="primary" :underline="false" v-else-if="hasPermission('loginacea:loginAce:view')"  @click="view(scope.row.id,scope.row.des1, searchForm,1)">{{scope.row.loginYesc}}</el-link>
+        <span v-else>{{scope.row.des1}}</span>
+                        </template>
+      </vxe-column>
+    <vxe-column
+        field="loginNotc"
+        sortable
+        title="未登入用户数">
+        <template slot-scope="scope">
+         <el-link  type="primary" :underline="false" v-if="hasPermission('loginacea:loginAce:edit')" @click="edit(scope.row.id,scope.row.des1, searchForm,2)">{{scope.row.loginNotc}}</el-link>
+         <el-link  type="primary" :underline="false" v-else-if="hasPermission('loginacea:loginAce:view')"  @click="view(scope.row.id,scope.row.des1, searchForm,2)">{{scope.row.loginNotc}}</el-link>
+         <span v-else>{{scope.row.des1}}</span>
+        </template>
+      </vxe-column>
+    </vxe-table>
+    <vxe-pager
+      background
+      size="small"
+      :current-page="tablePage.currentPage"
+      :page-size="tablePage.pageSize"
+      :total="tablePage.total"
+      :page-sizes="[10, 20, 100, 1000, {label: '全量数据', value: 1000000}]"
+      :layouts="['PrevPage', 'JumpNumber', 'NextPage', 'FullJump', 'Sizes', 'Total']"
+      @page-change="currentChangeHandle">
+    </vxe-pager>
+    </div>
+    </div>
+        <!-- 弹窗, 新增 / 修改 -->
+    <LoginAceForm  ref="loginAceForm" @refreshDataList="refreshList"></LoginAceForm>
+  </div>
+</template>
+
+<script>
+  import LoginAceForm from './LoginAceForm'
+  import loginAceService from '@/api/loginacea/loginAceService'
+  export default {
+    data () {
+      return {
+        searchForm: {
+          roleId:'',
+          des1:'',
+          dtime:''
+        },
+        dataList: [],
+        tablePage: {
+          total: 0,
+          currentPage: 1,
+          pageSize: 100
+        },
+        loading: false
+      }
+    },
+    components: {
+      LoginAceForm
+    },
+    activated () {
+      this.refreshList()
+    },
+    methods: {
+      // 获取数据列表
+      refreshList () {
+        this.loading = true
+        loginAceService.list({
+          'current': this.tablePage.currentPage,
+          'size': this.tablePage.pageSize,
+          'orders': this.tablePage.orders,
+          ...this.searchForm
+        }).then(({data}) => {
+          this.dataList = data.records
+          this.tablePage.total = data.total
+          this.loading = false
+        })
+      },
+      // 当前页
+      currentChangeHandle ({ currentPage, pageSize }) {
+        this.tablePage.currentPage = currentPage
+        this.tablePage.pageSize = pageSize
+        this.refreshList()
+      },
+      // 排序
+      sortChangeHandle (obj) {
+        this.tablePage.orders = []
+        if (obj.order != null) {
+          this.tablePage.orders = [{ column: obj.column.sortBy || this.$utils.toLine(obj.property), asc: obj.order === 'asc' }]
+        } else {
+          this.tablePage.orders = [{ column: 'create_date', asc: false }]
+        }
+        this.refreshList()
+      },
+      // 新增
+      add () {
+        this.$refs.loginAceForm.init('add', '')
+      },
+      // 修改
+      edit (id,des1, searchForm,status) {
+        id = id || this.$refs.loginAceTable.getCheckboxRecords().map(item => {
+          return item.id
+        })[0]
+        this.$refs.loginAceForm.init('edit', id, des1, searchForm.roleId, searchForm.dtime,status)
+      },
+      // 查看
+      view (id) {
+        this.$refs.loginAceForm.init('view', id, des1, searchForm.roleId, searchForm.dtime,status)
+      },
+      // 删除
+      del (id) {
+        let ids = id || this.$refs.loginAceTable.getCheckboxRecords().map(item => {
+          return item.id
+        }).join(',')
+        this.$confirm(`确定删除所选项吗?`, '提示', {
+          confirmButtonText: '确定',
+          cancelButtonText: '取消',
+          type: 'warning'
+        }).then(() => {
+          this.loading = true
+          loginAceService.delete(ids).then(({data}) => {
+            this.$message.success(data)
+            this.refreshList()
+            this.loading = false
+          })
+        })
+      },
+      // 下载模板
+      downloadTpl () {
+        this.loading = true
+        loginAceService.exportTemplate().then(({data}) => {
+    // 将二进制流文件写入excel表,以下为重要步骤
+          this.$utils.downloadExcel(data, '请假表单导入模板')
+          this.loading = false
+        }).catch(function (err) {
+          this.loading = false
+          if (err.response) {
+            console.log(err.response)
+          }
+        })
+      },
+      // 自定义服务端导入
+      importMethod ({ file }) {
+      // 处理表单
+        const formBody = new FormData()
+        formBody.append('file', file)
+        this.loading = true
+        loginAceService.importExcel(formBody).then(({data}) => {
+          this.$message.success({
+            dangerouslyUseHTMLString: true,
+            message: data
+          })
+          this.refreshList()
+        })
+      },
+      // 自定义服务端导出
+      exportMethod ({ options }) {
+      // 传给服务端的参数
+        const params = {
+          current: this.tablePage.currentPage,
+          size: this.tablePage.pageSize,
+          orders: this.tablePage.orders,
+          ...this.searchForm,
+          filename: options.filename,
+          sheetName: options.sheetName,
+          isHeader: options.isHeader,
+          original: options.original,
+          mode: options.mode,
+          selectIds: options.mode === 'selected' ? options.data.map((item) => item.id) : [],
+          exportFields: options.columns.map((column) => column.property && column.property.split('.')[0])
+        }
+        this.loading = true
+        return loginAceService.exportExcel(params).then(({data}) => {
+      // 将二进制流文件写入excel表,以下为重要步骤
+          this.$utils.downloadExcel(data, options.filename)
+          this.loading = false
+        }).catch(function (err) {
+          if (err.response) {
+            console.log(err.response)
+          }
+        })
+      },
+      resetSearch () {
+        this.$refs.searchForm.resetFields()
+        this.refreshList()
+      }
+    }
+  }
+</script>