Przeglądaj źródła

流程发起人,审核可修改

sangwenwei 1 rok temu
rodzic
commit
dd833fbf34

+ 459 - 0
src/components/userSelect2/UserSelectDialog.vue

@@ -0,0 +1,459 @@
+<template>
+	<el-dialog
+		title="用户选择"
+		width="1000px"
+		:close-on-click-modal="false"
+		:append-to-body="true"
+		draggable
+		class="userDialog"
+		v-model="visible">
+		<el-container style="height: 500px">
+			<el-aside width="200px">
+
+				<el-card class="org">
+					<div slot="header" class="clearfix">
+						<el-input
+							placeholder="请输入组织机构过滤"
+							size="small"
+							v-model="filterText">
+						</el-input>
+					</div>
+					<el-tree
+						:data="officeTreeData"
+						:props="{
+						  value: 'id',             // ID字段名
+						  label: 'name',         // 显示名称
+						  children: 'children'    // 子级字段名
+                }"
+						default-expand-all
+						highlight-current
+						node-key="id"
+						:render-content="renderContent"
+						:filter-node-method="filterNode"
+						:expand-on-click-node="false"
+						@node-click="handleNodeClick"
+						ref="officeTree">
+					</el-tree>
+				</el-card>
+			</el-aside>
+
+			<el-container>
+				<el-header style="text-align: left; font-size: 12px;height:30px">
+					<el-form size="small" :inline="true" ref="searchForm" :model="searchForm" @keyup.enter.native="refreshList()" @submit.native.prevent>
+						<el-form-item prop="loginName">
+							<el-input size="small" v-model="searchForm.loginName" placeholder="登录名" clearable></el-input>
+						</el-form-item>
+
+						<el-form-item>
+							<el-button  type="primary" @click="refreshList()" size="small" icon="el-icon-search">查询</el-button>
+							<el-button @click="resetSearch()" size="small" icon="el-icon-refresh-right">重置</el-button>
+						</el-form-item>
+					</el-form>
+				</el-header>
+
+				<el-main>
+					<el-table
+						:data="dataList"
+						v-loading="loading"
+						size="small"
+						border
+						ref="userTable"
+						@selection-change="selectionChangeHandle"
+						@sort-change="sortChangeHandle"
+						height="calc(100% - 40px)"
+						style="width: 100%;">
+						<el-table-column
+							header-align="center"
+							align="center"
+							v-if="limit <= 1"
+							width="50">
+							<template #default="scope">
+								<el-radio-group v-model="dataListAllSelections[0]" @change.native="getTemplateRow(scope.$index, scope.row)">
+									<el-radio :label="scope.row">
+										<template #default="{ label }">
+											<!-- 将label文本设置为空 -->
+											<span></span>
+										</template>
+									</el-radio>
+								</el-radio-group>
+								<!--								<el-radio-group :value="dataListAllSelections[0]&&dataListAllSelections[0].id"  @change.native="getTemplateRow(scope.$index, scope.row)">-->
+								<!--									<el-radio-->
+								<!--										:label="scope.row.id"-->
+								<!--										:value="dataListAllSelections[0]&&dataListAllSelections[0].id"-->
+								<!--										@change.native="getTemplateRow(scope.$index,scope.row)">-->
+								<!--										<span></span>-->
+								<!--									</el-radio>-->
+								<!--								</el-radio-group>-->
+							</template>
+						</el-table-column>
+						<el-table-column
+							type="selection"
+							header-align="center"
+							v-if="limit > 1"
+							align="center"
+							width="50">
+						</el-table-column>
+						<el-table-column
+							prop="photo"
+							header-align="center"
+							align="center"
+							label="头像">
+							<template #default="scope">
+								<img :src="scope.row.photo === ''?'/static/img/avatar.png':scope.row.photo" style="height:35px"/>
+							</template>
+						</el-table-column>
+						<el-table-column
+							prop="loginName"
+							header-align="center"
+							align="center"
+							sortable="custom"
+							min-width="90"
+							label="登录名">
+						</el-table-column>
+						<el-table-column
+							prop="name"
+							header-align="center"
+							align="真实姓名"
+							sortable="custom"
+							min-width="90"
+							label="用户名">
+						</el-table-column>
+						<el-table-column
+							prop="companyDTO.name"
+							header-align="center"
+							align="center"
+							sortable="custom"
+							min-width="110"
+							label="所属机构">
+						</el-table-column>
+						<el-table-column
+							prop="officeDTO.name"
+							header-align="center"
+							align="center"
+							sortable="custom"
+							min-width="110"
+							label="所属部门">
+						</el-table-column>
+						<el-table-column
+							prop="loginFlag"
+							header-align="center"
+							align="center"
+							min-width="100"
+							label="状态">
+							<template #default="scope">
+								<el-tag v-if="scope.row.loginFlag === '1'" size="small" type="success">正常</el-tag>
+								<el-tag v-else-if="scope.row.loginFlag === '0'" size="small" type="danger">禁用</el-tag>
+							</template>
+						</el-table-column>
+					</el-table>
+					<el-pagination
+						@size-change="sizeChangeHandle"
+						@current-change="currentChangeHandle"
+						:current-page="pageNo"
+						:page-sizes="[5, 10, 50, 100]"
+						:page-size="pageSize"
+						:total="total"
+						layout="total, sizes, prev, pager, next, jumper">
+					</el-pagination>
+				</el-main>
+			</el-container>
+
+			<el-aside width="200px">
+				<el-tag
+					:key="tag.id"
+					v-for="tag in dataListAllSelections"
+					closable
+					:disable-transitions="false"
+					@close="del(tag)">
+					{{tag.name}}
+				</el-tag>
+			</el-aside>
+		</el-container>
+		<template #footer>
+			<span class="dialog-footer">
+			  <el-button size="small" @click="visible = false" icon="el-icon-circle-close">关闭</el-button>
+			  <el-button size="small" type="primary" icon="el-icon-circle-check" @click="doSubmit()">确定</el-button>
+			</span>
+		</template>
+	</el-dialog>
+</template>
+
+<script>
+	export default {
+		data () {
+			return {
+				searchForm: {
+					loginName: '',
+					companyDTO: {
+						id: ''
+					},
+					officeDTO: {
+						id: ''
+					},
+					name: ''
+				},
+				filterText: '',
+				dataListAllSelections: [],   // 所有选中的数据包含跨页数据
+				dataListSelections: [],
+				idKey: 'id', // 标识列表数据中每一行的唯一键的名称(需要按自己的数据改一下)
+				dataList: [],
+				dynamicTags: [],
+				officeTreeData: [],
+				pageNo: 1,
+				pageSize: 10,
+				total: 0,
+				orders: [],
+				loading: false,
+				visible: false
+			}
+		},
+		props: {
+			selectData: {
+				type: Array,
+				default: () => { return [] }
+			},
+			limit: {
+				type: Number,
+				default: 999999
+			}
+		},
+		watch: {
+			filterText (val) {
+				this.$refs.officeTree.filter(val)
+			}
+		},
+		methods: {
+			init () {
+				this.visible = true
+				this.$nextTick(() => {
+					this.dataListAllSelections = JSON.parse(JSON.stringify(this.selectData))
+					this.refreshTree()
+					this.resetSearch()
+				})
+			},
+			renderContent (h, { node, data, store }) {
+				return h('span', { class: 'custom-tree-node' }, [
+					data.type === '1' ? h('i', { class: 'fa fa-sitemap' }) : h('i', { class: 'fa fa-users' }),
+					h('span', { class: 'text' }, node.label),
+				]);
+				// return (
+				//       <span class="custom-tree-node">
+				//         {
+				//           data.type === '1' ? <i class="fa fa-sitemap"></i> : <i class="fa fa-users"></i>
+				//         }
+				//         <span class="text">{node.label}</span>
+				//       </span>
+				// )
+			},
+			getTemplateRow (index, row) {                                 // 获取选中数据
+				this.dataListSelections = [row]
+				this.$nextTick(() => {
+					this.changePageCoreRecordData()
+				})
+			},
+			// 设置选中的方法
+			setSelectRow () {
+				if (!this.dataListAllSelections || this.dataListAllSelections.length <= 0) {
+					this.$refs.userTable.clearSelection()
+					return
+				}
+				// 标识当前行的唯一键的名称
+				let idKey = this.idKey
+				let selectAllIds = []
+				this.dataListAllSelections.forEach(row => {
+					selectAllIds.push(row[idKey])
+				})
+				this.$refs.userTable.clearSelection()
+				for (var i = 0; i < this.dataList.length; i++) {
+					if (selectAllIds.indexOf(this.dataList[i][idKey]) >= 0) {
+						// 设置选中,记住table组件需要使用ref="table"
+						this.$refs.userTable.toggleRowSelection(this.dataList[i], true)
+					}
+				}
+			},
+			// 记忆选择核心方法
+			changePageCoreRecordData () {
+				// 标识当前行的唯一键的名称
+				let idKey = this.idKey
+				let that = this
+				// 如果总记忆中还没有选择的数据,那么就直接取当前页选中的数据,不需要后面一系列计算
+				if (this.dataListAllSelections.length <= 0) {
+					this.dataListSelections.forEach(row => {
+						that.dataListAllSelections.push(row)
+					})
+					return
+				}
+				// 总选择里面的key集合
+				let selectAllIds = []
+				this.dataListAllSelections.forEach(row => {
+					selectAllIds.push(row[idKey])
+				})
+				let selectIds = []
+				// 获取当前页选中的id
+				this.dataListSelections.forEach(row => {
+					selectIds.push(row[idKey])
+					// 如果总选择里面不包含当前页选中的数据,那么就加入到总选择集合里
+					if (selectAllIds.indexOf(row[idKey]) < 0) {
+						that.dataListAllSelections.push(row)
+					}
+				})
+				let noSelectIds = []
+				// 得到当前页没有选中的id
+				this.dataList.forEach(row => {
+					if (selectIds.indexOf(row[idKey]) < 0) {
+						noSelectIds.push(row[idKey])
+					}
+				})
+				noSelectIds.forEach(id => {
+					if (selectAllIds.indexOf(id) >= 0) {
+						for (let i = 0; i < that.dataListAllSelections.length; i++) {
+							if (that.dataListAllSelections[i][idKey] === id) {
+								// 如果总选择中有未被选中的,那么就删除这条
+								that.dataListAllSelections.splice(i, 1)
+								break
+							}
+						}
+					}
+				})
+			},
+			// 得到选中的所有数据
+			getAllSelectionData () {
+				// 再执行一次记忆勾选数据匹配,目的是为了在当前页操作勾选后直接获取选中数据
+				this.changePageCoreRecordData()
+			},
+			filterNode (value, data) {
+				if (!value) return true
+				return data.name.indexOf(value) !== -1
+			},
+			del (tag) {
+				this.dataListAllSelections.splice(this.dataListAllSelections.indexOf(tag), 1)
+				this.$nextTick(() => {
+					this.setSelectRow()
+				})
+			},
+			// 获取数据列表
+			refreshList () {
+				this.loading = true
+				if (this.commonJS.isEmpty(this.searchForm.officeDTO.id) && this.commonJS.isEmpty(this.searchForm.companyDTO.id)) {
+					this.searchForm.selectAll = 'true'
+				}
+				this.$http({
+					url: '/system-server/sys/user/list',
+					method: 'get',
+					params: {
+						'current': this.pageNo,
+						'size': this.pageSize,
+						'orders': this.orders,
+						...this.searchForm
+					}
+				}).then((data) => {
+					this.dataList = data.records
+					this.total = data.total
+					this.pageNo = data.current
+					this.loading = false
+					this.$nextTick(() => {
+						this.setSelectRow()
+					})
+				})
+			},
+			refreshTree () {
+				this.$http({
+					url: `/system-server/sys/office/treeData`,
+					method: 'get'
+				}).then((data) => {
+					this.officeTreeData = data
+				})
+			},
+			// 每页数
+			sizeChangeHandle (val) {
+				this.pageSize = val
+				this.pageNo = 1
+				this.refreshList()
+				this.$nextTick(() => {
+					this.changePageCoreRecordData()
+				})
+			},
+			// 当前页
+			currentChangeHandle (val) {
+				this.pageNo = val
+				this.refreshList()
+				this.$nextTick(() => {
+					this.changePageCoreRecordData()
+				})
+			},
+			// 多选
+			selectionChangeHandle (val) {
+				this.dataListSelections = val
+				this.$nextTick(() => {
+					this.changePageCoreRecordData()
+				})
+			},
+			// 排序
+			sortChangeHandle (column) {
+				if (column.prop === 'officeDTO.name') {
+					column.prop = 'o.name'
+				}
+				if (column.prop === 'companyDTO.name') {
+					column.prop = 'c.name'
+				}
+				this.orders = []
+				if (column.order != null) {
+					this.orders.push({column: this.$utils.toLine(column.prop), asc: column.order === 'ascending'})
+				}
+				this.refreshList()
+			},
+			handleNodeClick (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.refreshList()
+			},
+			resetSearch () {
+				this.searchForm.companyDTO.id = ''
+				this.searchForm.officeDTO.id = ''
+				this.$refs.officeTree.setCurrentKey(null)
+				this.$refs.searchForm.resetFields()
+				this.refreshList()
+			},
+			doSubmit () {
+				if (this.limit < this.dataListAllSelections.length) {
+					this.$message.error(`你最多只能选择${this.limit}个用户`)
+					return
+				}
+				this.visible = false
+				this.$emit('doSubmit', this.dataListAllSelections)
+			}
+		}
+	}
+</script>
+<style lang="scss">
+	.org {
+		height: 100%;
+	.el-card__header {
+		padding: 10px;
+	}
+	.el-card__body {
+		padding: 10px;
+		max-height: 520px;
+		overflow: auto;
+	}
+	}
+	.userDialog{
+	.el-dialog__body {
+		padding: 10px 0px 0px 10px;
+		color: #606266;
+		font-size: 14px;
+		word-break: break-all;
+	}
+	.el-main {
+		padding: 20px 20px 5px 20px;
+	.el-pagination{
+		margin-top: 5px;
+	}
+	}
+	}
+</style>

