Browse Source

后台新增用章流转审批

LuChongMei 10 months ago
parent
commit
eef273f98f

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

@@ -73,38 +73,40 @@ public class YzCirculationCardController {
 	@GetMapping("list")
 	public ResponseEntity<IPage<YzCirculationCardDTO>> list(YzCirculationCardDTO yzCirculationCardDTO, Page<YzCirculationCardDTO> page) throws Exception {
 
-		//除   管理员、办公室管理员  之外的角色需要判断是否涉及自己流程
+
+		IPage<YzCirculationCardDTO> result = null;
+		String state=yzCirculationCardDTO.getState();
+//除   管理员之外的角色需要判断是否涉及自己流程
 		UserDTO userDTO=UserUtils.getCurrentUserDTO();
 		List<RoleDTO> list=userDTO.getRoleDTOList();
 		boolean isadmin=false;
+		QueryWrapper queryWrapper = null;
 		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" );
+		if(isadmin) {
+			if (state==null||state.equals("null")||state.equals("")||state.equals("5")) yzCirculationCardDTO.setState("");
+			queryWrapper = QueryWrapperGenerator.buildQueryCondition (yzCirculationCardDTO, YzCirculationCardDTO.class);
+		}else {
+			yzCirculationCardDTO.setState("");
+			queryWrapper = QueryWrapperGenerator.buildQueryCondition (yzCirculationCardDTO, YzCirculationCardDTO.class);
+			//状态:1待办,2暂存,3归档,4已办,
+			//5查看所有
+			if(state!=null&&!state.equals("null")&&!state.equals("")){
+				//1待办
+				if(state.equals("1")){
+					queryWrapper.eq ("b.state", "1" );
+				}
+				//4已办,根据流程上来
+				else if(state.equals("4")){
+					queryWrapper.eq ("b.state", "0" );
+				}
 			}
 		}
-		result=yzCirculationCardService.findList (page, queryWrapper,state,userDTO.getId());
+		queryWrapper.eq ("a.del_flag", 0 ); // 排除已经删除
+		result=yzCirculationCardService.findList (page, queryWrapper,isadmin,userDTO.getId());
 		for (YzCirculationCardDTO y :result.getRecords()){
 			UserDTO userDTO2=userService.get(y.getAuthorPerson());
 			y.setAuthorPerson(userDTO2.getName());

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

@@ -40,7 +40,7 @@ public interface YzCirculationCardMapper extends BaseMapper<YzCirculationCard> {
 
     int saveGetId(YzCirculationCardDTO map);
 
-    IPage<YzCirculationCardDTO> findPage(Page<YzCirculationCardDTO> page,@Param(Constants.WRAPPER) QueryWrapper queryWrapper,@Param("state") String state,@Param("userid") String userid);
+    IPage<YzCirculationCardDTO> findPage(Page<YzCirculationCardDTO> page,@Param(Constants.WRAPPER) QueryWrapper queryWrapper,@Param("isadmin") Boolean isadmin,@Param("userid") String userid);
 
     HashMap<String, Object> getStatistics(String userid);
 

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

@@ -43,12 +43,14 @@
 	<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
+		FROM (SELECT DISTINCT b.yz_id,b.state,b.next_user FROM yz_flow b
+		where b.del_flag = 0
+		<if test="!isadmin">
+		and b.next_user = #{userid}
+		</if>
+		GROUP BY b.yz_id
+		) b
+		LEFT JOIN yz_circulation_card a
 		ON b.yz_id = a.id
 		${ew.customSqlSegment}
 	</select>

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

@@ -3,6 +3,8 @@
  */
 package com.jeeplus.yzcirculation.service;
 
+import com.jeeplus.sys.service.dto.UserDTO;
+import com.jeeplus.sys.utils.UserUtils;
 import org.apache.commons.lang3.StringUtils;
 import org.springframework.stereotype.Service;
 import org.springframework.transaction.annotation.Transactional;
@@ -42,11 +44,10 @@ public class YzCirculationCardService extends ServiceImpl<YzCirculationCardMappe
 	 */
 	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 IPage <YzCirculationCardDTO> findList(Page <YzCirculationCardDTO> page, QueryWrapper queryWrapper,Boolean isadmin,String userid) {
+		return  baseMapper.findPage (page, queryWrapper,isadmin,userid);
 	}
     public String getCardNum() {
 		String aa=baseMapper.getCardNum();

+ 22 - 27
jp-mobile/pages/commonseal/commonCard.vue

@@ -19,6 +19,8 @@
 							<text>要</text>
 							<text>领</text>
 							<text>导</text>
+						</view>
+						<view class="justify-text">
 							<text>意</text>
 							<text>见</text>
 						</view>
@@ -42,6 +44,8 @@
 							<text>管</text>
 							<text>领</text>
 							<text>导</text>
+						</view>
+						<view class="justify-text">
 							<text>意</text>
 							<text>见</text>
 						</view>
@@ -60,10 +64,12 @@
 				</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 ;">
+						<view class="justify-text">
 							<text>办</text>
 							<text>公</text>
-							<text>(室) </text>
+							<text>室</text>
+						</view>
+						<view class="justify-text">
 							<text>意</text>
 							<text>见</text>
 						</view>
@@ -87,7 +93,9 @@
 							<text>承</text>
 							<text>办</text>
 							<text>科</text>
-							<text>室</text>
+							<text>(室)</text>
+						</view>
+						<view class="justify-text">
 							<text>意</text>
 							<text>见</text>
 						</view>
@@ -105,17 +113,19 @@
 					</u-col>
 				</u-row>
 				<u-row justify="space-between" class="card_row card_row_border">
-					<u-col span="3">
-						<view>文件名称</view>
+					<u-col span="3" textAlign="center">
+						<view>
+							文件名称
+						</view>
 					</u-col>
-					<u-col span="9" textAlign="center" class="card_col_1">
+					<u-col span="9" 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="">
+					<u-col span="3" textAlign="center">
 						<view>拟稿人</view>
 					</u-col>
 					<u-col span="3" textAlign="center" class="card_col_1">
@@ -150,11 +160,13 @@
 					</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">
+					<u-col span="3" textAlign="center">
 						<view>备注</view>
 					</u-col>
-					<u-col span="9" textAlign="center">
-						<view>{{inputForm.remark}}</view>
+					<u-col span="9" textAlign="center" class="card_col_1">
+						<uni-tooltip :content="inputForm.remark==''?'无':inputForm.remark" placement="top">
+							<u--text size="14" align="center" lines="1" :text="inputForm.remark==''?'无':inputForm.remark"></u--text>
+						</uni-tooltip>
 					</u-col>
 				</u-row>
 				<u--text style="margin: 10px;" size="10" type="error" text="所有涉密敏感信息不得上传"></u--text>
@@ -282,20 +294,6 @@
 					contentSummary: '',
 					attachedDocumentId: ''
 				},
-				yzflow: {
-					id: '',
-					yzId: '',
-					content: '',
-					signfj: '',
-					createTruename: '',
-					nextTruename: '',
-					nextUser: '',
-					which: '',
-					state: '',
-
-					next: '',
-					remark: '',
-				},
 			}
 		},
 		methods: {
@@ -340,9 +338,6 @@
 			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;

+ 2 - 4
jp-mobile/pages/commonseal/commonInfo.vue

@@ -7,11 +7,11 @@
 				</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">
+					:desc="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">
+					:desc="item.nextTruename">
 				</u-steps-item>
 			</u-steps>
 		</view>
@@ -38,7 +38,6 @@
 				downList: [],
 				gwList: [],
 				current: 0,
-				allNum: "",
 				inputForm: {},
 			}
 		},
@@ -46,7 +45,6 @@
 			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) {

+ 1 - 29
jp-mobile/pages/commonseal/examineCommon.vue

@@ -86,10 +86,6 @@
 				isAll: false,
 				show: false,
 				one: true,
-				action: this.BASE_URL + '/gwfile/upload?uploadPath=sign', //上传服务器的地址
-				header: {
-					"token": $auth.getUserToken()
-				}, //图片上传携带头部信息
 				auditForm: {
 					id: '',
 					yzId: '',
@@ -103,34 +99,11 @@
 					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: {
@@ -164,7 +137,6 @@
 			doSubmit() {
 				let inputForm = this.auditForm;
 				this.loading = true
-				console.log("inputForm.neUser",inputForm.neUser);
 				if (inputForm.neUser && inputForm.neUser != '') {
 					inputForm.next = '1'
 				}else {
@@ -201,7 +173,7 @@
 			// 归档
 			formSubmit() {
 				this.loading = true
-				let inputForm = Object.assign({}, this.auditForm);;
+				let inputForm = Object.assign({}, this.auditForm);
 				inputForm.state = '0'
 				inputForm.next = "0"
 				yzFlowService.save(inputForm).then(data1 => {

+ 13 - 9
jp-mobile/pages/login/login.vue

@@ -15,7 +15,8 @@
 					:labelStyle="{'font-size':'20px'}">
 					<u-form-item label="用户名" borderBottom prop="username">
 						<view style="position: relative;">
-							<u-input v-model="inputForm.username" @blur="onBlur" @input="getname" @focus="getname"></u-input>
+							<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>
@@ -104,12 +105,15 @@
 					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
+							let a = this.accounts.filter(item => item.loginName == this.inputForm.username)
+							if (a.length == 0) {
+								let item = {
+									loginName: this.inputForm.username,
+									password: this.inputForm.password
+								}
+								this.accounts.push(item)
+								uni.setStorageSync("accounts", JSON.stringify(this.accounts))
 							}
-							this.accounts.push(item)
-							uni.setStorageSync("accounts", JSON.stringify(this.accounts))
 						}
 						this.refreshUserInfo();
 						uni.reLaunch({
@@ -154,10 +158,10 @@
 				this.isAccount = false
 			},
 			// 失焦关闭
-			onBlur(){
-				setTimeout(()=>{
+			onBlur() {
+				setTimeout(() => {
 					this.isAccount = false
-				},300)
+				}, 300)
 			}
 		}
 	}

+ 65 - 0
jp-ui/src/api/yzcirculation/yzCirculationCardService.js

@@ -0,0 +1,65 @@
+import request from "@/utils/httpRequest";
+
+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,
+		});
+	},
+};

+ 66 - 0
jp-ui/src/api/yzflow/yzFlowService.js

@@ -0,0 +1,66 @@
+import request from "@/utils/httpRequest";
+
+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,
+		});
+	},
+};

+ 416 - 0
jp-ui/src/components/officeUserSelect/UserSelectDialog.vue

