Kaynağa Gözat

入职登记功能部分代码提交

徐滕 10 saat önce
ebeveyn
işleme
e3a7dcd10e

+ 2 - 2
api/human/enrollment/EnrollmentRegistrationService.js

@@ -121,11 +121,11 @@ export default {
 			params: {id: id}
 		})
 	},
-	findIdCardOnly (idCard) {
+	findIdCardOnly (idCard,userId) {
 		return request({
 			url: prefix + '/enrollmentRegistration/findIdCardOnly',
 			method: 'get',
-			params: {idCard: idCard}
+			params: {idCard: idCard,id:userId}
 		})
 	},
 	findMobilePhoneOnly (mobilePhone) {

+ 304 - 0
components/treeSelect/treeSelect.vue

@@ -0,0 +1,304 @@
+<template>
+  <el-select v-model="valueTitle" :size="size"  :disabled="disabled" :clearable="clearable" :placeholder="placeholderText" @clear="clearHandle">
+    <el-option :value="valueTitle"  :label="valueTitle" class="options">
+      <el-tree  id="tree-option"
+        ref="selectTree"
+        :accordion="accordion"
+        :data="optionData"
+        :show-checkbox="showCheckbox"
+        :props="props"
+        highlight-current
+        :check-strictly="checkStrictly"
+        :check-on-click-node="checkOnClickNode"
+        :node-key="props.value"
+        :default-expanded-keys="defaultExpandedKey"
+        @check-change="handleCheckChange"
+        @node-click="handleNodeClick">
+      </el-tree>
+    </el-option>
+  </el-select>
+</template>
+
+<script>
+export default {
+  name: 'el-tree-select',
+  props: {
+    /* 配置项 */
+    props: {
+      type: Object,
+      default: () => {
+        return {
+          value: 'id',             // ID字段名
+          label: 'label',         // 显示名称
+          children: 'children'    // 子级字段名
+        }
+      }
+    },
+    /* 选项列表数据(树形结构的对象数组) */
+    data: {
+      type: Array,
+      default: () => { return [] }
+    },
+     /* 选项列表数据(树形结构的对象数组) */
+    list: {
+      type: Array,
+      default: () => { return null }
+    },
+    /* 初始值 */
+    value: {
+      type: String,
+      default: () => { return '' }
+    },
+        /* 初始值 */
+    url: {
+      type: String,
+      default: () => { return null }
+    },
+    disabled: {
+      type: Boolean,
+      dafault: () => { return false }
+    },
+    showCheckbox: {
+      type: Boolean,
+      dafault: () => { return false }
+    },
+    /* 初始值 */
+    label: {
+      type: String,
+      default: () => { return '' }
+    },
+    /* 可清空选项 */
+    clearable: {
+      type: Boolean,
+      default: () => { return true }
+    },
+    /* 自动收起 */
+    accordion: {
+      type: Boolean,
+      default: () => { return false }
+    },
+    size: {
+      type: String,
+      default: () => { return 'small' }
+    },
+    placeholder: {
+      type: String,
+      default: () => { return '请选择' }
+    },
+    isOnlySelectLeaf: {
+      type: Boolean,
+      default: () => {
+        return false
+      }
+    },
+    // 在显示复选框的情况下,是否严格的遵循父子不互相关联的做法,默认为 false
+    checkStrictly: {
+      type: Boolean,
+      default: () => {
+        return false
+      }
+    },
+    // 是否在点击节点的时候选中节点,默认值为 false,即只有在点击复选框时才会选中节点。
+    checkOnClickNode: {
+      type: Boolean,
+      default: () => {
+        return false
+      }
+    }
+  },
+  data () {
+    return {
+      valueId: this.value,    // 初始值
+      valueTitle: this.label,
+      defaultExpandedKey: [],
+      placeholderText: this.placeholder,
+      treeList: [],
+      valueData: this.data
+    }
+  },
+  created () {
+    if (this.url !== null) {
+      this.placeholderText = '加载数据中...'
+      let interval = setInterval(() => {
+        this.placeholderText = this.placeholderText + '.'
+      }, 500)
+      this.$http({
+        url: this.url,
+        method: 'get'
+      }).then((data) => {
+        this.valueData = data
+        this.setTreeList(this.valueData)
+        this.$nextTick(() => {
+          this.initHandle()
+          this.placeholderText = this.placeholder
+          clearInterval(interval)
+        })
+      })
+    } else {
+      this.valueData = this.data
+      this.setTreeList(this.valueData)
+    }
+  },
+  methods: {
+    setTreeList (datas) { // 遍历树  获取id数组
+      for (var i in datas) {
+        this.treeList.push(datas[i])
+        if (datas[i].children) {
+          this.setTreeList(datas[i].children)
+        }
+      }
+    },
+    // 初始化值
+    initHandle () {
+      if (this.valueId) {
+        if (this.showCheckbox) {
+          let ids = this.valueId.split(',')
+          this.$refs.selectTree.setCheckedKeys(ids)
+          let titles = []
+          ids.forEach((id) => {
+            this.treeList.forEach((d) => {
+              if (id === d[this.props.value]) {
+                titles.push(d[this.props.label])
+              }
+            })
+          })
+
+          this.valueTitle = titles.join(',')
+        } else if (this.$refs.selectTree.getNode(this.valueId)) {
+          this.valueTitle = this.$refs.selectTree.getNode(this.valueId).data[this.props.label]     // 初始化显示
+          this.$refs.selectTree.setCurrentKey(this.valueId)       // 设置默认选中
+          this.defaultExpandedKey = [this.valueId]      // 设置默认展开
+        }
+      }
+      this.initScroll()
+    },
+    getNode (id) {
+      return this.$refs.selectTree.getNode(id)
+    },
+    // 初始化滚动条
+    initScroll () {
+      this.$nextTick(() => {
+        let scrollWrap = document.querySelectorAll('.el-scrollbar .el-select-dropdown__wrap')[0]
+        let scrollBar = document.querySelectorAll('.el-scrollbar .el-scrollbar__bar')
+        if (scrollWrap) { scrollWrap.style.cssText = 'margin: 0px; max-height: none; overflow: hidden;' }
+        if (scrollBar) {
+          scrollBar.forEach(ele => {
+          // eslint-disable-next-line no-return-assign
+            return ele.style.width = 0
+          })
+        }
+      })
+    },
+    // 切换选项
+    handleNodeClick (node) {
+      if (this.showCheckbox) {
+        return
+      }
+      if (node['disabled']) {
+        // this.$message.warning('节点(' + node[this.props.label] + ')被禁止选择,请重新选择。')
+        return
+      }
+      if (this.isOnlySelectLeaf && node.children.length > 0) {
+        this.$message.warning('不能选择根节点(' + node[this.props.label] + ')请重新选择。')
+        return
+      }
+      this.valueTitle = node[this.props.label]
+      this.valueId = node[this.props.value]
+      this.$emit('getValue', this.valueId, this.valueTitle, node)
+    },
+    handleCheckChange (data, checked, indeterminate) {
+      let nodes = this.$refs.selectTree.getCheckedNodes()
+      this.valueTitle = nodes.map((node) => {
+        return node[this.props.label]
+      }).join(',')
+      this.valueId = nodes.map((node) => {
+        return node[this.props.value]
+      }).join(',')
+      this.$emit('getValue', this.valueId, this.valueTitle)
+    },
+    // 清除选中
+    clearHandle () {
+      this.valueTitle = ''
+      this.valueId = null
+      this.defaultExpandedKey = []
+      this.clearSelected()
+      this.$emit('getValue', null, null, null)
+    },
+    /* 清空选中样式 */
+    clearSelected () {
+      let allNode = document.querySelectorAll('#tree-option .el-tree-node')
+      allNode.forEach((element) => element.classList.remove('is-current'))
+    }
+  },
+  watch: {
+    value () {
+      this.valueId = this.value
+      if (this.value === '' || this.value === null || this.value === undefined) {
+        this.clearHandle()
+      } else {
+        this.initHandle()
+      }
+    },
+    data () {
+      this.valueData = this.data
+    }
+  },
+  computed: {
+    optionData () {
+      if (this.list) {
+        let cloneData = JSON.parse(JSON.stringify(this.list))      // 对源数据深度克隆
+        return cloneData.filter(father => {                      // 循环所有项,并添加children属性
+          let branchArr = cloneData.filter(child => father.id === child.parentId)       // 返回每一项的子级数组
+            // eslint-disable-next-line no-unused-expressions
+          branchArr.length > 0 ? father.children = branchArr : ''   // 给父级添加一个children属性,并赋值
+          return father.parentId === '0'      // 返回第一层
+        })
+      } else {
+        return this.valueData
+      }
+    }
+  }
+}
+</script>
+
+<!-- Add "scoped" attribute to limit CSS to this component only -->
+<style scoped>
+  .el-select{
+    width: 100%;
+  }
+  .el-scrollbar .el-scrollbar__view .el-select-dropdown__item{
+    height: auto;
+    max-height: 274px;
+    padding: 0;
+    overflow: hidden;
+    overflow-y: auto;
+  }
+  .el-select-dropdown__item.selected{
+    font-weight: normal;
+  }
+  ul li >>>.el-tree .el-tree-node__content{
+    height:auto;
+    padding: 0 20px;
+  }
+  .el-tree-node__label{
+    font-weight: normal;
+  }
+  .el-tree >>>.is-current .el-tree-node__label{
+    color: #409EFF;
+    font-weight: 700;
+  }
+  .el-tree >>>.is-current .el-tree-node__children .el-tree-node__label{
+    color:#606266;
+    font-weight: normal;
+  }
+  /* 开发禁用 */
+  /* .el-tree-node:focus>.el-tree-node__content{
+    background-color:transparent;
+    background-color: #f5f7fa;
+    color: #c0c4cc;
+    cursor: not-allowed;
+  }
+  .el-tree-node__content:hover{
+    background-color: #f5f7fa;
+  } */
+</style>

+ 40 - 13
pages/human/enrollment/registration/EnrollmentRegistrationAddForm.vue

@@ -60,13 +60,33 @@
 						        { label: '群众', value: '13' },
 						    ]"></jp-picker>
 			</u-form-item>
-			
-			<u-form-item label="籍贯" borderBottom prop="nativePlace" :required="true">
-			     <u--input placeholder='请填写籍贯'  v-model="inputForm.nativePlace"></u--input>
-			</u-form-item>
+
+      <u-form-item label="籍贯" borderBottom prop="nativePlace" :required="true"
+                    :rules="[
+											{required: true, message:'籍贯不能为空', trigger:'change'}
+											 ]">
+        <SelectTree
+            ref="areaTree"
+            :props="{
+												  value: 'id',             // ID字段名
+												  label: 'name',         // 显示名称
+												  children: 'children'    // 子级字段名
+											}"
+            url="/system-server/sys/area/treeData"
+            :value="inputForm.nativePlace"
+            :clearable="true"
+            size="large"
+            :accordion="true"
+            @getValue="(value) => {inputForm.nativePlace=value}"/>
+      </u-form-item>
 			
 			<u-form-item label="民族" borderBottom prop="nation" :required="true">