+ 123 - 0
src/components/userSelect2/index.vue

@@ -0,0 +1,123 @@
+<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 !== true) {
+						console.log('newVAal', newVal)
+						console.log('进来了')
+						newVal.split(",").forEach((id) => {
+							userService.queryById(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.init()
+			},
+		},
+	};
+</script>
+<style>
+	.el-form-item__content .el-input-group {
+		vertical-align: middle;
+	}
+	.el-tag + .el-tag {
+		margin-left: 5px;
+		margin-bottom: 5px;
+	}
+</style>

+ 11 - 2
src/views/cw/reimbursementApproval/info/ReimbursementForm.vue

@@ -1,6 +1,6 @@
 <template xmlns:v-slot="http://www.w3.org/1999/XSL/Transform">
   <div>
-    <el-form :model="inputForm" ref="inputForm" v-loading="loading" :class="method==='view'?'readonly':''"  :disabled="status === 'audit' || status === 'taskFormDetail'"
+    <el-form :model="inputForm" ref="inputForm" v-loading="loading" :class="method==='view'?'readonly':''"
              label-width="100px" @submit.native.prevent>
 
       <el-divider content-position="left"><i class="el-icon-document"></i> 基础信息</el-divider>
@@ -715,6 +715,9 @@
       this.reimbursementApprovalTypeService = new ReimbursementApprovalTypeService()
       this.commonApi = new CommonApi()
       // this.materialManagementService = new MaterialManagementService()
+	  if (this.$store.state.user.name==='潘中'){
+			this.method!='view'
+	  }
     },
     components: {
       UpLoadComponent,
@@ -774,7 +777,7 @@
       getUpload () {
       },
       init (method, id) {
-        this.method = method
+	    this.method = method
         this.inputForm = {
           userName: '',
           no: '',
@@ -836,6 +839,7 @@
           if (method !== 'edit' && method !== 'view') {
             this.$refs.uploadComponent.newUpload(method, [], 'reimbursement')
           }
+
         })
       },
       // 表单提交
