瀏覽代碼

新增用章流转审批和记住账号

LuChongMei 11 月之前
父節點
當前提交
894d6a425b
共有 31 個文件被更改,包括 3513 次插入96 次删除
  1. 10 1
      jp-console/jeeplus-modules/gw/src/main/java/com/jeeplus/circulation2/controller/GwCirculationCard2Controller.java
  2. 249 0
      jp-console/jeeplus-modules/gw/src/main/java/com/jeeplus/yzcirculation/controller/YzCirculationCardController.java
  3. 76 0
      jp-console/jeeplus-modules/gw/src/main/java/com/jeeplus/yzcirculation/domain/YzCirculationCard.java
  4. 50 0
      jp-console/jeeplus-modules/gw/src/main/java/com/jeeplus/yzcirculation/mapper/YzCirculationCardMapper.java
  5. 82 0
      jp-console/jeeplus-modules/gw/src/main/java/com/jeeplus/yzcirculation/mapper/xml/YzCirculationCardMapper.xml
  6. 73 0
      jp-console/jeeplus-modules/gw/src/main/java/com/jeeplus/yzcirculation/service/YzCirculationCardService.java
  7. 100 0
      jp-console/jeeplus-modules/gw/src/main/java/com/jeeplus/yzcirculation/service/dto/YzCirculationCardDTO.java
  8. 36 0
      jp-console/jeeplus-modules/gw/src/main/java/com/jeeplus/yzcirculation/service/mapstruct/YzCirculationCardWrapper.java
  9. 232 0
      jp-console/jeeplus-modules/gw/src/main/java/com/jeeplus/yzflow/controller/YzFlowController.java
  10. 66 0
      jp-console/jeeplus-modules/gw/src/main/java/com/jeeplus/yzflow/domain/YzFlow.java
  11. 42 0
      jp-console/jeeplus-modules/gw/src/main/java/com/jeeplus/yzflow/mapper/YzFlowMapper.java
  12. 45 0
      jp-console/jeeplus-modules/gw/src/main/java/com/jeeplus/yzflow/mapper/xml/YzFlowMapper.xml
  13. 54 0
      jp-console/jeeplus-modules/gw/src/main/java/com/jeeplus/yzflow/service/YzFlowService.java
  14. 86 0
      jp-console/jeeplus-modules/gw/src/main/java/com/jeeplus/yzflow/service/dto/YzFlowDTO.java
  15. 36 0
      jp-console/jeeplus-modules/gw/src/main/java/com/jeeplus/yzflow/service/mapstruct/YzFlowWrapper.java
  16. 69 0
      jp-mobile/api/commonseal/yzCirculationCardService.js
  17. 67 0
      jp-mobile/api/commonseal/yzFlowService.js
  18. 50 29
      jp-mobile/components/office-user-select/office-user-select.vue
  19. 30 30
      jp-mobile/pages.json
  20. 2 0
      jp-mobile/pages/addressbook/addressbook.vue
  21. 527 0
      jp-mobile/pages/commonseal/addCommon.vue
  22. 488 0
      jp-mobile/pages/commonseal/commonCard.vue
  23. 79 0
      jp-mobile/pages/commonseal/commonInfo.vue
  24. 213 0
      jp-mobile/pages/commonseal/commonList.vue
  25. 259 0
      jp-mobile/pages/commonseal/examineCommon.vue
  26. 308 0
      jp-mobile/pages/commonseal/statistics.vue
  27. 1 1
      jp-mobile/pages/fileTransmit/examineFile.vue
  28. 70 7
      jp-mobile/pages/login/login.vue
  29. 65 0
      jp-mobile/pages/login/remember.vue
  30. 9 1
      jp-mobile/pages/user/person/person.vue
  31. 39 27
      jp-mobile/pages/workbench/workbench.vue

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

@@ -18,6 +18,7 @@ import com.jeeplus.sys.service.UserService;
 import com.jeeplus.sys.service.dto.RoleDTO;
 import com.jeeplus.sys.service.dto.UserDTO;
 import com.jeeplus.sys.utils.UserUtils;
+import com.jeeplus.yzcirculation.service.YzCirculationCardService;
 import io.swagger.annotations.Api;
 import io.swagger.annotations.ApiOperation;
 import org.springframework.http.ResponseEntity;