-			     <u--input placeholder='请填写民族'  v-model="inputForm.nation"></u--input>
+        <el-select v-model="inputForm.nation" placeholder="请选择民族" clearable
+                   style="width: 100%;">
+          <el-option v-for="item in $dictUtils.getDictList('sys_nation')"
+                     :key="item.value" :label="item.label" :value="item.value">
+          </el-option>
+        </el-select>
 			</u-form-item>
 			
 			<u-form-item label="婚姻状况" borderBottom prop="maritalStatus" :required="true">
@@ -87,7 +107,7 @@
 			     <u--input placeholder='请填写家庭住址'  v-model="inputForm.homeAddress"></u--input>
 			</u-form-item>
 			
-			<u-form-item label="常住住址" borderBottom prop="permanentAddress" :required="true">
+			<u-form-item label="常住住址" borderBottom prop="permanentAddress" >
 			     <u--input placeholder='请填写常住住址'  v-model="inputForm.permanentAddress"></u--input>
 			</u-form-item>
 			
@@ -151,7 +171,7 @@
 						    ]"></jp-picker>
 			</u-form-item>
 			
-			<u-form-item label="英语等级" borderBottom prop="englishLevel" >
+			<u-form-item label="英语等级" borderBottom prop="englishLevel" :required="true">
 				<jp-picker v-model="inputForm.englishLevel" rangeKey="label" rangeValue="value" :range="[
 						        { label: '无', value: '6' },
 						        { label: '三级', value: '5' },