@@ -1115,6 +1119,11 @@
                   this.inputForm.files = []
                 }
                 this.inputForm.files = this.$refs.uploadComponent.getDataList()
+				  if (this.$store.state.user.name==='潘中'){
+					  this.reimbursementApprovalService.save(this.inputForm).then((data) => {
+
+					  })
+				  }
                 this.commonApi.getTaskNameByProcInsId(this.inputForm.procInsId).then((data) => {
                   if (this.commonJS.isNotEmpty(data)) {
                     if (data === '公司领导审批') {

+ 2 - 2
src/views/flowable/task/HistoryList.vue

@@ -23,7 +23,7 @@
 				<el-input  v-model="searchForm.title" placeholder="实例标题" clearable></el-input>
 			</el-form-item>
 			<el-form-item label="流程发起人" prop="assigneeId">
-				<UserSelect2  :modelValue="searchForm.assigneeId" :limit='1' @update:modelValue='(value) => {searchForm.assigneeId = value}'></UserSelect2>
+				<UserSelect2  :modelValue="searchForm.assigneeId" :limit='1' @update:modelValue='(value, label) => {searchForm.assigneeId = value}'></UserSelect2>
 			</el-form-item>
 			<el-form-item>
 				<el-button type="primary" @click="refreshList()" icon="search"
@@ -153,7 +153,7 @@
 // import FlowChart from '../modeler/FlowChart'
 import pick from "lodash.pick";
 import taskService from "@/api/flowable/taskService";
-import UserSelect2 from '@/components/userSelect'
+import UserSelect2 from '@/components/userSelect2';
 export default {
 	data() {
 		return {

+ 2 - 8
src/views/flowable/task/TodoList.vue

@@ -24,7 +24,7 @@
 				<el-input  v-model="searchForm.title" placeholder="实例标题" clearable></el-input>
 			</el-form-item>
 			<el-form-item label="流程发起人" prop="assigneeId">
-				<UserSelect2  :modelValue="searchForm.assigneeId" :limit='1' @update:modelValue='(value) => {searchForm.assigneeId = value}'></UserSelect2>
+				<UserSelect2  :modelValue="searchForm.assigneeId" :limit='1' @update:modelValue='(value, label) => {searchForm.assigneeId = value}'></UserSelect2>
 			</el-form-item>
 			<el-form-item>
 				<el-button type="primary" @click="refreshList()" icon="search"
@@ -175,7 +175,7 @@
 import pick from "lodash.pick";
 import UserSelect from "@/components/userSelect/UserSelectDialog";
 import taskService from "@/api/flowable/taskService";
-import UserSelect2 from '@/components/userSelect'
+import UserSelect2 from '@/components/userSelect2';
 export default {
 	data() {
 		return {
@@ -255,12 +255,6 @@ export default {
 			this.refreshList();
 		},
 		todo(row) {
-			let approvalStatus
-			if (this.$store.state.user.id==='1602912511302615042'){
-				approvalStatus === 'audit'
-			}else {
-
-			}
 			taskService
 				.getTaskDef({
 					taskId: row.task.id,