Kaynağa Gözat

Merge remote-tracking branch 'origin/master'

yin_yu820 2 gün önce
ebeveyn
işleme
901b868806
29 değiştirilmiş dosya ile 2963 ekleme ve 447 silme
  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. 61 2
      jp-console/jeeplus-module/ly/src/main/java/com/jeeplus/lyservice/controller/LyServiceController.java
  16. 16 0
      jp-console/jeeplus-module/ly/src/main/java/com/jeeplus/lyservice/mapper/LyServiceMapper.java
  17. 46 0
      jp-console/jeeplus-module/ly/src/main/java/com/jeeplus/lyservice/mapper/xml/LyServiceMapper.xml
  18. 71 0
      jp-console/jeeplus-module/ly/src/main/java/com/jeeplus/lyservice/service/LyServiceService.java
  19. 26 0
      jp-console/jeeplus-module/ly/src/main/java/com/jeeplus/question/controller/DzfQuestionController.java
  20. 60 0
      jp-ui/src/api/jsbb/loginMessService.js
  21. 61 0
      jp-ui/src/api/loginacea/loginAceService.js
  22. 32 0
      jp-ui/src/api/service/lyServiceService.js
  23. 1 0
      jp-ui/src/router/index.js
  24. 105 0
      jp-ui/src/views/modules/jsbb/LoginMessForm.vue
  25. 278 0
      jp-ui/src/views/modules/jsbb/LoginMessList.vue
  26. 124 0
      jp-ui/src/views/modules/loginacea/LoginAceForm.vue
  27. 297 0
      jp-ui/src/views/modules/loginacea/LoginAceList.vue
  28. 722 445
      jp-ui/src/views/modules/sys/dashboard/analysis/index.vue
  29. 188 0
      jp-ui/src/views/modules/sys/dashboard/analysis/visitStatistics.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);
+}
+

+ 61 - 2
jp-console/jeeplus-module/ly/src/main/java/com/jeeplus/lyservice/controller/LyServiceController.java

@@ -30,6 +30,8 @@ import com.jeeplus.lyservice.service.LyServiceService;
 import org.springframework.web.multipart.MultipartFile;
 
 import java.io.IOException;
+import java.util.Calendar;
+import java.util.HashMap;
 import java.util.List;
 
 /**
@@ -60,8 +62,8 @@ public class LyServiceController {
 		QueryWrapper queryWrapper = QueryWrapperGenerator.buildQueryCondition (lyServiceDTO, LyServiceDTO.class);
 		UserDTO userDTO = UserUtils.getCurrentUserDTO();
 		//		//挂钩干部(能看到对应企业)
-		if(userDTO.getRoleIds().equals("1915280292672946177")){
-			queryWrapper.eq ("qy.des13", userDTO.getLoginName() ); // 排除已经删除
+		if(userDTO.getRoleIds().equals("1910141956174053377")){
+			queryWrapper.eq ("qy.bz6", userDTO.getLoginName() ); // 排除已经删除
 		}
 		IPage<LyServiceDTO> result = lyServiceService.findPage (page, queryWrapper);
 		return ResponseEntity.ok (result);
@@ -106,6 +108,63 @@ public class LyServiceController {
 		return ResponseEntity.ok( "删除服务对接成功" );
 	}
 
+	/**
+	 * 进度统计
+	 */
+
+	@ApiLog("获取进度统计数据")
+	@ApiOperation(value = "获取进度统计数据")
+	@GetMapping("getProgressStatistics")
+	public ResponseEntity<HashMap<String,Object>> getProgressStatistics(String start, String end) {
+		if (start.equals("")){
+			Calendar calendar = Calendar.getInstance();
+			int year = calendar.get(Calendar.YEAR);
+			int month = calendar.get(Calendar.MONTH) + 1; // 月份从0开始计数,所以要加1
+			int day = calendar.get(Calendar.DAY_OF_MONTH);
+			end = year+"-"+ month + "-" + day;
+			start =year+"-"+month+"-01";
+		}
+		HashMap<String,Object> result = lyServiceService.getProgressStatistics(start,end);
+		return ResponseEntity.ok ( result );
+	}
+
+	/**
+	 * 获取挂钩干部统计数据
+	 */
+
+	@ApiLog("获取挂钩干部统计数据")
+	@ApiOperation(value = "获取挂钩干部统计数据")
+	@GetMapping("getPerson")
+	public ResponseEntity<List<HashMap<String,Object>>> getPerson() {
+		List<HashMap<String,Object>> result = lyServiceService.getPerson();
+		return ResponseEntity.ok ( result );
+	}
+
+	/**
+	 * 获取地区
+	 */
+
+	@ApiLog("获取地区")
+	@ApiOperation(value = "获取地区")
+	@GetMapping("getAreaInfo")
+	public ResponseEntity<List<HashMap<String,Object>>> getAreaInfo() {
+		List<HashMap<String,Object>> result = lyServiceService.getAreaInfo();
+		return ResponseEntity.ok ( result );
+	}
+
+	/**
+	 * 获取挂钩干部详情数据
+	 */
+
+	@ApiLog("获取挂钩干部详情数据")
+	@ApiOperation(value = "获取挂钩干部详情数据")
+	@GetMapping("getPersonInfo")
+	public ResponseEntity<List<HashMap<String,Object>>> getPersonInfo(String name,String des1,String beginTime,String endTime) {
+		List<HashMap<String,Object>> result = lyServiceService.getPersonInfo(name,des1,beginTime,endTime);
+		return ResponseEntity.ok ( result );
+	}
+
+
 	/**
      * 导出服务对接数据
      *

+ 16 - 0
jp-console/jeeplus-module/ly/src/main/java/com/jeeplus/lyservice/mapper/LyServiceMapper.java

@@ -12,6 +12,9 @@ import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
 import com.jeeplus.lyservice.service.dto.LyServiceDTO;
 import com.jeeplus.lyservice.domain.LyService;
 
+import java.util.HashMap;
+import java.util.List;
+
 /**
  * LyServiceMAPPER接口
  * @author lcm
@@ -34,4 +37,17 @@ public interface LyServiceMapper extends BaseMapper<LyService> {
      */
     IPage <LyServiceDTO> findList(Page <LyServiceDTO> page, @Param(Constants.WRAPPER) QueryWrapper queryWrapper);
 
+
+    HashMap<String,Object> getAllSum();
+
+
+    HashMap<String,Object> getFinishSum(String start, String end);
+
+    HashMap<String, Object> getProgressMonth(String start, String end);
+
+    List<HashMap<String,Object>> getPerson();
+
+    List<HashMap<String, Object>> getAreaInfo();
+
+    List<HashMap<String, Object>> getPersonInfo(String name,String des1,String beginTime,String endTime);
 }

+ 46 - 0
jp-console/jeeplus-module/ly/src/main/java/com/jeeplus/lyservice/mapper/xml/LyServiceMapper.xml

@@ -46,4 +46,50 @@
 	    ${ew.customSqlSegment}
 	</select>
 