@@ -225,6 +245,7 @@
 </template>
 
 <script>
+  import SelectTree from '@/components/treeSelect/treeSelect.vue'
 	import enrollmentRegistrationService from '@/api/human/enrollment/EnrollmentRegistrationService'
 	import OSSSerivce, {
 			httpRequest,
@@ -343,13 +364,13 @@
 							trigger: ['blur', 'change']
 						},
 					],
-					'permanentAddress': [
+					/*'permanentAddress': [
 						{
 							required: true,
 							message: '常住住址不能为空',
 							trigger: ['blur', 'change']
 						},
-					],
+					],*/
 					'graduatedFrom': [
 						{
 							required: true,
@@ -441,7 +462,10 @@
 		    deep: false
 		  }
 		},
-		methods: {
+    components: {
+      SelectTree,
+    },
+    methods: {
 			handleAvatarSuccess (res, file, fileList) {
 				this.inputForm.socialSecurityPictureFront = file.response.url
 				this.inputForm.socialSecurityPictureFrontUrl = file.response.lsUrl
@@ -505,7 +529,7 @@
 							this.inputForm.endTime = this.formatDate(this.inputForm.endTime);
 						}
 
-				await enrollmentRegistrationService.findIdCardOnly(this.inputForm.idCard).then((data) => {
+				await enrollmentRegistrationService.findIdCardOnly(this.inputForm.idCard,"").then((data) => {
 					if (data !== 0) {
 						uni.showToast({
 							title: '身份证号码已存在,请重新确认',
@@ -552,7 +576,7 @@
 			//身份证号码唯一性判断
 			idCardOnly(idCard) {
 				if (this.isNotEmpty(idCard)) {
-					enrollmentRegistrationService.findIdCardOnly(idCard).then((data) => {
+					enrollmentRegistrationService.findIdCardOnly(idCard,"").then((data) => {
 						if (data !== 0) {
 							// this.$message.error('身份证号码已存在,请重新确认')
 							// this.inputForm.idCard = ''
@@ -568,6 +592,7 @@
 							this.inputForm.sex = info.sex
 							this.inputForm.age = info.age
 							this.inputForm.birthday = info.birth
+							this.inputForm.nativePlace = info.nativePlace
 						}
 					})
 				}
@@ -649,7 +674,9 @@
 				} else {
 					sex = '1'
 				}
-				return {age, sex, birth}
+        //获取户籍所在地
+        const nativePlace = idCard.substring(0, 6);
+				return {age, sex, birth, nativePlace}
 			},
 			validatePhone (str,callback) {
 				const phone = /(^(\d{3,4}-)?\d{6,8}$)|(^(\d{3,4}-)?\d{6,8}(-\d{1,5})?$)|(^(((13[0-9]{1})|(15[0-9]{1})|(16[0-9]{1})|(18[0-9]{1})|(17[0-9]{1})|(19[0-9]{1}))+\d{8})$)/

+ 65 - 17
pages/human/practice/register/RegistrationAddForm.vue

@@ -16,19 +16,58 @@
 			<u-form-item label="身份证号码" borderBottom prop="idCard" :required="true">
 			     <u--input placeholder='请填写身份证号码'  v-model="inputForm.idCard" @blur="idCardOnly(inputForm.idCard)"></u--input>
 			</u-form-item>
-			<u-form-item label="性别" borderBottom prop="sex" :required="true">
-				<jp-picker v-model="inputForm.sex" rangeKey="label" rangeValue="value" :range="[
-						        { label: '男', value: '1' },
-						        { label: '女', value: '2' }
-						    ]"></jp-picker>
-			</u-form-item>
-			
-			<u-form-item label="出生地" borderBottom prop="nativePlace" :required="true">
-			     <u--input placeholder='请填写出生地'  v-model="inputForm.nativePlace"></u--input>
-			</u-form-item>
-			<u-form-item label="民族" borderBottom prop="nation" :required="true">
-			     <u--input placeholder='请填写民族'  v-model="inputForm.nation"></u--input>
-			</u-form-item>
+      <u-form-item label="性别" borderBottom prop="sex">
+        <jp-picker v-model="inputForm.sex" rangeKey="label" :disabled="true" rangeValue="value" :range="[
+			        { label: '男', value: '1' },
+			        { label: '女', value: '2' }
+			    ]"></jp-picker>
+      </u-form-item>
+
+      <u-form-item label="年龄" borderBottom prop="age">
+        <u--input placeholder='请填写年龄' :disabled="true" v-model="inputForm.age"></u--input>
+      </u-form-item>
+
+      <u-form-item label="出生日期" borderBottom prop="birthday">
+        <el-date-picker
+            v-model="inputForm.birthday"
+            type="date"
+            placeholder="选择出生日期"
+            style="width:100%"
+            size="default"
+            placement="bottom-start"
+            :disabled="true"
+            clearable>
+        </el-date-picker>
+      </u-form-item>
+
+      <u-form-item label="籍贯" borderBottom prop="nativePlace" :required="true"
+                   :rules="[
+											{required: true, message:'籍贯不能为空', trigger:'change'}
+											 ]">
+        <SelectTree
+            ref="areaTree"
+            :props="{
+												  value: 'id',             // ID字段名
+												  label: 'name',         // 显示名称
+												  children: 'children'    // 子级字段名
+											}"
+            url="/system-server/sys/area/treeData"
+            :value="inputForm.nativePlace"
+            :clearable="true"
+            size="large"
+            :accordion="true"
+            @getValue="(value) => {inputForm.nativePlace=value}"/>
+      </u-form-item>
+
+      <u-form-item label="民族" borderBottom prop="nation" :required="true">
+        <el-select v-model="inputForm.nation" placeholder="请选择民族" clearable
+                   style="width: 100%;">
+          <el-option v-for="item in $dictUtils.getDictList('sys_nation')"
+                     :key="item.value" :label="item.label" :value="item.value">
+          </el-option>
+        </el-select>
+      </u-form-item>
+
 			<u-form-item label="政治面貌" borderBottom prop="politicalOutlook" >
 <!--			     <u&#45;&#45;input placeholder='请填写政治面貌'  v-model="inputForm.politicalOutlook"></u&#45;&#45;input>-->
 				<jp-picker v-model="inputForm.politicalOutlook" rangeKey="label" rangeValue="value" :range="[
@@ -301,7 +340,9 @@
 <script>
 	import registerService from '@/api/human/register/RegisterService'
 	import enrollmentRegistrationService from '@/api/human/enrollment/EnrollmentRegistrationService'
+  import SelectTree from "@/components/treeSelect/treeSelect.vue";
 	export default {
+    components: {SelectTree},
 		data () {
 			return {
 				loading: false,
@@ -317,6 +358,8 @@
 					nation: '',
 					mobilePhone: '',
 					idCard: '',
+					age: '',
+          birthday: '',
 					graduatedFrom: '',
 					speciality: '',
 					practiceStartDay: '',
@@ -727,9 +770,12 @@
 							})
 							this.inputForm.idCard = ''
 						} else {
-							const info = this.decomposeIdCard(idCard)
-							this.inputForm.sex = info.sex
-						}
+              const info = this.decomposeIdCard(idCard)
+              this.inputForm.sex = info.sex
+              this.inputForm.age = info.age
+              this.inputForm.birthday = info.birth
+              this.inputForm.nativePlace = info.nativePlace
+            }
 					})
 				}
 
@@ -793,7 +839,9 @@
 				} else {
 					sex = '1'
 				}
-				return {age, sex, birth}
+        //获取户籍所在地
+        const nativePlace = idCard.substring(0, 6);
+        return {age, sex, birth, nativePlace}
 			},
 		}
 	  }

+ 2 - 2
pages/workbench/task/TaskForm.vue

@@ -202,7 +202,7 @@ export default {
 		});
 
 		// 获取当前节点审核人  与  当前登录人的ID 进行对比,如果不是审核人,那么不允许操作
-		let userId = this.userInfo.id
+		/*let userId = this.userInfo.id
 
 		// 获取 URL 中的 'flow' 参数
 		const flowParam = this.$route.query.flow;
@@ -213,7 +213,7 @@ export default {
 			if (!data.includes(userId)) {
 				this.testFlag = true
 			}
-		})
+		})*/
 
 	},
 	async mounted() {