2 Commits fb2683e1d3 ... de507fff7b

Author SHA1 Message Date
  yin_yu820 de507fff7b Merge remote-tracking branch 'origin/master' 10 months ago
  yin_yu820 3db0d4dc96 工作台 10 months ago

+ 15 - 6
jp-console/jeeplus-modules/gw/src/main/java/com/jeeplus/circulation2/controller/GwCirculationCard2Controller.java

@@ -153,14 +153,23 @@ public class GwCirculationCard2Controller {
 	@GetMapping("getStatistics")
 	public ResponseEntity<HashMap<String, Object>> getStatistics() {
 		UserDTO userDTO=UserUtils.getCurrentUserDTO();
-		HashMap<String, Object> result = gwCirculationCard2Service.getStatistics ( userDTO.getId() );
+
+		HashMap<String, Object> result =new HashMap<>();
+		HashMap<String, Object> gw = gwCirculationCard2Service.getStatistics ( userDTO.getId() );
 		HashMap<String, Object> yz = yzCirculationCardService.getStatistics ( userDTO.getId() );
-		result.put("gw_db",result.get("db"));
-		result.put("allcount",Integer.parseInt(result.get("allcount").toString()) + Integer.parseInt(yz.get("allcount").toString())  );
-		result.put("db",Integer.parseInt(result.get("db").toString()) + Integer.parseInt(yz.get("db").toString())  );
-		result.put("gdcount",Integer.parseInt(result.get("gdcount").toString()) + Integer.parseInt(yz.get("gdcount").toString())  );
-		result.put("yb",Integer.parseInt(result.get("yb").toString()) + Integer.parseInt(yz.get("yb").toString())  );
+		result.put("allcount",Integer.parseInt(gw.get("allcount").toString()) + Integer.parseInt(yz.get("allcount").toString())  );
+		result.put("db",Integer.parseInt(gw.get("db").toString()) + Integer.parseInt(yz.get("db").toString())  );
+		result.put("gw_db",gw.get("db"));
 		result.put("yz_db",yz.get("db"));
+		int a = Integer.parseInt(gw.get("yb").toString());
+		int b = Integer.parseInt(yz.get("yb").toString());
+		int fff = a+b;
+		result.put("yb", fff );
+		result.put("gw_yb",gw.get("yb"));
+		result.put("yz_yb",Integer.parseInt(yz.get("yb").toString()));
+		result.put("gdcount",Integer.parseInt(gw.get("gdcount").toString()) + Integer.parseInt(yz.get("gdcount").toString())  );
+		result.put("gw_gd",gw.get("gdcount"));
+		result.put("yz_gd",yz.get("gdcount"));
 		return ResponseEntity.ok ( result  );
 	}
 

+ 2 - 0
jp-console/jeeplus-modules/gw/src/main/java/com/jeeplus/circulation2/mapper/GwCirculationCard2Mapper.java

@@ -13,6 +13,7 @@ import com.jeeplus.circulation2.service.dto.GwCirculationCard2DTO;
 import org.apache.ibatis.annotations.Param;
 
 import java.util.HashMap;
+import java.util.List;
 
 /**
  * 公文流转MAPPER接口
@@ -25,6 +26,7 @@ public interface GwCirculationCard2Mapper extends BaseMapper<GwCirculationCard2>
 
     IPage<GwCirculationCard2DTO> findList(Page<GwCirculationCard2> page, @Param(Constants.WRAPPER) QueryWrapper queryWrapper,String state,String userid,boolean isadmin);
 
+    List<HashMap<String, Object>> findListByStr(String searchContent, String userid, boolean isadmin);
     HashMap<String, Object> getStatistics(String userid);
     int getStatistics2(String userid);
     int getStatistics3(String userid);

+ 17 - 0
jp-console/jeeplus-modules/gw/src/main/java/com/jeeplus/circulation2/mapper/xml/GwCirculationCard2Mapper.xml

@@ -57,6 +57,23 @@
         order by a.state asc,a.update_time desc
     </select>
 
+    <select id="findListByStr" resultType="java.util.HashMap">
+        SELECT
+        <include refid="circulation2DetailColumns"/>
+        FROM gw_circulation_card2 a
+        <include refid="circulation2DetailJoins"/>
+
+        Where (a.sending_agency like concat('%', #{searchContent}, '%') or a.written_time like concat('%', #{searchContent}, '%') or a.receiving_time like concat('%', #{searchContent}, '%')
+        or a.content_summary like concat('%', #{searchContent}, '%') or a.attached_document_id like concat('%', #{searchContent}, '%'))
+
+        <if test="!isadmin">
+            AND (b.update_by_id=#{userid} or b.create_by_id=#{userid})
+        </if>
+
+        group by a.id
+        order by a.state asc,a.update_time desc
+    </select>
+
     <select id="getStatistics" resultType="java.util.HashMap">
         SELECT IFNULL(sum(if (a.del_flag=0,1,0)),0) allcount,
                IFNULL(sum(if (a.state=3,1,0)),0) gdcount

+ 4 - 0
jp-console/jeeplus-modules/gw/src/main/java/com/jeeplus/circulation2/service/GwCirculationCard2Service.java

@@ -42,6 +42,10 @@ public class GwCirculationCard2Service extends ServiceImpl<GwCirculationCard2Map
         return  baseMapper.findList (page, queryWrapper,state,userid,isadmin);
     }
 
+    public List<HashMap<String, Object>> findListByStr(String searchContent,String userid,boolean isadmin) {
+        List<HashMap<String, Object>> aa=baseMapper.findListByStr(searchContent,userid,isadmin);
+        return aa;
+    }
     public HashMap<String, Object> getStatistics(String userid) {
         HashMap<String, Object> aa=baseMapper.getStatistics(userid);
         int a1=baseMapper.getStatistics2(userid);

+ 166 - 0
jp-console/jeeplus-modules/gw/src/main/java/com/jeeplus/workbench/WorkBenchController.java

@@ -0,0 +1,166 @@
+package com.jeeplus.workbench;
+
+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.aop.logging.annotation.ApiLog;
+import com.jeeplus.circulation2.service.GwCirculationCard2Service;
+import com.jeeplus.circulation2.service.dto.GwCirculationCard2DTO;
+import com.jeeplus.circulation2.service.mapstruct.GwCirculationCard2Wrapper;
+import com.jeeplus.core.query.QueryWrapperGenerator;
+import com.jeeplus.sys.domain.DictValue;
+import com.jeeplus.sys.service.dto.DictValueDTO;
+import com.jeeplus.sys.service.dto.RoleDTO;
+import com.jeeplus.sys.service.dto.UserDTO;
+import com.jeeplus.sys.utils.UserUtils;
+import io.swagger.annotations.Api;
+import io.swagger.annotations.ApiOperation;
+import org.apache.commons.collections.map.HashedMap;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.http.ResponseEntity;
+import org.springframework.web.bind.annotation.GetMapping;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RestController;
+
+import javax.servlet.http.HttpServletRequest;
+import java.util.ArrayList;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+import java.util.stream.Collectors;
+
+@Api(tags ="工作台")
+@RestController
+@RequestMapping(value = "/workbench/index")
+public class WorkBenchController {
+
+    @Autowired
+    private GwCirculationCard2Service gwCirculationCard2Service;
+
+    @Autowired
+    private GwCirculationCard2Wrapper gwCirculationCard2Wrapper;
+
+    @ApiLog("一键搜")
+    @ApiOperation(value = "一键搜")
+    @GetMapping("queryOneSearch")
+    public ResponseEntity<Map<String,Object>> queryOneSearch(HttpServletRequest request, String searchContent) throws Exception{
+        Map<String,Object> map = new HashedMap();
+        List<WorkBenchDTO> workBenchList = new ArrayList<>();
+
+        UserDTO userDTO= UserUtils.getCurrentUserDTO();
+        List<RoleDTO> list=userDTO.getRoleDTOList();
+        boolean isadmin=false;
+        for (RoleDTO aa:list) {
+            if(aa.getName().equals("租户管理员")||aa.getName().equals("管理员")){
+                isadmin=true;
+            }
+        }
+        //来文机关/日期/摘要内容/附件名称
+        List<HashMap<String, Object>> result=gwCirculationCard2Service.findListByStr (searchContent,userDTO.getId(),isadmin);
+        for(HashMap<String, Object> gw1:result){
+            WorkBenchDTO workBenchDTO = new WorkBenchDTO();
+            workBenchDTO.setTitle("年度:["+gw1.get("yearNum")+"]"+gw1.get("cardNum")+"号  来文机关:"+gw1.get("sendingAgency"));
+
+            String aa=gw1.get("contentSummary").toString();
+            if(aa.length()>60){
+                aa=aa.substring(0,60)+"...";
+            }
+            workBenchDTO.setContent("内容摘要:"+aa+" 收文时间:"+gw1.get("receivingTime")+" 文件来源:"+gw1.get("fileSource")+" 文件字号:"+gw1.get("docFontSize"));
+            workBenchDTO.setId(gw1.get("id").toString());
+            workBenchDTO.setType("cs");
+            workBenchList.add(workBenchDTO);
+        }
+
+
+//        for(ReligiousSitesInfoDTO sitesInfoDTO:result){
+//            WorkBenchDTO workBenchDTO = new WorkBenchDTO();
+//            sitesInfoDTO.setSiteDetailInfo("联系人:"+sitesInfoDTO.getContact()+" 联系方式:"+sitesInfoDTO.getContactNumber()+" 所属地区:"+sitesInfoDTO.getPlaceSelectName()+" 地点:"+sitesInfoDTO.getPlace());
+//            workBenchDTO.setTitle(sitesInfoDTO.getName()+"(场所)");
+//            workBenchDTO.setContent(sitesInfoDTO.getSiteDetailInfo());
+//            workBenchDTO.setId(sitesInfoDTO.getId());
+//            workBenchDTO.setType("cs");
+//            workBenchList.add(workBenchDTO);
+//        }
+//        map.put("siteList",siteList);
+//        Map<String,Object> rymap = new HashedMap();
+//        //人员搜索
+//        rymap.put("name",searchContent);
+//        rymap.put("idcard",searchContent);
+//        rymap.put("phone",searchContent);
+//        rymap.put("nativePlace",searchContent);
+//        rymap.put("currentResidence",searchContent);
+//        List<UserManagementDTO> ryList = ""==searchContent?new ArrayList<>(): userManagementService.findCountsByParama(rymap);
+//        List<DictValueDTO> list = dictValueService.lambdaQuery ().
+//                eq ( DictValue::getDictTypeId, "1574590144800018433").
+//                orderByAsc (DictValue::getSort).list ().stream ().
+//                map (dictValueWrapper::toDTO).collect (Collectors.toList ());
+//        for(UserManagementDTO userDto:ryList){
+//            WorkBenchDTO workBenchDTO = new WorkBenchDTO();
+//            StringBuffer sb1 = new StringBuffer();
+//            String personnelType = userDto.getPersonnelType();
+//            if (null != personnelType && !"".equals(personnelType)) {
+//                String[] personnelTypes = personnelType.split(",");
+//                for (int j = 0; j < personnelTypes.length; j++) {
+//                    for (int k = 0; k < list.size(); k++) {
+//                        DictValueDTO dictValueDTO = list.get(k);
+//                        if(personnelTypes[j].equals(dictValueDTO.getValue())){
+//                            sb1.append(dictValueDTO.getLabel());
+//                            if(j+1<personnelTypes.length){
+//                                sb1.append(",");
+//                            }
+//                        }
+//                    }
+//                }
+//            }
+//            if("1".equals(userDto.getSex())){
+//                String phone = userDto.getPhone()==null?"无":userDto.getPhone();
+//                userDto.setRyDetailInfo("性别:男"+" 身份证号:"+userDto.getIdNumber()+" 联系方式:"+phone+" 人员类型:"+sb1.toString()+" 籍贯:"+userDto.getNativePlace()+" 现居地:"+userDto.getCurrentResidence());
+//            }else{
+//                String phone = userDto.getPhone()==null?"无":userDto.getPhone();
+//                userDto.setRyDetailInfo("性别:女"+" 身份证号:"+userDto.getIdNumber()+" 联系方式:"+phone+" 人员类型:"+sb1.toString()+" 籍贯:"+userDto.getNativePlace()+" 现居地:"+userDto.getCurrentResidence());
+//            }
+//            workBenchDTO.setTitle(userDto.getName()+"(人员)");
+//            workBenchDTO.setContent(userDto.getRyDetailInfo());
+//            workBenchDTO.setId(userDto.getId());
+//            workBenchDTO.setType("ry");
+//            workBenchList.add(workBenchDTO);
+//        }
+//        map.put("ryList",ryList);
+//        //组织搜索
+//        Map<String,Object> zzmap = new HashedMap();
+//        zzmap.put("name",searchContent);
+//        zzmap.put("organization",searchContent);
+//        zzmap.put("organizationPhone",searchContent);
+//        List<ReligionDTO> religionList = ""==searchContent?new ArrayList<>():religionService.findByName(zzmap);
+//        for(ReligionDTO religionDTO:religionList){
+//            WorkBenchDTO workBenchDTO = new WorkBenchDTO();
+//            religionDTO.setReDetailInfo("组织负责人:"+religionDTO.getOrganization()+" 负责人联系方式:"+religionDTO.getOrganizationPhone()+" 组织规模:"+religionDTO.getOrganizationSize()+" 所属区域:"+religionDTO.getPlaceSelectName()+" 详细地址:"+religionDTO.getPlaceDetailed());
+//            workBenchDTO.setTitle(religionDTO.getOrganizationName()+"(组织)");
+//            workBenchDTO.setContent(religionDTO.getReDetailInfo());
+//            workBenchDTO.setId(religionDTO.getId());
+//            workBenchDTO.setType("zz");
+//            workBenchList.add(workBenchDTO);
+//        }
+//        map.put("religionList",religionList);
+//        //待办搜索
+//        AssignWorkOrderDTO assignWorkOrderDTO = new AssignWorkOrderDTO();
+//        QueryWrapper queryWrapper = QueryWrapperGenerator.buildQueryCondition ( assignWorkOrderDTO, AssignWorkOrderDTO.class);
+//        queryWrapper.like("problem_content",searchContent);
+//        Page<AssignWorkOrderDTO> page = new Page<AssignWorkOrderDTO>();
+//        IPage<AssignWorkOrderDTO> result = assignWorkOrderService.findTop (page, queryWrapper);
+//        List<AssignWorkOrderDTO> orderDTOList = ""==searchContent?new ArrayList<>():result.getRecords();
+//        for(AssignWorkOrderDTO workOrderDTO:orderDTOList){
+//            WorkBenchDTO workBenchDTO = new WorkBenchDTO();
+//            workOrderDTO.setWorkDetailInfo("问题发生地区:"+workOrderDTO.getAreaSelectName()+" 问题发生时间:"+workOrderDTO.getProblemTime());
+//            workBenchDTO.setTitle("待办事项"+"(待办)");
+//            workBenchDTO.setContent(workOrderDTO.getWorkDetailInfo());
+//            workBenchDTO.setId(workOrderDTO.getId());
+//            workBenchDTO.setType("db");
+//            workBenchList.add(workBenchDTO);
+//        }
+//        map.put("dbList",orderDTOList);
+        map.put("totalList",workBenchList);
+        return ResponseEntity.ok(map);
+    }
+
+}

+ 42 - 0
jp-console/jeeplus-modules/gw/src/main/java/com/jeeplus/workbench/WorkBenchDTO.java

@@ -0,0 +1,42 @@
+/**
+ * Copyright © 2021-2025 <a href="http://www.jeeplus.org/">JeePlus</a> All rights reserved.
+ */
+package com.jeeplus.workbench;
+
+import com.jeeplus.core.service.dto.BaseDTO;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+
+/**
+ * ZfjgPolicyDTO
+ * @author sswei
+ * @version 2022-11-18
+ */
+@Data
+@EqualsAndHashCode(callSuper = false)
+public class WorkBenchDTO extends BaseDTO {
+
+	private static final long serialVersionUID = 1L;
+
+
+	/**
+     * 标题
+     */
+	private String title;
+	/**
+     * 简介
+     */
+	private String content;
+
+	/**
+	 * 类型
+	 */
+	private String type;
+
+	/**
+	 * 主键
+	 */
+	private String id;
+
+
+}

+ 10 - 8
jp-console/jeeplus-web/target/classes/application-production.yml

@@ -1,10 +1,10 @@
 server:
-  port: 8078
+  port: 8015
   servlet:
     context-path:
   tomcat:
     uri-encoding: UTF-8
-    basedir: /Users/liugf
+    basedir: /usr/local/yc_gwlz
     max-threads: 2000
     min-spare-threads: 10
     accesslog:
@@ -20,9 +20,11 @@ server:
     max-http-form-post-size: 20000000B
 logging:
   level:
-    root: INFO
+    #root: INFO
+    root: ERROR
     #    org.flowable: DEBUG
-    com.jeeplus: DEBUG
+    com.jeeplus: ERROR
+    #com.jeeplus: DEBUG
     org.apache.shiro.cache.ehcache.EhCacheManager: WARN
 spring:
   servlet:
@@ -49,8 +51,8 @@ spring:
       datasource:
         master:
           username: root
-          password: root
-          url: jdbc:mysql://127.0.0.1:3306/jeeplus-vue-saas-v3?useUnicode=true&characterEncoding=utf-8&useSSL=false&nullCatalogMeansCurrent=true&serverTimezone=GMT%2B8
+          password: dmjxcc@20210730
+          url: jdbc:mysql://localhost:3306/yc_gwlz?useUnicode=true&characterEncoding=utf-8&useSSL=false&nullCatalogMeansCurrent=true&serverTimezone=GMT%2B8
           driver-class-name: com.mysql.cj.jdbc.Driver
 
           #oracle database settings
@@ -86,7 +88,7 @@ spring:
     host: localhost
     port: 6379
     expireTime: 3600000 #单位秒
-    database: 3
+    database: 8
   mvc.servlet.load-on-startup: 1
   jmx:
     enabled: false
@@ -167,7 +169,7 @@ config:
     type: local
     baseDir: local
     local:
-      location: /userfiles
+      location: /usr/local/yc_gwlz
     aliyun:
       endpoint:
       accessKeyId:

+ 1 - 0
jp-console/jeeplus-web/target/classes/application.yml

@@ -1,6 +1,7 @@
 spring:
   profiles:
     active: development
+    #active: production
 ##############################################
 #
 # thymeleaf静态资源配置

BIN
jp-ui/public/img/bt1.jpg


BIN
jp-ui/public/img/bt2.jpg


BIN
jp-ui/public/img/home1.jpg


+ 23 - 0
jp-ui/src/api/workbench/WorkService.js

@@ -0,0 +1,23 @@
+import request from "@/utils/httpRequest";
+
+export default {
+
+  queryOneSearch: function (searchContent) {
+  	return request({
+  		url: "/workbench/index/queryOneSearch",
+  		method: "get",
+		params: {searchContent: searchContent}
+  	});
+  },
+
+  getStatistics: function () {
+  	return request({
+  		url: "/circulation2/gwCirculationCard2/getStatistics",
+  		method: "get"
+  	});
+  },
+
+
+
+
+}

+ 3 - 0
jp-ui/src/main.js

@@ -28,6 +28,8 @@ import "jeeplus-form-boot-v3/dist/index.css";
 
 import tool from "@/utils/tool";
 
+import * as echarts from 'echarts'
+
 const app = createApp(App);
 import "moment/locale/zh-cn";
 moment.locale("zh-cn");
@@ -49,6 +51,7 @@ app.config.globalProperties.deepClone = utils.deepClone;
 app.config.globalProperties.validatenull = utils.validatenull;
 app.config.globalProperties.$http = httpRequest; // ajax请求方法
 app.config.globalProperties.$cookies = VueCookies;
+app.config.globalProperties.$echarts = echarts;
 
 app.use(store);
 app.use(router);

+ 4 - 0
jp-ui/src/views/circulation2/GwCirculationCard2List.vue

@@ -280,6 +280,10 @@
 		})
     },
     activated () {
+		let aa=this.$route.query.state;
+		if(aa!=undefined){
+			this.searchForm.state=aa
+		}
 		this.refreshList()
 
 		let user = JSON.parse(window.localStorage.getItem('USER_INFO'))

+ 559 - 3
jp-ui/src/views/dashboard/index.vue

@@ -1,27 +1,583 @@
 <template>
-	<div >
+	<div class="flex2">
+
+		<div style="margin-top: 8px;width: 100%; background: white;padding: 13px;"  >
+			<div class="flex">
+				<div class="t1">工作台</div>
+				<div class="flex" style="align-items: center;width: 95%;justify-content: center;">
+					<div class="search-header-box-search">
+						<input type="search"
+						  class="search-header-box-searchinput"
+						  id='oneSearchText' v-model='searchContent' placeholder="请输入来文机关/日期/摘要内容/附件名称">
+						<el-button type="primary" @click="searchFrom" size="small" style="font-size: large;height: 50px;width: 19%;border-radius: 26px;" >一键搜</el-button>
+					</div>
+				</div>
+
+			</div>
+		</div>
+
+		<div class="flex" >
+			<div class="m3">
+				<el-card>
+				  <div class="t1">系统流程图</div>
+				  <el-image class="im1" src="public/img/home1.jpg" :fit="fit" />
+				</el-card>
+			</div>
+			<div class="m7">
+				<div class="t1">快捷导航</div>
+
+				<div class="flex">
+					<el-card class="card" :body-style="{ padding: '15px'}" @click="tab1">
+						<el-image class="im2" src="public/img/bt1.jpg" :fit="fit" />
+						<div class="t2">文件传阅</div>
+					</el-card>
+
+					<el-card class="card" style="margin-left: 20px;" :body-style="{ padding: '15px'}" @click="tab2" >
+						<el-image class="im2" src="public/img/bt2.jpg" :fit="fit" />
+						<div class="t2">用印审批</div>
+					</el-card>
+				</div>
+
+				<div class="flex">
+
+					<el-card class="card2" :body-style="{ padding: '15px 20px 15px 20px '}">
+
+					  <div class="flex2">
+						<div class="t1">
+						  待办
+						</div>
+						<div class="flex">
+						  <div class="tt1">
+							{{tcol1}}
+						  </div>
+						  <div class="flex2">
+							<div class="flex" @click="dbgw">
+								<div class="tt11">
+								  文件传阅
+								</div>
+								<div class="tt12">
+								  {{tcol2}}
+								</div>
+							</div>
+
+							<div class="flex" @click="dbyz">
+								<div class="tt11">
+								  用印审批
+								</div>
+								<div class="tt12">
+								  {{tcol3}}
+								</div>
+							</div>
+						  </div>
+						</div>
+					  </div>
+
+					</el-card>
+
+					<el-card class="card2" style="margin-left: 18px;" :body-style="{ padding: '15px 20px 15px 20px'}">
+
+					  <div class="flex2">
+						<div class="t1">
+						  已办
+						</div>
+						<div class="flex">
+						  <div class="tt2">
+							{{tcol4}}
+						  </div>
+						  <div class="flex2">
+							<div class="flex" @click="ybgw">
+								<div class="tt11">
+								  文件传阅
+								</div>
+								<div class="tt12">
+								  {{tcol5}}
+								</div>
+							</div>
+
+							<div class="flex" @click="ybyz">
+								<div class="tt11">
+								  用印审批
+								</div>
+								<div class="tt12">
+								  {{tcol6}}
+								</div>
+							</div>
+						  </div>
+						</div>
+					  </div>
+
+					</el-card>
+
+					<el-card class="card2" style="margin-left: 18px;" :body-style="{ padding: '15px 20px 15px 20px'}">
+
+					  <div class="flex2">
+						<div class="t1">
+						  已归档
+						</div>
+						<div class="flex">
+						  <div class="tt3">
+							{{tcol7}}
+						  </div>
+						  <div class="flex2">
+							<div class="flex"  @click="gdgw">
+								<div class="tt11">
+								  文件传阅
+								</div>
+								<div class="tt12">
+								  {{tcol8}}
+								</div>
+							</div>
+
+							<div class="flex" @click="gdyz">
+								<div class="tt11">
+								  用印审批
+								</div>
+								<div class="tt12">
+								  {{tcol9}}
+								</div>
+							</div>
+						  </div>
+						</div>
+					  </div>
+
+					</el-card>
+
+				</div>
+
+				<div class="t1" style="margin-top: 10px;">数据分析</div>
+
+				<el-card class="card" >
+					<div class="flex">
+						<div class="flex2" style="width: 30%;">
+							<div class="t1">
+							  待办文件类型分析
+							</div>
+							<div style="height:270px; width: 100%;" id="tx1" >
+							</div>
+						</div>
+
+						<div class="flex2" style="width: 30%;">
+							<div class="t1">
+							  已办文件类型分析
+							</div>
+							<div style="height:270px; width: 100%;" id="tx2">
+							</div>
+						</div>
+
+						<div class="flex2" style="width: 30%;">
+							<div class="t1">
+							  已归档文件类型分析
+							</div>
+							<div style="height:270px; width: 100%;" id="tx3">
+							</div>
+						</div>
+					</div>
+				</el-card>
+
+			</div>
+		</div>
 
 	</div>
 </template>
 
 <script>
 
+import WorkService from '@/api/workbench/WorkService'
 export default {
 	name: "dashboard",
 	components: {
 	},
 	data() {
 		return {
+			loading: false,
+			showsearch: false,
 			pageLoading: true,
+			searchContent:"",
+			tcol1:0,
+			tcol2:0,
+			tcol3:0,
+			tcol4:0,
+			tcol5:0,
+			tcol6:0,
+			tcol7:0,
+			tcol8:0,
+			tcol9:0,
 		};
 	},
-	mounted() {},
+	mounted() {
+		this.getStatistics()
+	},
 	methods: {
 		onMounted() {
 			this.pageLoading = false;
 		},
+
+		getStatistics(){
+			WorkService.getStatistics().then((data ) => {
+				this.tcol1=data.db;
+				this.tcol2=data.gw_db;
+				this.tcol3=data.yz_db;
+				this.tcol4=data.yb;
+				this.tcol5=data.gw_yb;
+				this.tcol6=data.yz_yb;
+				this.tcol7=data.gdcount;
+				this.tcol8=data.gw_gd;
+				this.tcol9=data.yz_gd;
+
+				this.line_fun1("文件传阅","用印审批",this.tcol2,this.tcol3)
+				this.line_fun2("文件传阅","用印审批",this.tcol5,this.tcol6)
+				this.line_fun3("文件传阅","用印审批",this.tcol8,this.tcol9)
+
+			})
+		},
+
+		searchFrom() {
+		  this.searchContent = document.getElementById('oneSearchText').value
+		  this.$router.push({
+		    path: '/dashboard/search',
+		    query: {
+		      searchContent: this.searchContent
+		    }
+		  })
+		},
+
+		tab1() {
+		  this.$router.push({
+		    path: '/circulation2/GwCirculationCard2List',
+		  })
+		},
+
+		tab2() {
+		  this.$router.push({
+		    path: '/yzcirculation/YzCirculationCardList',
+		  })
+		},
+
+		dbgw() {
+		  this.$router.push({
+		    path: '/circulation2/GwCirculationCard2List',
+			query: {
+			  state: 1
+			}
+		  })
+		},
+		dbyz() {
+		  this.$router.push({
+		    path: '/yzcirculation/YzCirculationCardList',
+			query: {
+			  state: 1
+			}
+		  })
+		},
+
+		ybgw() {
+		  this.$router.push({
+		    path: '/circulation2/GwCirculationCard2List',
+			query: {
+			  state: 4
+			}
+		  })
+		},
+		ybyz() {
+		  this.$router.push({
+		    path: '/yzcirculation/YzCirculationCardList',
+			query: {
+			  state: 4
+			}
+		  })
+		},
+
+		gdgw() {
+		  this.$router.push({
+		    path: '/circulation2/GwCirculationCard2List',
+			query: {
+			  state: 3
+			}
+		  })
+		},
+		gdyz() {
+		  this.$router.push({
+		    path: '/yzcirculation/YzCirculationCardList',
+			query: {
+			  state: 3
+			}
+		  })
+		},
+
+
+		line_fun1 (name1,name2,value1,value2) {
+
+		    var myChart = this.$echarts.init(document.getElementById('tx1'))
+
+		    const gaugeData = [
+		      {
+		        value: value1,
+		        name: name1,
+		        title: {
+		          offsetCenter: [0, -45]
+		        },
+		        detail: {
+		          valueAnimation: true,
+		          offsetCenter: ['0%', '-20%']
+		        },itemStyle: {
+			        color: "#77AFF4"
+			      }
+		      },
+		      {
+		        value: value2,
+		        name: name2,
+		        title: {
+		          offsetCenter: [0, 15]
+		        },
+		        detail: {
+		          valueAnimation: true,
+		          offsetCenter: ['0%', '40%']
+		        },itemStyle: {
+			        color: "#F9974F"
+			      }
+		      }
+		    ];
+		    const option = {
+		      series: [
+		        {
+		          type: 'gauge',
+		          startAngle: 90,
+		          endAngle: -270,
+		          pointer: {
+		            show: false
+		          },
+		          progress: {
+		            show: true,
+		            overlap: false,
+		            roundCap: true,
+		            clip: false,
+		          },
+		          axisLine: {
+		            lineStyle: {
+		              width: 20
+		            }
+		          },
+		          splitLine: {
+		            show: false,
+		            distance: 0,
+		            length: 10
+		          },
+		          axisTick: {
+		            show: false
+		          },
+		          axisLabel: {
+		            show: false,
+		            distance: 50
+		          },
+		          data: gaugeData,
+		          title: {
+		            fontSize: 15
+		          },
+		          detail: {
+		            width: 30,
+		            height: 14,
+		            fontSize: 14,
+		            color: 'inherit',
+
+		            formatter: '{value}'
+		          }
+		        }
+		      ]
+		    };
+
+
+		    myChart.setOption(option)
+
+		},
+
+		line_fun2 (name1,name2,value1,value2) {
+		var myChart = this.$echarts.init(document.getElementById('tx2'))
+
+			 const option = {
+			  tooltip: {
+			    trigger: 'item'
+			  },
+
+			  series: [
+			    {
+			      type: 'pie',
+			      radius: ['30%', '53%'],
+			      avoidLabelOverlap: false,
+			      padAngle: 20,
+				  roseType: 'area',
+			      itemStyle: {
+			        borderRadius: 4
+			      },
+			      emphasis: {
+			        scaleSize: 12,
+			        label: {
+			          show: true,
+			          fontSize: 20,
+			          fontWeight: 'bold'
+			        }
+			      },
+			      data: [
+			        { value: value2, name: name2 ,itemStyle: {
+			        color: "#138DB6"
+			      }},
+			        { value: value1, name: name1,itemStyle: {
+			        color: "#12B5B0" }}
+			      ]
+			    }
+			  ]
+			};
+
+
+			myChart.setOption(option)
+
+		},
+
+		line_fun3 (name1,name2,value1,value2) {
+		var myChart = this.$echarts.init(document.getElementById('tx3'))
+
+
+
+			 const option = {
+			  tooltip: {
+			    trigger: 'item'
+			  },
+			  legend: {
+			    top: '88%',
+			    left: 'right',
+
+			  },
+			  series: [
+			    {
+			      type: 'pie',
+			      radius: ['0', '50%'],
+			      avoidLabelOverlap: false,
+			      padAngle: 30,
+			      itemStyle: {
+			        borderRadius: 1
+			      },
+			      emphasis: {
+			        scaleSize: 15,
+			        label: {
+			          show: true,
+			          fontSize: 22,
+			          fontWeight: 'bold'
+			        }
+			      },
+			      data: [
+			        { value: value2, name: name2 ,itemStyle: {
+			        color: "#F2A80C"
+			      }},
+			        { value: value1, name: name1,itemStyle: {
+			        color: "#66D1F5" }}
+			      ]
+			    }
+			  ]
+			};
+
+
+			myChart.setOption(option)
+
+		},
+
+
+
+
 	},
 };
 </script>
 
-<style></style>
+<style>
+  .flex {
+    display: flex;
+  }
+  .flex2 {
+    display: flex;
+	flex-direction: column;
+  }
+.m3{
+	width: 30%;
+	padding: 10px;
+	min-height: 88%;
+}
+
+.m7{
+	width: 70%;
+	padding: 10px;
+}
+.t1{
+	font-size: 20px;
+	font-weight: 700;
+}
+.t2{
+	font-size: 17px;
+
+}
+.tt1{
+	padding-top: 6px;
+	font-size: 42px;
+	min-width: 86px;
+	font-weight: 700;
+	color: #ffaa00;
+}
+.tt11{
+	font-size: 15px;
+	padding-top: 7px;
+	padding-bottom: 2px;
+}
+.tt12{
+	margin-left: 25px;
+	margin-right: 15px;
+	font-size: 20px;
+	padding-top: 2px;
+	color: #ffaa00;
+	padding-bottom: 4px;
+}
+.tt2{
+	padding-top: 6px;
+	font-size: 42px;
+	min-width: 110px;
+	font-weight: 700;
+	color: #0173ff;
+}
+.tt3{
+	padding-top: 6px;
+	font-size: 42px;
+	min-width: 110px;
+	font-weight: 700;
+	color: #55ff7f;
+}
+.im1{
+	padding-top: 30px;
+	padding-bottom: 60px;
+}
+.im2{
+	width: 50px;
+	height: 50px;
+
+}
+.card{
+	text-align: center;margin-top: 8px;padding: 2px;
+	border-radius: 10px;
+}
+.card2{
+	margin-top: 15px;
+	border-radius: 10px;
+}
+
+.search-header-box-search {
+  width: 48%;
+  height: 50px;
+  margin-left: 1%;
+  border-radius: 26px;
+  padding-left: 28px;
+  border-color: rgba(0, 0, 0, 0);
+  border: 1px solid #ccc;
+  align-self: center;
+}
+.search-header-box-searchinput{
+	font-size: large;
+    border: aliceblue;
+    width: 81%;
+}
+
+</style>

+ 38 - 0
jp-ui/src/views/dashboard/index2.vue

@@ -0,0 +1,38 @@
+<template>
+	<div v-if="pageLoading">
+		<el-main>
+			<el-card shadow="never">
+				<el-skeleton :rows="1"></el-skeleton>
+			</el-card>
+			<el-card shadow="never" style="margin-top: 15px">
+				<el-skeleton></el-skeleton>
+			</el-card>
+		</el-main>
+	</div>
+	<widgets @on-mounted="onMounted"></widgets>
+</template>
+
+<script>
+import { defineAsyncComponent } from "vue";
+const widgets = defineAsyncComponent(() => import("./widgets"));
+
+export default {
+	name: "dashboard",
+	components: {
+		widgets,
+	},
+	data() {
+		return {
+			pageLoading: true,
+		};
+	},
+	mounted() {},
+	methods: {
+		onMounted() {
+			this.pageLoading = false;
+		},
+	},
+};
+</script>
+
+<style></style>

+ 283 - 0
jp-ui/src/views/dashboard/search.vue

@@ -0,0 +1,283 @@
+<template>
+  <div>
+    <div class="el-scrollbar__wrap">
+      <div class="el-scrollbar__view">
+        <div :class="[themeCheck === '#236ED2' ? 'oneSearch' : 'oneSearchdeep']">
+          <div class="search-header">
+            <input type="search"
+              :class="[themeCheck === '#236ED2' ? 'search-header-box-search' : 'search-header-box-searchdeep']"
+              id='oneSearchText' v-model='searchContent' placeholder="请输入来文机关/日期/摘要内容/附件名称">
+
+            <button type="button" class="search-header-box-button" @click="searchFrom">一键搜</button>
+
+          </div>
+          <!-- <div :class="[themeCheck === '#236ED2' ? 'tabs' : 'tabsdeep']">
+              <div v-for="(tab, index) in tabs" :key="index"
+                :class="['tab', { 'active': activeTab === index && themeCheck === '#236ED2', 'activedeep': activeTab === index && themeCheck != '#236ED2' }]"
+                @click="activateTab(index)">
+                {{ tab }}
+                <div v-show="activeTab === index" class="tab-line"></div>
+              </div>
+          </div> -->
+          <div class="search-body">
+            <div class="tab-content">
+              <div v-show="activeTab === 0">
+                <ul class="tab-content-ul">
+                  <li :class="[themeCheck === '#236ED2' ? 'tab-content-li' : 'tab-content-lideep']" v-for="item in items1"
+                    :key="item.title" @click="viewtotal(item.id,item.type)">
+                    <div class="tab-content-title" v-html="getHTML(item.title)">
+
+                    </div>
+                    <div class="tab-content-content" v-html="getHTML(item.content)">
+
+                    </div>
+                  </li>
+                </ul>
+              </div>
+
+
+
+
+            </div>
+          </div>
+        </div>
+      </div>
+    </div>
+    <!-- 弹窗, 新增 / 修改 -->
+	<GwCirculationCard2FormYb  ref="GwCirculationCard2FormYb" @refreshDataList="refreshList"></GwCirculationCard2FormYb>
+
+  </div>
+</template>
+<script>
+import WorkService from '@/api/workbench/WorkService'
+import GwCirculationCard2FormYb from '../circulation2/GwCirculationCard2FormYb.vue'
+
+export default {
+  data() {
+    return {
+      searchQuery: '',
+      activeTab: 0,
+      visible: false,
+      loading: false,
+
+      title: '',
+      searchContent: '',
+      themeCheck: "#236ED2",
+      tabs: ['全部', '文件传阅'],
+      items1: [],
+      items2: [],
+      items3: [],
+      items4: [],
+      items5: []
+
+    }
+  },
+  components: {
+	  GwCirculationCard2FormYb
+  },
+  created() {
+  },
+  activated() {
+    this.init(this.$route.query.searchContent)
+  },
+  methods: {
+    init(searchContent) {
+      this.searchContent = searchContent
+      this.visible = true
+      this.loading = true
+      this.title = '搜索'
+
+
+      WorkService.queryOneSearch(searchContent).then((data ) => {
+         this.items1 = data.totalList
+      })
+    },
+    activateTab(tabIndex) {
+      this.activeTab = tabIndex;
+    },
+    searchFrom() {
+      this.refreshList();
+
+    },
+    getHTML(text) {
+      if (this.searchContent.trim()) {
+        const words = text.split('')
+        const keys = this.searchContent.trim().replace(/\s*/g, '').split('')
+        keys.forEach(key => {
+          for (let i = 0; i < words.length; i++) {
+            if (words[i] === key) {
+              words[i] = `<span style="color: red; font-weight: bolder;">${key}</span>`
+            }
+          }
+          text = words.join('')
+        })
+        return text
+      }
+
+    },
+    refreshList() {
+      this.loading = true
+      var searchContent = document.getElementById("oneSearchText").value
+	  
+	  WorkService.queryOneSearch(searchContent).then((data ) => {
+	     this.items1 = data.totalList
+	  })
+
+    },
+
+    viewtotal(id,type) {
+      if(type == 'cs'){
+		this.$refs.GwCirculationCard2FormYb.init('view', id)
+      }
+    }
+  }
+}
+</script>
+
+<style scoped lang="scss">
+.oneSearch {
+  width: 100%;
+  background-color: #ffffff;
+}
+
+.oneSearchDeep {
+  width: 100%;
+  background-color: #05254f;
+}
+
+
+.search-header {
+  height: 85px;
+}
+
+.search-header-box-search {
+  width: 36%;
+  height: 40px;
+  margin-top: 2%;
+  margin-left: 1%;
+  border-radius: 3px;
+  padding-left: 23px;
+  border-color: rgba(0, 0, 0, 0);
+  border: 1px solid #ccc;
+}
+
+.search-header-box-searchdeep {
+  width: 36%;
+  height: 40px;
+  margin-top: 2%;
+  margin-left: 1%;
+  border-radius: 3px;
+  padding-left: 23px;
+  border-color: #0276ff;
+  border: 1px solid #0276ff;
+  background-color: #093266;
+  color: #ffffff;
+}
+
+.search-header-box-button {
+  width: 8%;
+  height: 40px;
+  margin-left: 2%;
+  border-radius: 4px;
+  background-color: #1890ff;
+  border-color: rgba(0, 0, 0, 0);
+  font-size: 18px;
+  color: #ffffff;
+  cursor: pointer;
+}
+
+.search-body {
+  height: 760px;
+  overflow: auto;
+
+}
+
+/* 列表标签样式 */
+.tabs {
+  display: flex;
+  justify-content: space-between;
+  align-items: center;
+  width: 30%;
+  margin-left: 1%;
+}
+
+.tabsdeep {
+  display: flex;
+  justify-content: space-between;
+  align-items: center;
+  width: 30%;
+  margin-left: 1%;
+  color: #ffffff;
+}
+
+.tab {
+  cursor: pointer;
+  padding: 10px;
+  border-bottom: 2px solid transparent;
+}
+
+/* 选中标签样式 */
+.active {
+  background-color: #ccc;
+}
+
+.activedeep {
+  background-color: #1890ff;
+}
+
+/* 列表容器样式 */
+.tab-content {
+  //border: 1px solid #ccc;
+  border-top: none;
+  padding-top: 10px;
+  border-radius: 0 0 5px 5px;
+  margin-left: 1%;
+}
+
+.tab-content ul {
+  list-style: none;
+  padding: 0;
+  margin: 0;
+}
+
+
+.tab-content-li {
+  height: 70px;
+  background-color: #dfe2e8;
+  padding-top: 5px;
+  margin-bottom: 8px;
+  border-radius: 4px;
+  width: 99%;
+}
+
+.tab-content-lideep {
+  height: 70px;
+  background-color: #093266;
+  padding-top: 5px;
+  margin-bottom: 8px;
+  border-radius: 4px;
+  width: 99%;
+  color: #ffffff;
+}
+
+.tab-content-title {
+  height: 35px;
+  padding-left: 2%;
+  line-height: 35px;
+  font-size: 18px;
+}
+
+.tab-content-content {
+  height: 35px;
+  padding-left: 2%;
+  line-height: 20px;
+}
+
+.tab-line {
+  position: absolute;
+  bottom: 0;
+  left: 0;
+  right: 0;
+  height: 2px;
+  background-color: #0078d4;
+}</style>

+ 4 - 0
jp-ui/src/views/yzcirculation/YzCirculationCardList.vue

@@ -331,6 +331,10 @@ export default {
     });
   },
   activated() {
+	  let aa=this.$route.query.state;
+	  if(aa!=undefined){
+		this.searchForm.state=aa
+	  }
     this.refreshList();
   },
   methods: {