@@ -63,6 +64,8 @@ public class GwCirculationCard2Controller {
 
 	@Autowired
 	private GwCirculationCard2Wrapper gwCirculationCard2Wrapper;
+	@Autowired
+	private YzCirculationCardService yzCirculationCardService;
 
 	/**
 	 * 公文流转列表数据
@@ -149,7 +152,13 @@ public class GwCirculationCard2Controller {
 	@GetMapping("getStatistics")
 	public ResponseEntity<HashMap<String, Object>> getStatistics() {
 		UserDTO userDTO=UserUtils.getCurrentUserDTO();
-		return ResponseEntity.ok ( gwCirculationCard2Service.getStatistics ( userDTO.getId() )  );
+		HashMap<String, Object> result = gwCirculationCard2Service.getStatistics ( userDTO.getId() );
+		HashMap<String, Object> yz = yzCirculationCardService.getStatistics ( userDTO.getId() );
+		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())  );
+		return ResponseEntity.ok ( result  );
 	}
 
 	/**

+ 249 - 0
jp-console/jeeplus-modules/gw/src/main/java/com/jeeplus/yzcirculation/controller/YzCirculationCardController.java

@@ -0,0 +1,249 @@
+/**
+ * Copyright © 2021-2025 <a href="http://www.jeeplus.org/">JeePlus</a> All rights reserved.
+ */
+package com.jeeplus.yzcirculation.controller;
+
+import javax.servlet.http.HttpServletResponse;
+import javax.validation.Valid;
+import com.google.common.collect.Lists;
+import com.jeeplus.aop.logging.annotation.ApiLog;
+import com.jeeplus.circulation2.service.dto.GwCirculationCard2DTO;
+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.gwflow.service.dto.GwFlowDTO;
+import com.jeeplus.sys.service.UserService;
+import com.jeeplus.sys.service.dto.RoleDTO;
+import com.jeeplus.sys.service.dto.UserDTO;
+import com.jeeplus.sys.utils.UserUtils;
+import com.jeeplus.yzflow.service.YzFlowService;
+import com.jeeplus.yzflow.service.dto.YzFlowDTO;
+import com.jeeplus.yzflow.service.mapstruct.YzFlowWrapper;
+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.yzcirculation.service.dto.YzCirculationCardDTO;
+import com.jeeplus.yzcirculation.service.mapstruct.YzCirculationCardWrapper;
+import com.jeeplus.yzcirculation.service.YzCirculationCardService;
+import org.springframework.web.multipart.MultipartFile;
+
+import java.io.IOException;
+import java.util.Date;
+import java.util.List;
+import java.util.UUID;
+
+/**
+ * YzCirculationController
+ * @author 卢崇梅
+ * @version 2024-04-09
+ */
+
+@Api(tags ="YzCirculation")
+@RestController
+@RequestMapping(value = "/yzcirculation/yzCirculationCard")
+public class YzCirculationCardController {
+
+	@Autowired
+	private YzCirculationCardService yzCirculationCardService;
+
+	@Autowired
+	private YzCirculationCardWrapper yzCirculationCardWrapper;
+
+	@Autowired
+	private YzFlowService yzFlowService;
+
+	@Autowired
+	private YzFlowWrapper yzFlowWrapper;
+	@Autowired
+	private UserService userService;
+
+	/**
+	 * 拟稿申请列表数据
+	 */
+	@ApiLog("查询拟稿申请列表数据")
+	@ApiOperation(value = "查询拟稿申请列表数据")
+//	@PreAuthorize("hasAuthority('yzcirculation:yzCirculationCard:list')")
+	@GetMapping("list")
+	public ResponseEntity<IPage<YzCirculationCardDTO>> list(YzCirculationCardDTO yzCirculationCardDTO, Page<YzCirculationCardDTO> page) throws Exception {
+
+		//除   管理员、办公室管理员  之外的角色需要判断是否涉及自己流程
+		UserDTO userDTO=UserUtils.getCurrentUserDTO();
+		List<RoleDTO> list=userDTO.getRoleDTOList();
+		boolean isadmin=false;
+		for (RoleDTO aa:list) {
+			if(aa.getName().equals("租户管理员")||aa.getName().equals("管理员")||aa.getName().equals("办公室管理员")){
+				isadmin=true;
+			}
+		}
+		IPage<YzCirculationCardDTO> result = null;
+		String state=yzCirculationCardDTO.getState();
+		yzCirculationCardDTO.setState("");
+		QueryWrapper queryWrapper = QueryWrapperGenerator.buildQueryCondition (yzCirculationCardDTO, YzCirculationCardDTO.class);
+		queryWrapper.eq ("a.del_flag", 0 ); // 排除已经删除
+
+		//状态:1待办,2暂存,3归档,4已办,
+		//5查看所有
+		if(state!=null&&!state.equals("null")&&!state.equals("")){
+			//1待办
+			if(state.equals("1")){
+				queryWrapper.eq ("b.state", "1" );
+				queryWrapper.eq ("a.state", "1" );
+			}
+			//4已办,根据流程上来
+			else if(state.equals("4")){
+				queryWrapper.eq ("b.state", "0" );
+			}
+			else if(state.equals("3")){
+				queryWrapper.eq ("a.state", "3" );
+			}
+		}
+		result=yzCirculationCardService.findList (page, queryWrapper,state,userDTO.getId());
+		for (YzCirculationCardDTO y :result.getRecords()){
+			UserDTO userDTO2=userService.get(y.getAuthorPerson());
+			y.setAuthorPerson(userDTO2.getName());
+		}
+		return ResponseEntity.ok (result);
+	}
+
+
+	/**
+	 * 根据Id获取拟稿申请数据
+	 */
+	@ApiLog("根据Id获取拟稿申请数据")
+	@ApiOperation(value = "根据Id获取拟稿申请数据")
+//	@PreAuthorize("hasAnyAuthority('yzcirculation:yzCirculationCard:view','yzcirculation:yzCirculationCard:add','yzcirculation:yzCirculationCard:edit')")
+	@GetMapping("queryById")
+	public ResponseEntity<YzCirculationCardDTO> queryById(String id) {
+		YzCirculationCardDTO yzCirculationCardDTO = yzCirculationCardWrapper.toDTO(yzCirculationCardService.getById ( id )) ;
+		UserDTO userDTO2=userService.get(yzCirculationCardDTO.getAuthorPerson());
+		yzCirculationCardDTO.setAuthorPerson(userDTO2.getName());
+		UserDTO userDTO=userService.getUserByLoginName(yzCirculationCardDTO.getProofreader(),"10000");
+		yzCirculationCardDTO.setProofreader(userDTO.getName());
+		return ResponseEntity.ok (  yzCirculationCardDTO);
+	}
+
+	/**
+	 * 保存拟稿申请
+	 */
+	@ApiLog("保存拟稿申请")
+	@ApiOperation(value = "保存拟稿申请")
+	@PostMapping("save")
+	public  ResponseEntity <String> save(@Valid @RequestBody YzCirculationCardDTO yzCirculationCardDTO) {
+		//新增或编辑表单保存
+		if(yzCirculationCardDTO.getId()!=null&&!yzCirculationCardDTO.getId().equals("")){
+			yzCirculationCardService.saveOrUpdate (yzCirculationCardWrapper.toEntity (yzCirculationCardDTO));
+		}else{
+			//新增的时候需要新增一条下一人待办事项
+			yzCirculationCardDTO.setId(UUID.randomUUID().toString());
+			UserDTO userDTO= UserUtils.getCurrentUserDTO();
+			yzCirculationCardDTO.setNowUser(userDTO.getId());
+			yzCirculationCardService.saveGetId (yzCirculationCardDTO);
+
+			//默认一条待办
+			YzFlowDTO yzFlowDTO=new YzFlowDTO();
+			yzFlowDTO.setYzId(yzCirculationCardDTO.getId());
+			yzFlowDTO.setState("1");
+			String nextuser="";
+			if(yzCirculationCardDTO.getProofreader()!=null&&!yzCirculationCardDTO.getProofreader().equals("")){
+				nextuser=yzCirculationCardDTO.getProofreader();
+			}
+			UserDTO userDTO2=userService.getUserByLoginName(nextuser,"10000");
+			yzFlowDTO.setCreateBy(userDTO);
+			yzFlowDTO.setUpdateBy(userDTO2);
+			yzFlowDTO.setCreateTruename(userDTO.getName());
+			yzFlowDTO.setNextTruename(userDTO2.getName());
+			yzFlowDTO.setNextUser(userDTO2.getId());
+			if (userDTO2.getRoleNames().contains("科室负责人")){
+				yzFlowDTO.setWhich("0");
+			}else {
+				yzFlowDTO.setWhich("1");
+			}
+			yzFlowService.saveOrUpdate (yzFlowWrapper.toEntity (yzFlowDTO));
+
+		}
+        return ResponseEntity.ok ( "保存拟稿申请成功" );
+	}
+	/**
+	 * 获取最新卡号
+	 */
+	@ApiLog("获取最新卡号")
+	@ApiOperation(value = "获取最新卡号")
+	@GetMapping("getCardNum")
+	public ResponseEntity<String> getCardNum() {
+		return ResponseEntity.ok ( yzCirculationCardService.getCardNum (  )  );
+	}
+
+	/**
+	 * 删除拟稿申请
+	 */
+	@ApiLog("删除拟稿申请")
+	@ApiOperation(value = "删除拟稿申请")
+	@PreAuthorize("hasAuthority('yzcirculation:yzCirculationCard:del')")
+	@DeleteMapping("delete")
+	public ResponseEntity <String> delete(String ids) {
+		String idArray[] = ids.split(",");
+        yzCirculationCardService.removeByIds ( Lists.newArrayList ( idArray ) );
+		return ResponseEntity.ok( "删除拟稿申请成功" );
+	}
+	
+    /**
+     * 导出拟稿申请数据
+     *
+     * @param yzCirculationCardDTO
+     * @param page
+     * @param response
+     * @throws Exception
+     */
+    @ApiLog("导出拟稿申请数据")
+    @PreAuthorize("hasAnyAuthority('yzcirculation:yzCirculationCard:export')")
+    @GetMapping("export")
+    public void exportFile(YzCirculationCardDTO yzCirculationCardDTO, Page <YzCirculationCardDTO> page, ExcelOptions options, HttpServletResponse response) throws Exception {
+        String fileName = options.getFilename ( );
+		QueryWrapper queryWrapper = QueryWrapperGenerator.buildQueryCondition (yzCirculationCardDTO, YzCirculationCardDTO.class);
+        if ( ExportMode.current.equals ( options.getMode ( ) ) ) { // 导出当前页数据
+            
+        } else if ( ExportMode.selected.equals ( options.getMode ( ) ) ) { // 导出选中数据
+            queryWrapper.in ( "a.id", options.getSelectIds () );
+        } else { // 导出全部数据
+            page.setSize ( -1 );
+            page.setCurrent ( 0 );
+        }
+        List<YzCirculationCardDTO> result = yzCirculationCardService.findPage ( page, queryWrapper ).getRecords ( );
+        EasyExcelUtils.newInstance ( yzCirculationCardService, yzCirculationCardWrapper ).exportExcel ( result,  options.getSheetName ( ), YzCirculationCardDTO.class, fileName,options.getExportFields (), response );
+    }
+
+    /**
+     * 导入拟稿申请数据
+     *
+     * @return
+     */
+    @PreAuthorize("hasAnyAuthority('yzcirculation:yzCirculationCard:import')")
+    @PostMapping("import")
+    public ResponseEntity importFile(MultipartFile file) throws IOException {
+        String result = EasyExcelUtils.newInstance ( yzCirculationCardService, yzCirculationCardWrapper ).importExcel ( file, YzCirculationCardDTO.class );
+        return ResponseEntity.ok ( result );
+    }
+
+    /**
+     * 下载导入拟稿申请数据模板
+     *
+     * @param response
+     * @return
+     */
+    @PreAuthorize ("hasAnyAuthority('yzcirculation:yzCirculationCard:import')")
+    @GetMapping("import/template")
+    public void importFileTemplate(HttpServletResponse response) throws IOException {
+        String fileName = "拟稿申请数据导入模板.xlsx";
+        List<YzCirculationCardDTO> list = Lists.newArrayList();
+        EasyExcelUtils.newInstance ( yzCirculationCardService, yzCirculationCardWrapper ).exportExcel ( list,  "拟稿申请数据", YzCirculationCardDTO.class, fileName, null, response );
+    }
+
+
+}

+ 76 - 0
jp-console/jeeplus-modules/gw/src/main/java/com/jeeplus/yzcirculation/domain/YzCirculationCard.java

@@ -0,0 +1,76 @@
+/**
+ * Copyright © 2021-2025 <a href="http://www.jeeplus.org/">JeePlus</a> All rights reserved.
+ */
+package com.jeeplus.yzcirculation.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;
+/**
+ * YzCirculationEntity
+ * @author 卢崇梅
+ * @version 2024-04-09
+ */
+@Data
+@EqualsAndHashCode(callSuper = false)
+@TableName("yz_circulation_card")
+public class YzCirculationCard extends BaseEntity {
+
+	private static final long serialVersionUID = 1L;
+
+			
+	/**
+     * 文件名称
+     */
+	private String name;
+			
+	/**
+     * 拟稿人
+     */
+    @TableField("author_person")
+	private String authorPerson;
+			
+	/**
+     * 校对人
+     */
+    @TableField("proofreader")
+	private String proofreader;
+			
+	/**
+     * 是否公开
+     */
+	private String open;
+			
+	/**
+     * 印数
+     */
+	private String printNum;
+			
+	/**
+     * 状态
+     */
+	private String state;
+			
+	/**
+     * 卡号
+     */
+	private String cardNum;
+			
+	/**
+     * 年份
+     */
+	private String yearNum;
+			
+	/**
+     * 附件
+     */
+	private String attachment;
+			
+	/**
+     * 备注
+     */
+	private String remark;
+
+}

+ 50 - 0
jp-console/jeeplus-modules/gw/src/main/java/com/jeeplus/yzcirculation/mapper/YzCirculationCardMapper.java

@@ -0,0 +1,50 @@
+/**
+ * Copyright © 2021-2025 <a href="http://www.jeeplus.org/">JeePlus</a> All rights reserved.
+ */
+package com.jeeplus.yzcirculation.mapper;
+
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import org.apache.ibatis.annotations.Param;
+import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
+import com.baomidou.mybatisplus.core.metadata.IPage;
+import com.baomidou.mybatisplus.core.toolkit.Constants;
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import com.jeeplus.yzcirculation.service.dto.YzCirculationCardDTO;
+import com.jeeplus.yzcirculation.domain.YzCirculationCard;
+
+import java.util.HashMap;
+
+/**
+ * YzCirculationMAPPER接口
+ * @author 卢崇梅
+ * @version 2024-04-09
+ */
+public interface YzCirculationCardMapper extends BaseMapper<YzCirculationCard> {
+
+    /**
+     * 根据id获取YzCirculation
+     * @param id
+     * @return
+     */
+    YzCirculationCardDTO findById(String id);
+
+    /**
+     * 获取YzCirculation列表
+     *
+     * @param queryWrapper
+     * @return
+     */
+    IPage <YzCirculationCardDTO> findList(Page <YzCirculationCardDTO> page, @Param(Constants.WRAPPER) QueryWrapper queryWrapper);
+
+    String getCardNum();
+
+    int saveGetId(YzCirculationCardDTO map);
+
+    IPage<YzCirculationCardDTO> findPage(Page<YzCirculationCardDTO> page,@Param(Constants.WRAPPER) QueryWrapper queryWrapper,@Param("state") String state,@Param("userid") String userid);
+
+    HashMap<String, Object> getStatistics(String userid);
+
+    int getStatistics2(String userid);
+
+    int getStatistics3(String userid);
+}

+ 82 - 0
jp-console/jeeplus-modules/gw/src/main/java/com/jeeplus/yzcirculation/mapper/xml/YzCirculationCardMapper.xml

@@ -0,0 +1,82 @@
+<?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.yzcirculation.mapper.YzCirculationCardMapper">
+
+	<sql id="yzCirculationCardColumns">
+		a.id AS "id",
+		a.name AS "name",
+		a.author_person AS "authorPerson",
+		a.proofreader AS "proofreader",
+		a.open AS "open",
+		a.print_num AS "printNum",
+		a.state AS "state",
+		a.card_num AS "cardNum",
+		a.year_num AS "yearNum",
+		a.attachment AS "attachment",
+		a.remark AS "remark",
+		a.create_by_id AS "createBy.id",
+		a.create_time AS "createTime",
+		a.update_by_id AS "updateBy.id",
+		a.update_time AS "updateTime",
+		a.del_flag AS "delFlag",
+		a.tenant_id AS "tenantId"
+	</sql>
+
+	<sql id="yzCirculationCardJoins">
+		LEFT JOIN yz_flow b  ON b.yz_id = a.id
+	</sql>
+	<select id="findById" resultType="com.jeeplus.yzcirculation.service.dto.YzCirculationCardDTO">
+		SELECT
+			<include refid="yzCirculationCardColumns"/>
+		FROM yz_circulation_card a
+		<include refid="yzCirculationCardJoins"/>
+		WHERE a.id = #{id} and a.del_flag = 0
+	</select>
+
+	<select id="findList" resultType="com.jeeplus.yzcirculation.service.dto.YzCirculationCardDTO">
+		SELECT
+			<include refid="yzCirculationCardColumns"/>
+		FROM yz_circulation_card a
+		<include refid="yzCirculationCardJoins"/>
+	    ${ew.customSqlSegment}
+	</select>
+	<select id="findPage" resultType="com.jeeplus.yzcirculation.service.dto.YzCirculationCardDTO">
+		SELECT
+		<include refid="yzCirculationCardColumns"/>
+		FROM yz_circulation_card a
+		LEFT JOIN (SELECT b.yz_id,b.state,b.next_user FROM yz_flow b
+		<if test="state != 5">
+		where b.next_user = #{userid}
+			and b.del_flag = 0
+		</if>) b
+		ON b.yz_id = a.id
+		${ew.customSqlSegment}
+	</select>
+	<select id="getCardNum" resultType="String">
+		SELECT a.card_num FROM yz_circulation_card a WHERE YEAR(a.create_time) = YEAR(NOW()) ORDER BY a.create_time DESC limit 1
+	</select>
+	<insert id="saveGetId" parameterType="com.jeeplus.yzcirculation.service.dto.YzCirculationCardDTO">
+		insert into yz_circulation_card ( id,year_num, card_num, name,author_person,proofreader,open,print_num,attachment,
+		remark,state,create_by_id,create_time,update_by_id,update_time,del_flag )
+		values (#{id},#{yearNum}, #{cardNum}, #{name}, #{authorPerson}, #{proofreader}, #{open}, #{printNum}, #{attachment}, #{remark},
+		1,#{nowUser},NOW(),#{nowUser},NOW(),'0')
+	</insert>
+	<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
+		From (SELECT * FROM yz_circulation_card ) a
+
+	</select>
+
+	<select id="getStatistics2" resultType="integer">
+		SELECT count(DISTINCT a.id) FROM yz_circulation_card a
+		left JOIN yz_flow b on a.id=b.yz_id
+		where a.del_flag=0 AND b.del_flag =0 and b.state=1 AND a.state = 1 and b.update_by_id=#{userid}
+	</select>
+
+	<select id="getStatistics3" resultType="integer">
+		SELECT count(DISTINCT a.id) FROM yz_circulation_card a
+		left JOIN yz_flow b on a.id=b.yz_id
+		where a.del_flag=0 and b.state=0 and b.next_user=#{userid}
+	</select>
+</mapper>

+ 73 - 0
jp-console/jeeplus-modules/gw/src/main/java/com/jeeplus/yzcirculation/service/YzCirculationCardService.java

@@ -0,0 +1,73 @@
+/**
+ * Copyright © 2021-2025 <a href="http://www.jeeplus.org/">JeePlus</a> All rights reserved.
+ */
+package com.jeeplus.yzcirculation.service;
+
+import org.apache.commons.lang3.StringUtils;
+import org.springframework.stereotype.Service;
+import org.springframework.transaction.annotation.Transactional;
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+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.yzcirculation.service.dto.YzCirculationCardDTO;
+import com.jeeplus.yzcirculation.domain.YzCirculationCard;
+import com.jeeplus.yzcirculation.mapper.YzCirculationCardMapper;
+
+import java.util.HashMap;
+
+/**
+ * YzCirculationService
+ * @author 卢崇梅
+ * @version 2024-04-09
+ */
+@Service
+@Transactional
+public class YzCirculationCardService extends ServiceImpl<YzCirculationCardMapper, YzCirculationCard> {
+
+	/**
+	 * 根据id查询
+	 * @param id
+	 * @return
+	 */
+	public YzCirculationCardDTO findById(String id) {
+		return baseMapper.findById ( id );
+	}
+
+	/**
+	 * 自定义分页检索
+	 * @param page
+	 * @param queryWrapper
+	 * @return
+	 */
+	public IPage <YzCirculationCardDTO> findPage(Page <YzCirculationCardDTO> page, QueryWrapper queryWrapper) {
+		queryWrapper.eq ("a.del_flag", 0 ); // 排除已经删除
+
+		return  baseMapper.findList (page, queryWrapper);
+	}
+	public IPage <YzCirculationCardDTO> findList(Page <YzCirculationCardDTO> page, QueryWrapper queryWrapper,String state,String userid) {
+		return  baseMapper.findPage (page, queryWrapper,state,userid);
+	}
+    public String getCardNum() {
+		String aa=baseMapper.getCardNum();
+		String bb="1";
+		if(aa!=null&& StringUtils.isNumeric(aa)){
+			int aas=Integer.parseInt(aa)+1;
+			bb=aas+"";
+		}
+		return bb;
+    }
+
+    public int saveGetId(YzCirculationCardDTO yzCirculationCardDTO) {
+		return baseMapper.saveGetId(yzCirculationCardDTO);
+    }
+
+	public HashMap<String, Object> getStatistics(String userid) {
+		HashMap<String, Object> aa=baseMapper.getStatistics(userid);
+		int a1=baseMapper.getStatistics2(userid);
+		int a2=baseMapper.getStatistics3(userid);
+		aa.put("db",a1);
+		aa.put("yb",a2);
+		return aa;
+	}
+}

+ 100 - 0
jp-console/jeeplus-modules/gw/src/main/java/com/jeeplus/yzcirculation/service/dto/YzCirculationCardDTO.java

@@ -0,0 +1,100 @@
+/**
+ * Copyright © 2021-2025 <a href="http://www.jeeplus.org/">JeePlus</a> All rights reserved.
+ */
+package com.jeeplus.yzcirculation.service.dto;
+
+import com.jeeplus.sys.service.dto.UserDTO;
+import com.jeeplus.core.query.Query;
+import com.jeeplus.core.query.QueryType;
+import com.alibaba.excel.annotation.ExcelProperty;
+import com.jeeplus.core.excel.converter.ExcelUserDTOConverter;
+import com.jeeplus.core.excel.converter.ExcelDictDTOConverter;
+import com.jeeplus.core.excel.annotation.ExcelDictProperty;
+import com.jeeplus.core.service.dto.BaseDTO;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+
+import java.util.Date;
+
+/**
+ * YzCirculationDTO
+ * @author 卢崇梅
+ * @version 2024-04-09
+ */
+@Data
+@EqualsAndHashCode(callSuper = false)
+public class YzCirculationCardDTO extends BaseDTO {
+
+	private static final long serialVersionUID = 1L;
+
+	        
+	/**
+     * 文件名称
+     */
+    @Query(tableColumn = "a.name", javaField = "name", type = QueryType.LIKE)
+	@ExcelProperty("文件名称") 
+	private String name;
+	        
+	/**
+     * 拟稿人
+     */
+    @Query(tableColumn = "a.author_person", javaField = "authorPerson", type = QueryType.EQ)
+    @ExcelProperty(value = "拟稿人")
+	private String authorPerson;
+
+	/**
+     * 校对人
+     */
+    @Query(tableColumn = "a.proofreader", javaField = "proofreader", type = QueryType.EQ)
+    @ExcelProperty(value = "校对人")
+	private String proofreader;
+	        
+	/**
+     * 是否公开
+     */
+    @Query(tableColumn = "a.open", javaField = "open", type = QueryType.EQ)
+	@ExcelProperty(value = "是否公开", converter = ExcelDictDTOConverter.class)
+	@ExcelDictProperty("")
+	private String open;
+	        
+	/**
+     * 印数
+     */
+	@ExcelProperty("印数") 
+	private String printNum;
+	        
+	/**
+     * 状态
+     */
+    @Query(tableColumn = "a.state", javaField = "state", type = QueryType.EQ)
+	@ExcelProperty(value = "状态", converter = ExcelDictDTOConverter.class)
+	@ExcelDictProperty("")
+	private String state;
+	private String nowUser;
+	/**
+     * 卡号
+     */
+	@ExcelProperty("卡号") 
+	private String cardNum;
+	        
+	/**
+     * 年份
+     */
+    @Query(tableColumn = "a.year_num", javaField = "yearNum", type = QueryType.EQ)
+	@ExcelProperty("年份") 
+	private String yearNum;
+	        
+	/**
+     * 附件
+     */
+	@ExcelProperty("附件") 
+	private String attachment;
+	        
+	/**
+     * 备注
+     */
+	@ExcelProperty("备注") 
+	private String remark;
+	@Query(tableColumn = "a.create_time", javaField = "createTime", type = QueryType.BETWEEN)
+	private Date createTime;
+}

+ 36 - 0
jp-console/jeeplus-modules/gw/src/main/java/com/jeeplus/yzcirculation/service/mapstruct/YzCirculationCardWrapper.java

@@ -0,0 +1,36 @@
+/**
+ * Copyright © 2021-2025 <a href="http://www.jeeplus.org/">JeePlus</a> All rights reserved.
+ */
+package com.jeeplus.yzcirculation.service.mapstruct;
+
+
+import com.jeeplus.core.mapstruct.EntityWrapper;
+import com.jeeplus.yzcirculation.service.dto.YzCirculationCardDTO;
+import com.jeeplus.yzcirculation.domain.YzCirculationCard;
+import org.mapstruct.Mapper;
+import org.mapstruct.Mapping;
+import org.mapstruct.Mappings;
+import org.mapstruct.ReportingPolicy;
+import org.mapstruct.factory.Mappers;
+
+/**
+ *  YzCirculationCardWrapper
+ * @author 卢崇梅
+ * @version 2024-04-09
+ */
+@Mapper(componentModel = "spring", unmappedTargetPolicy = ReportingPolicy.IGNORE, uses = {} )
+public interface YzCirculationCardWrapper extends EntityWrapper<YzCirculationCardDTO, YzCirculationCard> {
+
+    YzCirculationCardWrapper INSTANCE = Mappers.getMapper(YzCirculationCardWrapper.class);
+     @Mappings({
+            @Mapping(source = "createBy.id", target = "createById"),
+            @Mapping (source = "updateBy.id", target = "updateById")})
+    YzCirculationCard toEntity(YzCirculationCardDTO dto);
+
+
+    @Mappings({
+            @Mapping (source = "createById", target = "createBy.id"),
+            @Mapping (source = "updateById", target = "updateBy.id")})
+    YzCirculationCardDTO toDTO(YzCirculationCard entity);
+}
+

+ 232 - 0
jp-console/jeeplus-modules/gw/src/main/java/com/jeeplus/yzflow/controller/YzFlowController.java

@@ -0,0 +1,232 @@
+/**
+ * Copyright © 2021-2025 <a href="http://www.jeeplus.org/">JeePlus</a> All rights reserved.
+ */
+package com.jeeplus.yzflow.controller;
+
+import javax.servlet.http.HttpServletResponse;
+import javax.validation.Valid;
+import com.google.common.collect.Lists;
+import com.jeeplus.aop.logging.annotation.ApiLog;
+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.sys.service.UserService;
+import com.jeeplus.sys.service.dto.RoleDTO;
+import com.jeeplus.sys.service.dto.UserDTO;
+import com.jeeplus.sys.utils.UserUtils;
+import com.jeeplus.yzcirculation.service.YzCirculationCardService;
+import com.jeeplus.yzcirculation.service.dto.YzCirculationCardDTO;
+import com.jeeplus.yzcirculation.service.mapstruct.YzCirculationCardWrapper;
+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.yzflow.service.dto.YzFlowDTO;
+import com.jeeplus.yzflow.service.mapstruct.YzFlowWrapper;
+import com.jeeplus.yzflow.service.YzFlowService;
+import org.springframework.web.multipart.MultipartFile;
+
+import java.io.IOException;
+import java.util.List;
+
+/**
+ * YzFlowController
+ * @author 卢崇梅
+ * @version 2024-04-09
+ */
+
+@Api(tags ="YzFlow")
+@RestController
+@RequestMapping(value = "/yzflow/yzFlow")
+public class YzFlowController {
+
+	@Autowired
+	private YzFlowService yzFlowService;
+
+	@Autowired
+	private YzFlowWrapper yzFlowWrapper;
+	@Autowired
+	private UserService userService;
+	@Autowired
+	private YzCirculationCardService yzCirculationCardService;
+
+	@Autowired
+	private YzCirculationCardWrapper yzCirculationCardWrapper;
+
+	/**
+	 * 用章流程列表数据
+	 */
+	@ApiLog("查询用章流程列表数据")
+	@ApiOperation(value = "查询用章流程列表数据")
+//	@PreAuthorize("hasAuthority('yzflow:yzFlow:list')")
+	@GetMapping("list")
+	public ResponseEntity<IPage<YzFlowDTO>> list(YzFlowDTO yzFlowDTO, Page<YzFlowDTO> page) throws Exception {
+		QueryWrapper queryWrapper = QueryWrapperGenerator.buildQueryCondition (yzFlowDTO, YzFlowDTO.class);
+		IPage<YzFlowDTO> result = yzFlowService.findPage (page, queryWrapper);
+		return ResponseEntity.ok (result);
+	}
+	/**
+	 * 根据Id获取用章流程数据
+	 */
+	@ApiLog("根据Id获取用章流程数据")
+	@ApiOperation(value = "根据Id获取用章流程数据")
+//	@PreAuthorize("hasAnyAuthority('yzflow:yzFlow:view','yzflow:yzFlow:add','yzflow:yzFlow:edit')")
+	@GetMapping("queryById")
+	public ResponseEntity<YzFlowDTO> queryById(String id) {
+		return ResponseEntity.ok ( yzFlowService.findById ( id ) );
+	}
+	/**
+	 * 根据yzId获取公文流程数据
+	 */
+	@ApiLog("根据yzId获取公文流程数据")
+	@ApiOperation(value = "根据yzId获取公文流程数据")
+	@GetMapping("queryByYzId")
+	public ResponseEntity<List<YzFlowDTO>> queryByYzId(String yzId) {
+		return ResponseEntity.ok (  yzFlowService.getByYzId ( yzId )  );
+	}
+
+	/**
+	 * 保存用章流程
+	 */
+	@ApiLog("保存用章流程")
+	@ApiOperation(value = "保存用章流程")
+	@PostMapping("save")
+	public  ResponseEntity <String> save(@Valid @RequestBody YzFlowDTO yzFlowDTO) {
+		//新增或编辑表单保存
+
+		yzFlowService.saveOrUpdate (yzFlowWrapper.toEntity (yzFlowDTO));
+
+		//取当前角色,不是办公室管理员\办公室主任的时候两个角色的时候,处理完自己的需要新增一条待办人到办公室主任???????这边有疑问,先不新增(原因,多个审核人都提交会生成重复数据)
+		UserDTO userDTO= UserUtils.getCurrentUserDTO();
+		List<RoleDTO> list=userDTO.getRoleDTOList();
+		boolean isadmin=false;
+		for (RoleDTO aa:list) {
+			if(aa.getName().equals("租户管理员")||aa.getName().equals("管理员")||aa.getName().equals("办公室管理员")||aa.getName().equals("办公室主任")){
+				isadmin=true;
+			}
+		}
+		//根据Next判断此时是哪一类人员提交
+		//1、此时是办公室管理员选人后的操作
+		if(yzFlowDTO.getNext()!=null&&yzFlowDTO.getNext().equals("1")){
+
+			//有选择领导的时候新增
+			if(yzFlowDTO.getNeUser()!=null) {
+					if(!yzFlowDTO.getNeUser().equals("")){
+						YzFlowDTO a1=new YzFlowDTO();
+						a1.setYzId(yzFlowDTO.getYzId());
+						a1.setState("1");
+						UserDTO userDTO2=userService.getUserByLoginName(yzFlowDTO.getNeUser(),"10000");
+						a1.setCreateBy(userDTO);
+						a1.setUpdateBy(userDTO2);
+						a1.setCreateTruename(userDTO.getName());
+						a1.setNextTruename(userDTO2.getName());
+						a1.setNextUser(userDTO2.getId());
+						if(userDTO2.getRoleNames().contains("科室负责人")) a1.setWhich("0");
+						if(userDTO2.getRoleNames().contains("办公室主任") || userDTO2.getRoleNames().contains("办公室管理员") ) a1.setWhich("1");
+						if(userDTO2.getRoleNames().contains("分管领导")) a1.setWhich("2");
+						if(userDTO2.getRoleNames().contains("局领导")) a1.setWhich("3");
+						yzFlowService.saveOrUpdate (yzFlowWrapper.toEntity (a1));
+					}
+			}
+
+			//2、Next=0的时候,直接归档
+		}else if(yzFlowDTO.getNext()!=null&&yzFlowDTO.getNext().equals("0")){
+			YzCirculationCardDTO yzCirculationCardDTO =yzCirculationCardWrapper.toDTO (yzCirculationCardService.getById ( yzFlowDTO.getYzId() ));
+			yzCirculationCardDTO.setState("3");
+			yzCirculationCardService.saveOrUpdate (yzCirculationCardWrapper.toEntity (yzCirculationCardDTO));
+
+			//3、此时是局领导、或科室领导审核提交的时候
+		}else{
+			//需要判断会签是否结束,结束的时候需要新增一条待归档到办公室管理员的待办
+			int count=yzFlowService.isEnd(yzFlowDTO.getYzId());
+			if(count==0){
+				YzFlowDTO yzFlowDTOn=new YzFlowDTO();
+				yzFlowDTOn.setYzId(yzFlowDTO.getYzId());
+				yzFlowDTOn.setState("1");
+				UserDTO userDTO3=userService.getUserByLoginName("bgsgly","10000");
+				yzFlowDTOn.setCreateBy(userDTO3);
+				yzFlowDTOn.setUpdateBy(userDTO3);
+				yzFlowDTOn.setCreateTruename(userDTO.getName());
+				yzFlowDTOn.setNextTruename(userDTO3.getName());
+				yzFlowDTOn.setNextUser(userDTO3.getId());
+				yzFlowDTOn.setWhich("4");
+				yzFlowService.saveOrUpdate (yzFlowWrapper.toEntity (yzFlowDTOn));
+			}
+
+		}
+
+		return ResponseEntity.ok ( "保存用章流程成功" );
+	}
+	/**
+	 * 删除用章流程
+	 */
+	@ApiLog("删除用章流程")
+	@ApiOperation(value = "删除用章流程")
+	@PreAuthorize("hasAuthority('yzflow:yzFlow:del')")
+	@DeleteMapping("delete")
+	public ResponseEntity <String> delete(String ids) {
+		String idArray[] = ids.split(",");
+        yzFlowService.removeByIds ( Lists.newArrayList ( idArray ) );
+		return ResponseEntity.ok( "删除用章流程成功" );
+	}
+	
+    /**
+     * 导出用章流程数据
+     *
+     * @param yzFlowDTO
+     * @param page
+     * @param response
+     * @throws Exception
+     */
+    @ApiLog("导出用章流程数据")
+    @PreAuthorize("hasAnyAuthority('yzflow:yzFlow:export')")
+    @GetMapping("export")
+    public void exportFile(YzFlowDTO yzFlowDTO, Page <YzFlowDTO> page, ExcelOptions options, HttpServletResponse response) throws Exception {
+        String fileName = options.getFilename ( );
+		QueryWrapper queryWrapper = QueryWrapperGenerator.buildQueryCondition (yzFlowDTO, YzFlowDTO.class);
+        if ( ExportMode.current.equals ( options.getMode ( ) ) ) { // 导出当前页数据
+            
+        } else if ( ExportMode.selected.equals ( options.getMode ( ) ) ) { // 导出选中数据
+            queryWrapper.in ( "a.id", options.getSelectIds () );
+        } else { // 导出全部数据
+            page.setSize ( -1 );
+            page.setCurrent ( 0 );
+        }
+        List<YzFlowDTO> result = yzFlowService.findPage ( page, queryWrapper ).getRecords ( );
+        EasyExcelUtils.newInstance ( yzFlowService, yzFlowWrapper ).exportExcel ( result,  options.getSheetName ( ), YzFlowDTO.class, fileName,options.getExportFields (), response );
+    }
+
+    /**
+     * 导入用章流程数据
+     *
+     * @return
+     */
+    @PreAuthorize("hasAnyAuthority('yzflow:yzFlow:import')")
+    @PostMapping("import")
+    public ResponseEntity importFile(MultipartFile file) throws IOException {
+        String result = EasyExcelUtils.newInstance ( yzFlowService, yzFlowWrapper ).importExcel ( file, YzFlowDTO.class );
+        return ResponseEntity.ok ( result );
+    }
+
+    /**
+     * 下载导入用章流程数据模板
+     *
+     * @param response
+     * @return
+     */
+    @PreAuthorize ("hasAnyAuthority('yzflow:yzFlow:import')")
+    @GetMapping("import/template")
+    public void importFileTemplate(HttpServletResponse response) throws IOException {
+        String fileName = "用章流程数据导入模板.xlsx";
+        List<YzFlowDTO> list = Lists.newArrayList();
+        EasyExcelUtils.newInstance ( yzFlowService, yzFlowWrapper ).exportExcel ( list,  "用章流程数据", YzFlowDTO.class, fileName, null, response );
+    }
+
+
+}

+ 66 - 0
jp-console/jeeplus-modules/gw/src/main/java/com/jeeplus/yzflow/domain/YzFlow.java

@@ -0,0 +1,66 @@
+/**
+ * Copyright © 2021-2025 <a href="http://www.jeeplus.org/">JeePlus</a> All rights reserved.
+ */
+package com.jeeplus.yzflow.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;
+/**
+ * YzFlowEntity
+ * @author 卢崇梅
+ * @version 2024-04-09
+ */
+@Data
+@EqualsAndHashCode(callSuper = false)
+@TableName("yz_flow")
+public class YzFlow extends BaseEntity {
+
+	private static final long serialVersionUID = 1L;
+
+			
+	/**
+     * 拟稿id
+     */
+    @TableField("yz_id")
+	private String yzId;
+			
+	/**
+     * 内容
+     */
+	private String content;
+			
+	/**
+     * 签名附件
+     */
+	private String signfj;
+			
+	/**
+     * 流程状态
+     */
+	private String state;
+			
+	/**
+     * 科室承办:0,办公室拟办:1,分管领导:2,主领导:3,回流到办公室:4;待归档:5
+     */
+	private String which;
+			
+	/**
+     * 创建人姓名
+     */
+	private String createTruename;
+			
+	/**
+     * 下一步待办人姓名
+     */
+	private String nextTruename;
+			
+	/**
+     * 下一步待办人
+     */
+    @TableField("next_user")
+	private String nextUser;
+
+}

+ 42 - 0
jp-console/jeeplus-modules/gw/src/main/java/com/jeeplus/yzflow/mapper/YzFlowMapper.java

@@ -0,0 +1,42 @@
+/**
+ * Copyright © 2021-2025 <a href="http://www.jeeplus.org/">JeePlus</a> All rights reserved.
+ */
+package com.jeeplus.yzflow.mapper;
+
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import org.apache.ibatis.annotations.Param;
+import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
+import com.baomidou.mybatisplus.core.metadata.IPage;
+import com.baomidou.mybatisplus.core.toolkit.Constants;
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import com.jeeplus.yzflow.service.dto.YzFlowDTO;
+import com.jeeplus.yzflow.domain.YzFlow;
+
+import java.util.List;
+
+/**
+ * YzFlowMAPPER接口
+ * @author 卢崇梅
+ * @version 2024-04-09
+ */
+public interface YzFlowMapper extends BaseMapper<YzFlow> {
+
+    /**
+     * 根据id获取YzFlow
+     * @param id
+     * @return
+     */
+    YzFlowDTO findById(String id);
+
+    /**
+     * 获取YzFlow列表
+     *
+     * @param queryWrapper
+     * @return
+     */
+    IPage <YzFlowDTO> findList(Page <YzFlowDTO> page, @Param(Constants.WRAPPER) QueryWrapper queryWrapper);
+
+    int isEnd(String yzId);
+
+    List<YzFlowDTO> getByYzId(String yzId);
+}

+ 45 - 0
jp-console/jeeplus-modules/gw/src/main/java/com/jeeplus/yzflow/mapper/xml/YzFlowMapper.xml

@@ -0,0 +1,45 @@
+<?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.yzflow.mapper.YzFlowMapper">
+
+	<sql id="yzFlowColumns">
+		a.id AS "id",
+		a.yz_id AS "yzId",
+		a.content AS "content",
+		u.sign_pic AS "signfj",
+		a.state AS "state",
+		a.which AS "which",
+		a.create_truename AS "createTruename",
+		a.next_truename AS "nextTruename",
+		a.next_user AS "nextUser",
+		a.create_by_id AS "createBy.id",
+		a.create_time AS "createTime",
+		a.update_by_id AS "updateBy.id",
+		a.update_time AS "updateTime",
+		a.del_flag AS "delFlag",
+		a.tenant_id AS "tenantId"
+	</sql>
+	<select id="findById" resultType="com.jeeplus.yzflow.service.dto.YzFlowDTO">
+		SELECT
+			<include refid="yzFlowColumns"/>
+		FROM yz_flow a
+		WHERE a.id = #{id} and a.del_flag = 0
+	</select>
+
+	<select id="findList" resultType="com.jeeplus.yzflow.service.dto.YzFlowDTO">
+		SELECT
+			<include refid="yzFlowColumns"/>
+		FROM yz_flow a
+	    ${ew.customSqlSegment}
+	</select>
+	<select id="getByYzId" resultType="com.jeeplus.yzflow.service.dto.YzFlowDTO">
+		SELECT
+		<include refid="yzFlowColumns"/>
+		FROM yz_flow a
+		left join  sys_user u on a.next_user=u.id
+		WHERE a.yz_id = #{yzId} and a.del_flag = 0
+	</select>
+	<select id="isEnd" resultType="Integer">
+		SELECT COUNT(id) FROM yz_flow WHERE yz_id =#{yzId} and state=1
+	</select>
+</mapper>

+ 54 - 0
jp-console/jeeplus-modules/gw/src/main/java/com/jeeplus/yzflow/service/YzFlowService.java

@@ -0,0 +1,54 @@
+/**
+ * Copyright © 2021-2025 <a href="http://www.jeeplus.org/">JeePlus</a> All rights reserved.
+ */
+package com.jeeplus.yzflow.service;
+
+import org.springframework.stereotype.Service;
+import org.springframework.transaction.annotation.Transactional;
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+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.yzflow.service.dto.YzFlowDTO;
+import com.jeeplus.yzflow.domain.YzFlow;
+import com.jeeplus.yzflow.mapper.YzFlowMapper;
+
+import java.util.List;
+
+/**
+ * YzFlowService
+ * @author 卢崇梅
+ * @version 2024-04-09
+ */
+@Service
+@Transactional
+public class YzFlowService extends ServiceImpl<YzFlowMapper, YzFlow> {
+
+	/**
+	 * 根据id查询
+	 * @param id
+	 * @return
+	 */
+	public YzFlowDTO findById(String id) {
+		return baseMapper.findById ( id );
+	}
+
+	/**
+	 * 自定义分页检索
+	 * @param page
+	 * @param queryWrapper
+	 * @return
+	 */
+	public IPage <YzFlowDTO> findPage(Page <YzFlowDTO> page, QueryWrapper queryWrapper) {
+		queryWrapper.eq ("a.del_flag", 0 ); // 排除已经删除
+		return  baseMapper.findList (page, queryWrapper);
+	}
+
+    public List<YzFlowDTO> getByYzId(String yzId) {
+		return baseMapper.getByYzId(yzId);
+    }
+
+	public int isEnd(String yzId) {
+		return  baseMapper.isEnd(yzId);
+	}
+}

+ 86 - 0
jp-console/jeeplus-modules/gw/src/main/java/com/jeeplus/yzflow/service/dto/YzFlowDTO.java

@@ -0,0 +1,86 @@
+/**
+ * Copyright © 2021-2025 <a href="http://www.jeeplus.org/">JeePlus</a> All rights reserved.
+ */
+package com.jeeplus.yzflow.service.dto;
+
+import javax.validation.constraints.NotNull;
+import com.jeeplus.sys.service.dto.UserDTO;
+import com.jeeplus.core.query.Query;
+import com.jeeplus.core.query.QueryType;
+import com.alibaba.excel.annotation.ExcelProperty;
+import com.jeeplus.core.excel.converter.ExcelDictDTOConverter;
+import com.jeeplus.core.excel.annotation.ExcelDictProperty;
+import com.jeeplus.core.excel.converter.ExcelUserDTOConverter;
+import com.jeeplus.core.service.dto.BaseDTO;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+/**
+ * YzFlowDTO
+ * @author 卢崇梅
+ * @version 2024-04-09
+ */
+@Data
+@EqualsAndHashCode(callSuper = false)
+public class YzFlowDTO extends BaseDTO {
+
+	private static final long serialVersionUID = 1L;
+
+	        
+	/**
+     * 拟稿id
+     */
+	@NotNull(message="拟稿id不能为空")
+    @Query(tableColumn = "a.yz_id", javaField = "yzId", type = QueryType.EQ)
+	@ExcelProperty("拟稿id") 
+	private String yzId;
+	        
+	/**
+     * 内容
+     */
+	@ExcelProperty("内容") 
+	private String content;
+	        
+	/**
+     * 签名附件
+     */
+	@ExcelProperty("签名附件") 
+	private String signfj;
+	        
+	/**
+     * 流程状态
+     */
+    @Query(tableColumn = "a.state", javaField = "state", type = QueryType.EQ)
+	@ExcelProperty(value = "流程状态", converter = ExcelDictDTOConverter.class)
+	@ExcelDictProperty("gw_flow_state")
+	private String state;
+	        
+	/**
+     * 科室承办:0,办公室拟办:1,分管领导:2,主领导:3,回流到办公室:4;待归档:5
+     */
+    @Query(tableColumn = "a.which", javaField = "which", type = QueryType.EQ)
+	@ExcelProperty("科室承办:0,办公室拟办:1,分管领导:2,主领导:3,待归档:4")
+	private String which;
+	        
+	/**
+     * 创建人姓名
+     */
+	@ExcelProperty("创建人姓名") 
+	private String createTruename;
+	        
+	/**
+     * 下一步待办人姓名
+     */
+	@ExcelProperty("下一步待办人姓名") 
+	private String nextTruename;
+	        
+	/**
+     * 下一步待办人
+     */
+    @ExcelProperty(value = "下一步待办人")
+	private String nextUser;
+	//是否选择人提交  1是
+	private String next;
+
+	private String neUser;
+
+}

+ 36 - 0
jp-console/jeeplus-modules/gw/src/main/java/com/jeeplus/yzflow/service/mapstruct/YzFlowWrapper.java

@@ -0,0 +1,36 @@
+/**
+ * Copyright © 2021-2025 <a href="http://www.jeeplus.org/">JeePlus</a> All rights reserved.
+ */
+package com.jeeplus.yzflow.service.mapstruct;
+
+
+import com.jeeplus.core.mapstruct.EntityWrapper;
+import com.jeeplus.yzflow.service.dto.YzFlowDTO;
+import com.jeeplus.yzflow.domain.YzFlow;
+import org.mapstruct.Mapper;
+import org.mapstruct.Mapping;
+import org.mapstruct.Mappings;
+import org.mapstruct.ReportingPolicy;
+import org.mapstruct.factory.Mappers;
+
+/**
+ *  YzFlowWrapper
+ * @author 卢崇梅
+ * @version 2024-04-09
+ */
+@Mapper(componentModel = "spring", unmappedTargetPolicy = ReportingPolicy.IGNORE, uses = {} )
+public interface YzFlowWrapper extends EntityWrapper<YzFlowDTO, YzFlow> {
+
+    YzFlowWrapper INSTANCE = Mappers.getMapper(YzFlowWrapper.class);
+     @Mappings({
+            @Mapping(source = "createBy.id", target = "createById"),
+            @Mapping (source = "updateBy.id", target = "updateById")})
+    YzFlow toEntity(YzFlowDTO dto);
+
+
+    @Mappings({
+            @Mapping (source = "createById", target = "createBy.id"),
+            @Mapping (source = "updateById", target = "updateBy.id")})
+    YzFlowDTO toDTO(YzFlow entity);
+}
+

+ 69 - 0
jp-mobile/api/commonseal/yzCirculationCardService.js

@@ -0,0 +1,69 @@
+import request from "../../common/request";
+
+export default {
+	save: function(inputForm) {
+		return request({
+			url: "/yzcirculation/yzCirculationCard/save",
+			method: "post",
+			data: inputForm,
+		});
+	},
+	getCardNum: function(id) {
+		return request({
+			url: "/yzcirculation/yzCirculationCard/getCardNum",
+			method: "get",
+		});
+	},
+	delete: function(ids) {
+		return request({
+			url: "/yzcirculation/yzCirculationCard/delete",
+			method: "delete",
+			params: {
+				ids: ids
+			},
+		});
+	},
+
+	queryById: function(id) {
+		return request({
+			url: "/yzcirculation/yzCirculationCard/queryById",
+			method: "get",
+			params: {
+				id: id
+			},
+		});
+	},
+
+	list: function(params) {
+		return request({
+			url: "/yzcirculation/yzCirculationCard/list",
+			method: "get",
+			params: params,
+		});
+	},
+
+	exportTemplate: function() {
+		return request({
+			url: "/yzcirculation/yzCirculationCard/import/template",
+			method: "get",
+			responseType: "blob",
+		});
+	},
+
+	exportExcel: function(params) {
+		return request({
+			url: "/yzcirculation/yzCirculationCard/export",
+			method: "get",
+			params: params,
+			responseType: "blob",
+		});
+	},
+
+	importExcel: function(data) {
+		return request({
+			url: "/yzcirculation/yzCirculationCard/import",
+			method: "post",
+			data: data,
+		});
+	},
+};

+ 67 - 0
jp-mobile/api/commonseal/yzFlowService.js

@@ -0,0 +1,67 @@
+import request from "../../common/request";
+
+export default {
+	save: function (inputForm) {
+		return request({
+			url: "/yzflow/yzFlow/save",
+			method: "post",
+			data: inputForm,
+		});
+	},
+
+	delete: function (ids) {
+		return request({
+			url: "/yzflow/yzFlow/delete",
+			method: "delete",
+			params: { ids: ids },
+		});
+	},
+
+	queryById: function (id) {
+		return request({
+			url: "/yzflow/yzFlow/queryById",
+			method: "get",
+			params: { id: id },
+		});
+	},
+	queryByYzId: function (id) {
+		return request({
+			url: "/yzflow/yzFlow/queryByYzId",
+			method: "get",
+			params: { yzId: id },
+		});
+	},
+
+	list: function (params) {
+		return request({
+			url: "/yzflow/yzFlow/list",
+			method: "get",
+			params: params,
+		});
+	},
+
+	exportTemplate: function () {
+		return request({
+			url: "/yzflow/yzFlow/import/template",
+			method: "get",
+			responseType: "blob",
+		});
+	},
+
+	exportExcel: function (params) {
+		return request({
+			url: "/yzflow/yzFlow/export",
+			method: "get",
+			params: params,
+			responseType: "blob",
+		});
+	},
+
+	importExcel: function (data) {
+		return request({
+			url: "/yzflow/yzFlow/import",
+			method: "post",
+			data: data,
+		});
+	},
+};

+ 50 - 29
jp-mobile/components/office-user-select/office-user-select.vue

@@ -18,12 +18,17 @@
 					</view>
 				</scroll-view>
 				<scroll-view scroll-y class="src2">
-					<view class="tab2">
+					<view class="tab2" v-if="tab2.length>0">
 						<view class="tab2_text" v-for="item in tab2" @click="tab1click2(item)"
 							:class="item.check?'current':''">
 							{{item.name}}
 						</view>
 					</view>
+					<view class="tab2" v-else>
+						<view class="tab2_text">
+							暂无人员
+						</view>
+					</view>
 				</scroll-view>
 			</view>
 		</u-action-sheet>
@@ -31,8 +36,12 @@
 </template>
 
 <script>
+	import {
+		stubFalse
+	} from "lodash"
 	import officeService from "@/api/sys/officeService"
 	import userService from "@/api/sys/userService"
+	import * as $auth from "@/common/auth.js"
 	export default {
 		data() {
 			return {
@@ -47,36 +56,23 @@
 			}
 		},
 		props: {
-			limit: Number,
 			value: String,
 			size: String,
 			placeholder: String,
 			title: String,
-			readonly: {
-				type: Boolean,
+			types: {
+				type: String,
 				default: () => {
-					return false
+					return ""
 				}
 			},
-			checkOnlyLeaf: {
+			multiple: {
 				type: Boolean,
 				default: () => {
 					return false
 				}
 			},
-			showRadio: {
-				type: Boolean,
-				default: () => {
-					return true
-				}
-			},
-			showCheckBox: {
-				type: Boolean,
-				default: () => {
-					return false
-				}
-			},
-			disabled: {
+			myOffice: {
 				type: Boolean,
 				default: () => {
 					return false
@@ -94,18 +90,37 @@
 		},
 		mounted() {
 			officeService.treeData({
-				parentId:"1770354728635834369"
+				parentId: "1770354728635834369"
 			}).then((data) => {
-				
-				data = data.filter(item => item.type == '3')
+
+				if (this.types.length > 0) {
+					let types = this.types.split(",")
+
+					let officeList = []
+					types.forEach(item => {
+						data.forEach(item1 => {
+							if (item1.type == item) {
+								officeList.push(item1)
+							}
+						})
+					})
+					data = officeList
+					console.log("this.types.length", data);
+				}
 				this.tab1 = data
-				this.index1 = data[0].id
-				userService.officeList().then(res => {
-					this.userList = res
+				this.index1 = this.tab1[0].id
+				userService.list({
+					current: 1,
+					size: 10000
+				}).then(res => {
+					this.userList = res.records
 					this.userList = this.userList.map(item => ({
 						...item,
 						check: false
 					}));
+					if (this.myOffice) {
+						this.userList = this.userList.filter(item => item.id != $auth.getUserInfo().id)
+					}
 					this.tab1click(this.tab1[0])
 				})
 			})
@@ -119,8 +134,8 @@
 					let u = this.value.split(",")
 					this.$nextTick(() => {
 						for (let i = 0; i < this.userList.length; i++) {
-							let b = u.filter(t => t==this.userList[i].id)
-							if(b.length>0) {
+							let b = u.filter(t => t == this.userList[i].id)
+							if (b.length > 0) {
 								this.$set(this.userList[i], "check", true);
 								this.selectList.push(this.userList[i])
 							}
@@ -142,10 +157,16 @@
 			},
 			tab1click(e) {
 				this.index1 = e.id;
-				this.tab2 = this.userList.filter(item => item.officeDTO.id == e.id)
+				this.tab2 = this.userList.filter(item => item.officeDTO && item.officeDTO.id == e.id)
 
 			},
 			tab1click2(item) {
+				if (!this.multiple) {
+					this.selectList = []
+					this.userList.forEach(item1 => {
+						item1.check = false
+					})
+				}
 				item.check = !item.check
 				if (item.check) {
 					this.selectList.push(item)
@@ -154,7 +175,7 @@
 				}
 			},
 			getSelect(id) {
-				let s = this.selectList.filter(item => item.officeDTO.id == id)
+				let s = this.selectList.filter(item => item.officeDTO && item.officeDTO.id == id)
 				return s.length
 			}
 		}

+ 30 - 30
jp-mobile/pages.json

@@ -13,36 +13,36 @@
 				"navigationStyle": "custom" // 隐藏系统导航栏
 			}
 		},
-		// {
-		//     "path" : "pages/commonseal/addCommon",
-		//     "style" : {
-		// 		"navigationBarTitleText": "新增拟稿申请"
-		// 	}
-		// },
-		// {
-		//     "path" : "pages/commonseal/examineCommon",
-		//     "style" : {
-		// 		"navigationBarTitleText": "拟稿审批"
-		// 	}
-		// },
-		// {
-		//     "path" : "pages/commonseal/commonInfo",
-		//     "style" : {
-		// 		"navigationBarTitleText": "拟稿详情"
-		// 	}
-		// },
-		// {
-		//     "path" : "pages/commonseal/commonList",
-		//     "style" : {
-		// 		"navigationBarTitleText": "列表"
-		// 	}
-		// },
-		// {
-		//     "path" : "pages/commonseal/statistics",
-		//     "style" : {
-		// 		"navigationBarTitleText": "用章统计"
-		// 	}
-		// },
+		{
+		    "path" : "pages/commonseal/addCommon",
+		    "style" : {
+				"navigationBarTitleText": "新增拟稿申请"
+			}
+		},
+		{
+		    "path" : "pages/commonseal/examineCommon",
+		    "style" : {
+				"navigationBarTitleText": "拟稿审批"
+			}
+		},
+		{
+		    "path" : "pages/commonseal/commonInfo",
+		    "style" : {
+				"navigationBarTitleText": "拟稿详情"
+			}
+		},
+		{
+		    "path" : "pages/commonseal/commonList",
+		    "style" : {
+				"navigationBarTitleText": "列表"
+			}
+		},
+		{
+		    "path" : "pages/commonseal/statistics",
+		    "style" : {
+				"navigationBarTitleText": "用章统计"
+			}
+		},
 		{
 		    "path" : "pages/fileTransmit/addFileTransmit",
 		    "style" : {

+ 2 - 0
jp-mobile/pages/addressbook/addressbook.vue

@@ -1,8 +1,10 @@
 <template>
 	<view class="main">
+		<!-- #ifdef APP-PLUS -->
 		<cu-custom bgColor="bg-blue_default">
 			<block slot="content">通讯录</block>
 		</cu-custom>
+		<!-- #endif -->
 		<view class=" text-center flex tab-custom" style="height: 45px;line-height: 45px;">
 			<u-tabs :list="list" @click="changeParent" lineWidth="30" lineHeight="1" lineColor="#ffffff" :activeStyle="{
         color: '#ffffff',

+ 527 - 0
jp-mobile/pages/commonseal/addCommon.vue

@@ -0,0 +1,527 @@
+<template>
+	<view class="main">
+		<view class="bg-white default_title">
+			<u--form :model="inputForm" labelWidth="130px" class="u-form default_title" labelPosition="left"
+				ref="inputForm">
+				<u-form-item label="年度" borderBottom prop="yearNum">
+					<u--input readonly v-model="inputForm.yearNum" placeholder="输入年度" border="none"></u--input>
+				</u-form-item>
+				<u-form-item label="卡号" borderBottom prop="cardNum">
+					<u--input readonly v-model="inputForm.cardNum" placeholder="输入卡号" border="none"></u--input>
+				</u-form-item>
+			</u--form>
+		</view>
+		<view class="bg-white margin-top main_info">
+			<u--form :model="inputForm" :rules="rules" labelWidth="130px" class="u-form default_title"
+				labelPosition="left" ref="inputForm">
+				<u-form-item required label="文件名称" borderBottom prop="name">
+					<u--input v-model="inputForm.name" placeholder="请输入文件名称" border="none"></u--input>
+				</u-form-item>
+				<u-form-item label="拟稿人" borderBottom prop="authorPerson">
+					<u--input readonly v-model="$auth.getUserInfo().name" border="none"></u--input>
+				</u-form-item>
+				<u-form-item required label="校对人" borderBottom prop="proofreader">
+					<office-user-select v-model="inputForm.proofreader" placeholder="请选择校对人" title="校对人"
+						myOffice types="3,6"></office-user-select>
+				</u-form-item>
+				<u-form-item label="印数" borderBottom prop="printNum">
+					<u-number-box integer v-model="inputForm.printNum"></u-number-box>
+				</u-form-item>
+				<u-form-item label="是否公开" borderBottom prop="open">
+					<u-radio-group v-model="inputForm.open">
+						<u-radio style="margin-right: 20px;" label="是" name="1"></u-radio>
+						<u-radio label="否" name="0"></u-radio>
+					</u-radio-group>
+				</u-form-item>
+				<u-form-item label="备注" borderBottom prop="remark">
+					<u--input v-model="inputForm.remark" placeholder="请输入备注" border="none"></u--input>
+				</u-form-item>
+				<u-form-item label="文件附件" prop="attachment" labelPosition="top">
+					<lsj-upload ref="lsjUpload" childId="upload1" width="250rpx" height="200rpx" :option="option"
+						:debug="false" :instantly="false" @uploadEnd="onuploadEnd" @change="afterRead">
+						<view class="addfile flex">
+							<u-icon size="20" bold name="plus"></u-icon>
+						</view>
+					</lsj-upload>
+					<!-- #ifdef H5 -->
+					<view class="takephoto addfile flex" @click="takePhoto"> <u-icon size="20" bold
+							name="camera"></u-icon>
+					</view>
+					<!-- #endif -->
+				</u-form-item>
+				<view class="text-danger" style="font-size: 12px!important;">请确保上传图片内容清晰可见,所有涉密敏感信息不得上传</view>
+				<view class="other_info">
+					<view class="other_pdf">
+						<u-cell-group>
+							<u-cell v-for="item in fileList">
+								<view slot="title">
+									<u--text :lines="1" :text="item.name"></u--text>
+								</view>
+								<u-icon slot="value" size="28" name="trash-fill" @click="deleteFile(item)"></u-icon>
+							</u-cell>
+						</u-cell-group>
+					</view>
+				</view>
+				<u-upload :fileList="imgList" @delete="deletePic" multiple :maxCount="imgList.length"
+					:previewFullImage="true"></u-upload>
+
+				<view class="submit_btn flex">
+					<u-button v-if="!loading" type="primary" text="提交新增" @click="formSubmit"></u-button>
+					<u-button v-if="loading" :loading="loading" type="primary" text="加载中"></u-button>
+				</view>
+			</u--form>
+		</view>
+		<u-toast ref="uToast"></u-toast>
+		<u-overlay :show="loading">
+			<view class="warp">
+				<view class="rect"><u-button plain loading loadingText="加载中"></u-button></view>
+			</view>
+		</u-overlay>
+	</view>
+</template>
+
+<script>
+	import {
+		isImageFormat
+	} from "@/common/util.js"
+	import BASE_URL from '@/config.js'
+	import moment from "moment"
+	import * as $auth from "@/common/auth.js"
+	import userService from "@/api/sys/userService"
+	import fileService from '@/api/file/fileService.js'
+	import yzCirculationCardService from '@/api/commonseal/yzCirculationCardService.js'
+	export default {
+		mounted() {
+			userService.list({
+				current: 1,
+				size: 10000
+			}).then((res) => {
+				this.userList = res.records
+			}).catch((e) => {
+				throw e
+			})
+			yzCirculationCardService.getCardNum().then(data => {
+				this.inputForm.authorPerson = $auth.getUserInfo().id
+				const currentYear = new Date().getFullYear();
+				this.inputForm.yearNum = currentYear
+				this.cardNum = data
+				this.inputForm.cardNum = "[" + currentYear + "]" + data + "号"
+			})
+		},
+		data() {
+			return {
+				imgsrc: {},
+				loading: false,
+				isreceive: false,
+				iswrite: false,
+				fileLists: [],
+				fileList: [],
+				files: [],
+				imgList: [],
+				userList: [],
+				cardNum: "",
+				inputForm: {
+					id: '',
+					name: '',
+					authorPerson: '',
+					proofreader: '',
+					open: '1',
+					printNum: '1',
+					state: '1',
+					cardNum: '',
+					yearNum: '',
+					attachment: '',
+					remark: '',
+				},
+				rules: {
+					name: [{
+						required: true,
+						message: '请输入文件名称',
+						trigger: ['blur', 'change']
+					}]
+				},
+				// 上传接口参数
+				option: {
+					url: BASE_URL + '/gwfile/upload?uploadPath=commonseal',
+					name: 'file',
+					header: {
+						"token": $auth.getUserToken()
+					},
+				},
+			}
+		},
+		methods: {
+
+			showToast(params) {
+				this.loading = false
+				this.$refs.uToast.show({
+					...params,
+					complete() {
+						params.url && uni.redirectTo({
+							url: params.url
+						})
+					}
+				})
+			},
+			// 删除文件
+			deleteFile(item) {
+				let that = this
+				that.fileList = that.fileList.filter(i => !(i.url == item.url))
+				that.fileLists = that.fileLists.filter(i => !(i.url == item.url))
+
+			},
+			// 删除图片
+			deletePic(event) {
+				let that = this
+				this.imgList = this.imgList.filter(item => item.name != event.file.name)
+				that.fileLists = that.fileLists.filter(i => !(i.name == event.file.name))
+			},
+			// 图片压缩
+			compressH5(urlData, targetSizeKB, initialQuality = 1.0) {
+				const maxQuality = 1.0;
+				const minQuality = 0.0;
+				const tolerance = 0.01; // 根据需要调整公差
+				if (!urlData.url) {
+					this.$set(urlData, "url", urlData.path)
+				}
+				let that = this
+				return new Promise((resolve, reject) => {
+					let binarySearch = (min, max) => {
+						const midQuality = (min + max) / 2;
+						uni.getImageInfo({
+							src: urlData.url,
+							success(res) {
+								const reader = new FileReader();
+								let img = new Image()
+								img.src = res.path
+								img.onload = function() {
+									const canvas = document.createElement('canvas');
+									const ctx = canvas.getContext('2d');
+
+									canvas.width = img.width;
+									canvas.height = img.height;
+
+									ctx.clearRect(0, 0, canvas.width, canvas.height);
+									ctx.drawImage(img, 0, 0, canvas.width, canvas
+										.height);
+
+									// 使用异步的 toBlob 方法
+									canvas.toBlob(async (blob) => {
+										const fileSizeKB = blob.size /
+											1024;
+										if (Math.abs(fileSizeKB -
+												targetSizeKB) <
+											tolerance || max - min <
+											tolerance) {
+											// 当前质量足够接近目标大小,使用当前质量解析
+											reader.readAsDataURL(blob);
+											reader.onload = () => {
+												let result = that
+													.uploadFilePromise(reader
+														.result)
+												setTimeout(() => {
+													resolve(result)
+												}, 300)
+											}
+										} else if (fileSizeKB >
+											targetSizeKB) {
+											// 如果文件大小太大,降低质量,继续二分查找
+											binarySearch(min, midQuality);
+										} else {
+											// 如果文件大小太小,增加质量,继续二分查找
+											binarySearch(midQuality, max);
+										}
+									}, urlData.type, midQuality);
+								};
+							}
+						})
+					}
+					// 开始二分查找
+					binarySearch(minQuality, maxQuality);
+				})
+			},
+			// 拍照
+			takePhoto() {
+				let that = this
+				// 调用uniapp的chooseImage API 选择图片
+				uni.chooseImage({
+					count: 1, // 默认9, 设置图片的数量
+					sizeType: ['original', 'compressed'], // 可以指定是原图还是压缩图,默认二者都有
+					sourceType: ['camera'], // 可以指定来源是相册还是相机,默认二者都有
+					success: (chooseImageRes) => {
+						uni.showLoading({
+							title: "上传中"
+						})
+						const tempFilePaths = chooseImageRes.tempFiles[0];
+						// 成功选择图片后进行压缩处理
+						that.compressH5(tempFilePaths, 150).then(result => {
+							const fileName = result.split(/[/\\=]/).pop();
+							let item1 = {
+								name: fileName,
+								url: BASE_URL + result
+							}
+							let item = {
+								name: fileName,
+								path: result,
+
+							}
+							that.fileLists.push(item)
+							that.imgList.push(item1)
+							uni.hideLoading()
+						})
+
+					},
+					fail: (error) => {
+						uni.hideLoading()
+					}
+				});
+			},
+			// 拍照上传
+			async uploadFilePromise(param) {
+				return new Promise((resolve, reject) => {
+					let a = uni.uploadFile({
+						url: this.BASE_URL + '/gwfile/upload?uploadPath=commonseal',
+						filePath: param,
+						name: 'file',
+						header: {
+							"token": $auth.getUserToken()
+						},
+						success: (res) => {
+							setTimeout(() => {
+								resolve(res.data)
+							}, 300)
+						}
+					})
+				});
+			},
+			// 新增图片
+			afterRead(files) {
+				uni.showLoading({
+					title: "上传中"
+				})
+				let lists = [...files.values()]
+				this.files = files
+				for (let i = 0; i < lists.length; i++) {
+					if (lists[i].type == 'success') continue;
+					if (isImageFormat(lists[i].name) && lists[i].size > 200 * 1024) {
+						this.compressAPP(lists[i], 150).then(res => {
+							this.files.get(lists[i].name).file = res
+							this.upload(lists[i].name)
+						})
+					} else {
+						this.upload(lists[i].name)
+					}
+				}
+
+			},
+			// app图片压缩
+			compressAPP(urlData, targetSizeKB, initialQuality = 1.0) {
+				const maxQuality = 1.0;
+				const minQuality = 0.0;
+				const tolerance = 0.01; // 根据需要调整公差
+				let that = this
+				return new Promise((resolve, reject) => {
+
+					let binarySearch = (min, max) => {
+						const midQuality = (min + max) / 2;
+						uni.getImageInfo({
+							src: urlData.path,
+							success: function(res) {
+								let img = new Image()
+								img.src = res.path
+								img.onload = function() {
+									const canvas = document.createElement('canvas');
+									const ctx = canvas.getContext('2d');
+
+									canvas.width = img.width;
+									canvas.height = img.height;
+
+									ctx.clearRect(0, 0, canvas.width, canvas.height);
+									ctx.drawImage(img, 0, 0, canvas.width, canvas
+										.height);
+
+									// 使用异步的 toBlob 方法
+									canvas.toBlob(async (blob) => {
+										const fileSizeKB = blob.size / 1024;
+										if (Math.abs(fileSizeKB -
+												targetSizeKB) <
+											tolerance || max - min <
+											tolerance) {
+
+											// 当前质量足够接近目标大小,使用当前质量解析
+											const file = new File([blob], urlData
+												.name, {
+													type: blob.type,
+													lastModified: new Date()
+														.getTime(), // 使用当前时间作为最后修改时间
+												});
+											setTimeout(() => {
+												resolve(file)
+											}, 300)
+										} else if (fileSizeKB >
+											targetSizeKB) {
+											// 如果文件大小太大,降低质量,继续二分查找
+											binarySearch(min, midQuality);
+										} else {
+											// 如果文件大小太小,增加质量,继续二分查找
+											binarySearch(midQuality, max);
+										}
+									}, urlData.file.type, midQuality);
+								};
+							},
+							fail: function(err) {
+								resolve(false);
+							}
+						});
+
+
+					}
+					// 开始二分查找
+					binarySearch(minQuality, maxQuality);
+				})
+			},
+			// APP手动上传
+			upload(name) {
+				// name=指定文件名,不指定则上传所有type等于waiting和fail的文件
+				this.$refs['lsjUpload'].upload(name);
+			},
+			onuploadEnd(item) {
+				console.log(`${item.name}已上传结束,上传状态=${item.type}`);
+
+				// 更新当前窗口状态变化的文件
+				this.files.set(item.name, item);
+				let file = {
+					name: item.name,
+					path: item.responseText
+				}
+				this.fileLists.push(file)
+
+				const fileName = item.name.split(/[/\\=]/).pop();
+				if (isImageFormat(item.name)) {
+					let item1 = {
+						name: fileName,
+						url: this.BASE_URL + item.responseText
+					}
+					this.imgList.push(item1)
+				} else {
+					let a = {
+						name: fileName,
+						url: this.BASE_URL + item.responseText
+					}
+					this.fileList.push(a)
+				}
+				uni.hideLoading()
+				// 微信小程序Map对象for循环不显示,所以转成普通数组,
+				// 如果你用不惯Map对象,也可以像这样转普通数组,组件使用Map主要是避免反复文件去重操作
+				// #ifdef MP-WEIXIN
+				this.wxFiles = [...this.files.values()];
+				// #endif
+
+				// 强制更新视图
+				this.$forceUpdate();
+
+				// ---可删除--演示判断是否所有文件均已上传成功
+				let isAll = [...this.files.values()].find(item => item.type !== 'success');
+				if (!isAll) {
+
+				} else {
+					console.log(isAll.name + '待上传');
+				}
+
+			},
+
+			// 下载文件
+			download(param) {
+				fileService.download(param).then(data)
+			},
+			// 表单提交
+			formSubmit() {
+				this.loading = true
+				let auditForm = Object.assign({}, this.inputForm);
+				let files = []
+				this.fileLists.forEach(item => {
+					files.push(item.path)
+				})
+				auditForm.attachment = files.join(",");
+				auditForm.cardNum = this.cardNum
+				this.$refs.inputForm.validate().then(valid => {
+					if (valid) {
+						yzCirculationCardService.save(auditForm).then((data) => {
+
+							let param = {
+								type: 'success',
+								message: data,
+								iconUrl: 'https://cdn.uviewui.com/uview/demo/toast/success.png',
+								url: "/pages/index/index"
+							}
+							this.showToast(param);
+						}).catch(() => {
+							let param = {
+								type: 'error',
+								message: data,
+								iconUrl: 'https://cdn.uviewui.com/uview/demo/toast/error.png',
+							}
+							this.showToast(param);
+						})
+					}
+				}).catch(e => {
+					this.loading = false
+				})
+
+			}
+
+		}
+	}
+</script>
+
+<style>
+	.warp {
+		display: flex;
+		align-items: center;
+		justify-content: center;
+		height: 100%;
+	}
+
+	.default_title {
+		padding-top: 0px;
+	}
+
+	.main_info {
+		margin-top: 15px;
+	}
+
+	.u-form-item__body__right__message span {
+		font-size: 12px !important;
+	}
+
+	.submit_btn {
+		background-color: #fefefe;
+		margin-top: 20px;
+		box-shadow: none;
+		margin-bottom: 20px;
+	}
+
+	.submit_btn button {
+		height: 40px;
+		width: 80%;
+		border-radius: 30px;
+
+	}
+
+	.addfile {
+		width: 80px;
+		height: 80px;
+		background-color: #eee;
+		padding-left: 30%;
+		/* padding-left: 18%; */
+		margin: 10px;
+	}
+
+	.takephoto {
+		padding-left: 9%;
+	}
+
+	.other_info {
+		width: 100%;
+	}
+</style>

+ 488 - 0
jp-mobile/pages/commonseal/commonCard.vue

@@ -0,0 +1,488 @@
+<template>
+	<view class="commom_main">
+		<view class="card_banner"></view>
+		<view class="card_info">
+			<view class="card_info_title">
+				<view class="">
+					盐城市盐都区工业和信息化局拟稿
+				</view>
+				<view class="card_info_min">
+					都工信{{inputForm.cardNum}}
+				</view>
+			</view>
+			<view class="card_table">
+				<u-row class="card_first_row"></u-row>
+				<u-row v-if="leaderInfo.length>0" justify="space-between" class="card_row">
+					<u-col span="3">
+						<view class="justify-text">
+							<text>主</text>
+							<text>要</text>
+							<text>领</text>
+							<text>导</text>
+							<text>意</text>
+							<text>见</text>
+						</view>
+					</u-col>
+					<u-col span="9" class="info_abstract">
+						<view v-for="leader in leaderInfo" class="info_abstract_v">
+							<view>
+								{{leader.content}}
+							</view>
+							<view class="flex text-sm" style="line-height: 20px;">
+								<u--image :src="leader.signfj" width="80px" height="20px"></u--image>
+								{{leader.updateTime}}
+							</view>
+						</view>
+					</u-col>
+				</u-row>
+				<u-row v-if="fgLeaderInfo.length>0" justify="space-between" class="card_row ">
+					<u-col span="3">
+						<view class="justify-text">
+							<text>分</text>
+							<text>管</text>
+							<text>领</text>
+							<text>导</text>
+							<text>意</text>
+							<text>见</text>
+						</view>
+					</u-col>
+					<u-col span="9" class="info_abstract">
+						<view v-for="item in fgLeaderInfo" class="info_abstract_v">
+							<view>
+								{{item.content}}
+							</view>
+							<view class="flex text-sm" style="line-height: 20px;">
+								<u--image :src="item.signfj" width="80px" height="20px"></u--image>
+								{{item.updateTime}}
+							</view>
+						</view>
+					</u-col>
+				</u-row>
+				<u-row v-if="officeInfo.length>0" justify="space-between" class="card_row ">
+					<u-col span="3">
+						<view class="justify-text" style="font-size:18px ;">
+							<text>办</text>
+							<text>公</text>
+							<text>(室) </text>
+							<text>意</text>
+							<text>见</text>
+						</view>
+					</u-col>
+					<u-col span="9" class="info_abstract">
+						<view v-for="item in officeInfo" class="info_abstract_v">
+							<view>
+								{{item.content}}
+							</view>
+							<view class="flex text-sm" style="line-height: 20px;">
+								<u--image :src="item.signfj" width="80px" height="20px"></u--image>
+								{{item.updateTime}}
+							</view>
+						</view>
+					</u-col>
+				</u-row>
+
+				<u-row v-if="undertakeInfo.length>0" justify="space-between" class="card_row ">
+					<u-col span="3" textAlign="justify">
+						<view class="justify-text">
+							<text>承</text>
+							<text>办</text>
+							<text>科</text>
+							<text>室</text>
+							<text>意</text>
+							<text>见</text>
+						</view>
+					</u-col>
+					<u-col span="9" class="info_abstract">
+						<view v-for="item in undertakeInfo" class="info_abstract_v">
+							<view>
+								{{item.content}}
+							</view>
+							<view class="flex text-sm" style="line-height: 20px;">
+								<u--image :src="item.signfj" width="80px" height="20px" mode="aspectFit"></u--image>
+								{{item.updateTime}}
+							</view>
+						</view>
+					</u-col>
+				</u-row>
+				<u-row justify="space-between" class="card_row card_row_border">
+					<u-col span="3">
+						<view>文件名称</view>
+					</u-col>
+					<u-col span="9" textAlign="center" class="card_col_1">
+						<uni-tooltip :content="inputForm.name" placement="top">
+							<u--text size="14" align="center" lines="1" :text="inputForm.name"></u--text>
+						</uni-tooltip>
+					</u-col>
+				</u-row>
+				<u-row justify="space-between" class="card_row card_row_border">
+					<u-col span="3" textAlign="center" class="">
+						<view>拟稿人</view>
+					</u-col>
+					<u-col span="3" textAlign="center" class="card_col_1">
+						<uni-tooltip :content="inputForm.authorPerson" placement="top">
+							<u--text size="14" align="center" lines="1" :text="inputForm.authorPerson"></u--text>
+						</uni-tooltip>
+					</u-col>
+					<u-col span="3" textAlign="center" class="card_col card_col_1">
+						<view>校对人</view>
+					</u-col>
+					<u-col span="3" textAlign="center">
+						<uni-tooltip :content="inputForm.proofreader" placement="top">
+							<u--text size="14" align="center" lines="1" :text="inputForm.proofreader"></u--text>
+						</uni-tooltip>
+						<!-- <u--text size="14" align="center" lines="1" :text="inputForm.fileSource"></u--text> -->
+					</u-col>
+				</u-row>
+				<u-row justify="space-between" class="card_row card_row_border">
+					<u-col span="3" textAlign="center" class="">
+						<view>可否公开</view>
+					</u-col>
+					<u-col span="3" textAlign="center" class="card_col_1">
+						<u--text size="14" align="center" lines="1" :text="inputForm.open?'是':'否'"></u--text>
+					</u-col>
+					<u-col span="3" textAlign="center" class="card_col card_col_1">
+						<view>印数</view>
+					</u-col>
+					<u-col span="3" textAlign="center">
+						<uni-tooltip :content="inputForm.printNum" placement="top">
+							<u--text size="14" align="center" lines="1" :text="inputForm.printNum"></u--text>
+						</uni-tooltip>
+					</u-col>
+				</u-row>
+				<u-row justify="space-between" class="card_row card_row_border card_last_row">
+					<u-col span="3" textAlign="center" class="card_col">
+						<view>备注</view>
+					</u-col>
+					<u-col span="9" textAlign="center">
+						<view>{{inputForm.remark}}</view>
+					</u-col>
+				</u-row>
+				<u--text style="margin: 10px;" size="10" type="error" text="所有涉密敏感信息不得上传"></u--text>
+				<view class="card_other">
+					附件:
+					<view class="other_info" v-for="item in fileList">
+						<view class="other_pdf  flex  ">
+							<u--text decoration='underline' color='#36a7f3' :text="item.name"
+								@click="item.type=='pdf'?preview(item):download(item)"></u--text>
+						</view>
+					</view>
+
+				</view>
+			</view>
+
+		</view>
+		<view style="margin-left: 20px;">
+			<u-upload :fileList="imgList" multiple :maxCount="imgList.length" :previewFullImage="true"
+				:deletable="false"></u-upload>
+		</view>
+		<u-overlay :show="ismask">
+			<view class="warp">
+				<view class="rect"><u-button plain loading loadingText="加载中"></u-button></view>
+			</view>
+		</u-overlay>
+	</view>
+</template>
+
+<script>
+	import {
+		isImageFormat
+	} from "@/common/util.js"
+	import BASE_URL from '@/config.js'
+	import fileService from '@/api/file/fileService.js'
+	import yzCirculationCardService from '@/api/commonseal/yzCirculationCardService.js'
+	import yzFlowService from '@/api/commonseal/yzFlowService.js'
+
+	export default {
+		mounted() {
+			yzCirculationCardService.queryById(this.gwId).then(data => {
+				this.inputForm = data
+				this.inputForm.cardNum = "[" + this.inputForm.yearNum + "]" + this.inputForm.cardNum + "号"
+				this.fileLists = this.inputForm.attachment.split(",")
+				this.fileLists.forEach(item => {
+					if (isImageFormat(item)) {
+						let img = {
+							url: item
+						}
+						if (!item.startsWith("http")) img.url = this.BASE_URL + item
+						this.imgList.push(img)
+					} else {
+						const fileName = item.split(/[/\\=]/).pop();
+						let type = ""
+						const pdfFormats = /\.pdf$/i;
+						if (pdfFormats.test(item)) type = "pdf";
+						let a = {
+							name: fileName,
+							url: item,
+							type: type
+						}
+						if (!item.startsWith("http")) a.url = this.BASE_URL + item
+						this.fileList.push(a)
+					}
+				})
+			})
+			yzFlowService.queryByYzId(this.gwId).then(data => {
+
+				data.forEach(item => {
+					if (item.which == 0 && item.state == 0) {
+						if (item.signfj && !item.signfj.startsWith("http")) item.signfj = this.BASE_URL +
+							item.signfj
+						this.undertakeInfo.push(item)
+					} else if (item.which == 1 && item.state == 0) {
+						if (item.signfj && !item.signfj.startsWith("http")) item.signfj = this.BASE_URL +
+							item.signfj
+						this.officeInfo.push(item)
+					} else if (item.which == 2 && item.state == 0) {
+						if (item.signfj && !item.signfj.startsWith("http")) item.signfj = this.BASE_URL +
+							item.signfj
+						this.fgLeaderInfo.push(item)
+					}
+					if (item.which == 3 && item.state == 0) {
+						if (item.signfj && !item.signfj.startsWith("http")) item.signfj = this.BASE_URL +
+							item.signfj
+						this.leaderInfo.push(item)
+					}
+				})
+				this.leaderInfo.sort((a, b) => a.updateTime.localeCompare(b.updateTime) || a.updateTime
+					.localeCompare(b.updateTime));
+				this.undertakeInfo.sort((a, b) => a.updateTime.localeCompare(b.updateTime) || a.updateTime
+					.localeCompare(b.updateTime));
+				this.officeInfo.sort((a, b) => a.updateTime.localeCompare(b.updateTime) || a.updateTime
+					.localeCompare(b.updateTime));
+				this.fgLeaderInfo.sort((a, b) => a.updateTime.localeCompare(b.updateTime) || a.updateTime
+					.localeCompare(b.updateTime));
+				this.ismask = false
+			})
+
+		},
+		data() {
+			return {
+				ismask: true,
+				src: 'https://cdn.uviewui.com/uview/album/1.jpg',
+				// 公文附件
+				fileLists: [],
+				fileList: [],
+				imgList: [],
+				// 办公室信息
+				officeInfo: [],
+				// 领导信息
+				leaderInfo: [],
+				// 分管领导
+				fgLeaderInfo: [],
+				// 承办信息
+				undertakeInfo: [],
+				inputForm: {
+					id: '',
+					yearNum: '',
+					cardNum: '',
+					sendingAgency: '',
+					docFontSize: '',
+					fileSource: '',
+					writtenTime: '',
+					receivingTime: '',
+					contentSummary: '',
+					attachedDocumentId: ''
+				},
+				yzflow: {
+					id: '',
+					yzId: '',
+					content: '',
+					signfj: '',
+					createTruename: '',
+					nextTruename: '',
+					nextUser: '',
+					which: '',
+					state: '',
+
+					next: '',
+					remark: '',
+				},
+			}
+		},
+		methods: {
+
+			// 预览pdf
+			preview(fileUrl) {
+				uni.navigateTo({
+					url: "/pages/pdfPreview/pdfPreview?url=" + encodeURIComponent(fileUrl.url)
+				})
+
+			},
+			// 下载文件
+			download(param) {
+				uni.showLoading({
+					title: "下载中"
+				})
+				uni.downloadFile({
+					url: param.url, //调接口返回url
+					success: (res) => {
+						uni.hideLoading();
+						if (res.statusCode == 200) {
+							var tempFilePath = res.tempFilePath;
+							this.saveFile(tempFilePath, param.name);
+						} else {
+							uni.showToast({
+								icon: 'none',
+								title: '报告下载失败'
+							})
+						}
+					},
+					fail: err => {
+						uni.hideLoading();
+						uni.showToast({
+							icon: 'none',
+							title: '报告下载失败'
+						})
+						reject(err);
+					}
+				})
+
+			},
+			saveFile(url, name) { //保存到本地
+				try {
+					const fileName = name;
+					//new Blob 实例化文件流
+					//let url = fileData
+					//const url = window.URL.createObjectURL(new Blob([fileData],{type:'application/pdf'}))
+					const link = document.createElement('a');
+					link.style.display = 'none';
+					link.href = url;
+					link.setAttribute('download', fileName);
+					link.setAttribute("target", "_blank");
+					document.body.appendChild(link);
+					link.click();
+					//下载完成移除元素
+					document.body.removeChild(link);
+					//释放掉blob对象
+					window.URL.revokeObjectURL(url)
+					uni.showToast({
+						title: '下载成功'
+					})
+				} catch (error) {
+					uni.showToast({
+						title: '下载失败'
+					})
+				}
+			},
+		},
+		props: {
+			isoffice: {
+				type: Boolean,
+				default: false
+			},
+			isleader: {
+				type: Boolean,
+				default: false
+			},
+			isinfo: {
+				type: Boolean,
+				default: false
+			},
+			gwId: {
+				type: String,
+
+			}
+		},
+	}
+</script>
+
+<style>
+	.warp {
+		display: flex;
+		align-items: center;
+		justify-content: center;
+		height: 100%;
+	}
+
+	.commom_main {
+		width: 100%;
+		background-color: #fefefe;
+	}
+
+	.commom_main .card_banner {
+		width: 100%;
+		height: 60px;
+		background-color: #36a7f3;
+	}
+
+	.commom_main .card_info {
+		width: 96%;
+		/* height: 80vh; */
+		margin: -40px 2% 0;
+		background-color: #fefefe;
+		border-radius: 15px;
+		text-align: center;
+		color: red;
+	}
+
+	.commom_main .card_info_title {
+		font-size: 20px;
+		font-weight: 700;
+		padding-top: 10px;
+		color: red;
+	}
+
+	.card_info_min {
+		font-size: 16px;
+		font-weight: 400;
+		margin-top: 5px;
+	}
+
+	.commom_main .card_table {
+		padding: 20px 20px;
+		font-size: 18px;
+	}
+
+	.commom_main .card_row {
+		border-top: 1px solid red;
+		word-wrap: break-word;
+		/* border-bottom: none; */
+	}
+
+	.commom_main .justify-text {
+		padding: 0 4px;
+		display: flex;
+		flex-direction: row;
+		justify-content: space-between;
+		flex-wrap: wrap;
+	}
+
+	.justify-text text {
+		display: block;
+	}
+
+	.commom_main .card_row_border {
+		line-height: 50px;
+		border-bottom: none;
+	}
+
+	.commom_main .card_last_row {
+		border-bottom: 2px solid red;
+	}
+
+	.commom_main .card_first_row {
+		border-top: 1px solid red;
+	}
+
+	.commom_main .card_col {
+		border-right: 1px solid;
+	}
+
+	.commom_main .card_col_1 {
+		border-left: 1px solid;
+	}
+
+	.commom_main .info_abstract {
+		line-height: 34px;
+		font-size: 16px;
+		word-wrap: break-word;
+		border-left: 1px solid;
+	}
+
+	.commom_main .info_abstract_v {
+		margin: 18px;
+	}
+
+	.commom_main .card_other {
+		text-align: left;
+	}
+</style>

+ 79 - 0
jp-mobile/pages/commonseal/commonInfo.vue

@@ -0,0 +1,79 @@
+<template>
+	<view class="page_main">
+		<commonCard :gwId="gwId"></commonCard>
+		<view class="info_main">
+			<u-steps :current="current" direction="column" inactiveColor="#36a7f3" activeColor="#5fdf50">
+				<u-steps-item title="发起" :desc="inputForm.createTruename +' - '+inputForm.createTime">
+				</u-steps-item>
+				<u-steps-item v-for="item in downList"
+					:title="item.which=='0'?'承办科(室)意见':item.which=='1'?'办公室意见':item.which=='2'?'分管领导意见':item.which=='3'?'主要领导意见':'已归档'"
+					:desc="item.state==1?item.nextTruename :item.nextTruename +' - '+item.updateTime">
+				</u-steps-item>
+				<u-steps-item v-for="item in gwList"
+					:title="item.which=='0'?'承办科(室)意见':item.which=='1'?'办公室意见':item.which=='2'?'分管领导意见':item.which=='3'?'主要领导意见':'待归档'"
+					:desc="item.state==1?item.nextTruename :item.nextTruename +' - '+item.createTime">
+				</u-steps-item>
+			</u-steps>
+		</view>
+		<view class="info_footer">
+			
+		</view>
+	</view>
+</template>
+
+<script>
+	import commonCard from "./commonCard.vue"
+	import yzCirculationCardService from '@/api/commonseal/yzCirculationCardService.js'
+	import yzFlowService from '@/api/commonseal/yzFlowService.js'
+	export default {
+		onLoad(option) {
+			this.gwId = option.id
+		},
+		components: {
+			commonCard,
+		},
+		data() {
+			return {
+				gwId: '',
+				downList: [],
+				gwList: [],
+				current: 0,
+				allNum: "",
+				inputForm: {},
+			}
+		},
+		mounted() {
+			yzFlowService.queryByYzId(this.gwId).then(data => {
+				data.sort((a, b) => a.createTime.localeCompare(b.createTime) || a.createTime
+					.localeCompare(b.createTime));
+				this.allNum = data.length
+				this.inputForm = data[0]
+				data.forEach(item => {
+					if (item.state == 0) {
+						this.downList.push(item)
+					} else {
+						this.gwList.push(item)
+					}
+				})
+				this.downList.sort((a, b) => a.updateTime.localeCompare(b.updateTime) || a.updateTime
+					.localeCompare(b.updateTime));
+				this.current = this.downList.length + 1
+			})
+		}
+	}
+</script>
+
+<style>
+	.page_main {
+		width: 100%;
+		background-color: #fefefe;
+	}
+
+	.info_main {
+		margin: 20px;
+	}
+	.info_footer {
+		width: 100%;
+		height: 20px;
+	}
+</style>

+ 213 - 0
jp-mobile/pages/commonseal/commonList.vue

@@ -0,0 +1,213 @@
+<template>
+	<view>
+		<view class="list_search card_banner flex">
+			<uni-datetime-picker class="list_search_date" v-model="searchForm.createTime" type="daterange" />
+			<u-icon class="list_search_icon" name="search" color="#fff" size="28" @click="doSearch"></u-icon>
+		</view>
+		<view class="list_content">
+			<u-cell-group>
+				<u-cell v-for="item in dataList" @click="toInfo(item)">
+					<view slot="title">
+						<view class="text-bold text-black">
+							<view class="ellipsis-description">
+								{{item.name}}
+							</view>
+
+						</view>
+					</view>
+					<view slot="value">
+
+						<view class="text-grey text-sm list_label margin-top">
+							{{item.createTime}}
+						</view>
+						<view>
+							<u-tag v-if="type==5" :text="item.state==1?'待办':item.state == 3?'归档':'已办'" plain
+								:type="item.state==1?'warning':item.state == 3?'primary':'success'">
+							</u-tag>
+						</view>
+					</view>
+					<view slot="label">
+						<view class="text-grey margin-top">
+							{{item.authorPerson}}
+						</view>
+					</view>
+				</u-cell>
+			</u-cell-group>
+		</view>
+		<u-loadmore :status="status" />
+	</view>
+</template>
+
+<script>
+	import yzCirculationCardService from '@/api/commonseal/yzCirculationCardService.js'
+	import yzFlowService from '@/api/commonseal/yzFlowService.js'
+	import * as $auth from "@/common/auth.js"
+	export default {
+		onShow() {
+			// 先获取页面栈
+			let pages = getCurrentPages();
+			
+			// 当前页面的前一个页面
+			let prevPage = pages[pages.length - 1];
+			if (prevPage.options.type) {
+				this.dataList = []
+				this.type = prevPage.options.type
+				switch (prevPage.options.type) {
+					case "1":
+						uni.setNavigationBarTitle({
+							title: '待办列表' // 设置为你想要显示的标题文本
+						});
+						break;
+					case "3":
+						uni.setNavigationBarTitle({
+							title: '归档列表' // 设置为你想要显示的标题文本
+						});
+						break;
+					case "4":
+						uni.setNavigationBarTitle({
+							title: '已办列表' // 设置为你想要显示的标题文本
+						});
+						break;
+					case "5":
+						uni.setNavigationBarTitle({
+							title: '公文列表' // 设置为你想要显示的标题文本
+						});
+						break;
+				}
+				this.searchForm.state = prevPage.options.type
+				this.tablePage.currentPage = 0
+				this.status = 'loading';
+				this.loadmore()
+			}
+		
+		},
+		data() {
+			return {
+				status: 'loadmore',
+				type: "",
+				time: "",
+				value: "",
+				range: [],
+				dataList: [],
+				searchForm: {
+					yearNum: '',
+					cardNum: '',
+					state: '',
+					createTime: ""
+				},
+				tablePage: {
+					pages: 0,
+					currentPage: 0,
+					pageSize: 10,
+					orders: [{
+						column: "a.create_time",
+						asc: false
+					}],
+				},
+				loading: false,
+			}
+		},
+		methods: {
+			// 查看详情
+			toInfo(item) {
+				if (this.type == 3 || this.type == 5 || this.type == 4) {
+					uni.navigateTo({
+						url: '/pages/commonseal/commonInfo?id=' + item.id
+					})
+				} else {
+					uni.navigateTo({
+						url: '/pages/commonseal/examineCommon?id=' + item.id
+					})
+				}
+			},
+			// 搜索
+			doSearch() {
+				this.dataList = [];
+				this.tablePage.currentPage = 0;
+				this.tablePage.pageSize = 10;
+				this.tablePage.pages = 0;
+				this.loadmore()
+			},
+			onReachBottom() {
+				this.loadmore()
+			},
+			loadmore() {
+				if (this.tablePage.currentPage !== 0 && this.tablePage.pages <= this.tablePage.currentPage) {
+					this.status = 'nomore';
+					return;
+				}
+				this.tablePage.currentPage = ++this.tablePage.currentPage;
+				//联网加载数据
+				this.status = 'loading';
+				let {
+					createTime,
+					...newForm
+				} = this.searchForm
+				yzCirculationCardService.list({
+					current: this.tablePage.currentPage,
+					size: this.tablePage.pageSize,
+					orders: this.tablePage.orders,
+					beginCreateDate: this.searchForm.createTime ? this.searchForm.createTime[0] : '',
+					endCreateDate: this.searchForm.createTime ? this.searchForm.createTime[1] : '',
+					...newForm
+				}).then((data) => {
+					//追加新数据
+					this.dataList = this.dataList.concat(data.records);
+					this.tablePage.pages = data.pages;
+					if (this.tablePage.pages <= this.tablePage.currentPage) {
+						this.status = 'nomore'
+					} else {
+						this.status = 'loadmore'
+					}
+				})
+
+			}
+		}
+
+	}
+</script>
+
+<style>
+	.card_banner {
+		width: 100%;
+		height: 60px;
+		background-color: #36a7f3;
+	}
+
+	.ellipsis-description {
+		font-size: 18px;
+	}
+
+	.u-transition {
+		align-items: flex-end;
+	}
+
+	.list_search_icon {
+		line-height: 60px;
+	}
+
+	.list_search_select {
+		width: 200px;
+		background-color: #fff;
+		height: 30px;
+		border-radius: 10px;
+		margin: 15px 5px 0;
+	}
+
+	.list_search_date {
+		margin: 8px 5px 0;
+	}
+
+	.t-c {
+		height: 34px;
+		line-height: 34px;
+	}
+
+	.list_content {
+		background-color: #fff;
+	}
+
+	.list_label {
+		margin-top: 33px;
+	}
+</style>

+ 259 - 0
jp-mobile/pages/commonseal/examineCommon.vue

@@ -0,0 +1,259 @@
+<template>
+	<view>
+		<commonCard :gwId="gwId"></commonCard>
+		<view class="office_main">
+			<view class="office_title">
+				<uni-section v-if="isoffice" titleColor="#36a7f3" class="mb-10" title="分管领导意见"
+					type="line"></uni-section>
+				<uni-section v-if="istransmit" titleColor="#36a7f3" class="mb-10" title="办公室意见"
+					type="line"></uni-section>
+				<uni-section v-if="isleader" titleColor="#36a7f3" class="mb-10" title="主要领导意见"
+					type="line"></uni-section>
+				<uni-section v-if="isundertake" titleColor="#36a7f3" class="mb-10" title="承办科(室)意见"
+					type="line"></uni-section>
+			</view>
+			<view class="office_info">
+				<u--form :model="auditForm" labelWidth="130px" class="u-form default_title" labelPosition="left"
+					ref="auditForm">
+					<u-form-item :label="istransmit?'办公室意见':isundertake?'承办科(室)意见':isoffice?'分管领导意见':'主要领导意见'"
+						borderBottom prop="content">
+						<u--textarea v-model="auditForm.content" placeholder=""></u--textarea>
+					</u-form-item>
+					<u-form-item v-if="!isleader" label="下一位审批人" borderBottom prop="neUser">
+						<office-user-select v-model="auditForm.neUser" placeholder="请选择下一位审批人"
+							title="审批人"></office-user-select>
+					</u-form-item>
+					<view class="submit_btn flex ">
+						<u-button v-if="isAll" @click="formSubmit" type="success" text="归档"></u-button>
+						<u-button v-if="!loading" type="primary" :disabled="auditForm.nextLeadUser==''" text="确认签字"
+							@click="doSubmit"></u-button>
+						<u-button v-if="loading" :loading="loading" type="primary" text="加载中"></u-button>
+					</view>
+				</u--form>
+			</view>
+		</view>
+		<u-toast ref="uToast"></u-toast>
+		<u-overlay :show="loading">
+			<view class="warp">
+				<view class="rect"><u-button plain loading loadingText="加载中"></u-button></view>
+			</view>
+		</u-overlay>
+	</view>
+
+</template>
+
+<script>
+	import commonCard from "./commonCard.vue"
+	import BASE_URL from '@/config.js'
+	import moment from "moment"
+	import signInput from "@/components/am-sign-input/am-sign-input.vue"
+	import officeUserSelect from "@/components/office-user-select/office-user-select.vue"
+	import userService from "@/api/sys/userService"
+	import yzFlowService from '@/api/commonseal/yzFlowService.js'
+	import * as $auth from "@/common/auth.js"
+	export default {
+		onLoad(option) {
+			this.gwId = option.id
+			yzFlowService.queryByYzId(this.gwId).then(data => {
+				let user = $auth.getUserInfo()
+				let role = $auth.getUserInfo().roleNames
+				let gw = data.filter(item => {
+					return item.nextUser == user.id && item.state == 1
+				})
+				if (gw.length > 0) {
+					this.auditForm = gw[0]
+					if (gw[0].which == '4') this.isAll = true
+					if (!this.auditForm.content) this.auditForm.content = '已阅'
+				}
+				if (role == '办公室管理员') {
+					this.istransmit = true
+				}
+				if (role == '局领导' && gw.length > 0) this.isleader = true
+				if (role == '办公室主任' && gw.length > 0) this.istransmit = true
+				if (role == '分管领导' && gw.length > 0) this.isoffice = true
+				if (role == '科室负责人' && gw.length > 0) this.isundertake = true
+
+			})
+		},
+		components: {
+			commonCard,
+			signInput,
+			officeUserSelect
+		},
+		data() {
+			return {
+				loading: false,
+				isAll: false,
+				show: false,
+				one: true,
+				action: this.BASE_URL + '/gwfile/upload?uploadPath=sign', //上传服务器的地址
+				header: {
+					"token": $auth.getUserToken()
+				}, //图片上传携带头部信息
+				auditForm: {
+					id: '',
+					yzId: '',
+					content: '已阅',
+					signfj: '',
+					createTruename: '',
+					nextTruename: '',
+					nextUser: '',
+					which: '0',
+					state: '0',
+					next: '',
+					neUser: ''
+				},
+				gwForm: {},
+				gwId: "",
+				isoffice: false,
+				isleader: false,
+				isundertake: false,
+				istransmit: false,
+				leaderList: [],
+				tablePage: {
+					total: 0,
+					currentPage: 1,
+					pageSize: 1000,
+					orders: [{
+						column: "a.create_time",
+						asc: false
+					}],
+				},
+				searchForm: {
+
+					// loginName: "",
+					// name: "",
+					// companyDTO: {
+					// 	id: "",
+					// },
+					// officeDTO: {
+					// 	id: "",
+					// },
+				},
+				roleId: ""
+			}
+		},
+		methods: {
+			showToast(params) {
+				this.loading = false
+				this.$refs.uToast.show({
+					...params,
+					complete() {
+						params.url && uni.redirectTo({
+							url: params.url
+						})
+					}
+				})
+			},
+			/**
+			 * @param {Object} e
+			 * 签名完成回调
+			 */
+			signToUrl(e) {
+
+				this.auditForm.signfj = e.data
+				if (e.error_code && e.error_code === '201') {
+					uni.showToast({
+						title: e.msg,
+						icon: 'none'
+					})
+					return
+				}
+			},
+			// 提交表单
+			doSubmit() {
+				let inputForm = this.auditForm;
+				this.loading = true
+				console.log("inputForm.neUser",inputForm.neUser);
+				if (inputForm.neUser && inputForm.neUser != '') {
+					inputForm.next = '1'
+				}else {
+					inputForm.next = ''
+				}
+				inputForm.state = "0"
+				inputForm.gwId = this.gwId
+				const date = moment().format('YYYY-MM-DD HH:mm:ss');
+				inputForm.updateTime = date
+
+				yzFlowService.save(inputForm).then(data => {
+					let param = {
+						type: 'success',
+						message: data,
+						iconUrl: 'https://cdn.uviewui.com/uview/demo/toast/success.png',
+					}
+					this.showToast(param);
+					setTimeout(() => {
+
+						// 重定向到上一页
+						uni.redirectTo({
+							url: `/pages/commonseal/commonInfo?id=${this.gwId}` // 注意此处可能需要加上参数保留
+						});
+					}, 500)
+				}).catch(() => {
+					let param = {
+						type: 'error',
+						message: data,
+						iconUrl: 'https://cdn.uviewui.com/uview/demo/toast/error.png',
+					}
+					this.showToast(param);
+				})
+			},
+			// 归档
+			formSubmit() {
+				this.loading = true
+				let inputForm = Object.assign({}, this.auditForm);;
+				inputForm.state = '0'
+				inputForm.next = "0"
+				yzFlowService.save(inputForm).then(data1 => {
+					let param = {
+						type: 'success',
+						message: "已归档",
+						iconUrl: 'https://cdn.uviewui.com/uview/demo/toast/success.png',
+					}
+					this.showToast(param);
+					setTimeout(() => {
+						// 重定向到上一页
+						uni.redirectTo({
+							url: `/pages/commonseal/commonInfo?id=${this.gwId}` // 注意此处可能需要加上参数保留
+						});
+					}, 500)
+				})
+
+			}
+		}
+	}
+</script>
+
+<style>
+	.warp {
+		display: flex;
+		align-items: center;
+		justify-content: center;
+		height: 100%;
+	}
+
+	.office_main {
+		width: 100%;
+		margin: 5px 0;
+		padding: 0 20px;
+		background-color: #fefefe;
+	}
+
+	.office_main .office_title {
+		width: 100%;
+		border-bottom: 1px solid #eee;
+	}
+
+	.submit_btn {
+		background-color: #fefefe;
+		bottom: 10px;
+		box-shadow: none;
+		padding: 20px 0;
+	}
+
+	.submit_btn button {
+		height: 40px;
+		width: 40%;
+		border-radius: 30px;
+	}
+</style>

+ 308 - 0
jp-mobile/pages/commonseal/statistics.vue

@@ -0,0 +1,308 @@
+<template>
+	<view class="statics_main">
+		<view class="card_banner">
+			<u-tabs class="tab_title" lineColor="#36a7f3" :inactiveStyle="{color:'#fff'}"
+				:activeStyle="{color:'#e6d623'}" :itemStyle="{width:'30%',height:'40px'}" :current="current" scrollable
+				:list="list" @click="selectTab"></u-tabs>
+		</view>
+		<view class="card_one">
+			<view class="card_title">
+				文件传阅卡统计分析
+			</view>
+			<view class="charts-box">
+				<qiun-data-charts type="column" :opts="opts"
+					:chartData="current==0?chartData:current==1?chartData1:chartData2" />
+			</view>
+			<view class="grid">
+				<view class="grid_item">
+					<view class="text_font_size">496</view>
+					<text style="color: #b8b8b8;font-size: 14px;">本年度新增</text>
+				</view>
+				<view class="grid_item item_mouth">
+					<view class="text_font_size">496</view>
+					<text style="color: #b8b8b8;font-size: 14px;">本月新增</text>
+
+					<!-- <view class="charts-box_1">
+						<qiun-data-charts type="arcbar" :chartData="chartDataOne" />
+					</view> -->
+				</view>
+			</view>
+		</view>
+		<view class="grid_row">
+			<u-row justify="space-between" >
+				<u-col span="6" class="card_two">
+					<view class="card_two_title text-center">
+						本年度传阅卡来文部门top5
+					</view>
+					<view class="card_list">
+						<u-row class="cell_item" justify="space-between" gutter="10" v-for="(item,index) in dataList">
+							<u-col span="3">
+								<view class="text-grey text-center">
+									{{index+1}}
+								</view>
+							</u-col>
+							<u-col span="6">
+								<view class=" text-bold text-black ellipsis-description">
+									{{item.name}}
+								</view>
+							</u-col>
+							<u-col span="3">
+								<view class="text-center text-blue text-sm ">
+									{{item.num}}
+								</view>
+							</u-col>
+						</u-row>
+					</view>
+				</u-col>
+				<u-col span="6" class="card_two" style="margin-left: 10px;">
+					<view class="card_two_title text-center">
+						本月新增文件传阅卡分析
+					</view>
+					<view class="card_chart">
+						<view class="charts-box_1">
+							<qiun-data-charts type="pie" :opts="opts1" :chartData="chartDataOne" />
+							<!-- <qiun-data-charts type="arcbar" :opts="opts1" :chartData="chartDataOne" /> -->
+						</view>
+					</view>
+				</u-col>
+			</u-row>
+		</view>
+	</view>
+</template>
+
+<script>
+	export default {
+		data() {
+			return {
+				current: 0,
+				chartData: {},
+				chartData1: {},
+				chartData2: {},
+				chartDataOne: {},
+				list: [{
+					name: '年度'
+				}, {
+					name: '月份'
+				}, {
+					name: '来文部门'
+				}],
+				dataList: [{
+					name: '政府办',
+					num: 156
+				}, {
+					name: "法规办",
+					num: 85
+				}, {
+					name: "工业强市办",
+					num: 79
+				}, {
+					name: "环保办",
+					num: 71
+				}, {
+					name: "教育办",
+					num: 68
+				}],
+				opts: {
+					height: '240px',
+					color: ["#0ec89a"],
+					enableScroll: false,
+					legend: {
+						show: false,
+						
+					},
+					extra: {
+						column: {
+							type: "group",
+							width: 30,
+							activeBgColor: "#000000",
+							activeBgOpacity: 0.08
+						}
+					}
+				},
+				opts1: {
+					rotate: false,
+					rotateLock: false,
+					color: ["#1890FF", "#91CB74", "#FAC858", "#EE6666", "#73C0DE", "#3CA272", "#FC8452", "#9A60B4",
+						"#ea7ccc"
+					],
+					padding: [5, 5, 5, 5],
+					dataLabel: false,
+					enableScroll: false,
+					// legend: {
+					// 	show: true,
+					// 	position: "right"
+					// },
+					subtitle: {
+						name: "as",
+						fontSize: 25,
+						color: "#7cb5ec"
+					},
+					extra: {
+						pie: {
+							// ringWidth: 100,
+							activeOpacity: 0.5,
+							activeRadius: 0,
+							offsetAngle: 0,
+							labelWidth: 15,
+							border: false,
+							borderWidth: 3,
+							borderColor: "#FFFFFF"
+						}
+					}
+				},
+			};
+		},
+		onReady() {
+			this.getServerData();
+		},
+		methods: {
+			selectTab(item) {
+				this.current = item.index
+			},
+			getServerData() {
+				//模拟从服务器获取数据时的延时
+				setTimeout(() => {
+					let res = {
+						categories: ["2016", "2017", "2018", "2019", "2020", "2021"],
+						legend: {
+							show: false
+						},
+						series: [{
+							data: [35, 36, 31, 33, 13, 34]
+						}]
+					};
+					this.chartData = JSON.parse(JSON.stringify(res));
+				}, 500);
+				setTimeout(() => {
+					let res1 = {
+						categories: ["1", "2", "3", "4", "5", "6", "7", "8", "9", "10", "11", "12"],
+						legend: {
+							show: false
+						},
+						series: [{
+							data: [35, 40, 2, 0, 36, 31, 10, 33, 20, 13, 50, 34]
+						}]
+					}
+					this.chartData1 = JSON.parse(JSON.stringify(res1));
+				}, 500);
+				setTimeout(() => {
+					let res2 = {
+						categories: ["政府办", "法规办", "教育办"],
+						legend: {
+							show: false
+						},
+						series: [{
+							data: [35, 40, 2]
+						}]
+					}
+					this.chartData2 = JSON.parse(JSON.stringify(res2));
+				}, 500);
+				setTimeout(() => {
+					//模拟服务器返回数据,如果数据格式和标准格式不同,需自行按下面的格式拼接
+					let res = {
+						series: [{
+							radius: ['40%', '70%'],
+							data: [{
+								"name":"已办",
+								"value": 50,
+							}, {
+								"name":"待办",
+								"value": 50,
+							}]
+						}]
+					};
+					this.chartDataOne = JSON.parse(JSON.stringify(res));
+				}, 500);
+			},
+		}
+	};
+</script>
+
+<style>
+	.card_banner {
+		width: 100%;
+		height: 100px;
+		background-color: #36a7f3;
+		padding: 10px 20px 0;
+	}
+
+	.charts-box {
+		width: 100%;
+		height: 250px;
+	}
+
+	.charts-box_1 {
+		width: 100%;
+		height: 160px;
+	}
+
+	.card_one {
+		width: 96%;
+		margin: 0 2%;
+		position: relative;
+		border-radius: 20px;
+		background-color: #f5f5f5;
+		box-shadow: 0 0 0 1px #ccc;
+		top: -40px;
+		z-index: 4;
+	}
+
+	.card_title {
+		height: 40px;
+		line-height: 40px;
+		font-size: 16px;
+		font-weight: 700;
+		text-align: center;
+		border-bottom: 1px solid #ccc;
+		background-color: eee;
+		margin-bottom: 20px;
+	}
+
+	.grid_item {
+		width: 50%;
+		/* height: 20vh; */
+		border-top: 1px solid #ccc;
+		margin-top: 20px;
+		text-align: center;
+		padding: 10px 0;
+	}
+
+	.grid_item .text_font_size {
+		font-size: 26px !important;
+		margin-bottom: 10px;
+		font-weight: 700;
+	}
+
+	.item_mouth {
+		border-left: 1px solid #ccc;
+	}
+
+	.card_two {
+		height: 200px;
+		border-radius: 20px;
+		background-color: #f5f5f5;
+		box-shadow: 0 0 0 1px #ccc;
+		
+	}
+
+	.grid_row {
+		width: 96%;
+		padding: 0 10px;
+		position: relative;
+		top: -20px;
+	}
+
+	.cell_item {
+		height: 30px;
+		line-height: 30px;
+		text-align: center;
+		border-bottom: 1px solid #eee;
+	}
+
+	.card_two_title {
+		height: 30px;
+		/* line-height: 30px; */
+		margin:10px 0px ;
+		font-size: 12px;
+	}
+</style>

+ 1 - 1
jp-mobile/pages/fileTransmit/examineFile.vue

@@ -19,7 +19,7 @@
 					</u-form-item>
 					<u-form-item v-if="!one" label="科室承办" borderBottom prop="nextDepUser">
 						<office-user-select v-model="auditForm.nextDepUser" placeholder="请选择科室承办"
-							title="科室承办"></office-user-select>
+							title="科室承办" multiple types="3"></office-user-select>
 					</u-form-item>
 					<u-form-item label="备注" borderBottom prop="remark">
 						<u--input v-model="auditForm.remark" placeholder="请输入备注" border="none"></u--input>

+ 70 - 7
jp-mobile/pages/login/login.vue

@@ -1,5 +1,5 @@
 <template>
-	<view class="main">
+	<view class="">
 		<view id="box">
 			<view id="top" class="">
 				<view class="top_le"></view>
@@ -7,16 +7,28 @@
 			</view>
 			<view class="title">
 				<view style="font-size: 28px!important;">盐都区工信局
-				<br>办公自动化平台</view>
+					<br>办公自动化平台
+				</view>
 			</view>
 			<view class="login-form">
-				<u--form :model="inputForm" labelWidth="100px" labelPosition="left" :rules="rules" ref="uForm">
+				<u--form :model="inputForm" labelWidth="100px" labelPosition="left" :rules="rules" ref="uForm"
+					:labelStyle="{'font-size':'20px'}">
 					<u-form-item label="用户名" borderBottom prop="username">
-						<u-input v-model="inputForm.username" />
+						<view style="position: relative;">
+							<u-input v-model="inputForm.username" @blur="onBlur" @input="getname" @focus="getname"></u-input>
+							<remember :topPosition="40" :show="isAccount" :list="currentAccounts"
+								@getAccount="getAccount"></remember>
+						</view>
 					</u-form-item>
 					<u-form-item label="密码" borderBottom prop="password">
 						<u-input password v-model="inputForm.password" />
 					</u-form-item>
+					<u-form-item>
+						<u-checkbox-group :labelDisabled="true" v-model="account">
+							<u-checkbox label="记住账号" name="1">
+							</u-checkbox>
+						</u-checkbox-group>
+					</u-form-item>
 				</u--form>
 			</view>
 			<view class="but">
@@ -33,13 +45,16 @@
 	import {
 		mapActions
 	} from 'vuex'
-
+	import remember from "./remember.vue"
 	export default {
 		data() {
 			return {
 				isfocus: false,
 				captchaImg: '',
 				accounts: [],
+				currentAccounts: [],
+				account: [],
+				isAccount: false,
 				isrember: [],
 				inputForm: {
 					'username': '',
@@ -66,8 +81,16 @@
 				}
 			}
 		},
+		components: {
+			remember
+		},
 		created() {
 			this.getCaptcha()
+			if (uni.getStorageSync("accounts")) {
+				this.accounts = JSON.parse(uni.getStorageSync("accounts"))
+				this.currentAccounts = JSON.parse(uni.getStorageSync("accounts"))
+			}
+
 		},
 		methods: {
 			...mapActions(['refreshUserInfo']),
@@ -80,6 +103,14 @@
 				this.$refs.uForm.validate().then(res => {
 					loginService.login(this.inputForm).then((data) => {
 						this.$store.commit('SET_TOKEN', data.token);
+						if (this.account.length > 0) {
+							let item = {
+								loginName: this.inputForm.username,
+								password: this.inputForm.password
+							}
+							this.accounts.push(item)
+							uni.setStorageSync("accounts", JSON.stringify(this.accounts))
+						}
 						this.refreshUserInfo();
 						uni.reLaunch({
 							url: '../index/index',
@@ -89,8 +120,6 @@
 							title: e.data
 						})
 						this.getCaptcha()
-
-						console.error(e)
 					})
 				})
 			},
@@ -100,6 +129,35 @@
 					this.captchaImg = 'data:image/gif;base64,' + data.codeImg
 					this.inputForm.uuid = data.uuid
 				})
+			},
+			// 筛选信息
+			getname(val) {
+				this.currentAccounts = this.accounts
+				if (this.accounts == '') {
+					this.isAccount = false
+				} else {
+					this.currentAccounts = this.currentAccounts.filter(item => item.loginName.includes(this.inputForm
+						.username))
+					if (this.currentAccounts.length > 0) {
+						this.isAccount = true
+					} else {
+						this.isAccount = false
+					}
+				}
+			},
+			// 获取选择的账号信息
+			getAccount(item) {
+				if (this.inputForm.username != item.loginName) {
+					this.inputForm.username = item.loginName
+				}
+				this.inputForm.password = item.password
+				this.isAccount = false
+			},
+			// 失焦关闭
+			onBlur(){
+				setTimeout(()=>{
+					this.isAccount = false
+				},300)
 			}
 		}
 	}
@@ -189,6 +247,11 @@
 		padding-left: 50rpx;
 		padding-right: 50rpx;
 		margin-top: 60rpx;
+
+	}
+
+	.but * {
+		font-size: 40rpx !important;
 	}
 
 	.fot {

+ 65 - 0
jp-mobile/pages/login/remember.vue

@@ -0,0 +1,65 @@
+<template>
+	<view v-if="show" class="remeber_info" :style="{top:topPosition+ 'px',left:leftPosition+ 'px'}">
+		<u-cell-group :customStyle="{'font-size':'12px!important'}">
+			<u-cell class="remeber_list" v-for="item in list" @click="toInfo(item)" :title="item.loginName" >
+			</u-cell>
+		</u-cell-group>
+	</view>
+</template>
+
+<script>
+	export default {
+		data() {
+			return {
+				dataList: [],
+			}
+		},
+		props: {
+			show: {
+				type: Boolean,
+				default: false
+			},
+			topPosition: {
+				type: Number,
+				default: 0
+			},
+			leftPosition: {
+				type: Number,
+				default: 0
+			},
+			list: {
+				type: Array,
+				default: () => {
+					return [{
+						loginName: '',
+						password: ''
+					}]
+				}
+			},
+
+		},
+		methods: {
+			toInfo(item) {
+				this.$emit('getAccount', item)
+			},
+		}
+	}
+</script>
+
+<style>
+	.remeber_info {
+		width: 100%;
+		position: absolute;
+		top: 0;
+		left: 0;
+		z-index: 10;
+		background-color: #fefefe;
+		max-height: 20vh;
+		overflow: auto;
+		
+	}
+
+	.remeber_list * {
+		padding: 0px !important;
+	}
+</style>

+ 9 - 1
jp-mobile/pages/user/person/person.vue

@@ -1,8 +1,10 @@
 <template>
 	<view class="main">
+		<!-- #ifdef APP-PLUS -->
 		<cu-custom bgColor="bg-blue">
 			<block slot="content">我的</block>
 		</cu-custom>
+		<!-- #endif -->
 		<view class="person-head">
 			<lsj-upload ref="lsjUpload" childId="upload1" width="160rpx" height="140rpx" :option="option" :debug="false"
 				:instantly="false" @uploadEnd="onuploadEnd" @change="afterRead">
@@ -239,7 +241,13 @@
 				uni.showLoading()
 				loginService.logout().then((data) => {
 					this.$store.commit('logout');
-					uni.clearStorage();
+					// uni.clearStorage();
+					uni.removeStorageSync("WMS-userinfo")
+					uni.removeStorageSync("WMS-username")
+					uni.removeStorageSync("dictList")
+					uni.removeStorageSync("__DC_STAT_UUID")
+					uni.removeStorageSync("WMS-permission")
+					uni.removeStorageSync("token")
 					uni.hideLoading()
 					uni.reLaunch({
 						url: '/pages/login/login'

+ 39 - 27
jp-mobile/pages/workbench/workbench.vue

@@ -1,83 +1,85 @@
 <template>
-	<view class="main">
+	<view class="workbench_main">
+		<!-- #ifdef APP-PLUS -->
 		<cu-custom bgColor="bg-blue">
 			<block slot="content">工作台</block>
 		</cu-custom>
+		<!-- #endif -->
 		<swiper class="screen-swiper square-dot bg-blue" :indicator-dots="true" :circular="true" :autoplay="true"
 			interval="2000" duration="500">
 			<swiper-item v-for="(item,index) in swiperList" :key="index">
-				<image :src="item.url" mode="aspectFill" v-if="item.type=='image'"></image>
+				<image :src="item.url" mode="aspectFit" v-if="item.type=='image'"></image>
 				<video :src="item.url" autoplay loop muted :show-play-btn="false" :controls="false" objectFit="cover"
 					v-if="item.type=='video'"></video>
 			</swiper-item>
 		</swiper>
 		<view class="cu-list grid col-4 no-border fixed">
-			<view @click="toList(5)" class="circle-button-box">
+			<view class="circle-button-box">
 				<view class="text-primary text_font_size">{{statistics.allcount?statistics.allcount:0}}</view>
-				<text>总数</text>
+				<text class="grid_text">总数</text>
 			</view>
-			<view @click="toList(1)" class="circle-button-box">
+			<view class="circle-button-box">
 				<view class="text-danger text_font_size">{{statistics.db?statistics.db:0}}</view>
-				<text>待办</text>
+				<text class="grid_text">待办</text>
 			</view>
-			<view @click="toList(4)" class="circle-button-box">
+			<view class="circle-button-box">
 				<view class="text-success text_font_size">{{statistics.yb?statistics.yb:0}}</view>
-				<text>已办</text>
+				<text class="grid_text">已办</text>
 			</view>
-			<view @click="toList(3)" class="circle-button-box">
+			<view class="circle-button-box">
 				<view class="text-warning text_font_size">{{statistics.gdcount?statistics.gdcount:0}}</view>
-				<text>归档</text>
+				<text class="grid_text">归档</text>
 			</view>
 		</view>
 		<scroll-view scroll-y class="page">
 			<view class="cu-bar bg-white solid-bottom margin-top">
 				<view class="action">
-					<text class=" text-orange font-b">快捷入口</text>
+					<text class="text-orange font-b" style="font-size: 24px;">快捷入口</text>
 				</view>
 			</view>
-			<uni-section class="mb-10" title="文件传阅" type="line"></uni-section>
+			<uni-section titleFontSize="20px" class="mb-10" title="文件传阅" type="line"></uni-section>
 			<view class="cu-list grid col-4 no-border">
 				<view @tap="add(1)" class="circle-button-box">
 					<view><u--image src="/static/index/icon4.png" width="40px" height="40px"></u--image></view>
-					<text>新增</text>
+					<text class="grid_text">新增</text>
 				</view>
 				<view @tap="toList(1)" class="circle-button-box">
 					<view><u--image src="/static/index/icon1.png" width="40px" height="40px"></u--image></view>
-					<text>待办</text>
+					<text class="grid_text">待办</text>
 				</view>
 				<view @tap="toList(4)" class="circle-button-box">
 					<view><u--image src="/static/index/icon5.png" width="40px" height="40px"></u--image></view>
-					<text>已办</text>
+					<text class="grid_text">已办</text>
 				</view>
 				<view @tap="toList(3)" class="circle-button-box">
 					<view><u--image src="/static/index/icon2.png" width="40px" height="40px"></u--image></view>
-					<text>已归档</text>
+					<text class="grid_text">已归档</text>
 				</view>
 			</view>
-			<!-- <uni-section class="mb-10" title="用章审批" type="line"></uni-section>
+			<uni-section titleFontSize="20px" class="mb-10" title="用章审批" type="line"></uni-section>
 			<view class="cu-list grid col-4 no-border">
 				<view @tap="add(2)" class="circle-button-box">
 					<view><u--image src="/static/index/icon4.png" width="40px" height="40px"></u--image></view>
-					<text>新增</text>
+					<text class="grid_text">新增</text>
 				</view>
 				<view @tap="toCommonList(1)" class="circle-button-box">
 					<view><u--image src="/static/index/icon1.png" width="40px" height="40px"></u--image></view>
-					<text>待办</text>
+					<text class="grid_text">待办</text>
 				</view>
 				<view @tap="toCommonList(4)" class="circle-button-box">
 					<view><u--image src="/static/index/icon5.png" width="40px" height="40px"></u--image></view>
-					<text>已办</text>
+					<text class="grid_text">已办</text>
 				</view>
 				<view @tap="toCommonList(3)" class="circle-button-box">
 					<view><u--image src="/static/index/icon2.png" width="40px" height="40px"></u--image></view>
-					<text>已归档</text>
+					<text class="grid_text">已归档</text>
 				</view>
-			</view> -->
-			<uni-section class="mb-10" title="公文统计" type="line"></uni-section>
+			</view>
+			<uni-section titleFontSize="20px" class="mb-10" title="公文统计" type="line"></uni-section>
 			<view class="cu-list grid col-4 no-border">
 				<view @tap="toApplyList" class="circle-button-box">
 					<view><u--image src="/static/index/icon6.png" width="40px" height="40px"></u--image></view>
-					<text>公文统计</text>
+					<text class="grid_text">公文统计</text>
 				</view>
 			</view>
 			<u-gap height="80" bgColor="#fff"></u-gap>
@@ -160,11 +162,11 @@
 				})
 			},
 			add(mail) {
-				if(mail == 1){
+				if (mail == 1) {
 					uni.navigateTo({
 						url: '/pages/fileTransmit/addFileTransmit'
 					})
-				}else {
+				} else {
 					uni.navigateTo({
 						url: '/pages/commonseal/addCommon'
 					})
@@ -190,6 +192,11 @@
 </script>
 
 <style>
+	.workbench_main .screen-swiper {
+		min-height: 60px !important;
+		height: 60px;
+	}
+
 	.page .uni-section {
 		border-bottom: 1px solid #ededed;
 		padding-left: 10px;
@@ -221,7 +228,12 @@
 
 	.text_font_size {
 		font-size: 28px !important;
-		margin-bottom: 10px;
+		/* margin-bottom: 5px; */
+	}
+
+	.grid_text {
+		font-size: 16px;
+		margin-top: 5px;
 	}
 
 	.circle-button {