@@ -0,0 +1,416 @@
+<template>
+	<el-dialog v-model="dialogVisible" title="人员选择" :width="type == 1 ? 680 : 460" destroy-on-close append-to-body
+		@closed="$emit('closed')" draggable>
+		<template v-if="type == 1">
+			<div class="user-select">
+				<div class="user-select__left">
+					<div class="user-select__search">
+						<el-input v-model="searchForm.name" prefix-icon="search" placeholder="搜索成员">
+							<template #append>
+								<el-button icon="search" @click="search"></el-button>
+							</template>
+						</el-input>
+					</div>
+					<div class="user-select__select">
+						<div class="user-select__tree" v-loading="showGrouploading">
+							<el-scrollbar>
+								<el-tree class="menu" ref="groupTree" :data="group" node-key="id" :props="{
+		label: 'name',
+		children: 'children',
+	}" highlight-current :expand-on-click-node="false" :current-node-key="groupId" @node-click="groupClick">
+									<template #default="{ node, data }">
+										<span class="custom-tree-node el-tree-node__label">
+											<span class="label">
+												<el-icon :size="16" class="m-r-5">
+													<qiye v-if="data.type === '1'" :style="{
+		color:
+			$TOOL.data.get(
+				'IS_PRIMARY_TENANT'
+			) &&
+			data.tenantDTO &&
+			$utils.getTenantColorById(
+				data
+					.tenantDTO
+					.id
+			),
+	}"></qiye>
+													<bumen v-else :style="{
+		color:
+			$TOOL.data.get(
+				'IS_PRIMARY_TENANT'
+			) &&
+			data.tenantDTO &&
+			$utils.getTenantColorById(
+				data
+					.tenantDTO
+					.id
+			),
+	}"></bumen>
+												</el-icon>
+												{{ node.label }}
+											</span>
+										</span>
+									</template>
+								</el-tree>
+							</el-scrollbar>
+						</div>
+						<div class="user-select__user" v-loading="showUserloading">
+							<div class="user-select__user__list">
+								<el-scrollbar ref="userScrollbar">
+									<el-tree class="menu" ref="userTree" :data="user" node-key="id" highlight-current
+										:props="{
+		key: 'id',
+		label: 'name',
+		children: 'children',
+	}" :default-checked-keys="selectedIds" :show-checkbox="limit > 1" check-on-click-node
+										@check-change="userClick"></el-tree>
+								</el-scrollbar>
+							</div>
+							<footer>
+								<el-pagination background layout="prev,next" small :total="total" :page-size="pageSize"
+									v-model:currentPage="currentPage"
+									@current-change="paginationChange"></el-pagination>
+							</footer>
+						</div>
+					</div>
+				</div>
+				<div class="user-select__toicon">
+					<el-icon><arrow-right /></el-icon>
+				</div>
+				<div class="user-select__selected">
+					<header>已选 ({{ selected.length }})</header>
+					<ul>
+						<el-scrollbar>
+							<li v-for="(item, index) in selected" :key="item.id">
+								<span class="name">
+									<el-avatar v-if="$TOOL.data.get('IS_PRIMARY_TENANT')
+		" :size="30" :style="{
+		background:
+			$utils.getTenantColorById(
+				item.tenantId
+			) + '!important',
+	}">{{
+		item.name.substring(0, 1)
+	}}</el-avatar>
+									<el-avatar v-else>{{
+			item.name.substring(0, 1)
+		}}</el-avatar>
+									<label>{{ item.name }}</label>
+								</span>
+								<span class="delete">
+									<el-button text type="primary" icon="del-filled" circle size="small"
+										@click="deleteSelected(index)"></el-button>
+								</span>
+							</li>
+						</el-scrollbar>
+					</ul>
+				</div>
+			</div>
+		</template>
+
+		<template #footer>
+			<el-button @click="dialogVisible = false">取 消</el-button>
+			<el-button type="primary" @click="save">确 认</el-button>
+		</template>
+	</el-dialog>
+</template>
+
+<script>
+import userService from "@/api/sys/userService";
+import officeService from "@/api/sys/officeService";
+export default {
+	props: {
+		tenantId: { type: String, default: null },
+		limit: {
+			type: Number,
+			default: 999999,
+		},
+	},
+	data() {
+		return {
+			searchForm: {
+				loginName: "",
+				companyDTO: {
+					id: "",
+				},
+				officeDTO: {
+					id: "",
+				},
+				name: "",
+			},
+
+			dialogVisible: false,
+			showGrouploading: false,
+			showUserloading: false,
+			groupId: "",
+			pageSize: 10,
+			total: 0,
+			currentPage: 1,
+			group: [],
+			user: [],
+			role: [],
+			type: 1,
+			selected: [],
+			value: [],
+		};
+	},
+	computed: {
+		selectedIds() {
+			return this.selected.map((t) => t.id);
+		},
+	},
+	methods: {
+		//打开赋值
+		open(data) {
+			this.value = data || [];
+			this.selected = JSON.parse(JSON.stringify(data || []));
+			this.dialogVisible = true;
+			this.getGroup();
+			//this.getUser();
+		},
+		//获取组织
+		async getGroup() {
+			this.showGrouploading = true;
+			// officeService.treeData().then((data) => {
+			// 	this.officeTreeData = data
+			// 	this.showGrouploading = false;
+			// })
+			//var res = await officeService.treeData({ tenantId: this.tenantId });
+			var res = await officeService.treeData({ parentId: "1770354728635834369" });
+			// res = res.filter(item => item.type == '3')
+
+			this.showGrouploading = false;
+			// var allNode = { id: "", type: "1", name: "所有" };
+			// res.unshift(allNode);
+			this.group = res;
+
+
+			this.groupClick(this.group[0])
+
+		},
+		//获取用户
+		async getUser() {
+			this.showUserloading = true;
+			userService
+				.list({
+					current: this.currentPage,
+					size: this.pageSize,
+					...this.searchForm,
+					"tenantDTO.id": this.tenantId,
+				})
+				.then((data) => {
+					this.user = data.records;
+					this.total = data.total;
+					// this.pageNo = data.current
+					this.showUserloading = false;
+					this.$refs.userScrollbar.setScrollTop(0);
+				});
+		},
+		//组织点击
+		groupClick(data) {
+			if (data.type === "1") {
+				this.searchForm.companyDTO.id = data.id;
+				this.searchForm.officeDTO.id = "";
+			} else {
+				this.searchForm.companyDTO.id = "";
+				this.searchForm.officeDTO.id = data.id;
+			}
+			this.currentPage = 1;
+			this.groupId = data.id;
+			this.getUser();
+		},
+		//用户点击
+		userClick(data, checked) {
+			if (checked) {
+				if (this.limit === 1) {
+					this.selected = [
+						{
+							id: data.loginName,
+							name: data.name,
+							tenantId: data.tenantDTO?.id,
+						},
+					];
+				} else {
+					this.selected.push({
+						id: data.loginName,
+						name: data.name,
+						tenantId: data.tenantDTO?.id,
+					});
+				}
+			} else {
+				this.selected = this.selected.filter(
+					(item) => item.id != data.loginName
+				);
+			}
+		},
+		//用户分页点击
+		paginationChange() {
+			this.getUser();
+		},
+		//用户搜索
+		search() {
+			// this.groupId = ''
+			// this.$refs.groupTree.setCurrentKey(this.groupId)
+			this.currentPage = 1;
+			this.getUser();
+		},
+		//删除已选
+		deleteSelected(index) {
+			this.selected.splice(index, 1);
+			console.log(this.selected);
+			if (this.type == 1) {
+				this.$refs.userTree.setCheckedKeys(this.selectedIds);
+			} else if (this.type == 2) {
+				this.$refs.groupTree.setCheckedKeys(this.selectedIds);
+			}
+		},
+		//提交保存
+		save() {
+			this.value.splice(0, this.value.length);
+			this.selected.map((item) => {
+				console.log("选择了" + JSON.stringify(item));
+				this.value.push(item);
+			});
+			if (this.limit < this.value.length) {
+				this.$message.error(`你最多只能选择${this.limit}个用户`);
+				return;
+			}
+			this.$emit("doSubmit", this.value);
+			this.dialogVisible = false;
+		},
+	},
+};
+</script>
+
+<style scoped>
+.user-select {
+	display: flex;
+}
+
+.user-select__left {
+	width: 400px;
+}
+
+.user-select__right {
+	flex: 1;
+}
+
+.user-select__selected li .name .el-avatar {
+	margin-right: 2px;
+	height: 10;
+	width: 25px;
+	height: 25px;
+}
+
+.user-select__search {
+	padding-bottom: 10px;
+}
+
+.user-select__select {
+	display: flex;
+	border: 1px solid var(--el-border-color-light);
+	background: var(--el-color-white);
+}
+
+.user-select__tree {
+	width: 200px;
+	height: 300px;
+	border-right: 1px solid var(--el-border-color-light);
+}
+
+.user-select__user {
+	width: 200px;
+	height: 300px;
+	display: flex;
+	flex-direction: column;
+}
+
+.user-select__user__list {
+	flex: 1;
+	overflow: auto;
+}
+
+.user-select__user footer {
+	height: 36px;
+	padding-top: 5px;
+	border-top: 1px solid var(--el-border-color-light);
+}
+
+.user-select__toicon {
+	display: flex;
+	justify-content: center;
+	align-items: center;
+	margin: 0 10px;
+}
+
+.user-select__toicon i {
+	display: flex;
+	justify-content: center;
+	align-items: center;
+	background: #ccc;
+	width: 20px;
+	height: 20px;
+	text-align: center;
+	line-height: 20px;
+	border-radius: 50%;
+	color: #fff;
+}
+
+.user-select__selected {
+	height: 345px;
+	width: 200px;
+	border: 1px solid var(--el-border-color-light);
+	background: var(--el-color-white);
+}
+
+.user-select__selected header {
+	height: 43px;
+	line-height: 43px;
+	border-bottom: 1px solid var(--el-border-color-light);
+	padding: 0 15px;
+	font-size: 16px;
+}
+
+.user-select__selected ul {
+	height: 300px;
+	overflow: auto;
+}
+
+.user-select__selected li {
+	display: flex;
+	align-items: center;
+	justify-content: space-between;
+	padding: 5px 5px 5px 15px;
+	height: 38px;
+}
+
+.user-select__selected li .name {
+	display: flex;
+	align-items: center;
+}
+
+.user-select__selected li .name .el-avatar {
+	margin-right: 10px;
+}
+
+.user-select__selected li .delete {
+	display: none;
+}
+
+.user-select__selected li:hover {
+	background: var(--el-color-primary-light-9);
+}
+
+.user-select__selected li:hover .delete {
+	display: inline-block;
+}
+
+.user-select-role .user-select__left {
+	width: 200px;
+}
+
+.user-select-role .user-select__tree {
+	border: none;
+	height: 343px;
+}
+</style>

+ 121 - 0
jp-ui/src/components/officeUserSelect/index.vue

@@ -0,0 +1,121 @@
+<template>
+	<template v-if="printRead">
+		<label>{{ name }}</label>
+	</template>
+	<template v-else>
+		<el-input
+			placeholder="请选择"
+			readonly
+			:clearable="clearable"
+			:disabled="disabled"
+			style="line-hight: 40px"
+			v-model="name"
+		>
+			<template #append>
+				<el-button
+					:disabled="disabled"
+					:readonly="readonly"
+					@click="showUserSelect"
+					icon="search"
+				></el-button>
+			</template>
+		</el-input>
+		<user-select
+			ref="userSelect"
+			@doSubmit="selectUsersToInput"
+			:tenantId="tenantId"
+			:limit="limit"
+		></user-select>
+	</template>
+</template>
+<script>
+import userSelect from "./UserSelectDialog";
+import userService from "@/api/sys/userService";
+export default {
+	data() {
+		return {
+			name: "",
+			selectData: [],
+		};
+	},
+	props: {
+		limit: Number,
+		modelValue: { type: String, default: "" },
+		tenantId: { type: String, default: null },
+		printRead: {
+			type: Boolean,
+			default: () => {
+				return false;
+			},
+		},
+		clearable: {
+			type: Boolean,
+			default: () => {
+				return true;
+			},
+		},
+		readonly: {
+			type: Boolean,
+			default: () => {
+				return false;
+			},
+		},
+		disabled: {
+			type: Boolean,
+			default: () => {
+				return false;
+			},
+		},
+	},
+	components: {
+		userSelect,
+	},
+	watch: {
+		modelValue: {
+			handler(newVal) {
+				this.selectData = [];
+				if (newVal) {
+					newVal.split(",").forEach((id) => {
+						userService.queryByLoginName(id).then((data) => {
+							if (data && data.id !== "") {
+								this.selectData.push(data);
+								this.name = this.selectData
+									.map((user) => {
+										return user.name;
+									})
+									.join(",");
+							}
+						});
+					});
+				} else {
+					this.name = "";
+				}
+			},
+			immediate: true,
+			deep: false,
+		},
+	},
+	methods: {
+		selectUsersToInput(users) {
+			let selectIds = users
+				.map((user) => {
+					return user.id;
+				})
+				.join(",");
+			this.$emit("update:modelValue", selectIds);
+		},
+		showUserSelect() {
+			this.$refs.userSelect.open(this.selectData);
+		},
+	},
+};
+</script>
+<style>
+.el-form-item__content .el-input-group {
+	vertical-align: middle;
+}
+.el-tag + .el-tag {
+	margin-left: 5px;
+	margin-bottom: 5px;
+}
+</style>

+ 456 - 140
jp-ui/src/style/app.scss

@@ -1,32 +1,99 @@
 /* 全局 */
-#app, body, html {width: 100%;height: 100%;font-size: 12px;
+#app,
+body,
+html {
+  width: 100%;
+  height: 100%;
+  font-size: 12px;
   font-family: "Helvetica Neue", Helvetica, "PingFang SC", "Hiragino Sans GB", "Microsoft YaHei", 微软雅黑, Arial, sans-serif;
   line-height: 1.5;
   color: rgb(81, 90, 110);
   background-color: #f7f7f7;
-  -webkit-font-smoothing: antialiased;}
+  -webkit-font-smoothing: antialiased;
+}
+
+a {
+  color: #333;
+  text-decoration: none;
+}
+
+a:hover,
+a:focus {
+  color: #000;
+  text-decoration: none;
+}
+
+a:link {
+  text-decoration: none;
+}
+
+a:-webkit-any-link {
+  text-decoration: none;
+}
+
+a,
+button,
+input,
+textarea {
+  -webkit-tap-highlight-color: rgba(0, 0, 0, 0);
+  box-sizing: border-box;
+  outline: none !important;
+  -webkit-appearance: none;
+}
 