+	<select id="getAllSum" resultType="Map">
+		SELECT count(id) allqy,COUNT(DISTINCT bz6) allper FROM ly_enterprise_info
+		WHERE del_flag = 0 ;
+	</select>
+
+	<select id="getFinishSum" resultType="Map">
+		SELECT count(a.id) finishqy,COUNT(DISTINCT bz6) finishper
+		FROM ly_enterprise_info a
+		LEFT JOIN ly_service b ON a.id = b.qy_id
+		WHERE a.del_flag = 0 AND qy_id IS NOT NULL
+		AND DATE_FORMAT(b.create_date, '%Y-%m-%d') >= #{start} AND DATE_FORMAT(b.create_date, '%Y-%m-%d') &lt;= #{end};
+	</select>
+
+	<select id="getProgressMonth" resultType="Map" parameterType="String">
+		SELECT COUNT(*) allque, COUNT(IF(states != 0 or states IS NULL ,1,NULL )) AS unfinish
+		FROM dzf_question_detil WHERE del_flag = 0
+		AND DATE_FORMAT(create_date, '%Y-%m-%d') >= #{start} AND DATE_FORMAT(create_date, '%Y-%m-%d') &lt;= #{end};
+	</select>
+
+	<select id="getPerson" resultType="Map">
+		SELECT des1, COUNT(DISTINCT bz5) AS perNum FROM ly_enterprise_info WHERE del_flag = 0 AND bz5 IS NOT NULL GROUP BY des1;
+	</select>
+
+	<select id="getAreaInfo" resultType="Map">
+		SELECT des1 FROM ly_enterprise_info WHERE del_flag = 0 GROUP BY des1;
+	</select>
+
+	<select id="getPersonInfo" resultType="Map">
+		SELECT COUNT(DISTINCT b.id) sum,bz5 FROM ly_enterprise_info a
+		LEFT JOIN
+		(SELECT * FROM ly_service WHERE del_flag = 0
+		<if test="beginTime != ''">
+		AND DATE_FORMAT(create_date, '%Y-%m-%d') >= #{beginTime} AND DATE_FORMAT(create_date, '%Y-%m-%d') &lt;= #{endTime}
+		</if>
+		) b ON a.id = b.qy_id
+		WHERE a.del_flag = 0 AND bz5 IS NOT NULL
+		<if test="des1 != ''">
+			AND des1 = #{des1}
+		</if>
+		<if test="name != ''">
+			AND name LIKE CONCAT('%', #{name}, '%')
+		</if>
+		GROUP BY bz5
+		ORDER BY bz5;
+	</select>
+
 </mapper>

+ 71 - 0
jp-console/jeeplus-module/ly/src/main/java/com/jeeplus/lyservice/service/LyServiceService.java

@@ -13,6 +13,11 @@ import com.jeeplus.lyservice.service.dto.LyServiceDTO;
 import com.jeeplus.lyservice.domain.LyService;
 import com.jeeplus.lyservice.mapper.LyServiceMapper;
 
+import java.math.BigDecimal;
+import java.util.ArrayList;
+import java.util.HashMap;
+import java.util.List;
+
 /**
  * LyServiceService
  * @author lcm
@@ -42,4 +47,70 @@ public class LyServiceService extends ServiceImpl<LyServiceMapper, LyService> {
 		return  baseMapper.findList (page, queryWrapper);
 	}
 
+    public HashMap<String,Object > getProgressStatistics(String start, String end) {
+		HashMap<String,Object> map = new HashMap<>();
+		// 获取总的数据
+		HashMap<String,Object> allSum = baseMapper.getAllSum();
+		// 获取总的数据
+		HashMap<String,Object> finishSum = baseMapper.getFinishSum(start,end);
+		// 计算占比
+		double qyAcount =  0;
+		Integer finishqy = Integer.valueOf(finishSum.get("finishqy").toString());
+		double allqy = Integer.valueOf(allSum.get("allqy").toString());
+		if(allqy != 0){
+			qyAcount = finishqy / allqy * 100;
+		}
+		// 计算占比
+		double perAcount = 0 ;
+		Integer finishPer = Integer.valueOf(finishSum.get("finishper").toString());
+		double allper = Integer.valueOf(allSum.get("allper").toString());
+		if(allper!=0){
+			perAcount = finishPer / allper * 100;
+		}
+		// 保存两位小数
+		BigDecimal bg = new BigDecimal(qyAcount);
+		double f1 = bg.setScale(2, BigDecimal.ROUND_HALF_UP).doubleValue();
+		BigDecimal bg2 = new BigDecimal(perAcount);
+		double f2 = bg2.setScale(2, BigDecimal.ROUND_HALF_UP).doubleValue();
+		// 走访企业
+		map.put("qyAcount", String.valueOf(f1));
+		map.put("qyFinishSum", String.valueOf(finishqy));
+		map.put("qyUnfinish", String.valueOf(100 - f1));
+		map.put("qyUnFinishSum", String.valueOf(Integer.valueOf(allSum.get("allqy").toString()) - finishqy));
+		// 走访人数
+		map.put("perFinishSum", String.valueOf(finishPer));
+		map.put("perAcount", String.valueOf(f2));
+		map.put("perUnFinishSum", String.valueOf(Integer.valueOf(allSum.get("allper").toString()) - finishPer));
+		map.put("perUnfinish", String.valueOf(100 - f2));
+		// 问题数
+		// 月份
+		HashMap<String, Object> monthNum = baseMapper.getProgressMonth(start,end);
+		// 计算占比
+		double unAcount =  0;
+		Integer unfinish = Integer.valueOf(monthNum.get("unfinish").toString());
+		double allque = Integer.valueOf(monthNum.get("allque").toString());
+		if(allque != 0){
+			unAcount = unfinish / allque * 100;
+		}
+		BigDecimal bg3 = new BigDecimal(unAcount);
+		double f3 = bg3.setScale(2, BigDecimal.ROUND_HALF_UP).doubleValue();
+		// 问题数
+		map.put("queFinishSum", String.valueOf(Integer.valueOf(monthNum.get("allque").toString()) - unfinish ));
+		map.put("queAcount", String.valueOf(100.0 - f3));
+		map.put("queUnFinishSum", String.valueOf(unfinish));
+		map.put("queUnfinish", String.valueOf(f3));
+		return map;
+    }
+
+	public List<HashMap<String,Object>> getPerson() {
+		return baseMapper.getPerson();
+	}
+
+	public List<HashMap<String, Object>> getAreaInfo() {
+		return baseMapper.getAreaInfo();
+	}
+
+	public List<HashMap<String, Object>> getPersonInfo(String name,String des1,String beginTime,String endTime) {
+		return baseMapper.getPersonInfo(name,des1,beginTime.substring(0,10),endTime.substring(0,10));
+	}
 }

+ 26 - 0
jp-console/jeeplus-module/ly/src/main/java/com/jeeplus/question/controller/DzfQuestionController.java

@@ -251,6 +251,32 @@ public class DzfQuestionController {
 			end = year+"-"+ month + "-" + day;
 			start =year+"-"+month+"-01";
 		}
+		DzfQuestionDTO dzfQuestionDTO=new DzfQuestionDTO();
+		//		UserDTO userDTO = UserUtils.getCurrentUserDTO();
+//		//企业(能看到自己企业的问题)
+//		if(userDTO.getRoleIds().equals("38a14f1f42ed424eab4cb5d489596b0d")){
+//			EnterpriseInfoDTO ei=enterpriseInfoService.findByUserid ( userDTO.getLoginName());
+//			dzfQuestionDTO.setQyId(ei.getId());
+//		}
+//
+//		QueryWrapper queryWrapper = QueryWrapperGenerator.buildQueryCondition (dzfQuestionDTO, DzfQuestionDTO.class);
+//		//挂钩干部(能看到对应企业)
+//		if(userDTO.getRoleIds().equals("1910141956174053377")){
+//			queryWrapper.eq ("ei.bz6", userDTO.getLoginName() ); // 排除已经删除
+//		}
+//		//办公室(能看到所有提交的问题)
+//		if(userDTO.getRoleIds().equals("1910175386924417025")){
+//			queryWrapper.ne ("a.states", "0" ); // 排除已经删除
+//		}
+//		//办理部门
+//		if(userDTO.getRoleIds().equals("1910175949166673921")){
+//			queryWrapper.eq ("c.des3", userDTO.getLoginName() ); // 筛选流程中涉及到自己的
+//			IPage<DzfQuestionDTO> result = dzfQuestionService.findPage2 (page, queryWrapper);
+//			return ResponseEntity.ok (result);
+//		}else{
+//			IPage<DzfQuestionDTO> result = dzfQuestionService.findPage (page, queryWrapper);
+//			return ResponseEntity.ok (result);
+//		}
 		HashMap<Object,String> result = dzfQuestionService.getProgressStatistics(start,end);
 		return ResponseEntity.ok ( result );
 	}

+ 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
+    })
+  }
+}

+ 32 - 0
jp-ui/src/api/service/lyServiceService.js

@@ -33,6 +33,38 @@ export default {
     })
   },
 
+  getProgressStatistics: function(start, end) {
+  	return request({
+  		url: '/lyservice/lyService/getProgressStatistics',
+  		method: 'get',
+  		params: {
+  			start: start,
+  			end: end
+  		}
+  	})
+  },
+
+  getPerson: function() {
+  	return request({
+  		url: '/lyservice/lyService/getPerson',
+  		method: 'get'
+  	})
+  },
+
+  getAreaInfo: function() {
+  	return request({
+  		url: '/lyservice/lyService/getAreaInfo',
+  		method: 'get'
+  	})
+  },
+  getPersonInfo: function (params) {
+    return request({
+      url: '/lyservice/lyService/getPersonInfo',
+      method: 'get',
+      params: params
+    })
+  },
+
   exportTemplate: function () {
     return request({
       url: '/lyservice/lyService/import/template',

+ 1 - 0
jp-ui/src/router/index.js

@@ -33,6 +33,7 @@ const mainRoutes = {
   children: [
     {path: '/redirect/:path(.*)', component: _import('modules/redirect/index')},
     {path: '/home', redirect: '/sys/dashboard/analysis/index', name: 'home'},
+    {path: '/visit', component: _import('modules/sys/dashboard/analysis/visitStatistics'), name: 'visit'},
     {path: '/flowable/task/TaskForm', component: _import('modules/flowable/task/TaskForm'), name: 'task-form', meta: {title: '流程表单'}},
     {path: '/flowable/task/TaskFormEdit', component: _import('modules/flowable/task/TaskFormEdit'), name: 'task-form-edit', meta: {title: '流程表单'}},
     {path: '/flowable/task/TaskFormDetail', component: _import('modules/flowable/task/TaskFormDetail'), name: 'task-form-detail', meta: {title: '流程表单详情'}},

+ 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>

+ 722 - 445
jp-ui/src/views/modules/sys/dashboard/analysis/index.vue

@@ -15,17 +15,14 @@
       <div class="headline-text">盐都区工业企业产品发布平台</div>
     </div>
     <div class="main">
-      <div style="width: 2.5%"></div>
+      <div style="width: 1.5%"></div>
       <div class="main-1">
         <div class="main-periphery">
           <div style="height: 25%"></div>
           <div class="main-periphery-font" style="height: 30%; color: #031c57">
             今日入库企业数
           </div>
-          <div
-            class="main-periphery-numerical"
-            style="height: 45%; color: #0843cd"
-          >
+          <div class="main-periphery-numerical" style="height: 45%; color: #0843cd">
             {{ pageInfo.todayenterprisec }}
           </div>
         </div>
@@ -34,10 +31,7 @@
           <div class="main-periphery-font" style="height: 30%; color: #031c57">
             入库企业总数
           </div>
-          <div
-            class="main-periphery-numerical"
-            style="height: 45%; color: #0843cd"
-          >
+          <div class="main-periphery-numerical" style="height: 45%; color: #0843cd">
             {{ pageInfo.enterprisec }}
           </div>
         </div>
@@ -48,10 +42,7 @@
           <div class="main-periphery-font" style="height: 30%; color: #063e2a">
             今天活跃数
           </div>
-          <div
-            class="main-periphery-numerical"
-            style="height: 45%; color: #028455"
-          >
+          <div class="main-periphery-numerical" style="height: 45%; color: #028455">
             {{ pageInfo.todayc }}
           </div>
         </div>
@@ -61,10 +52,7 @@
           <div class="main-periphery-font" style="height: 30%; color: #063e2a">
             当月活跃数
           </div>
-          <div
-            class="main-periphery-numerical"
-            style="height: 45%; color: #028455"
-          >
+          <div class="main-periphery-numerical" style="height: 45%; color: #028455">
             {{ pageInfo.samemonthc }}
           </div>
         </div>
@@ -77,100 +65,52 @@
           <div style="height: 25%"></div>
           <div class="main-periphery-font" style="height: 30%; color: #764710">
             入库企业行业
-            <span
-              class="main-periphery-font-small"
-              style="color: #764710"
-            ></span>
+            <span class="main-periphery-font-small" style="color: #764710"></span>
           </div>
           <div class="main-periphery2">
             <div style="height: 15%"></div>
-            <div
-              class="main-periphery-font-small"
-              style="height: 30%; color: #764710"
-            >
+            <div class="main-periphery-font-small" style="height: 30%; color: #764710">
               {{pageInfo2[0].industry}}
-              <span
-                class="main-periphery-font"
-                style="font-weight: bold; color: #b86504; margin-left: 10px"
-                >{{ pageInfo2[0].cc }}</span
-              >
-              <span
-                class="main-periphery-font-small"
-                style="font-weight: bold; color: #b86504; margin-left: 10px"
-                >家</span
-              >
+              <span class="main-periphery-font"
+                style="font-weight: bold; color: #b86504; margin-left: 10px">{{ pageInfo2[0].cc }}</span>
+              <span class="main-periphery-font-small"
+                style="font-weight: bold; color: #b86504; margin-left: 10px">家</span>
             </div>
             <div style="height: 15%"></div>
-            <div
-              class="main-periphery-font-small"
-              style="height: 30%; color: #764710"
-            >
+            <div class="main-periphery-font-small" style="height: 30%; color: #764710">
               {{pageInfo2[1].industry}}
-              <span
-                class="main-periphery-font"
-                style="font-weight: bold; color: #b86504; margin-left: 10px"
-                >{{ pageInfo2[1].cc }}</span
-              >
-              <span
-                class="main-periphery-font-small"
-                style="font-weight: bold; color: #b86504; margin-left: 10px"
-                >家</span
-              >
+              <span class="main-periphery-font"
+                style="font-weight: bold; color: #b86504; margin-left: 10px">{{ pageInfo2[1].cc }}</span>
+              <span class="main-periphery-font-small"
+                style="font-weight: bold; color: #b86504; margin-left: 10px">家</span>
             </div>
           </div>
 
           <div class="main-periphery2">
             <div style="height: 15%"></div>
-            <div
-              class="main-periphery-font-small"
-              style="height: 30%; color: #764710"
-            >
+            <div class="main-periphery-font-small" style="height: 30%; color: #764710">
               {{pageInfo2[2].industry}}
-              <span
-                class="main-periphery-font"
-                style="font-weight: bold; color: #b86504; margin-left: 10px"
-                >{{ pageInfo2[2].cc }}</span
-              >
-              <span
-                class="main-periphery-font-small"
-                style="font-weight: bold; color: #b86504; margin-left: 10px"
-                >家</span
-              >
+              <span class="main-periphery-font"
+                style="font-weight: bold; color: #b86504; margin-left: 10px">{{ pageInfo2[2].cc }}</span>
+              <span class="main-periphery-font-small"
+                style="font-weight: bold; color: #b86504; margin-left: 10px">家</span>
             </div>
             <div style="height: 15%"></div>
-            <div
-              class="main-periphery-font-small"
-              style="height: 30%; color: #764710"
-            >
+            <div class="main-periphery-font-small" style="height: 30%; color: #764710">
               {{pageInfo2[3].industry}}
-              <span
-                class="main-periphery-font"
-                style="font-weight: bold; color: #b86504; margin-left: 10px"
-                >{{ pageInfo2[3].cc }}</span
-              >
-              <span
-                class="main-periphery-font-small"
-                style="font-weight: bold; color: #b86504; margin-left: 10px"
-                >家</span
-              >
+              <span class="main-periphery-font"
+                style="font-weight: bold; color: #b86504; margin-left: 10px">{{ pageInfo2[3].cc }}</span>
+              <span class="main-periphery-font-small"
+                style="font-weight: bold; color: #b86504; margin-left: 10px">家</span>
             </div>
 
             <div style="height: 15%"></div>
-            <div
-              class="main-periphery-font-small"
-              style="height: 30%; color: #764710"
-            >
+            <div class="main-periphery-font-small" style="height: 30%; color: #764710">
               {{pageInfo2[4].industry}}
-              <span
-                class="main-periphery-font"
-                style="font-weight: bold; color: #b86504; margin-left: 10px"
-                >{{ pageInfo2[4].cc }}</span
-              >
-              <span
-                class="main-periphery-font-small"
-                style="font-weight: bold; color: #b86504; margin-left: 10px"
-                >家</span
-              >
+              <span class="main-periphery-font"
+                style="font-weight: bold; color: #b86504; margin-left: 10px">{{ pageInfo2[4].cc }}</span>
+              <span class="main-periphery-font-small"
+                style="font-weight: bold; color: #b86504; margin-left: 10px">家</span>
             </div>
 
 
@@ -244,7 +184,7 @@
       </div> -->
     </div>
     <div class="footer">
-      <div class="footer-main">
+      <!-- <div class="footer-main">
         <div style="height: 10%"></div>
         <div class="footer-main-top">
           <i class="el-icon-s-promotion icon"></i>
@@ -272,13 +212,13 @@
               <div class="footer-fast-1-2">创建企业</div>
             </router-link>
           </div>
-          <!-- <div class="footer-fast-2" v-show="haveCJYG">
+          <div class="footer-fast-2" v-show="haveCJYG">
             <router-link to="/qyuser/QyUserList">
               <div class="footer-fast-2-3"></div>
               <div style="height: 10%"></div>
               <div class="footer-fast-1-2">新增员工</div>
             </router-link>
-          </div> -->
+          </div>
           <div class="footer-fast-2" v-show="haveSBSS">
             <router-link to="/saleinventory/SaleInventoryList">
               <div class="footer-fast-2-4"></div>
@@ -294,380 +234,717 @@
             </router-link>
           </div>
         </div>
+      </div> -->
+      <div class="headline">
+        <div class="headline-text">大走访看板</div>
+      </div>
+      <div class="footer-main">
+        <el-row>
+          <el-col :span="12">
+            <div class="">
+              <el-button autofocus @click="getTime(0)" size="mini">月度</el-button>
+              <el-button @click="getTime(1)" size="mini">季度</el-button>
+              <el-button @click="getTime(2)" size="mini">年度</el-button>
+            </div>
+          </el-col>
+          <el-col :span="12">
+            <div style="text-align: right;">
+              <el-date-picker size="mini" @change="getTime(3)" v-model="value2" type="daterange" align="right"
+                unlink-panels range-separator="至" start-placeholder="开始日期" end-placeholder="结束日期"
+                :picker-options="pickerOptions">
+              </el-date-picker>
+            </div>
+          </el-col>
+        </el-row>
+        <el-row :gutter="20">
+          <el-col :span="4">
+            <el-card shadow="always" :body-style="{padding: '5px',margin:'0px'}">
+              <div class="footer-fast-1-1">
+                <p><span style="color: red;">●</span>未完成大走访人数</p>
+                <p><span style="font-size: 20px;font-weight: 700;margin-right: 10px;">{{allSum.perUnFinishSum}}</span>人
+                </p>
+                <p>占比<span style="font-size: 12px;color: red;margin-left: 5px;">{{allSum.perUnfinish}}%</span></p>
+              </div>
+            </el-card>
+          </el-col>
+          <el-col :span="4">
+            <el-card shadow="always" :body-style="{padding: '5px',margin:'0px'}">
+              <div class="footer-fast-1-1">
+                <p><span style="color: #0843cd;">●</span>完成大走访人数</p>
+                <p><span style="font-size: 20px;font-weight: 700;margin-right: 10px;">{{allSum.perFinishSum}}</span>人
+                </p>
+                <p>占比<span style="font-size: 12px;color: #0843cd;margin-left: 5px;">{{allSum.perAcount}}%</span></p>
+              </div>
+            </el-card>
+          </el-col>
+          <el-col :span="4">
+            <el-card shadow="always" :body-style="{padding: '5px',margin:'0px'}">
+              <div class="footer-fast-1-1">
+                <p><span style="color: red;">●</span>未完成大走访企业数</p>
+                <p><span style="font-size: 20px;font-weight: 700;margin-right: 10px;">{{allSum.qyUnFinishSum}}</span>个
+                </p>
+                <p>占比<span style="font-size: 12px;color: red;margin-left: 5px;">{{allSum.qyUnfinish}}%</span></p>
+              </div>
+            </el-card>
+          </el-col>
+          <el-col :span="4">
+            <el-card shadow="always" :body-style="{padding: '5px',margin:'0px'}">
+              <div class="footer-fast-1-1">
+                <p><span style="color: #0843cd;">●</span>完成大走访企业数</p>
+                <p><span style="font-size: 20px;font-weight: 700;margin-right: 10px;">{{allSum.qyFinishSum}}</span>个
+                </p>
+                <p>占比<span style="font-size: 12px;color: #0843cd;margin-left: 5px;">{{allSum.qyAcount}}%</span></p>
+              </div>
+            </el-card>
+          </el-col>
+          <el-col :span="4">
+            <el-card shadow="always" :body-style="{padding: '5px',margin:'0px'}">
+              <div class="footer-fast-1-1">
+                <p><span style="color: red;">●</span>未办结问题数</p>
+                <p><span style="font-size: 20px;font-weight: 700;margin-right: 10px;">{{allSum.queUnFinishSum}}</span>个
+                </p>
+                <p>占比<span style="font-size: 12px;color: red;margin-left: 5px;">{{allSum.queUnfinish}}%</span></p>
+              </div>
+            </el-card>
+          </el-col>
+          <el-col :span="4">
+            <el-card shadow="always" :body-style="{padding: '5px',margin:'0px'}">
+              <div class="footer-fast-1-1">
+                <p><span style="color: #0843cd;">●</span>办结问题数</p>
+                <p><span style="font-size: 20px;font-weight: 700;margin-right: 10px;">{{allSum.queFinishSum}}</span>个
+                </p>
+                <p>占比<span
+                    style="font-size: 12px;color: #0843cd;margin-left: 5px;">{{parseFloat(allSum.queAcount).toFixed(2)}}%</span>
+                </p>
+              </div>
+            </el-card>
+          </el-col>
+        </el-row>
+        <div style="width:100%;height:280px;">
+          <div id="eChart2" style="width:100%;height:100%;"></div>
+        </div>
       </div>
     </div>
+
+    <el-dialog title="走访" :close-on-click-modal="false" v-dialogDrag :visible.sync="visible">
+
+      <span slot="footer" class="dialog-footer">
+        <el-button size="small" @click="visible = false">关闭</el-button>
+        <!-- <el-button size="small" type="primary"  @click="doSubmit()" v-noMoreClick>确定</el-button> -->
+      </span>
+    </el-dialog>
   </div>
 </template>
 
 <script>
-import bigScreenService from "@/api/bigScreen/bigScreenApi";
-import notifyService from "@/api/notify/notifyService";
-import userService from "@/api/sys/userService";
-export default {
-  data() {
-    return {
-      parkSum: "24",
-      enterpriseSum: "1025",
-      premisesAcreage: "24152.3",
-      usableArea: "18122.1",
-      residualArea: "6030.2",
-      moneyYear: "1025.2",
-      moneyMonth: "101.2",
-      moneyMoM: "2.2%",
-      moneyYoY: "0.2%",
-      revenueYear: "201.2",
-      revenueMonth: "31.2",
-      revenueMoM: "2.2%",
-      revenueYoY: "0.2%",
-      taxYear: "201.2",
-      taxMonth: "31.2",
-      taxMoM: "2.2%",
-      taxYoY: "0.2%",
-      textColor1: "#028455",
-      textColor2: "#028455",
-      textColor3: "#028455",
-      textColor4: "#028455",
-      textColor5: "#028455",
-      textColor6: "#028455",
-      isTop1: true,
-      isTop2: true,
-      isTop3: true,
-      isTop4: true,
-      isTop5: true,
-      isTop6: true,
-      isBottom1: false,
-      isBottom2: false,
-      isBottom3: false,
-      isBottom4: false,
-      isBottom5: false,
-      isBottom6: false,
-      pageInfo: {},
-      pageInfo2: [],
-      haveCJYQ: false,
-      haveCJLY: false,
-      haveCJQY: false,
-      haveCJYG: false,
-      haveSBSS: false,
-      haveXXWH: false,
-      nowYQInfo: {
-        BelowUndergraduate: 0,
-        Undergraduate: 0,
-        Postgraduate: 0,
-        DoctoralStudent: 0,
-      },
-      notifyList: [],
-      tablePage: {
+  import bigScreenService from "@/api/bigScreen/bigScreenApi";
+  import notifyService from "@/api/notify/notifyService";
+  import lyService from "@/api/service/lyServiceService";
+  import userService from "@/api/sys/userService";
+  import visitStatistics from './visitStatistics'
+  export default {
+    data() {
+      return {
+        parkSum: "24",
+        enterpriseSum: "1025",
+        premisesAcreage: "24152.3",
+        usableArea: "18122.1",
+        residualArea: "6030.2",
+        moneyYear: "1025.2",
+        moneyMonth: "101.2",
+        moneyMoM: "2.2%",
+        moneyYoY: "0.2%",
+        revenueYear: "201.2",
+        revenueMonth: "31.2",
+        revenueMoM: "2.2%",
+        revenueYoY: "0.2%",
+        taxYear: "201.2",
+        taxMonth: "31.2",
+        taxMoM: "2.2%",
+        taxYoY: "0.2%",
+        textColor1: "#028455",
+        textColor2: "#028455",
+        textColor3: "#028455",
+        textColor4: "#028455",
+        textColor5: "#028455",
+        textColor6: "#028455",
+        isTop1: true,
+        isTop2: true,
+        isTop3: true,
+        isTop4: true,
+        isTop5: true,
+        isTop6: true,
+        isBottom1: false,
+        isBottom2: false,
+        isBottom3: false,
+        isBottom4: false,
+        isBottom5: false,
+        isBottom6: false,
+        pageInfo: {},
+        pageInfo2: [{
+          industry: '',
+          cc: ''
+        }, {
+          industry: '',
+          cc: ''
+        }, {
+          industry: '',
+          cc: ''
+        }, {
+          industry: '',
+          cc: ''
+        }, {
+          industry: '',
+          cc: ''
+        }, {
+          industry: '',
+          cc: ''
+        }, ],
+        haveCJYQ: false,
+        haveCJLY: false,
+        haveCJQY: false,
+        haveCJYG: false,
+        haveSBSS: false,
+        haveXXWH: false,
+        nowYQInfo: {
+          BelowUndergraduate: 0,
+          Undergraduate: 0,
+          Postgraduate: 0,
+          DoctoralStudent: 0,
+        },
+        notifyList: [],
+        tablePage: {
           total: 0,
           currentPage: 1,
           pageSize: 10,
-          orders: [{ column: 'a.create_date', asc: false }]
+          orders: [{
+            column: 'a.create_date',
+            asc: false
+          }]
         },
-    };
-  },
-  activated() {
-    this.changeColor();
-    this.getPageInfo();
-    this.getMenuList();
-    this.getNotifyList()
-  },
-  methods: {
-    getPageInfo() {
-      bigScreenService.InfoStatistics({}).then(({ data }) => {
-        this.pageInfo = data;
-      });
-
-      bigScreenService.InfoStatistics_industry({ }).then(({ data }) => {
-        this.pageInfo2 = data;
-      });
-
+        pickerOptions: {
+          shortcuts: [{
+            text: '最近一周',
+            onClick(picker) {
+              const end = new Date();
+              const start = new Date();
+              start.setTime(start.getTime() - 3600 * 1000 * 24 * 7);
+              picker.$emit('pick', [start, end]);
+            }
+          }, {
+            text: '最近一个月',
+            onClick(picker) {
+              const end = new Date();
+              const start = new Date();
+              start.setTime(start.getTime() - 3600 * 1000 * 24 * 30);
+              picker.$emit('pick', [start, end]);
+            }
+          }, {
+            text: '最近三个月',
+            onClick(picker) {
+              const end = new Date();
+              const start = new Date();
+              start.setTime(start.getTime() - 3600 * 1000 * 24 * 90);
+              picker.$emit('pick', [start, end]);
+            }
+          }]
+        },
+        value2: [new Date().setTime(new Date().getTime() - 3600 * 1000 * 24 * 30), new Date()],
+        allSum: {},
+        visible: false,
+      };
+    },
+    components: {
+      visitStatistics
     },
+    activated() {
+
+      this.changeColor();
+      this.getPageInfo();
+      this.getMenuList();
+      this.getNotifyList();
+      const end = new Date();
+      const start = new Date();
+      start.setTime(start.getTime() - 3600 * 1000 * 24 * 30);
+      this.getAllAum(start, end)
+      this.get2();
+    },
+    methods: {
+      get2() {
+        var that = this
+        //获取id并初始化图表
+        var myChart = this.$echarts.init(document.getElementById("eChart2"));
+        lyService.getPerson().then(({
+          data
+        }) => {
+          const x = [];
+          const y = [];
+          for (let i = 0; i < data.length; i++) {
+            x.push(data[i].des1)
+            y.push(data[i].perNum)
+          }
 
-    getNotifyList() {
-      notifyService
-        .list({
-          current: this.tablePage.currentPage,
-          size: this.tablePage.pageSize,
-          orders: this.tablePage.orders,
-          isSelf: true,
-          ...this.searchForm,
+          // const x = this.tableData.x//x轴
+          // const y = this.tableData.y//y轴
+
+          //配置项
+          let option = {
+            tooltip: {
+              show: false
+            },
+            legend: {
+              show: false
+            },
+            grid: {
+              left: "4%",
+              right: "3%",
+              bottom: "7%",
+              top: "15%",
+              containLabel: true
+            },
+            // dataZoom: [
+            //   //滑动条
+            //   {
+            //     xAxisIndex: 0, //这里是从X轴的0刻度开始
+            //     show: false, //是否显示滑动条,不影响使用
+            //     type: "inside", // 这个 dataZoom 组件是 slider 型 dataZoom 组件
+            //     startValue: 0, // 从头开始。
+            //     endValue: 8, // 一次性展示几个。
+            //   },
+            // ],
+            xAxis: {
+              type: "category",
+              data: x.length && y.length > 0 ? x : tableData1,
+              boundaryGap: [0, 0.01],
+              axisLine: {
+                lineStyle: {
+                  color: "rgba(255, 255, 255, 0.1)",
+                  width: 1
+                }
+              },
+              splitLine: {
+                show: true,
+                lineStyle: {
+                  color: "rgba(255, 255, 255, 0.1)"
+                }
+              },
+              axisTick: {
+                show: true
+              },
+              axisLabel: {
+                show: true,
+                color: "#000",
+                fontSize: 14
+              }
+            },
+            yAxis: {
+              name: "人",
+              nameTextStyle: {
+                color: "#000",
+                fontSize: 13,
+              },
+              type: "value",
+              boundaryGap: [0, 0.01],
+              axisLine: {
+                lineStyle: {
+                  color: "#333",
+                  width: 1
+                }
+              },
+              splitLine: {
+                show: true,
+                lineStyle: {
+                  color: "rgba(255, 255, 255, 0.1)"
+                }
+              },
+              axisTick: {
+                show: false
+              },
+              axisLabel: {
+                show: true,
+                color: "#000",
+                fontSize: 14
+              }
+            },
+            series: [{
+              name: "人",
+              type: "bar",
+              data: y,
+              barWidth: 20,
+              label: {
+                normal: {
+                  show: true,
+                  position: "top",
+                  fontSize: 12,
+                  color: '#000'
+                }
+              },
+              itemStyle: {
+                normal: {
+                  label: {
+                    show: false
+                  },
+                  borderRadius: 2,
+                  color: '#0184ff'
+                }
+              }
+            }]
+          };
+
+          myChart.setOption(option); //通过setOption()方法生成图表
+          myChart.on('click', function(params) {
+            that.$router.push({
+              name: 'visit',
+              params: {
+                name: params.name,
+                createTime: that.value2
+              }
+            })
+          })
         })
-        .then(({ data }) => {
-          this.notifyList = data.records;
+      },
+      getPageInfo() {
+        bigScreenService.InfoStatistics({}).then(({
+          data
+        }) => {
+          this.pageInfo = data;
         });
-    },
 
+        bigScreenService.InfoStatistics_industry({}).then(({
+          data
+        }) => {
+          this.pageInfo2 = data;
+        });
 
+      },
 
-    getMenuList() {
-      userService.getMenus().then(({ data }) => {
-        let routerList = data.routerList;
-        let allList = [];
-        routerList.forEach((item) => {
-          if (item.href) {
-            allList.push(item.href);
-          }
-          if (item.children.length > 0) {
-            item.children.forEach((itemIn) => {
-              if (itemIn.href) {
-                allList.push(itemIn.href);
-              }
-            });
-          }
+      getAllAum(start, end) {
+        lyService.getProgressStatistics(start, end).then(({
+          data
+        }) => {
+          this.allSum = data
+        })
+      },
+
+      getTime(val) {
+        const end = new Date();
+        const start = new Date();
+        if (val == 0) {
+          start.setTime(start.getTime() - 3600 * 1000 * 24 * 30);
+        } else if (val == 1) {
+          start.setTime(start.getTime() - 3600 * 1000 * 24 * 90);
+        } else if (val == 2) {
+          start.setFullYear(start.getFullYear() - 1);
+        } else if (val == 3) {
+          start.setTime(this.value2[0])
+          end.setTime(this.value2[1])
+        }
+        this.value2 = [start, end]
+        this.getAllAum(start, end);
+      },
+
+      getNotifyList() {
+        notifyService
+          .list({
+            current: this.tablePage.currentPage,
+            size: this.tablePage.pageSize,
+            orders: this.tablePage.orders,
+            isSelf: true,
+            ...this.searchForm,
+          })
+          .then(({
+            data
+          }) => {
+            this.notifyList = data.records;
+          });
+      },
+
+
+
+      getMenuList() {
+        userService.getMenus().then(({
+          data
+        }) => {
+          let routerList = data.routerList;
+          let allList = [];
+          routerList.forEach((item) => {
+            if (item.href) {
+              allList.push(item.href);
+            }
+            if (item.children.length > 0) {
+              item.children.forEach((itemIn) => {
+                if (itemIn.href) {
+                  allList.push(itemIn.href);
+                }
+              });
+            }
+          });
+          console.log(allList, "====================>allList");
+          this.haveCJYQ = allList.includes("/parkmanagement/ParkManagementList");
+          this.haveCJLY = allList.includes(
+            "/buildinginfo/BuildingManagementList"
+          );
+          this.haveCJQY = allList.includes("/enterpriseinfo/EnterpriseInfoList");
+          this.haveCJYG = allList.includes("/qyuser/QyUserList");
+          this.haveSBSS = allList.includes("/saleinventory/SaleInventoryList");
+          this.haveXXWH = allList.includes(
+            "/enterpriseother/EnterpriseOtherList"
+          );
+
+          this.$router.push({
+            name: "home"
+          });
         });
-        console.log(allList, "====================>allList");
-        this.haveCJYQ = allList.includes("/parkmanagement/ParkManagementList");
-        this.haveCJLY = allList.includes(
-          "/buildinginfo/BuildingManagementList"
-        );
-        this.haveCJQY = allList.includes("/enterpriseinfo/EnterpriseInfoList");
-        this.haveCJYG = allList.includes("/qyuser/QyUserList");
-        this.haveSBSS = allList.includes("/saleinventory/SaleInventoryList");
-        this.haveXXWH = allList.includes(
-          "/enterpriseother/EnterpriseOtherList"
-        );
-
-        this.$router.push({ name: "home" });
-      });
-    },
+      },
 
-    changeColor() {
-      this.textColor1 = "#FF1C1C";
-      this.textColor4 = "#FF1C1C";
-      this.isTop1 = false;
-      this.isTop4 = false;
-      this.isBottom1 = true;
-      this.isBottom4 = true;
+      changeColor() {
+        this.textColor1 = "#FF1C1C";
+        this.textColor4 = "#FF1C1C";
+        this.isTop1 = false;
+        this.isTop4 = false;
+        this.isBottom1 = true;
+        this.isBottom4 = true;
+      },
     },
-  },
-};
+  };
 </script>
 
 <style scoped lang="less">
-.background-image {
-  background-image: url("~@/assets/img/homePage/hou_bg2.png");
-  background-position: bottom;
-  background-size: 100% 100%;
-  width: 100%;
-  height: 100%;
-}
-
-.header {
-  width: 100%;
-  height: 8%;
-}
-
-.headline {
-  width: 100%;
-  height: 7%;
-  position: relative;
-}
-
-.headline-text {
-  margin-left: 4%;
-  font-family: Alibaba PuHuiTi 2;
-  font-weight: normal;
-  font-size: 30px;
-  color: #3c507e;
-}
-
-.main-1 {
-  margin-left: 1.5%;
-  width: 29%;
-  height: 80%;
-  background-image: url("~@/assets/img/homePage/hou_5.png");
-  background-size: 100% 100%;
-  border-radius: 10px;
-}
-
-.main-2 {
-  margin-left: 1.5%;
-  width: 29%;
-  height: 80%;
-  background-image: url("~@/assets/img/homePage/hou_4.png");
-  background-size: 100% 100%;
-  border-radius: 10px;
-}
-
-.main-3 {
-  margin-left: 1.5%;
-  width: 29%;
-  height: 80%;
-  background-image: url("~@/assets/img/homePage/hou_3.png");
-  background-size: 100% 100%;
-  border-radius: 10px;
-}
-
-.main-4 {
-  margin-left: 1.5%;
-  width: 30%;
-  height: 80%;
-  background-image: url("~@/assets/img/homePage/hou_2.png");
-  background-size: 100% 100%;
-  border-radius: 10px;
-}
-
-.main-5 {
-  margin-left: 1.5%;
-  width: 17%;
-  height: 80%;
-  background-image: url("~@/assets/img/homePage/hou_1.png");
-  background-size: 100% 100%;
-  border-radius: 10px;
-}
-
-.main {
-  width: 100%;
-  height: 35%;
-  /* 开启Flexbox布局 */
-  display: flex;
-}
-
-.footer {
-  width: 100%;
-  height: 43%;
-}
-
-.footer-main {
-  margin-left: 4%;
-  width: 91%;
-  height: 55%;
-  background-color: white;
-  border-radius: 10px;
-}
-
-.footer-main-top {
-  height: 26%;
-  font-family: Alibaba PuHuiTi 2;
-  font-weight: normal;
-  font-size: 16px;
-  color: #333333;
-  margin-left: 2%;
-}
-
-.footer-fast {
-  width: 100%;
-  height: 64%;
-  /* 开启Flexbox布局 */
-  display: flex;
-}
-
-// .footer-fast-1 {
-//   margin-left: 5%;
-//   width: 4.5%;
-//   height: 100%;
-// }
-
-.footer-fast-2 {
-  margin-left: 5%;
-  width: 4.5%;
-  height: 100%;
-}
-
-.footer-fast-1-1 {
-  width: 100%;
-  height: 53.84%;
-  background-image: url("~@/assets/img/homePage/hou_addyuan.png");
-  background-size: 100% 100%;
-}
-
-.footer-fast-1-2 {
-  font-family: Alibaba PuHuiTi 2;
-  font-weight: normal;
-  font-size: 14px;
-  text-align: center;
-}
-
-.footer-fast-2-1 {
-  width: 100%;
-  height: 53.84%;
-  background-image: url("~@/assets/img/homePage/hou_addlou.png");
-  background-size: 100% 100%;
-}
-
-.footer-fast-2-2 {
-  width: 100%;
-  height: 53.84%;
-  background-image: url("~@/assets/img/homePage/hou_addqiye.png");
-  background-size: 100% 100%;
-}
-
-.footer-fast-2-3 {
-  width: 100%;
-  height: 53.84%;
-  background-image: url("~@/assets/img/homePage/hou_addren.png");
-  background-size: 100% 100%;
-}
-
-.footer-fast-2-4 {
-  width: 100%;
-  height: 53.84%;
-  background-image: url("~@/assets/img/homePage/hou_shuishou.png");
-  background-size: 100% 100%;
-}
-
-.footer-fast-2-5 {
-  width: 100%;
-  height: 53.84%;
-  background-image: url("~@/assets/img/homePage/hou_addint.png");
-  background-size: 100% 100%;
-}
-
-.main-periphery {
-  margin-left: 8%;
-  width: 92%;
-  height: 50%;
-}
-
-.main-periphery2 {
-  margin-left: 0%;
-  height: 50%;
-}
-
-.main-periphery-font {
-  font-family: Alibaba PuHuiTi 2;
-  font-weight: normal;
-  font-size: 20px;
-}
-
-.main-periphery-numerical {
-  font-family: Alibaba PuHuiTi 2;
-  font-weight: bold;
-  font-size: 40px;
-}
-
-.main-periphery-font-small {
-  font-family: Alibaba PuHuiTi 2;
-  font-weight: normal;
-  font-size: 15px;
-}
-
-.roll-name-box {
-  width: 100%;
-  padding-left: 1vw;
-  padding-right: 1vw;
-  height: 3vh;
-  color: #fff;
-  background: #0f467a;
-  line-height: 3vh;
-  font-size: 1.5vh;
-  overflow: hidden;
-  white-space: nowrap;
-}
-
-.scroll-content {
-  margin-left: 50%; // 把文字弄出可见区域
-  width: 200%;
-  animation: myMove 100s linear infinite; // 重点,定义动画
-  animation-fill-mode: forwards;
-  color: #fff;
-}
-
-@keyframes myMove {
-  0% {
-    transform: translateX(0%);
+  .background-image {
+    background-image: url("~@/assets/img/homePage/hou_bg2.png");
+    background-position: bottom;
+    background-size: 100% 100%;
+    width: 100%;
+    height: 100%;
+  }
+
+  .header {
+    width: 100%;
+    height: 20px;
+  }
+
+  .headline {
+    width: 100%;
+    height: 5%;
+    position: relative;
+  }
+
+  .headline-text {
+    margin-left: 4%;
+    font-family: Alibaba PuHuiTi 2;
+    font-weight: normal;
+    font-size: 30px;
+    color: #3c507e;
+  }
+
+  .main-1 {
+    margin-left: 1.5%;
+    width: 29%;
+    height: 75%;
+    background-image: url("~@/assets/img/homePage/hou_5.png");
+    background-size: 100% 100%;
+    border-radius: 10px;
+  }
+
+  .main-2 {
+    margin-left: 1.5%;
+    width: 29%;
+    height: 75%;
+    background-image: url("~@/assets/img/homePage/hou_4.png");
+    background-size: 100% 100%;
+    border-radius: 10px;
+  }
+
+  .main-3 {
+    margin-left: 1.5%;
+    width: 29%;
+    height: 75%;
+    background-image: url("~@/assets/img/homePage/hou_3.png");
+    background-size: 100% 100%;
+    border-radius: 10px;
+  }
+
+  .main-4 {
+    margin-left: 1.5%;
+    width: 30%;
+    height: 75%;
+    background-image: url("~@/assets/img/homePage/hou_2.png");
+    background-size: 100% 100%;
+    border-radius: 10px;
+  }
+
+  .main-5 {
+    margin-left: 1.5%;
+    width: 17%;
+    height: 75%;
+    background-image: url("~@/assets/img/homePage/hou_1.png");
+    background-size: 100% 100%;
+    border-radius: 10px;
+  }
+
+  .main {
+    width: 100%;
+    height: 30%;
+    /* 开启Flexbox布局 */
+    display: flex;
+  }
+
+  .footer {
+    width: 100%;
+    position: relative;
+    top: -5%;
+    // height: 43%;
+
+  }
+
+  .el-row {
+    margin-bottom: 20px;
+  }
+
+  .footer-main {
+    margin-left: 4%;
+    width: 91%;
+    border-radius: 10px;
+    margin-top: 15px;
+  }
+
+  .footer-main-top {
+    height: 26%;
+    font-family: Alibaba PuHuiTi 2;
+    font-weight: normal;
+    font-size: 16px;
+    color: #333333;
+    margin-left: 2%;
   }
-  100% {
-    transform: translateX(-100%);
+
+  .footer-fast {
+    width: 100%;
+    height: 64%;
+    /* 开启Flexbox布局 */
+    display: flex;
+  }
+
+  // .footer-fast-1 {
+  //   margin-left: 5%;
+  //   width: 4.5%;
+  //   height: 100%;
+  // }
+
+  .footer-fast-2 {
+    margin-left: 5%;
+    width: 4.5%;
+    height: 100%;
+  }
+
+  .footer-fast-1-1 p {
+    margin: 10px;
+    font-size: 14px;
+    // width: 100%;
+    // height: 53.84%;
+    // background-image: url("~@/assets/img/homePage/hou_addyuan.png");
+    // background-size: 100% 100%;
+
+  }
+
+  .footer-fast-1-2 {
+    font-family: Alibaba PuHuiTi 2;
+    font-weight: normal;
+    font-size: 14px;
+    text-align: center;
+  }
+
+  .footer-fast-2-1 {
+    width: 100%;
+    height: 53.84%;
+    background-image: url("~@/assets/img/homePage/hou_addlou.png");
+    background-size: 100% 100%;
+  }
+
+  .footer-fast-2-2 {
+    width: 100%;
+    height: 53.84%;
+    background-image: url("~@/assets/img/homePage/hou_addqiye.png");
+    background-size: 100% 100%;
+  }
+
+  .footer-fast-2-3 {
+    width: 100%;
+    height: 53.84%;
+    background-image: url("~@/assets/img/homePage/hou_addren.png");
+    background-size: 100% 100%;
+  }
+
+  .footer-fast-2-4 {
+    width: 100%;
+    height: 53.84%;
+    background-image: url("~@/assets/img/homePage/hou_shuishou.png");
+    background-size: 100% 100%;
+  }
+
+  .footer-fast-2-5 {
+    width: 100%;
+    height: 53.84%;
+    background-image: url("~@/assets/img/homePage/hou_addint.png");
+    background-size: 100% 100%;
+  }
+
+  .main-periphery {
+    margin-left: 8%;
+    width: 92%;
+    height: 50%;
+  }
+
+  .main-periphery2 {
+    margin-left: 0%;
+    height: 50%;
+  }
+
+  .main-periphery-font {
+    font-family: Alibaba PuHuiTi 2;
+    font-weight: normal;
+    font-size: 20px;
+  }
+
+  .main-periphery-numerical {
+    font-family: Alibaba PuHuiTi 2;
+    font-weight: bold;
+    font-size: 40px;
+  }
+
+  .main-periphery-font-small {
+    font-family: Alibaba PuHuiTi 2;
+    font-weight: normal;
+    font-size: 15px;
+  }
+
+  .roll-name-box {
+    width: 100%;
+    padding-left: 1vw;
+    padding-right: 1vw;
+    height: 3vh;
+    color: #fff;
+    background: #0f467a;
+    line-height: 3vh;
+    font-size: 1.5vh;
+    overflow: hidden;
+    white-space: nowrap;
+  }
+
+  .scroll-content {
+    margin-left: 50%; // 把文字弄出可见区域
+    width: 200%;
+    animation: myMove 100s linear infinite; // 重点,定义动画
+    animation-fill-mode: forwards;
+    color: #fff;
+  }
+
+  @keyframes myMove {
+    0% {
+      transform: translateX(0%);
+    }
+
+    100% {
+      transform: translateX(-100%);
+    }
   }
-}
 </style>

+ 188 - 0
jp-ui/src/views/modules/sys/dashboard/analysis/visitStatistics.vue

@@ -0,0 +1,188 @@
+<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" title="企业名称">
+        <el-input size="small" v-model="searchForm.name" placeholder="企业名称" clearable></el-input>
+      </el-form-item>
+      <el-form-item prop="des1" title="属地">
+        <el-select v-model="searchForm.des1" placeholder="请选择">
+          <el-option v-for="item in areaList" :key="item" :label="item" :value="item">
+          </el-option>
+        </el-select>
+      </el-form-item>
+      <el-form-item prop="createTime">
+        <el-date-picker size="mini" v-model="searchForm.createTime" type="daterange" align="right" unlink-panels
+          range-separator="至" start-placeholder="开始日期" end-placeholder="结束日期">
+        </el-date-picker>
+      </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>
+        <template #buttons>
+          <el-button type="primary" size="small" @click="add()">导出</el-button>
+        </template>
+      </vxe-toolbar> -->
+      <div style="height: calc(100% - 80px);">
+        <vxe-table border="inner" auto-resize resizable height="auto" :loading="loading" size="small"
+          ref="lyServiceTable" show-header-overflow show-overflow highlight-hover-row :menu-config="{}"
+          :print-config="{}"  :export-config="{
+                remote: true,
+                filename: `走访统计${moment(new Date()).format(
+            		'YYYY-MM-DD'
+                )}`,
+                sheetName: '走访统计',
+                exportMethod: exportMethod,
+                types: ['xlsx'],
+                modes: ['current', 'selected', 'all'],
+            }" :data="dataList" :checkbox-config="{}">
+          <vxe-column type="seq" width="80" title="序号"></vxe-column>
+          <vxe-column field="bz5"  title="挂钩干部">
+          </vxe-column>
+          <vxe-column field="sum"  title="走访次数">
+          </vxe-column>
+          <!-- <vxe-column field="contactDate" title="单位">
+          </vxe-column> -->
+          <vxe-column fixed="right" align="center" width="200" title="操作">
+            <!-- <template slot-scope="scope">
+              <el-button v-if="hasPermission('service:lyService:view')" type="text" icon="el-icon-view" size="small"
+                @click="view(scope.row.id)">查看</el-button>
+              <el-button v-if="hasPermission('service:lyService:edit')" type="text" icon="el-icon-edit" size="small"
+                @click="edit(scope.row.id)">修改</el-button>
+              <el-button v-if="hasPermission('service:lyService:del')" type="text" icon="el-icon-delete" size="small"
+                @click="del(scope.row.id)">删除</el-button>
+            </template> -->
+          </vxe-column>
+        </vxe-table>
+      </div>
+    </div>
+  </div>
+</template>
+
+<script>
+  import lyServiceService from '@/api/service/lyServiceService'
+  export default {
+    data() {
+      return {
+        searchForm: {
+          name: '',
+          des1: '',
+          createTime: []
+        },
+        dataList: [],
+        areaList: [],
+        loading: false
+      }
+    },
+    activated() {
+      this.searchForm.des1 = this.$route.params.name
+      this.searchForm.createTime = this.$route.params.createTime
+      this.searchForm.createTime[0] = new Date(this.$route.params.createTime[0])
+      this.refreshList()
+      this.getAreaInfo()
+    },
+    methods: {
+      // 获取数据列表
+      refreshList() {
+        this.loading = true
+        this.searchForm.beginTime = this.searchForm.createTime[0]
+        this.searchForm.endTime = this.searchForm.createTime[1]
+        lyServiceService.getPersonInfo({
+          ...this.searchForm
+        }).then(({
+          data
+        }) => {
+          this.dataList = data
+          this.loading = false
+        })
+      },
+      getAreaInfo() {
+        this.areaList = []
+        lyServiceService.getAreaInfo().then(({
+          data
+        }) => {
+          for (var index = 0; index < data.length; index++) {
+            this.areaList.push(data[index].des1);
+          }
+        })
+      },
+
+
+      // 下载模板
+      downloadTpl() {
+        this.loading = true
+        lyServiceService.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
+        lyServiceService.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 lyServiceService.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>