-a {color: #333;text-decoration: none;}
-a:hover, a:focus {color: #000;text-decoration: none;}
-a:link {text-decoration: none;}
-a:-webkit-any-link {text-decoration: none;}
-a,button,input,textarea{-webkit-tap-highlight-color:rgba(0,0,0,0);box-sizing: border-box;outline:none !important; -webkit-appearance: none;}
-* {margin: 0;padding: 0;box-sizing: border-box;outline: none;}
+* {
+  margin: 0;
+  padding: 0;
+  box-sizing: border-box;
+  outline: none;
+}
 
 /* 大布局样式 */
-.aminui {display: flex;flex-flow: column;}
-.aminui-wrapper {display: flex;flex:1;overflow: auto;}
+.aminui {
+  display: flex;
+  flex-flow: column;
+}
+
+.aminui-wrapper {
+  display: flex;
+  flex: 1;
+  overflow: auto;
+}
 
 /*布局设置*/
-.layout-setting {position: fixed;width: 40px;height: 40px;border-radius: 3px 0 0 3px;bottom: 100px;right: 0px;z-index: 100;background: #409EFF;display: flex;flex-direction: column;align-items: center;justify-content: center;cursor: pointer;}
-.layout-setting i {font-size: 18px;color: #fff;}
+.layout-setting {
+  position: fixed;
+  width: 40px;
+  height: 40px;
+  border-radius: 3px 0 0 3px;
+  bottom: 100px;
+  right: 0px;
+  z-index: 100;
+  background: #409EFF;
+  display: flex;
+  flex-direction: column;
+  align-items: center;
+  justify-content: center;
+  cursor: pointer;
+}
+
+.layout-setting i {
+  font-size: 18px;
+  color: #fff;
+}
 
 /* 头部 */
-.adminui-header {height: 60px;background: #fff;display: flex;justify-content:space-between;border-bottom: 1px solid #e5e6eb;
+.adminui-header {
+  height: 60px;
+  background: #fff;
+  display: flex;
+  justify-content: space-between;
+  border-bottom: 1px solid #e5e6eb;
+
   .el-menu--horizontal>.el-menu-item {
     border-bottom: none !important;
   }
-  
+
   .el-menu--horizontal>.el-menu-item.is-active {
     border-bottom: none !important;
   }
@@ -35,31 +102,67 @@ a,button,input,textarea{-webkit-tap-highlight-color:rgba(0,0,0,0);box-sizing: bo
 .adminui-header-left {
   display: flex;
   align-items: center;
-  padding-left:20px; 
-  .logo-bar{
+  padding-left: 20px;
+
+  .logo-bar {
     width: 200px;
   }
+
   .panel-item {
     padding: 0 10px;
     cursor: pointer;
     height: 100%;
     display: flex;
     align-items: center;
+
     i {
       font-size: 20px;
     }
   }
+
   .panel-item:hover {
     color: #fff;
-    background: hsla(0,0%,100%,.05);
+    background: hsla(0, 0%, 100%, .05);
   }
 }
-.adminui-header-right {display: flex;align-items: center;}
-.adminui-header .logo-bar {font-size: 18px;font-weight: bold;display: flex;align-items: center;}
-.adminui-header .logo-bar .logo {margin-right: 10px;width: 35px;height: 35px;}
-.adminui-header .nav {display: flex;height: 100%;}
-.adminui-header .nav li {padding:0 10px;font-size: 14px;color: rgba(0, 0, 0, 0.6);list-style: none;height: 100%;display: flex;align-items: center;cursor: pointer;}
-.adminui-header .nav li i {margin-right: 5px;}
+
+.adminui-header-right {
+  display: flex;
+  align-items: center;
+}
+
+.adminui-header .logo-bar {
+  font-size: 18px;
+  font-weight: bold;
+  display: flex;
+  align-items: center;
+}
+
+.adminui-header .logo-bar .logo {
+  margin-right: 10px;
+  width: 35px;
+  height: 35px;
+}
+
+.adminui-header .nav {
+  display: flex;
+  height: 100%;
+}
+
+.adminui-header .nav li {
+  padding: 0 10px;
+  font-size: 14px;
+  color: rgba(0, 0, 0, 0.6);
+  list-style: none;
+  height: 100%;
+  display: flex;
+  align-items: center;
+  cursor: pointer;
+}
+
+.adminui-header .nav li i {
+  margin-right: 5px;
+}
 
 .adminui-header-menu {
   height: 48px;
@@ -68,88 +171,241 @@ a,button,input,textarea{-webkit-tap-highlight-color:rgba(0,0,0,0);box-sizing: bo
 
 
 /* 左侧菜单 */
-.aminui-side-split {width: 80px;flex-shrink:0;
+.aminui-side-split {
+  width: 80px;
+  flex-shrink: 0;
   // background: rgba(22,71,163,.1);
-  background:var(--el-color-primary-light-9);
-  display: flex;flex-flow: column;}
-.aminui-side-split-top {height: 49px;}
-.aminui-side-split-top a {display: inline-block;width: 100%;height: 100%;display: flex;align-items: center;justify-content: center;}
-.aminui-side-split-top .logo {height:30px;vertical-align: bottom;}
-.adminui-side-split-scroll {overflow: auto;overflow-x:hidden;height: 100%;flex: 1;}
-.aminui-side-split li {cursor: pointer;width: 80px;height: 65px;text-align: center;display: flex;flex-direction: column;align-items: center;justify-content: center;}
-.aminui-side-split li.active i, .aminui-side-split li.active p{   opacity:1;filter:alpha(opacity=100);}
-.aminui-side-split li i {font-size: 24px;}
+  background: var(--el-color-primary-light-9);
+  display: flex;
+  flex-flow: column;
+}
+
+.aminui-side-split-top {
+  height: 49px;
+}
+
+.aminui-side-split-top a {
+  display: inline-block;
+  width: 100%;
+  height: 100%;
+  display: flex;
+  align-items: center;
+  justify-content: center;
+}
+
+.aminui-side-split-top .logo {
+  height: 30px;
+  vertical-align: bottom;
+}
+
+.adminui-side-split-scroll {
+  overflow: auto;
+  overflow-x: hidden;
+  height: 100%;
+  flex: 1;
+}
+
+.aminui-side-split li {
+  cursor: pointer;
+  width: 80px;
+  height: 65px;
+  text-align: center;
+  display: flex;
+  flex-direction: column;
+  align-items: center;
+  justify-content: center;
+}
+
+.aminui-side-split li.active i,
+.aminui-side-split li.active p {
+  opacity: 1;
+  filter: alpha(opacity=100);
+}
+
+.aminui-side-split li i {
+  font-size: 24px;
+}
 
 // .aminui-side-split li.active {background: #409EFF;}
-.adminui-side-split-scroll::-webkit-scrollbar-thumb {background-color: rgba(255, 255, 255, 0.4);border-radius:5px;}
-.adminui-side-split-scroll::-webkit-scrollbar-thumb:hover {background-color: rgba(255, 255, 255, 0.5);}
-.adminui-side-split-scroll::-webkit-scrollbar-track {background-color: rgba(255, 255, 255, 0);}
-.adminui-side-split-scroll::-webkit-scrollbar-track:hover {background-color: rgba(255, 255, 255, 0);}
-
-.aminui-side-split+.aminui-side 
-{
-  width:170px;
-  .el-menu-item.is-active{
+.adminui-side-split-scroll::-webkit-scrollbar-thumb {
+  background-color: rgba(255, 255, 255, 0.4);
+  border-radius: 5px;
+}
+
+.adminui-side-split-scroll::-webkit-scrollbar-thumb:hover {
+  background-color: rgba(255, 255, 255, 0.5);
+}
+
+.adminui-side-split-scroll::-webkit-scrollbar-track {
+  background-color: rgba(255, 255, 255, 0);
+}
+
+.adminui-side-split-scroll::-webkit-scrollbar-track:hover {
+  background-color: rgba(255, 255, 255, 0);
+}
+
+.aminui-side-split+.aminui-side {
+  width: 170px;
+
+  .el-menu-item.is-active {
     box-shadow: none;
   }
+
   .el-sub-menu .el-menu-item {
-      min-width: 160px;
+    min-width: 160px;
   }
 }
-.aminui-side {display: flex;flex-flow: column;flex-shrink:0;width:200px;background: #fff;box-shadow: 2px 0 8px 0 rgba(29,35,41,.05);border-right: 1px solid #e6e6e6;transition:width 0.3s;}
-.adminui-header .el-menu--horizontal > .el-sub-menu.is-active .el-sub-menu__title {
+
+.aminui-side {
+  display: flex;
+  flex-flow: column;
+  flex-shrink: 0;
+  width: 200px;
+  background: #fff;
+  box-shadow: 2px 0 8px 0 rgba(29, 35, 41, .05);
+  border-right: 1px solid #e6e6e6;
+  transition: width 0.3s;
+}
+
+.adminui-header .el-menu--horizontal>.el-sub-menu.is-active .el-sub-menu__title {
   border-bottom: 0px solid transparent !important;
-  color: rgba(255, 255, 255, 1.0) ;
+  color: rgba(255, 255, 255, 1.0);
   box-shadow: inset 0 -3px 0 0 #4fe3c1;
 }
- .adminui-header .el-menu--horizontal > .el-sub-menu .el-sub-menu__title {
+
+.adminui-header .el-menu--horizontal>.el-sub-menu .el-sub-menu__title {
   border-bottom: 0px solid transparent !important;
-  color: rgba(255, 255, 255, 0.7) ;
+  color: rgba(255, 255, 255, 0.7);
+}
+
+.adminui-side-top {
+  border-bottom: 1px solid #ebeef5;
+  height: 50px;
+  line-height: 50px;
+}
+
+.adminui-side-top h2 {
+  padding: 0 20px;
+  font-size: 17px;
+  color: #3c4a54;
+}
+
+.adminui-side-scroll {
+  overflow: auto;
+  overflow-x: hidden;
+  flex: 1;
+}
+
+.adminui-side-bottom {
+  border-top: 1px solid #ebeef5;
+  color: #3c4a54;
+  height: 35px;
+  cursor: pointer;
+  display: flex;
+  align-items: center;
+  justify-content: center;
+}
+
+.adminui-side-bottom i {
+  font-size: 16px;
+}
+
+.adminui-side-bottom:hover {
+  color: var(--el-color-primary);
+}
+
+.aminui-side.isCollapse {
+  width: 65px;
 }
-.adminui-side-top {border-bottom: 1px solid #ebeef5;height:50px;line-height: 50px;}
-.adminui-side-top h2 {padding:0 20px;font-size: 17px;color: #3c4a54;}
-.adminui-side-scroll {overflow: auto;overflow-x:hidden;flex: 1;}
-.adminui-side-bottom {border-top: 1px solid #ebeef5;color: #3c4a54;height:35px;cursor: pointer;display: flex;align-items: center;justify-content: center;}
-.adminui-side-bottom i {font-size: 16px; }
-.adminui-side-bottom:hover {color: var(--el-color-primary);}
-.aminui-side.isCollapse {width: 65px;}
 
 /* 右侧内容 */
-.aminui-body {flex: 1;display: flex;flex-flow: column;}
+.aminui-body {
+  flex: 1;
+  display: flex;
+  flex-flow: column;
+}
+
 
 
+.right-panel-search {
+  display: flex;
+  align-items: center;
+}
 
-.right-panel-search {display: flex;align-items: center;}
-.right-panel-search > * + * {margin-left:10px;}
+.right-panel-search>*+* {
+  margin-left: 10px;
+}
 
 //f5f7f9
-.adminui-main {overflow: auto;background-color: #f5f7f9;flex: 1;}
+.adminui-main {
+  overflow: auto;
+  background-color: #f5f7f9;
+  flex: 1;
+}
 
 /*页面最大化*/
 .aminui.main-maximize {
-	.main-maximize-exit {display: block;}
-	.aminui-side-split, .aminui-side, .adminui-header, .adminui-topbar, .adminui-tags {display: none;}
-  .adminui-tags + .contextmenu + .adminui-main .adminui-topbar + .splitpanes, .adminui-tags + .adminui-main .adminui-topbar + .splitpanes {
-      height: 100%;
+  .main-maximize-exit {
+    display: block;
   }
-  .adminui-topbar + .splitpanes {
+
+  .aminui-side-split,
+  .aminui-side,
+  .adminui-header,
+  .adminui-topbar,
+  .adminui-tags {
+    display: none;
+  }
+
+  .adminui-tags+.contextmenu+.adminui-main .adminui-topbar+.splitpanes,
+  .adminui-tags+.adminui-main .adminui-topbar+.splitpanes {
     height: 100%;
   }
-  .adminui-tags + .contextmenu + .adminui-main .adminui-topbar + .page, .adminui-tags + .adminui-main .adminui-topbar + .page {
+
+  .adminui-topbar+.splitpanes {
+    height: 100%;
+  }
+
+  .adminui-tags+.contextmenu+.adminui-main .adminui-topbar+.page,
+  .adminui-tags+.adminui-main .adminui-topbar+.page {
     height: calc(100% - 20px) !important;
   }
 
-  .adminui-topbar + .page {
-      height: calc(100% - 20px) !important;
+  .adminui-topbar+.page {
+    height: calc(100% - 20px) !important;
   }
 }
-.main-maximize-exit {display: none;position: fixed;z-index: 3000;top:-20px;left:50%;margin-left: -20px;border-radius: 50%;width: 40px;height: 40px;cursor: pointer;background: rgba(0,0,0,0.2);text-align: center;}
-.main-maximize-exit i {font-size: 14px;margin-top: 22px;color: #fff;}
-.main-maximize-exit:hover {background: rgba(0,0,0,0.4);}
+
+.main-maximize-exit {
+  display: none;
+  position: fixed;
+  z-index: 3000;
+  top: -20px;
+  left: 50%;
+  margin-left: -20px;
+  border-radius: 50%;
+  width: 40px;
+  height: 40px;
+  cursor: pointer;
+  background: rgba(0, 0, 0, 0.2);
+  text-align: center;
+}
+
+.main-maximize-exit i {
+  font-size: 14px;
+  margin-top: 22px;
+  color: #fff;
+}
+
+.main-maximize-exit:hover {
+  background: rgba(0, 0, 0, 0.4);
+}
+
 /** 自定义页面样式*/
 .el-card__body {
-    overflow: auto;
+  overflow: auto;
 }
+
 // .vxe-table{
 // 	padding:10px; 
 // 	height:100%;
@@ -160,9 +416,14 @@ a,button,input,textarea{-webkit-tap-highlight-color:rgba(0,0,0,0);box-sizing: bo
 // 		height: calc(100% - 60px);
 // 	}
 // }
+.el-form-item__content {
+  min-width: 120px;
+}
+
 .text-grey {
   color: rgb(153, 153, 153) !important;
 }
+
 .help-block {
   color: #9ca0a7;
   font-size: 12px;
@@ -172,108 +433,132 @@ a,button,input,textarea{-webkit-tap-highlight-color:rgba(0,0,0,0);box-sizing: bo
   top: 100%;
   left: 0;
 }
-.adminui-topbar+.page{
+
+.adminui-topbar+.page {
   height: calc(100% - 123px) !important;
   margin: 12px 12px 8px 12px;
 }
-.page{
-    height: calc(100% - 16px);
-    display: block;
-    background: #fff;
+
+.page {
+  height: calc(100% - 16px);
+  display: block;
+  background: #fff;
+  border-radius: 4px;
+  font-size: 14px;
+  position: relative;
+  padding: 16px 16px 0 16px;
+  margin: 8px 12px;
+  -webkit-transition: all .2s ease-in-out;
+  transition: all .2s ease-in-out;
+
+  .query-form {
+    margin-bottom: 16px !important;
+  }
+
+  .query-form+.jp-table {
+    height: calc(100% - 66px);
+  }
+
+  .jp-table {
+    // border: 1px solid #EBEEF5;
+    background-color: #FFF;
+    -webkit-transition: .3s;
+    transition: .3s;
     border-radius: 4px;
-    font-size: 14px;
-    position: relative;
-    padding: 16px 16px 0 16px;
-    margin: 8px 12px;
-    -webkit-transition: all .2s ease-in-out;
-    transition: all .2s ease-in-out;
-    .query-form {
-      margin-bottom: 16px !important;
-    }
-    .query-form + .jp-table{
-      height: calc(100% - 66px);
-    }
-    .jp-table{
-      // border: 1px solid #EBEEF5;
-      background-color: #FFF;
-      -webkit-transition: .3s;
-      transition: .3s;
-      border-radius: 4px;
-      overflow: hidden;
-      height: 100%;
-      .jp-table-body{
-        height: calc(100% - 90px);
-      }
+    overflow: hidden;
+    height: 100%;
+
+    .jp-table-body {
+      height: calc(100% - 90px);
     }
-    .body-tree{
-      height: calc(100% - 50px);	
-    }    
   }
+
+  .body-tree {
+    height: calc(100% - 50px);
+  }
+}
+
 .left-panel {
   .query-form {
     padding: 18px 5px 0px 5px;
     background-color: #ffffff;
   }
 }
-.adminui-topbar+.page2{
+
+.adminui-topbar+.page2 {
   height: calc(100% - 118px);
 }
-.page2+.el-header{
+
+.page2+.el-header {
   height: calc(100% - 40px);
 }
-.page2{
+
+.page2 {
+  height: 100%;
+  margin: 0px;
+  background-color: #FFF;
+
+  .jp-table {
+    // border: 1px solid #EBEEF5;
+    -webkit-transition: .3s;
+    transition: .3s;
+    border-radius: 4px;
+    overflow: hidden;
+    padding: 10px 10px 5px 10px;
     height: 100%;
-    margin: 0px;
-    background-color: #FFF;
-    .jp-table{
-      // border: 1px solid #EBEEF5;
-      -webkit-transition: .3s;
-      transition: .3s;
-      border-radius: 4px;
-      overflow: hidden;
-      padding: 10px 10px 5px 10px;
-      height: 100%;
-      .jp-table-body{
-        height: calc(100% - 85px);
-      }
-    }
-    .body-tree{
-      height: calc(100% - 50px);	
+
+    .jp-table-body {
+      height: calc(100% - 85px);
     }
+  }
+
+  .body-tree {
+    height: calc(100% - 50px);
+  }
 }
+
 .tree-footer {
   height: 45px;
 }
-.p-0{
+
+.p-0 {
   padding: 0;
 }
+
 .p-l-16 {
   padding: 16px 0px 0px 16px;
 }
+
 .m-b-10 {
   margin-bottom: 10px;
 }
+
 .m-r-10 {
-  margin-right:10px;
+  margin-right: 10px;
 }
+
 .m-t-5 {
   margin-top: 5px;
 }
+
 .m-r-5 {
-  margin-right:5px;
+  margin-right: 5px;
 }
+
 .m-r-0 {
   margin-right: 0px !important;
 }
-.m-l-0{
+
+.m-l-0 {
   margin-left: 0px !important;
 }
 
-.el-header{
+.el-header {
   height: auto;
 }
-.m-p-13-15{
-  padding:13px 15px;
+
+.m-p-13-15 {
+  padding: 13px 15px;
 }
 
 .page-white {
@@ -286,48 +571,79 @@ a,button,input,textarea{-webkit-tap-highlight-color:rgba(0,0,0,0);box-sizing: bo
   justify-content: space-between;
   align-items: center;
 }
+
 .splitpanes.default-theme .splitpanes__splitter {
   background-color: transparent !important;
   box-sizing: border-box;
   position: relative;
   flex-shrink: 0;
 }
-.bt-group{
-  padding:20px;
+
+.bt-group {
+  padding: 20px;
   text-align: right;
   display: block;
   width: 100%;
 }
+
 .child-tab {
   padding: 20px;
+
   .child-table {
-    width: 100%; margin: 10px;
+    width: 100%;
+    margin: 10px;
   }
 }
 
-.custom-tree-node {display: flex;flex: 1;align-items: center;justify-content: space-between;font-size: 14px;padding-right: 24px;height:100%;}
-.custom-tree-node .label {display: flex;align-items: center;;height: 100%;}
-.custom-tree-node .label.grey {color: #999;}
-.custom-tree-node .label .el-tag {margin-left: 5px;}
+.custom-tree-node {
+  display: flex;
+  flex: 1;
+  align-items: center;
+  justify-content: space-between;
+  font-size: 14px;
+  padding-right: 24px;
+  height: 100%;
+}
+
+.custom-tree-node .label {
+  display: flex;
+  align-items: center;
+  ;
+  height: 100%;
+}
+
+.custom-tree-node .label.grey {
+  color: #999;
+}
+
+.custom-tree-node .label .el-tag {
+  margin-left: 5px;
+}
 
 .el-tree-node__content {
-  .do {display: none;}
+  .do {
+    display: none;
+  }
 }
-.el-tree-node__content:hover{
+
+.el-tree-node__content:hover {
   .do {
     display: flex;
     align-items: center;
     height: 100%;
-    i { 
-      margin-left:5px;
+
+    i {
+      margin-left: 5px;
       color: #999;
-      padding:5px;
+      padding: 5px;
     }
+
     i:hover {
       color: #333;
     }
   }
 }
+
 .tip {
   padding: 8px 16px;
   background-color: #ecf8ff;

+ 402 - 363
jp-ui/src/views/circulation2/fileCard.vue

@@ -7,92 +7,127 @@
 			</view>
 
 
-			  <el-row>
-				<el-col :span="12" class="grid-content-left1"><div >年度: {{inputForm.yearNum}}</div></el-col>
-				<el-col :span="12" class="grid-content-right1"><div >[{{inputForm.yearNum}}]{{inputForm.cardNum}}号</div></el-col>
-			  </el-row>
-			  <el-row>
-				<el-col :span="6" class="grid-content-left"><div >来文机关</div></el-col>
-				<el-col :span="6" class="grid-content-left"><div >{{inputForm.sendingAgency}}</div></el-col>
-				<el-col :span="6" class="grid-content-left"><div >来文字号</div></el-col>
-				<el-col :span="6" class="grid-content-right"><div >{{inputForm.docFontSize}}</div></el-col>
-			  </el-row>
-			  <el-row>
-				<el-col :span="6" class="grid-content-left"><div >收文时间</div></el-col>
-				<el-col :span="6" class="grid-content-left"><div >{{inputForm.receivingTime}}</div></el-col>
-				<el-col :span="6" class="grid-content-left"><div >文件来源</div></el-col>
-				<el-col :span="6" class="grid-content-right"><div >{{inputForm.fileSource}}</div></el-col>
-			  </el-row>
-			  <el-row>
-				<el-col :span="6" class="grid-content-left"><div >内容摘要</div></el-col>
-				<el-col :span="18" class="grid-content-right"><div >{{inputForm.contentSummary}}</div></el-col>
-			  </el-row>
-			  <el-row v-if="officeInfo.length>0">
-				<el-col :span="6" class="grid-content-left"><div >办公室拟办</div></el-col>
+			<el-row>
+				<el-col :span="12" class="grid-content-left1">
+					<div>年度: {{ inputForm.yearNum }}</div>
+				</el-col>
+				<el-col :span="12" class="grid-content-right1">
+					<div>[{{ inputForm.yearNum }}]{{ inputForm.cardNum }}号</div>
+				</el-col>
+			</el-row>
+			<el-row>
+				<el-col :span="6" class="grid-content-left">
+					<div>来文机关</div>
+				</el-col>
+				<el-col :span="6" class="grid-content-left">
+					<div>{{ inputForm.sendingAgency }}</div>
+				</el-col>
+				<el-col :span="6" class="grid-content-left">
+					<div>来文字号</div>
+				</el-col>
+				<el-col :span="6" class="grid-content-right">
+					<div>{{ inputForm.docFontSize }}</div>
+				</el-col>
+			</el-row>
+			<el-row>
+				<el-col :span="6" class="grid-content-left">
+					<div>收文时间</div>
+				</el-col>
+				<el-col :span="6" class="grid-content-left">
+					<div>{{ inputForm.receivingTime }}</div>
+				</el-col>
+				<el-col :span="6" class="grid-content-left">
+					<div>文件来源</div>
+				</el-col>
+				<el-col :span="6" class="grid-content-right">
+					<div>{{ inputForm.fileSource }}</div>
+				</el-col>
+			</el-row>
+			<el-row>
+				<el-col :span="6" class="grid-content-left">
+					<div>内容摘要</div>
+				</el-col>
+				<el-col :span="18" class="grid-content-right">
+					<div>{{ inputForm.contentSummary }}</div>
+				</el-col>
+			</el-row>
+			<el-row v-if="officeInfo.length > 0">
+				<el-col :span="6" class="grid-content-left">
+					<div>办公室拟办</div>
+				</el-col>
 				<el-col :span="18">
 					<div class="grid-content-right">
 						<view v-for="item in officeInfo" class="info_abstract_v">
 							<view>
-								{{item.content}}
+								{{ item.content }}
+							</view>
+							<view class="flex " style="line-height: 20px;">
+								<el-image :src="item.signfj" style="width: 80px; "></el-image>
+								{{ item.updateTime }}
+							</view>
+						</view>
+					</div>
+				</el-col>
+			</el-row>
+			<el-row v-if="leaderInfo.length > 0">
+				<el-col :span="6" class="grid-content-left">
+					<div>领导批示</div>
+				</el-col>
+				<el-col :span="18" class="grid-content-right">
+					<div class="flexlay">
+						<view v-for="leader in leaderInfo" class="info_abstract_v">
+							<view>
+								{{ leader.content }}
+							</view>
+							<view class="flex " style="line-height: 20px;">
+								<el-image :src="leader.signfj" style="width: 80px; "></el-image>
+								{{ leader.updateTime }}
+							</view>
+						</view>
+					</div>
+				</el-col>
+			</el-row>
+			<el-row v-if="undertakeInfo.length > 0">
+				<el-col :span="6" class="grid-content-left">
+					<div>承办情况</div>
+				</el-col>
+				<el-col :span="18" class="grid-content-right">
+					<div class="flexlay">
+						<view v-for="item in undertakeInfo" class="info_abstract_v">
+							<view>
+								{{ item.content }}
 							</view>
 							<view class="flex " style="line-height: 20px;">
 								<el-image :src="item.signfj" style="width: 80px; "></el-image>
-								{{item.updateTime}}
+								{{ item.updateTime }}
 							</view>
 						</view>
 					</div>
 				</el-col>
-			  </el-row>
-			  <el-row v-if="leaderInfo.length>0">
-			  				<el-col :span="6" class="grid-content-left"><div>领导批示</div></el-col>
-			  				<el-col :span="18" class="grid-content-right">
-								<div class="flexlay" >
-									<view v-for="leader in leaderInfo" class="info_abstract_v">
-										<view>
-											{{leader.content}}
-										</view>
-										<view class="flex " style="line-height: 20px;">
-											<el-image :src="leader.signfj" style="width: 80px; "></el-image>
-											{{leader.updateTime}}
-										</view>
-									</view>
-								</div>
-							</el-col>
-			  </el-row>
-			  <el-row v-if="undertakeInfo.length>0">
-			  				<el-col :span="6" class="grid-content-left"><div >承办情况</div></el-col>
-			  				<el-col :span="18" class="grid-content-right">
-								<div class="flexlay">
-									<view v-for="item in undertakeInfo" class="info_abstract_v">
-										<view>
-											{{item.content}}
-										</view>
-										<view class="flex " style="line-height: 20px;">
-											<el-image :src="item.signfj" style="width: 80px; "></el-image>
-											{{item.updateTime}}
-										</view>
-									</view>
-								</div>
-							</el-col>
-			  </el-row>
-			  <el-row>
-			  				<el-col :span="6"><div class="grid-content-left2">备注</div></el-col>
-			  				<el-col :span="18"><div class="grid-content-right2">{{inputForm.remark}}</div></el-col>
-			  </el-row>
-			  <div style="text-align: left;">附件:</div>
-			  <view class="card_other">
-
-
-			  	<view class="other_info" v-for="item in fileList">
-			  		<view class="other_pdf  flex  ">
-			  			<view decoration='underline' color='#36a7f3' :text="item.name"
-			  				@click="item.type=='pdf'?preview(item):download(item)"></view>
-
-			  			<!-- <a :href="item.url">{{item.name}}</a> -->
-			  		</view>
-			  	</view>
-			  	<image-upload v-model="inputForm.attachedDocumentId" :limit="3" tip="最多上传3个图片,单个图片不要超过10M"></image-upload>
-			  </view>
+			</el-row>
+			<el-row>
+				<el-col :span="6">
+					<div class="grid-content-left2">备注</div>
+				</el-col>
+				<el-col :span="18">
+					<div class="grid-content-right2">{{ inputForm.remark }}</div>
+				</el-col>
+			</el-row>
+			<div style="text-align: left;">附件:</div>
+			<view class="card_other">
+
+
+				<view class="other_info" v-for="item in fileList">
+					<view class="other_pdf  flex  ">
+						<view decoration='underline' color='#36a7f3' :text="item.name"
+							@click="item.type == 'pdf' ? preview(item) : download(item)"></view>
+
+						<!-- <a :href="item.url">{{item.name}}</a> -->
+					</view>
+				</view>
+				<image-upload v-model="inputForm.attachedDocumentId" :limit="3"
+					tip="最多上传3个图片,单个图片不要超过10M"></image-upload>
+			</view>
 
 
 		</view>
@@ -108,310 +143,314 @@
 
 <script>
 
-	import gwCirculationCard2Service from '@/api/circulation2/gwCirculationCard2Service'
-	import gwFlowService from '@/api/gwflow/gwFlowService'
-
-	export default {
-		mounted() {
-			// this.$nextTick(function() {
-			// 	this.$on('refresh', function() {
-					this.refresh();
-			// 	});
-			// });
-			
-		},
-		data() {
-			return {
-				ismask: true,
-				src: 'https://cdn.uviewui.com/uview/album/1.jpg',
-				// 公文附件
-				fileLists: [],
-				fileList: [],
-				imgList: [],
-				// 办公室信息
-				officeInfo: [],
-				// 领导信息
-				leaderInfo: [],
-				// 承办信息
-				undertakeInfo: [],
-				inputForm: {
-					id: '',
-					yearNum: '',
-					cardNum: '',
-					sendingAgency: '',
-					docFontSize: '',
-					fileSource: '',
-					writtenTime: '',
-					receivingTime: '',
-					contentSummary: '',
-					attachedDocumentId: ''
-				},
-				gwflow: {
-					id: '',
-					gwId: '',
-					content: '',
-					signfj: '',
-					createTruename: '',
-					nextTruename: '',
-					nextUser: '',
-					which: '',
-					state: '',
-
-					next: '',
-					nextLeadUser: '',
-					nextDepUser: '',
-					remark: '',
-				},
-			}
-		},
-		methods: {
-			// 预览pdf
-			preview(fileUrl) {
-				uni.navigateTo({
-					url: "/pages/pdfPreview/pdfPreview?url=" + fileUrl
-				})
+import gwCirculationCard2Service from '@/api/circulation2/gwCirculationCard2Service'
+import gwFlowService from '@/api/gwflow/gwFlowService'
+
+export default {
+	mounted() {
+		// this.$nextTick(function() {
+		// 	this.$on('refresh', function() {
+		this.refresh();
+		// 	});
+		// });
+
+	},
+	data() {
+		return {
+			ismask: true,
+			src: 'https://cdn.uviewui.com/uview/album/1.jpg',
+			// 公文附件
+			fileLists: [],
+			fileList: [],
+			imgList: [],
+			// 办公室信息
+			officeInfo: [],
+			// 领导信息
+			leaderInfo: [],
+			// 承办信息
+			undertakeInfo: [],
+			inputForm: {
+				id: '',
+				yearNum: '',
+				cardNum: '',
+				sendingAgency: '',
+				docFontSize: '',
+				fileSource: '',
+				writtenTime: '',
+				receivingTime: '',
+				contentSummary: '',
+				attachedDocumentId: ''
 			},
-			// 下载文件
-			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();
+			gwflow: {
+				id: '',
+				gwId: '',
+				content: '',
+				signfj: '',
+				createTruename: '',
+				nextTruename: '',
+				nextUser: '',
+				which: '',
+				state: '',
+
+				next: '',
+				nextLeadUser: '',
+				nextDepUser: '',
+				remark: '',
+			},
+		}
+	},
+	methods: {
+		// 预览pdf
+		preview(fileUrl) {
+			uni.navigateTo({
+				url: "/pages/pdfPreview/pdfPreview?url=" + fileUrl
+			})
+		},
+		// 下载文件
+		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: '报告下载失败'
 						})
-						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) {
+				},
+				fail: err => {
+					uni.hideLoading();
 					uni.showToast({
-						title: '下载失败'
+						icon: 'none',
+						title: '报告下载失败'
 					})
+					reject(err);
 				}
-			},
-
-			refresh(){
-				gwCirculationCard2Service.queryById(this.gwId).then(data => {
-					this.inputForm = data
-					this.inputForm.receivingTime = this.inputForm.receivingTime.substring(5, 10)
+			})
 
+		},
+		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: '下载成功'
 				})
-				gwFlowService.queryByGwId(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.officeInfo.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.leaderInfo.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.undertakeInfo.push(item)
-						}
-					})
-					this.leaderInfo.sort((a, b) => a.createTime.localeCompare(b.createTime) || a.createTime
-						.localeCompare(b.createTime));
-					this.ismask = false
+			} catch (error) {
+				uni.showToast({
+					title: '下载失败'
 				})
-			},
+			}
 		},
-		props: {
-			isoffice: {
-				type: Boolean,
-				default: false
-			},
-			isleader: {
-				type: Boolean,
-				default: false
-			},
-			isinfo: {
-				type: Boolean,
-				default: false
-			},
-			gwId: {
-				type: String,
 
-			}
+		refresh() {
+			gwCirculationCard2Service.queryById(this.gwId).then(data => {
+				this.inputForm = data
+				this.inputForm.receivingTime = this.inputForm.receivingTime.substring(5, 10)
+
+			})
+			gwFlowService.queryByGwId(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.officeInfo.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.leaderInfo.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.undertakeInfo.push(item)
+					}
+				})
+				this.leaderInfo.sort((a, b) => a.createTime.localeCompare(b.createTime) || a.createTime
+					.localeCompare(b.createTime));
+				this.ismask = false
+			})
 		},
-	}
+	},
+	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%;
-	}
-
-	.card_main {
-		width: 100%;
-		background-color: #fefefe;
-		display: flex;
-		flex-direction: column;
-	}
-
-	.card_banner {
-		width: 100%;
-		height: 60px;
-		background-color: #36a7f3;
-	}
-
-	.card_info {
-		width: 96%;
-		text-align: center;
-	}
-
-	.card_info_title {
-		font-size: 16px;
-		font-weight: 700;
-		padding-top: 10px;
-		color: #36a7f3;
-		text-align: center;
-	}
-
-	.card_table {
-		padding: 20px 20px;
-		font-size: 12px;
-	}
-
-	.card_row {
-		line-height: 30px;
-		border: 1px solid;
-		word-wrap: break-word;
-	}
-
-	.card_row_border {
-		border-top: none;
-	}
-
-	.card_col {
-		border-right: 1px solid;
-	}
-
-	.card_col_1 {
-		border-left: 1px solid;
-	}
-
-	.info_abstract {
-		line-height: 16px;
-		word-wrap: break-word;
-		border-left: 1px solid;
-	}
-
-	.info_abstract_v {
-		margin: 18px;
-	}
-
-	.vertical-text {
-		writing-mode: vertical-rl;
-		/* 文字垂直排列,从右向左 */
-		/* 或者使用vertical-lr; 从左向右 */
-	}
-
-	.card_other {
-		text-align: left;
-	}
-	.grid-content-left1 {
-	  min-height: 36px;
-	  text-align: left;
-	  line-height: 36px;
-	  color: #333333;
-	}
-	.grid-content-right1 {
-	  box-sizing: border-box;
-	  min-height: 36px;
-	  text-align: right;
-	  line-height: 36px;
-	  color: #333333;
-	}
-	.grid-content-left {
-	  border-left: 1px solid #333333;
-	  border-top: 1px solid #333333;
-	  box-sizing: border-box;
-	  min-height: 36px;
-	  text-align: center;
-	  line-height: 36px;
-	  color: #333333;
-	}
-	.grid-content-right {
-	  border-left: 1px solid #333333;
-	  border-right: 1px solid #333333;
-	  border-top: 1px solid #333333;
-	  box-sizing: border-box;
-	  min-height: 36px;
-	  text-align: center;
-	  line-height: 36px;
-	  color: #333333;
-	}
-	.flexlay{
-		display: flex;
-		    flex-direction: column;
-	}
-
-	.grid-content-left2 {
-	  border-left: 1px solid #333333;
-	  border-top: 1px solid #333333;
-	  border-bottom: 1px solid #333333;
-	  box-sizing: border-box;
-	  min-height: 36px;
-	  text-align: center;
-	  line-height: 36px;
-	  color: #333333;
-	}
-	.grid-content-right2 {
-	  border-left: 1px solid #333333;
-	  border-right: 1px solid #333333;
-	  border-top: 1px solid #333333;
-	  border-bottom: 1px solid #333333;
-	  box-sizing: border-box;
-	  min-height: 36px;
-	  text-align: center;
-	  line-height: 36px;
-	  color: #333333;
-	}
-	.border-none {
-	}
+.warp {
+	display: flex;
+	align-items: center;
+	justify-content: center;
+	height: 100%;
+}
+
+.card_main {
+	width: 100%;
+	background-color: #fefefe;
+	display: flex;
+	flex-direction: column;
+}
+
+.card_banner {
+	width: 100%;
+	height: 60px;
+	background-color: #36a7f3;
+}
+
+.card_info {
+	width: 96%;
+	text-align: center;
+}
+
+.card_info_title {
+	font-size: 16px;
+	font-weight: 700;
+	padding-top: 10px;
+	color: #36a7f3;
+	text-align: center;
+}
+
+.card_table {
+	padding: 20px 20px;
+	font-size: 12px;
+}
+
+.card_row {
+	line-height: 30px;
+	border: 1px solid;
+	word-wrap: break-word;
+}
+
+.card_row_border {
+	border-top: none;
+}
+
+.card_col {
+	border-right: 1px solid;
+}
+
+.card_col_1 {
+	border-left: 1px solid;
+}
+
+.info_abstract {
+	line-height: 16px;
+	word-wrap: break-word;
+	border-left: 1px solid;
+}
+
+.info_abstract_v {
+	margin: 18px;
+}
+
+.vertical-text {
+	writing-mode: vertical-rl;
+	/* 文字垂直排列,从右向左 */
+	/* 或者使用vertical-lr; 从左向右 */
+}
+
+.card_other {
+	text-align: left;
+}
+
+.grid-content-left1 {
+	min-height: 36px;
+	text-align: left;
+	line-height: 36px;
+	color: #333333;
+}
+
+.grid-content-right1 {
+	box-sizing: border-box;
+	min-height: 36px;
+	text-align: right;
+	line-height: 36px;
+	color: #333333;
+}
+
+.grid-content-left {
+	border-left: 1px solid #333333;
+	border-top: 1px solid #333333;
+	box-sizing: border-box;
+	min-height: 36px;
+	text-align: center;
+	line-height: 36px;
+	color: #333333;
+}
+
+.grid-content-right {
+	border-left: 1px solid #333333;
+	border-right: 1px solid #333333;
+	border-top: 1px solid #333333;
+	box-sizing: border-box;
+	min-height: 36px;
+	text-align: center;
+	line-height: 36px;
+	color: #333333;
+}
+
+.flexlay {
+	display: flex;
+	flex-direction: column;
+}
+
+.grid-content-left2 {
+	border-left: 1px solid #333333;
+	border-top: 1px solid #333333;
+	border-bottom: 1px solid #333333;
+	box-sizing: border-box;
+	min-height: 36px;
+	text-align: center;
+	line-height: 36px;
+	color: #333333;
+}
+
+.grid-content-right2 {
+	border-left: 1px solid #333333;
+	border-right: 1px solid #333333;
+	border-top: 1px solid #333333;
+	border-bottom: 1px solid #333333;
+	box-sizing: border-box;
+	min-height: 36px;
+	text-align: center;
+	line-height: 36px;
+	color: #333333;
+}
 </style>

+ 474 - 0
jp-ui/src/views/yzcirculation/YzCard.vue

@@ -0,0 +1,474 @@
+<template>
+    <div class="commom_main">
+        <div class="card_info">
+            <div class="card_info_title">
+                <div class="">
+                    盐城市盐都区工业和信息化局拟稿
+                </div>
+                <div class="card_info_min">
+                    都工信{{ inputForm.cardNum }}
+                </div>
+            </div>
+            <div class="card_table">
+                <el-row class="card_first_row"></el-row>
+                <el-row type="flex" v-if="leaderInfo.length > 0" align="middle" justify="space-between"
+                    class="card_row">
+                    <el-col :span="6">
+                        <div class="justify-text">
+                            <span>主</span>
+                            <span>要</span>
+                            <span>领</span>
+                            <span>导</span>
+                        </div>
+                        <div class="justify-text">
+                            <span>意</span>
+                            <span>见</span>
+                        </div>
+                    </el-col>
+                    <el-col :span="18" class="info_abstract">
+                        <div v-for="leader in leaderInfo" class="info_abstract_v">
+                            <div>
+                                {{ leader.content }}
+                            </div>
+                            <div class="flex text-sm" style="line-height: 20px;">
+                                <el-image :src="leader.signfj" width="80px" height="20px"></el-image>
+                                {{ leader.updateTime }}
+                            </div>
+                        </div>
+                    </el-col>
+                </el-row>
+                <el-row type="flex" v-if="fgLeaderInfo.length > 0" align="middle" justify="space-between"
+                    class="card_row ">
+                    <el-col :span="6">
+                        <div class="justify-text">
+                            <span>分</span>
+                            <span>管</span>
+                            <span>领</span>
+                            <span>导</span>
+                        </div>
+                        <div class="justify-text">
+                            <span>意</span>
+                            <span>见</span>
+                        </div>
+                    </el-col>
+                    <el-col :span="18" class="info_abstract">
+                        <div v-for="item in fgLeaderInfo" class="info_abstract_v">
+                            <div>
+                                {{ item.content }}
+                            </div>
+                            <div class="flex text-sm" style="line-height: 20px;">
+                                <el-image :src="item.signfj" width="80px" height="20px"></el-image>
+                                {{ item.updateTime }}
+                            </div>
+                        </div>
+                    </el-col>
+                </el-row>
+                <el-row type="flex" v-if="officeInfo.length > 0" align="middle" justify="space-between"
+                    class="card_row ">
+                    <el-col :span="6">
+                        <div class="justify-text">
+                            <span>办</span>
+                            <span>公</span>
+                            <span>室</span>
+                        </div>
+                        <div class="justify-text">
+                            <span>意</span>
+                            <span>见</span>
+                        </div>
+                    </el-col>
+                    <el-col :span="18" class="info_abstract">
+                        <div v-for="item in officeInfo" class="info_abstract_v">
+                            <div>
+                                {{ item.content }}
+                            </div>
+                            <div class="flex text-sm" style="line-height: 20px;">
+                                <el-image :src="item.signfj" width="80px" height="20px"></el-image>
+                                {{ item.updateTime }}
+                            </div>
+                        </div>
+                    </el-col>
+                </el-row>
+
+                <el-row type="flex" v-if="undertakeInfo.length > 0" align="middle" justify="space-between"
+                    class="card_row ">
+                    <el-col :span="6" textAlign="justify">
+                        <div class="justify-text">
+                            <span>承</span>
+                            <span>办</span>
+                            <span>科</span>
+                            <span>(室)</span>
+                        </div>
+                        <div class="justify-text">
+                            <span>意</span>
+                            <span>见</span>
+                        </div>
+                    </el-col>
+                    <el-col :span="18" class="info_abstract">
+                        <div v-for="item in undertakeInfo" class="info_abstract_v">
+                            <div>
+                                {{ item.content }}
+                            </div>
+                            <div class="flex text-sm" style="line-height: 20px;">
+                                <el-image :src="item.signfj" width="80px" height="20px" mode="aspectFit"></el-image>
+                                {{ item.updateTime }}
+                            </div>
+                        </div>
+                    </el-col>
+                </el-row>
+                <el-row type="flex" justify="space-between" class="card_row card_row_border">
+                    <el-col :span="6" textAlign="center">
+                        <div>
+                            文件名称
+                        </div>
+                    </el-col>
+                    <el-col :span="18" class="card_col_1">
+                        <el-tooltip :content="inputForm.name" placement="top">
+                            <span class="card_col_2">{{ inputForm.name }}</span>
+                        </el-tooltip>
+                    </el-col>
+                </el-row>
+                <el-row type="flex" justify="space-between" class="card_row card_row_border">
+                    <el-col :span="6" textAlign="center">
+                        <div>拟稿人</div>
+                    </el-col>
+                    <el-col :span="6" textAlign="center" class="card_col_1">
+                        <el-tooltip :content="inputForm.authorPerson" placement="top">
+                            <span class="card_col_2">{{ inputForm.authorPerson }}</span>
+                        </el-tooltip>
+                    </el-col>
+                    <el-col :span="6" textAlign="center" class="card_col card_col_1">
+                        <div>校对人</div>
+                    </el-col>
+                    <el-col :span="6" textAlign="center">
+                        <el-tooltip :content="inputForm.proofreader" placement="top">
+                            <span class="card_col_2">{{ inputForm.proofreader }}</span>
+                        </el-tooltip>
+                    </el-col>
+                </el-row>
+                <el-row type="flex" justify="space-between" class="card_row card_row_border">
+                    <el-col :span="6" textAlign="center" class="">
+                        <div>可否公开</div>
+                    </el-col>
+                    <el-col :span="6" textAlign="center" class="card_col_1">
+                        <span class="card_col_2">{{ inputForm.open ? '是' : '否' }}</span>
+                    </el-col>
+                    <el-col :span="6" textAlign="center" class="card_col card_col_1">
+                        <div>印数</div>
+                    </el-col>
+                    <el-col :span="6" textAlign="center">
+                        <span class="card_col_2">{{ inputForm.printNum }}</span>
+                    </el-col>
+                </el-row>
+                <el-row type="flex" justify="space-between" class="card_row card_row_border card_last_row">
+                    <el-col :span="6" textAlign="center">
+                        <div>备注</div>
+                    </el-col>
+                    <el-col :span="18" textAlign="center" class="card_col_1">
+                        <el-tooltip :content="inputForm.remark == '' ? '无' : inputForm.remark" placement="top">
+                            <span class="card_col_2">{{ inputForm.remark == '' ? '无' : inputForm.remark }}</span>
+                        </el-tooltip>
+                    </el-col>
+                </el-row>
+                <span style="margin: 10px;color: red; font-size: 10px">所有涉密敏感信息不得上传</span>
+                <div class="card_other">
+                    附件:
+                    <div class="other_info" v-for="item in fileList">
+                        <div class="other_pdf  flex  ">
+                            <text decoration='underline' color='#36a7f3' :text="item.name"
+                                @click="item.type == 'pdf' ? prediv(item) : download(item)"></text>
+                        </div>
+                    </div>
+
+                </div>
+            </div>
+
+        </div>
+        <div style="margin-left: 20px;">
+            <image-upload :fileList="imgList" multiple :maxCount="imgList.length" :predivFullImage="true"
+                :deletable="false"></image-upload>
+        </div>
+    </div>
+</template>
+<script>
+import yzCirculationCardService from '@/api/yzcirculation/yzCirculationCardService.js'
+import yzFlowService from '@/api/yzflow/yzFlowService.js'
+export default {
+    mounted() {
+        yzCirculationCardService.queryById(this.gwId).then(data => {
+            // console.log("data", 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 {
+            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: ''
+            },
+        }
+    },
+    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;
+                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;
+    margin-top: 30px;
+}
+
+.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;
+}
+
+.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 .card_col_2 {
+    font-size: 14px;
+}
+
+.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>

+ 253 - 0
jp-ui/src/views/yzcirculation/YzCardInfo.vue

@@ -0,0 +1,253 @@
+<template>
+    <v-dialog :title="title" :close-on-click-modal="false"
+        style="width:1100px;height: auto;max-height: 1000px ;margin-top: 85px;" v-model="visible">
+
+
+        <div style="display: flex; flex-direction: row;">
+            <yzCard :gwId="gwId" ref="filecard" v-if="visible" style="width: 50%;"></yzCard>
+
+            <div>
+
+
+                <div class="cll" :style="{ height: heightpx }">
+                    <el-steps finish-status="success" direction="vertical" :active="current">
+                        <el-step title="发起"
+                            :description="inputForm.createTruename + ' - ' + inputForm.createTime"></el-step>
+                        <el-step v-for="item in downList"
+                            :title="item.which == '0' ? '承办科(室)意见' : item.which == '1' ? '办公室意见' : item.which == '2' ? '分管领导意见' : item.which == '3' ? '主要领导意见' : '已归档'"
+                            :description="item.nextTruename + ' - ' + item.updateTime" />
+                        <el-step v-for="item in gwList"
+                            :title="item.which == '0' ? '承办科(室)意见' : item.which == '1' ? '办公室意见' : item.which == '2' ? '分管领导意见' : item.which == '3' ? '主要领导意见' : '待归档'"
+                            :description="item.nextTruename">
+                        </el-step>
+                    </el-steps>
+                </div>
+
+
+                <div v-if="auditForm.yzId != ''"
+                    style="display: flex; flex-direction:column;margin-left: 60px;margin-top:20px">
+
+
+                    <view v-if="istransmit && method == 'edit'" class="titletab">办公室意见</view>
+                    <view v-if="isoffice && method == 'edit'" class="titletab">分管领导意见</view>
+                    <view v-if="isleader && method == 'edit'" class="titletab">主要领导意见</view>
+                    <view v-if="isundertake && method == 'edit'" class="titletab">承办科(室)意见</view>
+
+
+
+                    <el-form v-if="method == 'edit'" :model="auditForm" ref="auditForm" v-loading="loading"
+                        label-position="right" label-width="auto" style="max-width: 400px;margin-top: 40px;">
+                        <el-row :gutter="15">
+                            <el-col :span="24">
+                                <el-form-item
+                                    :label="istransmit ? '办公室意见' : isundertake ? '承办科(室)意见' : isoffice ? '分管领导意见' : '主要领导意见'"
+                                    prop="content">
+                                    <el-input type="textarea" v-model="auditForm.content" placeholder=""
+                                        style="min-width: 300px;"></el-input>
+                                </el-form-item>
+                            </el-col>
+                        </el-row>
+                        <el-row :gutter="15">
+                            <el-col :span="24">
+                                <el-form-item v-if="!isleader" label="下一位审批人" borderBottom prop="neUser">
+                                    <office-user-select v-model="auditForm.neUser" :limit="1"
+                                        title="审批人"></office-user-select>
+                                </el-form-item>
+                            </el-col>
+                        </el-row>
+                    </el-form>
+                </div>
+
+            </div>
+
+        </div>
+        <template #footer>
+            <span class="dialog-footer">
+                <el-button @click="visible = false" icon="circle-close">关闭</el-button>
+                <el-button
+                    v-if="((isundertake || isleader || isoffice) && !loading && auditForm.yzId != '') && method == 'edit'"
+                    type="primary" @click="doSubmit()" icon="circle-check" v-noMoreClick>确认签字</el-button>
+                <el-button
+                    v-if="(!(isundertake || isleader || isoffice) && !loading && auditForm.yzId != '') && method == 'edit'"
+                    type="primary" @click="doSubmit()" icon="circle-check" v-noMoreClick>提交</el-button>
+                <el-button type="primary" v-if="isAll && auditForm.yzId != ''" @click="formSubmit()" icon="circle-check"
+                    v-noMoreClick>归档</el-button>
+            </span>
+        </template>
+    </v-dialog>
+</template>
+
+<script>
+import yzFlowService from '@/api/yzflow/yzFlowService.js'
+import moment from "moment"
+import officeUserSelect from "@/components/officeUserSelect/index.vue";
+import YzCard from "./YzCard.vue"
+export default {
+    data() {
+        return {
+            title: '',
+            visible: false,
+            loading: false,
+            isAll: false,
+            show: false,
+            one: true,
+            auditForm: {
+                id: '',
+                yzId: '',
+                content: '已阅',
+                signfj: '',
+                createTruename: '',
+                nextTruename: '',
+                nextUser: '',
+                which: '0',
+                state: '0',
+                next: '',
+                neUser: ''
+            },
+            gwId: "",
+            isoffice: false,
+            isleader: false,
+            isundertake: false,
+            istransmit: false,
+            // 步骤条
+            heightpx: '400px',
+            downList: [],
+            gwList: [],
+            current: 0,
+            inputForm: {
+                id: '',
+                yzId: '',
+                content: '',
+                signfj: '',
+                createTruename: '',
+                nextTruename: '',
+                nextUser: '',
+                which: '0',
+                state: '0',
+                next: '',
+                neUser: '',
+                createTime: ''
+            },
+        }
+    },
+    components: {
+        officeUserSelect,
+        YzCard,
+    },
+    created() {
+    },
+    methods: {
+        init(method, id) {
+            this.method = method
+            this.gwId = id
+            if (method === 'add') {
+                this.title = `新建盐都工信拟稿`
+            } else if (method === 'edit') {
+                this.title = '拟稿详情'
+            } else if (method === 'view') {
+                this.title = '拟稿详情'
+            }
+
+            this.visible = true
+            this.loading = false
+            this.$nextTick(() => {
+                if (method === 'edit' || method === 'view') { // 修改或者查看
+                    this.loading = true
+                    this.downList = []
+                    this.gwList = []
+                    yzFlowService.queryByYzId(this.gwId).then(data => {
+                        data.sort((a, b) => a.createTime.localeCompare(b.createTime) || a.createTime
+                            .localeCompare(b.createTime));
+                        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
+                        let user = JSON.parse(window.localStorage.getItem('USER_INFO'))
+                        let role = user.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 = '已阅'
+                        }
+                        console.log("this.auditForm", this.auditForm);
+                        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
+                        let a = data.length * 60;
+                        this.heightpx = a + "px";
+                        this.loading = false
+                    })
+
+                }
+            })
+        },
+        // 提交表单
+        doSubmit() {
+            let inputForm = this.auditForm;
+            this.loading = true
+            if (inputForm.neUser && inputForm.neUser != '') {
+                inputForm.next = '1'
+            } else {
+                inputForm.next = ''
+            }
+            inputForm.state = "0"
+            inputForm.yzId = this.gwId
+            const date = moment().format('YYYY-MM-DD HH:mm:ss');
+            inputForm.updateTime = date
+
+            yzFlowService.save(inputForm).then(data => {
+                this.visible = false
+                this.$message.success(data)
+                this.$emit('refreshDataList')
+                this.loading = false
+            }).catch(() => {
+                this.loading = false
+            })
+        },
+        // 归档
+        formSubmit() {
+            this.loading = true
+            let inputForm = Object.assign({}, this.auditForm);;
+            inputForm.state = '0'
+            inputForm.next = "0"
+            yzFlowService.save(inputForm).then(data1 => {
+                this.visible = false
+                this.$message.success(data1)
+                this.$emit('refreshDataList')
+                this.loading = false
+            })
+
+        }
+
+    }
+}
+</script>
+<style>
+.titletab {
+    color: #36a7f3;
+    border-bottom: 1px solid #36a7f3;
+    width: 100%;
+    font-size: 18px;
+    font-weight: 700;
+    padding: 6px;
+}
+
+.cll {
+    width: 450px;
+    margin-left: 50px;
+}
+</style>

+ 163 - 0
jp-ui/src/views/yzcirculation/YzCirculationCardForm.vue

@@ -0,0 +1,163 @@
+<template>
+  <v-dialog :title="title" :close-on-click-modal="false" v-model="visible">
+    <el-form :model="inputForm" ref="inputForm" v-loading="loading" :class="method === 'view' ? 'readonly' : ''"
+      :disabled="method === 'view'" label-width="120px">
+      <el-row :gutter="15">
+
+        <el-col :span="12">
+          <el-form-item label="年份" prop="yearNum" :rules="[
+  ]">
+            <el-input v-model="inputForm.yearNum" placeholder="请填写年份"></el-input>
+          </el-form-item>
+        </el-col>
+        <el-col :span="12">
+          <el-form-item label="卡号" prop="cardNum" :rules="[
+  ]">
+            <el-input v-model="inputForm.cardNum" placeholder="请填写卡号"></el-input>
+          </el-form-item>
+        </el-col>
+
+        <el-col :span="12">
+          <el-form-item label="文件名称" prop="name" :rules="[
+  ]">
+            <el-input v-model="inputForm.name" placeholder="请填写文件名称"></el-input>
+          </el-form-item>
+        </el-col>
+        <el-col :span="12">
+          <el-form-item label="拟稿人" prop="authorPerson" :rules="[
+  ]">
+            <el-input v-model="inputForm.authorPerson" placeholder="请填写拟稿人"></el-input>
+            <!-- <user-select :limit='1' v-model="inputForm.authorPerson"></user-select> -->
+          </el-form-item>
+        </el-col>
+        <el-col :span="12">
+          <el-form-item label="校对人" prop="proofreader" :rules="[
+  ]">
+            <el-input v-model="inputForm.proofreader" placeholder="请填写校对人"></el-input>
+          </el-form-item>
+        </el-col>
+        <el-col :span="12">
+          <el-form-item label="是否公开" prop="open" :rules="[
+  ]">
+            <el-radio-group v-model="inputForm.open">
+              <el-radio v-for="item in $dictUtils.getDictList('yes_no')" :label="item.value" :key="item.value">{{
+    item.label
+  }}</el-radio>
+            </el-radio-group>
+          </el-form-item>
+        </el-col>
+        <el-col :span="12">
+          <el-form-item label="印数" prop="printNum" :rules="[
+    { validator: validator.isNumber, trigger: 'blur' }
+  ]">
+            <el-input-number v-model="inputForm.printNum" placeholder="请填写印数" style="width: 100%;"></el-input-number>
+          </el-form-item>
+        </el-col>
+        <el-col :span="12">
+          <el-form-item label="状态" prop="state" :rules="[
+  ]">
+            <el-select v-model="inputForm.state" placeholder="请选择" style="width: 100%;">
+              <el-option v-for="item in $dictUtils.getDictList('gw_state')" :key="item.value" :label="item.label"
+                :value="item.value">
+              </el-option>
+            </el-select>
+          </el-form-item>
+        </el-col>
+
+        <el-col :span="24">
+          <el-form-item label="附件" prop="attachment" :rules="[
+  ]">
+            <file-upload v-model="inputForm.attachment" :limit="3" tip="最多上传3个文件,单个文件不要超过10M"></file-upload>
+          </el-form-item>
+        </el-col>
+        <el-col :span="12">
+          <el-form-item label="备注" prop="remark" :rules="[
+  ]">
+            <el-input v-model="inputForm.remark" placeholder="请填写备注"></el-input>
+          </el-form-item>
+        </el-col>
+      </el-row>
+    </el-form>
+    <template #footer>
+      <span class="dialog-footer">
+        <el-button @click="visible = false" icon="circle-close">关闭</el-button>
+        <el-button type="primary" v-if="method != 'view'" @click="doSubmit()" icon="circle-check"
+          v-noMoreClick>确定</el-button>
+      </span>
+    </template>
+  </v-dialog>
+</template>
+
+<script>
+import UserSelect from '@/components/userSelect'
+import yzCirculationCardService from '@/api/yzcirculation/yzCirculationCardService'
+export default {
+  data() {
+    return {
+      title: '',
+      method: '',
+      visible: false,
+      loading: false,
+      inputForm: {
+        id: '',
+        name: '',
+        authorPerson: '',
+        proofreader: '',
+        open: '',
+        printNum: '',
+        state: '',
+        cardNum: '',
+        yearNum: '',
+        attachment: '',
+        remark: ''
+      }
+    }
+  },
+  components: {
+    UserSelect
+  },
+  created() {
+  },
+  methods: {
+    init(method, id) {
+      this.method = method
+      this.inputForm.id = id
+      if (method === 'add') {
+        this.title = `新建拟稿申请`
+      } else if (method === 'edit') {
+        this.title = '修改拟稿申请'
+      } else if (method === 'view') {
+        this.title = '查看拟稿申请'
+      }
+      this.visible = true
+      this.loading = false
+      this.$nextTick(() => {
+        this.$refs.inputForm.resetFields()
+        if (method === 'edit' || method === 'view') { // 修改或者查看
+          this.loading = true
+          yzCirculationCardService.queryById(this.inputForm.id).then((data) => {
+            this.inputForm = this.recover(this.inputForm, data)
+            this.loading = false
+          })
+        }
+      })
+    },
+    // 表单提交
+    doSubmit() {
+      this.$refs['inputForm'].validate((valid) => {
+        if (valid) {
+          this.loading = true
+          yzCirculationCardService.save(this.inputForm).then((data) => {
+            this.visible = false
+            this.$message.success(data)
+            this.$emit('refreshDataList')
+            this.loading = false
+          }).catch(() => {
+            this.loading = false
+          })
+        }
+      })
+    }
+  }
+}
+</script>

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

@@ -0,0 +1,305 @@
+<template>
+	<div class="page">
+		<el-form :inline="true" v-if="searchVisible" class="query-form m-b-10" ref="searchForm" :model="searchForm"
+			@keyup.enter="refreshList()" @submit.prevent>
+			<!-- 搜索框-->
+			<el-form-item prop="name" label="文件名称:">
+				<el-input v-model="searchForm.name" placeholder="请输入文件名称" clearable></el-input>
+			</el-form-item>
+			<el-form-item prop="yearNum" label="年份:">
+				<el-input v-model="searchForm.yearNum" placeholder="请输入年份" clearable></el-input>
+			</el-form-item>
+			<el-form-item prop="authorPerson" label="拟稿人:">
+				<UserSelect tenantId="10000" :limit="1" v-model="searchForm.authorPerson"></UserSelect>
+			</el-form-item>
+			<el-form-item prop="open" label="是否公开:">
+				<el-select clearable v-model="searchForm.open" placeholder="是否公开">
+					<el-option v-for="item in $dictUtils.getDictList('yes_no')" :key="item.value" :label="item.label"
+						:value="item.value">
+					</el-option>
+				</el-select>
+			</el-form-item>
+			<el-form-item prop="state" label="状态:">
+				<el-select clearable v-model="searchForm.state" placeholder="请选择状态">
+					<el-option v-for="item in $dictUtils.getDictList('gw_state')" :key="item.value" :label="item.label"
+						:value="item.value">
+					</el-option>
+				</el-select>
+			</el-form-item>
+			<el-form-item>
+				<el-button type="primary" @click="refreshList()" icon="search">查询</el-button>
+				<el-button type="default" @click="resetSearch()" icon="refresh-right">重置</el-button>
+			</el-form-item>
+		</el-form>
+
+		<div class="jp-table">
+			<vxe-toolbar ref="yzCirculationCardToolbar" :refresh="{ query: refreshList }" import export print custom>
+				<template #buttons>
+					<el-button v-if="hasPermission('yzcirculation:yzCirculationCard:add')" type="primary" icon="plus"
+						@click="add()">新建</el-button>
+					<el-button v-if="hasPermission('yzcirculation:yzCirculationCard:edit')" type="warning"
+						icon="edit-filled" @click="edit()"
+						v-show="$refs.yzCirculationCardTable && $refs.yzCirculationCardTable.getCheckboxRecords().length === 1"
+						plain>修改</el-button>
+					<el-button v-if="hasPermission('yzcirculation:yzCirculationCard:del')" type="danger"
+						icon="del-filled" @click="del()"
+						v-show="$refs.yzCirculationCardTable && $refs.yzCirculationCardTable.getCheckboxRecords().length > 0"
+						plain>删除</el-button>
+				</template>
+				<template #tools>
+					<vxe-button type="text" :title="searchVisible ? '收起检索' : '展开检索'
+			" icon="vxe-icon-search" class="tool-btn" @click="searchVisible = !searchVisible"></vxe-button>
+					<vxe-button type="text" title="下载导入模板"
+						v-if="hasPermission('yzcirculation:yzCirculationCard:import')" icon="iconfont icon-xiazaimoban1"
+						class="tool-btn m-l-0" @click="downloadTpl()">
+					</vxe-button>
+				</template>
+			</vxe-toolbar>
+			<div class="jp-table-body">
+				<vxe-table border="inner" auto-resize resizable height="auto" :loading="loading" size="small"
+					ref="yzCirculationCardTable" show-header-overflow show-overflow highlight-hover-row
+					:menu-config="{}" :print-config="{}" :import-config="{
+			importMethod: importMethod,
+			types: ['csv', 'xls', 'xlsx'],
+			remote: true,
+		}" :export-config="{
+			remote: true,
+			filename: `拟稿申请数据${moment(new Date()).format(
+				'YYYY-MM-DD'
+			)}`,
+			sheetName: '拟稿申请数据',
+			exportMethod: exportMethod,
+			types: ['xlsx'],
+			modes: ['current', 'selected', 'all'],
+		}" @sort-change="sortChangeHandle" :sort-config="{ remote: true }" :data="dataList" :checkbox-config="{}">
+					<vxe-column type="seq" width="40"></vxe-column>
+					<vxe-column type="checkbox" width="40px"></vxe-column>
+					<vxe-column field="yearNum" sortable title="年份">
+					</vxe-column>
+					<vxe-column field="cardNum" sortable title="卡号">
+					</vxe-column>
+					<vxe-column field="name" sortable title="文件名称">
+					</vxe-column>
+					<vxe-column field="authorPerson" sortable title="拟稿人">
+					</vxe-column>
+					<!-- <vxe-column field="proofreader" sortable title="校对人">
+					</vxe-column> -->
+					<vxe-column field="open" sortable title="是否公开">
+						<template #default="{ row }">
+							{{ $dictUtils.getDictLabel("yes_no", row.open, '-') }}
+						</template>
+					</vxe-column>
+					<vxe-column field="printNum" sortable title="印数">
+					</vxe-column>
+					<!-- <vxe-column field="state" sortable title="状态">
+						<template #default="{ row }">
+							{{ $dictUtils.getDictLabel("gw_state", row.state, '-') }}
+						</template>
+					</vxe-column> -->
+
+					<vxe-column fixed="right" align="center" width="200" title="操作">
+						<template #default="{ row }">
+							<el-button v-if="hasPermission('yzcirculation:yzCirculationCard:view')" type="primary" text
+								icon="view-filled" @click="view(row.id)">查看</el-button>
+							<el-button
+								v-if="hasPermission('yzcirculation:yzCirculationCard:edit') && searchForm.state == 1"
+								type="primary" text icon="edit-filled" @click="edit(row.id)">审批</el-button>
+							<el-button v-if="hasPermission('yzcirculation:yzCirculationCard:del')" type="danger" text
+								icon="del-filled" @click="del(row.id)">删除</el-button>
+						</template>
+					</vxe-column>
+				</vxe-table>
+				<vxe-pager background size="small" :current-page="tablePage.currentPage" :page-size="tablePage.pageSize"
+					:total="tablePage.total" :page-sizes="[10, 20, 100, 1000, { label: '全量数据', value: 1000000 }]"
+					:layouts="['PrevPage', 'JumpNumber', 'NextPage', 'FullJump', 'Sizes', 'Total']"
+					@page-change="currentChangeHandle">
+				</vxe-pager>
+			</div>
+		</div>
+		<!-- 弹窗, 新增 / 修改 -->
+		<YzCirculationCardForm ref="yzCirculationCardForm" @refreshDataList="refreshList"></YzCirculationCardForm>
+		<YzCardInfo ref="yzCardInfo" @refreshDataList="refreshList"></YzCardInfo>
+	</div>
+</template>
+
+<script>
+import YzCirculationCardForm from './YzCirculationCardForm'
+import YzCardInfo from './YzCardInfo'
+import yzCirculationCardService from '@/api/yzcirculation/yzCirculationCardService'
+import UserSelect from '@/components/userSelect'
+export default {
+	data() {
+		return {
+			searchVisible: true,
+			searchForm: {
+				name: '',
+				open: '',
+				state: '1',
+				yearNum: '',
+				authorPerson: ''
+			},
+			dataList: [],
+			tablePage: {
+				total: 0,
+				currentPage: 1,
+				pageSize: 10,
+				orders: [{ column: "a.create_time", asc: false }],
+			},
+			loading: false
+		}
+	},
+	components: {
+		UserSelect,
+		YzCirculationCardForm,
+		YzCardInfo
+	},
+	created() {
+	},
+	mounted() {
+		this.$nextTick(() => {
+			// 将表格和工具栏进行关联
+			const $table = this.$refs.yzCirculationCardTable
+			const $toolbar = this.$refs.yzCirculationCardToolbar
+			$table.connect($toolbar)
+		})
+	},
+	activated() {
+		this.refreshList()
+	},
+	methods: {
+		// 获取数据列表
+		refreshList() {
+			this.loading = true
+			yzCirculationCardService.list({
+				'current': this.tablePage.currentPage,
+				'size': this.tablePage.pageSize,
+				'orders': this.tablePage.orders,
+				...this.searchForm
+			}).then((data) => {
+				this.dataList = data.records
+				this.tablePage.total = data.total
+				this.loading = false
+			})
+		},
+		// 当前页
+		currentChangeHandle({ currentPage, pageSize }) {
+			this.tablePage.currentPage = currentPage
+			this.tablePage.pageSize = pageSize
+			this.refreshList()
+		},
+		// 排序
+		sortChangeHandle(obj) {
+			this.tablePage.orders = [];
+			if (obj.order != null) {
+				this.tablePage.orders = [{ column: obj.column.sortBy || this.$utils.toLine(obj.property), asc: obj.order === "asc" }];
+			} else {
+				this.tablePage.orders = [{ column: "a.create_time", asc: false }];
+			}
+			this.refreshList();
+		},
+		// 新增
+		add() {
+			this.$refs.yzCirculationCardForm.init('add', '')
+		},
+		// 修改
+		edit(id) {
+			id = id || this.$refs.yzCirculationCardTable.getCheckboxRecords().map(item => {
+				return item.id
+			})[0]
+			this.$refs.yzCardInfo.init('edit', id)
+		},
+		// 查看
+		view(id) {
+			this.$refs.yzCardInfo.init('view', id)
+		},
+		// 删除
+		del(id) {
+			let ids = id || this.$refs.yzCirculationCardTable.getCheckboxRecords().map(item => {
+				return item.id
+			}).join(',')
+			this.$confirm(`确定删除所选项吗?`, '提示', {
+				confirmButtonText: '确定',
+				cancelButtonText: '取消',
+				type: 'warning'
+			}).then(() => {
+				this.loading = true
+				yzCirculationCardService.delete(ids).then((data) => {
+					this.$message.success(data)
+					this.refreshList()
+					this.loading = false
+				})
+			})
+		},
+		// 下载模板
+		downloadTpl() {
+			this.loading = true
+			yzCirculationCardService
+				.exportTemplate()
+				.then((data) => {
+					// 将二进制流文件写入excel表,以下为重要步骤
+					this.$utils.downloadExcel(data, "拟稿申请导入模板");
+					this.loading = false
+				})
+				.catch(function (err) {
+					this.loading = false
+					if (err.response) {
+						console.log(err.response);
+					}
+				});
+		},
+		// 自定义服务端导入
+		importMethod({ file }) {
+			// 处理表单
+			const formBody = new FormData();
+			formBody.append("file", file);
+			this.loading = true
+			yzCirculationCardService.importExcel(formBody).then((result) => {
+				this.$message.success({
+					dangerouslyUseHTMLString: true,
+					message: result,
+				});
+				this.refreshList();
+			});
+		},
+		// 自定义服务端导出
+		exportMethod({ options }) {
+			// 传给服务端的参数
+			const params = {
+				current: this.tablePage.currentPage,
+				size: this.tablePage.pageSize,
+				orders: this.tablePage.orders,
+				...this.searchForm,
+				filename: options.filename,
+				sheetName: options.sheetName,
+				isHeader: options.isHeader,
+				original: options.original,
+				mode: options.mode,
+				selectIds:
+					options.mode === "selected"
+						? options.data.map((item) => item.id)
+						: [],
+				exportFields: options.columns.map(
+					(column) => column.property && column.property.split(".")[0]
+				),
+			};
+			this.loading = true;
+			return yzCirculationCardService
+				.exportExcel(params)
+				.then((data) => {
+					// 将二进制流文件写入excel表,以下为重要步骤
+					this.$utils.downloadExcel(data, options.filename);
+					this.loading = false;
+				})
+				.catch(function (err) {
+					if (err.response) {
+						console.log(err.response);
+					}
+				});
+		},
+		resetSearch() {
+			this.$refs.searchForm.resetFields()
+			this.refreshList()
+		}
+	}
+}
+</script>

+ 105 - 0
jp-ui/src/views/yzflow/YzFlowForm.vue

@@ -0,0 +1,105 @@
+<template>
+  <v-dialog
+    :title="title"
+    :close-on-click-modal="false"
+    v-model="visible">
+    <el-form :model="inputForm" ref="inputForm" v-loading="loading" :class="method==='view'?'readonly':''"  :disabled="method==='view'" label-width="120px">
+      <el-row  :gutter="15">
+        <el-col :span="12">
+            <el-form-item label="内容" prop="content"
+                :rules="[
+                 ]">
+              <el-input v-model="inputForm.content" placeholder="请填写内容"     ></el-input>
+           </el-form-item>
+        </el-col>
+        <el-col :span="24">
+            <el-form-item label="签名附件" prop="signfj"
+                :rules="[
+                 ]">
+	            <image-upload v-model="inputForm.signfj" :limit="3" tip="最多上传3个图片,单个图片不要超过10M"></image-upload>
+           </el-form-item>
+        </el-col>
+        <el-col :span="12">
+            <el-form-item label="下一步待办人姓名" prop="nextTruename"
+                :rules="[
+                 ]">
+              <el-input v-model="inputForm.nextTruename" placeholder="请填写下一步待办人姓名"     ></el-input>
+           </el-form-item>
+        </el-col>
+        </el-row>
+    </el-form>
+    <template #footer>    
+        <span class="dialog-footer">
+          <el-button @click="visible = false" icon="circle-close">关闭</el-button>
+          <el-button  type="primary" v-if="method != 'view'" @click="doSubmit()" icon="circle-check" v-noMoreClick>确定</el-button>
+        </span>
+    </template>    
+  </v-dialog>
+</template>
+
+<script>
+  import yzFlowService from '@/api/yzflow/yzFlowService'
+  export default {
+    data () {
+      return {
+        title: '',
+        method: '',
+        visible: false,
+        loading: false,
+        inputForm: {
+          id: '',
+          content: '',
+          signfj: '',
+          nextTruename: ''
+        }
+      }
+    },
+    components: {
+    },
+    created () {
+    },
+    methods: {
+      init (method, id) {
+        this.method = method
+        this.inputForm.id = id
+        if (method === 'add') {
+          this.title = `新建用章流程`
+        } else if (method === 'edit') {
+          this.title = '修改用章流程'
+        } else if (method === 'view') {
+          this.title = '查看用章流程'
+        }
+        this.visible = true
+        this.loading = false
+        this.$nextTick(() => {
+          this.$refs.inputForm.resetFields()
+          if (method === 'edit' || method === 'view') { // 修改或者查看
+            this.loading = true
+            yzFlowService.queryById(this.inputForm.id).then((data) => {
+              this.inputForm = this.recover(this.inputForm, data)
+              this.loading = false
+            })
+          }
+        })
+      },
+      // 表单提交
+      doSubmit () {
+        this.$refs['inputForm'].validate((valid) => {
+          if (valid) {
+            this.loading = true
+            yzFlowService.save(this.inputForm).then((data) => {
+              this.visible = false
+              this.$message.success(data)
+              this.$emit('refreshDataList')
+              this.loading = false
+            }).catch(() => {
+              this.loading = false
+            })
+          }
+        })
+      }
+    }
+  }
+</script>
+
+  

+ 368 - 0
jp-ui/src/views/yzflow/YzFlowList.vue

@@ -0,0 +1,368 @@
+<template>
+  <div class="page">
+    <el-form
+      :inline="true"
+      v-if="searchVisible"
+      class="query-form m-b-10"
+      ref="searchForm"
+      :model="searchForm"
+      @keyup.enter="refreshList()"
+      @submit.prevent
+    >
+      <!-- 搜索框-->
+      <el-form-item prop="gwId" label="拟稿id:">
+        <el-input v-model="searchForm.gwId" placeholder="请输入拟稿id" clearable></el-input>
+		   </el-form-item>
+      <el-form-item prop="state" label="流程状态:">
+        <el-select v-model="searchForm.state" placeholder="请选择流程状态">
+						  <el-option
+						    v-for="item in $dictUtils.getDictList('gw_flow_state')"
+						    :key="item.value"
+						    :label="item.label"
+						    :value="item.value">
+						  </el-option>
+						</el-select>
+		   </el-form-item>
+      <el-form-item prop="which" label="科室承办:0,办公室拟办:1,分管领导:2,主领导:3,回流到办公室:4;待归档:5:">
+        <el-input v-model="searchForm.which" placeholder="请输入科室承办:0,办公室拟办:1,分管领导:2,主领导:3,回流到办公室:4;待归档:5" clearable></el-input>
+		   </el-form-item>
+      <el-form-item>
+        <el-button type="primary" @click="refreshList()" icon="search">查询</el-button>
+        <el-button type="default" @click="resetSearch()" icon="refresh-right">重置</el-button>
+      </el-form-item>
+    </el-form>
+
+		<div class="jp-table">
+		  <vxe-toolbar ref="yzFlowToolbar" :refresh="{query: refreshList}" import export print custom>
+		    <template #buttons>
+				<el-button v-if="hasPermission('yzflow:yzFlow:add')" type="primary"  icon="plus" @click="add()">新建</el-button>
+				<el-button v-if="hasPermission('yzflow:yzFlow:edit')" type="warning" icon="edit-filled" @click="edit()" v-show="$refs.yzFlowTable && $refs.yzFlowTable.getCheckboxRecords().length === 1" plain>修改</el-button>
+				<el-button v-if="hasPermission('yzflow:yzFlow:del')" type="danger"   icon="del-filled" @click="del()" v-show="$refs.yzFlowTable && $refs.yzFlowTable.getCheckboxRecords().length > 0" plain>删除</el-button>
+		    </template>
+		    <template #tools>
+		<vxe-button
+		  type="text"
+		  :title="
+		    searchVisible ? '收起检索' : '展开检索'
+		  "
+		  icon="vxe-icon-search"
+		  class="tool-btn"
+		  @click="searchVisible = !searchVisible"
+		></vxe-button>
+		<vxe-button
+		  type="text"
+		  title="下载导入模板"
+		  v-if="hasPermission('yzflow:yzFlow:import')"
+		  icon="iconfont icon-xiazaimoban1"
+		  class="tool-btn m-l-0"
+		  @click="downloadTpl()"
+		>
+		</vxe-button>
+    </template>
+		  </vxe-toolbar>
+		  <div class="jp-table-body">
+		  <vxe-table
+				border="inner"
+				auto-resize
+				resizable
+				height="auto"
+				:loading="loading"
+				size="small"
+				ref="yzFlowTable"
+				show-header-overflow
+				show-overflow
+				highlight-hover-row
+				:menu-config="{}"
+				:print-config="{}"
+  :import-config="{
+    importMethod: importMethod,
+    types: ['csv', 'xls', 'xlsx'],
+    remote: true,
+  }"
+  :export-config="{
+    remote: true,
+    filename: `用章流程数据${moment(new Date()).format(
+		'YYYY-MM-DD'
+    )}`,
+    sheetName: '用章流程数据',
+    exportMethod: exportMethod,
+    types: ['xlsx'],
+    modes: ['current', 'selected', 'all'],
+  }"
+
+				@sort-change="sortChangeHandle"
+				:sort-config="{remote:true}"
+				:data="dataList"
+				:checkbox-config="{}">
+				<vxe-column type="seq" width="40"></vxe-column>
+				<vxe-column type="checkbox"  width="40px"></vxe-column>
+    <vxe-column
+		  field="gwId"
+		  sortable
+		  title="拟稿id">
+				<template  #default="{ row }">
+				  <el-link  type="primary" :underline="false" v-if="hasPermission('yzflow:yzFlow:edit')" @click="edit(row.id)">{{row.gwId}}</el-link>
+				  <el-link  type="primary" :underline="false" v-else-if="hasPermission('yzflow:yzFlow:view')"  @click="view(row.id)">{{row.gwId}}</el-link>
+				  <span v-else>{{row.gwId}}</span>
+				</template>
+		</vxe-column>
+    <vxe-column
+		  field="content"
+		  sortable
+		  title="内容">
+		</vxe-column>
+    <vxe-column
+		  field="signfj"
+		  sortable
+		  title="签名附件">
+		  <template  #default="{ row }">
+		    <template v-if="row.signfj">
+				  <el-image
+				    style="height: 50px;width:50px;margin-right:10px;"
+				    :src="src" v-for="(src, index) in row.signfj.split(',')" :key="index"
+				    :preview-src-list="row.signfj.split(',')">
+				  </el-image>
+		     </template>
+		  </template>
+		</vxe-column>
+    <vxe-column
+		  field="state"
+		  sortable
+		  title="流程状态">
+		  <template #default="{ row }">
+				  {{ $dictUtils.getDictLabel("gw_flow_state", row.state, '-') }}
+		  </template>
+		</vxe-column>
+    <vxe-column
+		  field="which"
+		  sortable
+		  title="科室承办:0,办公室拟办:1,分管领导:2,主领导:3,回流到办公室:4;待归档:5">
+		</vxe-column>
+    <vxe-column
+		  field="createTruename"
+		  sortable
+		  title="创建人姓名">
+		</vxe-column>
+    <vxe-column
+		  field="nextTruename"
+		  sortable
+		  title="下一步待办人姓名">
+		</vxe-column>
+		<vxe-column
+		  field="nextUser.name"
+		  sortable
+		  title="下一步待办人">
+				<template #default="{ row }">
+				    {{row.nextUser && row.nextUser.name}}
+				</template>
+		</vxe-column>
+    <vxe-column
+		  field="createBy.id"
+		  sortable
+		  title="创建者">
+		</vxe-column>
+		<vxe-column
+		  fixed="right"
+		  align="center"
+		  width="200"
+		  title="操作">
+		  <template   #default="{ row }">
+		    <el-button v-if="hasPermission('yzflow:yzFlow:view')" type="primary" text icon="view-filled" @click="view(row.id)">查看</el-button>
+		    <el-button v-if="hasPermission('yzflow:yzFlow:edit')" type="primary" text icon="edit-filled" @click="edit(row.id)">修改</el-button>
+		    <el-button v-if="hasPermission('yzflow:yzFlow:del')"  type="danger"  text icon="del-filled" @click="del(row.id)">删除</el-button>
+		  </template>
+		</vxe-column>
+    </vxe-table>
+    <vxe-pager
+		background
+		size="small"
+		:current-page="tablePage.currentPage"
+		:page-size="tablePage.pageSize"
+		:total="tablePage.total"
+		:page-sizes="[10, 20, 100, 1000, {label: '全量数据', value: 1000000}]"
+		:layouts="['PrevPage', 'JumpNumber', 'NextPage', 'FullJump', 'Sizes', 'Total']"
+		@page-change="currentChangeHandle">
+    </vxe-pager>
+    </div>
+    </div>
+		  <!-- 弹窗, 新增 / 修改 -->
+    <YzFlowForm  ref="yzFlowForm" @refreshDataList="refreshList"></YzFlowForm>
+  </div>
+</template>
+
+<script>
+  import YzFlowForm from './YzFlowForm'
+  import yzFlowService from '@/api/yzflow/yzFlowService'
+  export default {
+    data () {
+		return {
+		  searchVisible: true,
+		  searchForm: {
+		    gwId: '',
+		    state: '',
+		    which: ''
+		  },
+		  dataList: [],
+		  tablePage: {
+		    total: 0,
+		    currentPage: 1,
+		    pageSize: 10,
+		    orders: [{ column: "a.create_time", asc: false }],
+		  },
+		  loading: false
+		}
+    },
+    components: {
+		YzFlowForm
+    },
+    created () {
+    },    
+    mounted () {
+		this.$nextTick(() => {
+		  // 将表格和工具栏进行关联
+		  const $table = this.$refs.yzFlowTable
+		  const $toolbar = this.$refs.yzFlowToolbar
+		  $table.connect($toolbar)
+		})
+    }, 
+    activated () {
+		this.refreshList()
+    },
+    methods: {
+		// 获取数据列表
+		refreshList () {
+		  this.loading = true
+		  yzFlowService.list({
+		    'current': this.tablePage.currentPage,
+		    'size': this.tablePage.pageSize,
+		    'orders': this.tablePage.orders,
+		    ...this.searchForm
+		  }).then((data) => {
+		    this.dataList = data.records
+		    this.tablePage.total = data.total
+		    this.loading = false
+		  })
+		},
+		// 当前页
+		currentChangeHandle ({ currentPage, pageSize }) {
+		  this.tablePage.currentPage = currentPage
+		  this.tablePage.pageSize = pageSize
+		  this.refreshList()
+		},
+		// 排序
+    sortChangeHandle(obj) {
+		  this.tablePage.orders = [];
+		  if (obj.order != null) {
+		    this.tablePage.orders = [{ column: obj.column.sortBy || this.$utils.toLine(obj.property), asc: obj.order === "asc" }];
+		  } else {
+		    this.tablePage.orders = [{ column: "a.create_time", asc: false }];
+		  }
+		  this.refreshList();
+		},
+		// 新增
+		add () {
+		  this.$refs.yzFlowForm.init('add', '')
+		},
+		// 修改
+		edit (id) {
+		  id = id || this.$refs.yzFlowTable.getCheckboxRecords().map(item => {
+		    return item.id
+		  })[0]
+		  this.$refs.yzFlowForm.init('edit', id)
+		},
+		// 查看
+		view (id) {
+		  this.$refs.yzFlowForm.init('view', id)
+		},
+		// 删除
+		del (id) {
+		  let ids = id || this.$refs.yzFlowTable.getCheckboxRecords().map(item => {
+		    return item.id
+		  }).join(',')
+		  this.$confirm(`确定删除所选项吗?`, '提示', {
+		    confirmButtonText: '确定',
+		    cancelButtonText: '取消',
+		    type: 'warning'
+		  }).then(() => {
+		    this.loading = true
+		    yzFlowService.delete(ids).then((data) => {
+				this.$message.success(data)
+				this.refreshList()
+				this.loading = false
+		    })
+		  })
+		},
+		// 下载模板
+		downloadTpl() {
+		this.loading = true
+		yzFlowService
+		  .exportTemplate()
+		  .then((data) => {
+		    // 将二进制流文件写入excel表,以下为重要步骤
+		    this.$utils.downloadExcel(data, "用章流程导入模板");
+		    this.loading = false
+		  })
+		  .catch(function (err) {
+				this.loading = false
+		    if (err.response) {
+				console.log(err.response);
+		    }
+		  });
+    },
+    // 自定义服务端导入
+    importMethod({ file }) {
+		// 处理表单
+		const formBody = new FormData();
+		formBody.append("file", file);
+		this.loading = true
+		yzFlowService.importExcel(formBody).then((result) => {
+		  this.$message.success({
+		    dangerouslyUseHTMLString: true,
+		    message: result,
+		  });
+		  this.refreshList();
+		});
+    },
+    // 自定义服务端导出
+    exportMethod({ options }) {
+		// 传给服务端的参数
+		const params = {
+		  current: this.tablePage.currentPage,
+		  size: this.tablePage.pageSize,
+		  orders: this.tablePage.orders,
+		  ...this.searchForm,
+		  filename: options.filename,
+		  sheetName: options.sheetName,
+		  isHeader: options.isHeader,
+		  original: options.original,
+		  mode: options.mode,
+		  selectIds:
+		    options.mode === "selected"
+				? options.data.map((item) => item.id)
+				: [],
+		  exportFields: options.columns.map(
+		    (column) => column.property && column.property.split(".")[0]
+		  ),
+		};
+		this.loading = true;
+		return yzFlowService
+		  .exportExcel(params)
+		  .then((data) => {
+		    // 将二进制流文件写入excel表,以下为重要步骤
+		    this.$utils.downloadExcel(data, options.filename);
+		    this.loading = false;
+		  })
+		  .catch(function (err) {
+		    if (err.response) {
+				console.log(err.response);
+		    }
+		  });
+    },
+		resetSearch () {
+		  this.$refs.searchForm.resetFields()
+		  this.refreshList()
+		}
+    }
+  }
+</script>
+