Browse Source

feat:入职登记,人员管理

shenji 2 năm trước cách đây
mục cha
commit
036e40943d

+ 420 - 0
src/views/oa/EnrollmentList.vue

@@ -0,0 +1,420 @@
+<template>
+  <a-card :bordered="false">
+    <!-- 查询区域 -->
+    <div class="table-page-search-wrapper">
+      <a-form layout="inline" @keyup.enter.native="searchQuery">
+        <a-row :gutter="24">
+          <a-col :xl="6" :lg="7" :md="8" :sm="24">
+            <a-form-item label="登记人	">
+              <a-input placeholder="请输入登记人	" v-model="queryParam.operator"></a-input>
+            </a-form-item>
+          </a-col>
+          <a-col :xl="6" :lg="7" :md="8" :sm="24">
+            <a-form-item label="登记部门">
+              <a-input placeholder="请输入登记部门" v-model="queryParam.operatorDept"></a-input>
+            </a-form-item>
+          </a-col>
+          <template v-if="toggleSearchStatus">
+            <a-col :xl="6" :lg="7" :md="8" :sm="24">
+              <a-form-item label="登记日期">
+                <j-date placeholder="请选择登记日期" v-model="queryParam.operateDate"></j-date>
+              </a-form-item>
+            </a-col>
+            <a-col :xl="6" :lg="7" :md="8" :sm="24">
+              <a-form-item label="姓名">
+                <a-input placeholder="请输入姓名" v-model="queryParam.realname"></a-input>
+              </a-form-item>
+            </a-col>
+            <a-col :xl="6" :lg="7" :md="8" :sm="24">
+              <a-form-item label="用户账号">
+                <a-input placeholder="请输入用户账号" v-model="queryParam.username"></a-input>
+              </a-form-item>
+            </a-col>
+            <a-col :xl="6" :lg="7" :md="8" :sm="24">
+              <a-form-item label="性别">
+                <a-select v-model="queryParam.gender" placeholder="请选择性别">
+                  <a-select-option :value="1">男</a-select-option>
+                  <a-select-option :value="2">女</a-select-option>
+                </a-select>
+              </a-form-item>
+            </a-col>
+            <a-col :xl="6" :lg="7" :md="8" :sm="24">
+              <a-form-item label="职务">
+              <j-select-position placeholder="请选择职务" :multiple="false" v-model="queryParam.post" />
+
+              </a-form-item>
+            </a-col>
+            <a-col :xl="6" :lg="7" :md="8" :sm="24">
+              <a-form-item label="职级">
+                <a-input placeholder="请输入职级" v-model="queryParam.postLevel"></a-input>
+              </a-form-item>
+            </a-col>
+            <a-col :xl="6" :lg="7" :md="8" :sm="24">
+              <a-form-item label="岗位类型">
+                <a-select v-model="queryParam.positionType" placeholder="请选择岗位类型">
+                  <a-select-option value="管理类">管理类</a-select-option>
+                  <a-select-option value="专技类">专技类</a-select-option>
+                </a-select>
+              </a-form-item>
+            </a-col>
+            <a-col :xl="6" :lg="7" :md="8" :sm="24">
+              <a-form-item label="部门">
+                <j-select-depart v-model="queryParam.departIds" :trigger-change="true"/>
+              </a-form-item>
+            </a-col>
+          </template>
+          <a-col :xl="6" :lg="7" :md="8" :sm="24">
+            <span style="float: left;overflow: hidden;" class="table-page-search-submitButtons">
+              <a-button type="primary" @click="searchQuery" icon="search">查询</a-button>
+              <a-button type="primary" @click="searchReset" icon="reload" style="margin-left: 8px">重置</a-button>
+              <a @click="handleToggleSearch" style="margin-left: 8px">
+                {{ toggleSearchStatus ? '收起' : '展开' }}
+                <a-icon :type="toggleSearchStatus ? 'up' : 'down'"/>
+              </a>
+            </span>
+          </a-col>
+
+        </a-row>
+      </a-form>
+    </div>
+    <!-- 查询区域-END -->
+    
+    <!-- 操作按钮区域 -->
+    <div class="table-operator">
+      <a-button @click="showUserSelection" type="primary" icon="plus">添加用户</a-button>
+      <!-- <a-button type="primary" icon="download" @click="handleExportXls('入职登记')">导出</a-button>
+      <a-upload name="file" :showUploadList="false" :multiple="false" :headers="tokenHeader" :action="importExcelUrl" @change="handleImportExcel">
+        <a-button type="primary" icon="import">导入</a-button>
+      </a-upload> -->
+      <a-dropdown v-if="selectedRowKeys.length > 0">
+        <a-menu slot="overlay">
+          <a-menu-item key="1" @click="batchDel"><a-icon type="delete"/>删除</a-menu-item>
+        </a-menu>
+        <a-button style="margin-left: 8px"> 批量操作 <a-icon type="down" /></a-button>
+      </a-dropdown>
+    </div>
+
+    <!-- table区域-begin -->
+    <div>
+      <div class="ant-alert ant-alert-info" style="margin-bottom: 16px;">
+        <i class="anticon anticon-info-circle ant-alert-icon"></i> 已选择 <a style="font-weight: 600">{{ selectedRowKeys.length }}</a>项
+        <a style="margin-left: 24px" @click="onClearSelected">清空</a>
+      </div>
+
+      <a-table
+        ref="table"
+        size="middle"
+        :scroll="{x:1800}"
+        bordered
+        rowKey="id"
+        :columns="columns"
+        :dataSource="dataSource"
+        :pagination="ipagination"
+        :loading="loading"
+        :rowSelection="{selectedRowKeys: selectedRowKeys, onChange: onSelectChange}"
+        @change="handleTableChange">
+
+        <template slot="htmlSlot" slot-scope="text">
+          <div v-html="text"></div>
+        </template>
+        <template slot="imgSlot" slot-scope="text">
+          <span v-if="!text" style="font-size: 12px;font-style: italic;">无此图片</span>
+          <img v-else :src="getImgView(text)" height="25px" alt="图片不存在" style="max-width:80px;font-size: 12px;font-style: italic;"/>
+        </template>
+        <template slot="fileSlot" slot-scope="text">
+          <span v-if="!text" style="font-size: 12px;font-style: italic;">无此文件</span>
+          <a-button
+            v-else
+            :ghost="true"
+            type="primary"
+            icon="download"
+            size="small"
+            @click="uploadFile(text)">
+            下载
+          </a-button>
+        </template>
+
+        <span slot="action" slot-scope="text, record">
+          <a @click="handleEdit(record)"  v-if="record.status==1" >编辑</a>
+          <a-divider type="vertical"  v-if="record.status==2" />
+          <a href="javascript:;"  v-if="record.status==2" @click="handleDetail(record)">详情</a>
+
+          <a-divider type="vertical" />
+          <a-dropdown  v-if="record.status==1" >
+            <a class="ant-dropdown-link">更多 <a-icon type="down" /></a>
+            <a-menu slot="overlay">
+              <a-menu-item>
+                <a-popconfirm title="确定删除吗?" @confirm="() => handleDelete(record.id)">
+                  <a>删除</a>
+                </a-popconfirm>
+              </a-menu-item>
+              <a-menu-item>
+                <a-popconfirm title="确定提交吗?" @confirm="() => handleSubmit(record.id)">
+                  <a>提交</a>
+                </a-popconfirm>
+              </a-menu-item>
+            </a-menu>
+          </a-dropdown>
+        </span>
+
+      </a-table>
+    </div>
+
+    <enrollment-modal ref="modalForm" @ok="modalFormOk"></enrollment-modal>
+
+    
+    <a-modal title="新增用户选择" :width="450" :visible="newUserVisible" :closable="false" :maskClosable="false">
+      <template slot="footer">
+        <a-button type="primary" @click="handleAddUser">确认</a-button>
+        <a-button type="primary" @click="newUserVisible = false">取消</a-button>
+      </template>
+
+      <a-form>
+        <a-form-item
+          :labelCol="{ span: 4 }"
+          :wrapperCol="{ span: 20 }"
+          style="margin-bottom:10px"
+        >
+          <!-- <a-tooltip placement="topLeft">
+            <template slot="title">
+              <span>请选择最新添加的用户</span>
+            </template>
+            <a-avatar style="backgroundColor:#87d068" icon="gold" />
+          </a-tooltip> -->
+          <a-select
+            @change="selectUser"
+            placeholder="请选择需要添加的用户"
+            style="margin-left:10px;width: 80%"
+          >
+            <a-icon slot="suffixIcon" type="gold" />
+            <a-select-option v-for="d in newUserList" :key="d.user_id" :value="d.user_id">
+              {{ d.user_cn_name }}  -- {{ d.dept_cn_name }}
+            </a-select-option>
+          </a-select>
+        </a-form-item>
+      </a-form>
+    </a-modal>
+  </a-card>
+</template>
+
+<script>
+
+  import { JeecgListMixin } from '@/mixins/JeecgListMixin'
+  import {putAction,getFileAccessHttpUrl,getAction} from '@/api/manage';
+  import EnrollmentModal from './modules/EnrollmentModal'
+  import JDate from '@/components/jeecg/JDate.vue'
+  import JSelectDepart from '@/components/jeecgbiz/JSelectDepart'
+  import JDictSelectTag from "@/components/dict/JDictSelectTag"
+  import JSelectPosition from '@/components/jeecgbiz/JSelectPosition'
+
+  export default {
+    name: "EnrollmentList",
+    mixins:[JeecgListMixin],
+    components: {
+      JDate,
+      EnrollmentModal,
+      JSelectDepart,
+      JDictSelectTag,
+      JSelectPosition
+    },
+    data () {
+      return {
+        description: '入职登记管理页面',
+        newUserVisible: false,
+        newUserList: [],
+        userSelected:{},
+        // 表头
+        columns: [
+          {
+            title: '#',
+            dataIndex: '',
+            key:'rowIndex',
+            width:60,
+            align:"center",
+            customRender:function (t,r,index) {
+              return parseInt(index)+1;
+            }
+          },
+          {
+            title:'部门',
+            align:"center",
+            dataIndex: 'departIds_dictText'
+          },
+          {
+            title:'姓名',
+            align:"center",
+            dataIndex: 'realname'
+          },
+          {
+            title:'用户账号',
+            align:"center",
+            dataIndex: 'username'
+          },
+          {
+            title:'入职日期',
+            align:"center",
+            dataIndex: 'joinDate',
+            customRender:function (text) {
+              return !text?"":(text.length>10?text.substr(0,10):text)
+            }
+          },
+          {
+            title:'职务',
+            align:"center",
+            dataIndex: 'post'
+          },
+          {
+            title:'职级',
+            align:"center",
+            dataIndex: 'postLevel'
+          },
+          {
+            title:'岗位类型',
+            align:"center",
+            dataIndex: 'positionType'
+          },
+          {
+            title:'手机号码',
+            align:"center",
+            dataIndex: 'mobile'
+          },
+          {
+            title:'座机',
+            align:"center",
+            dataIndex: 'phone'
+          },
+          {
+            title:'联系地址',
+            align:"center",
+            dataIndex: 'address'
+          },
+          {
+            title:'合同起始日期',
+            align:"center",
+            dataIndex: 'contractStart',
+            customRender:function (text) {
+              return !text?"":(text.length>10?text.substr(0,10):text)
+            }
+          },
+          {
+            title:'合同终止日期',
+            align:"center",
+            dataIndex: 'contractEnd',
+            customRender:function (text) {
+              return !text?"":(text.length>10?text.substr(0,10):text)
+            }
+          },
+          {
+            title:'登记人	',
+            align:"center",
+            dataIndex: 'operator'
+          },
+          {
+            title:'登记部门',
+            align:"center",
+            dataIndex: 'operatorDept'
+          },
+          {
+            title:'登记日期',
+            align:"center",
+            dataIndex: 'operateDate',
+            customRender:function (text) {
+              return !text?"":(text.length>10?text.substr(0,10):text)
+            }
+          },
+          {
+            title: '操作',
+            dataIndex: 'action',
+            align:"center",
+            fixed:"right",
+            width:150,
+            scopedSlots: { customRender: 'action' },
+          }
+        ],
+        url: {
+          list: "/oa/enrollment/list",
+          delete: "/oa/enrollment/delete",
+          submit: "/oa/enrollment/submit",
+          deleteBatch: "/oa/enrollment/deleteBatch",
+          exportXlsUrl: "/oa/enrollment/exportXls",
+          importExcelUrl: "oa/enrollment/importExcel",
+        },
+        dictOptions:{},
+      }
+    },
+    computed: {
+      importExcelUrl: function(){
+        return `${window._CONFIG['domianURL']}/${this.url.importExcelUrl}`;
+      }
+    },
+    methods: {
+      initDictConfig(){
+      },
+       
+      showUserSelection(){
+        getAction(`/sys/user/recently/added`)
+          .then(res => {
+            if (res.success) {
+              this.newUserList = res.result
+              // this.newUserList = [
+              //   {
+              //   "user_id": "zhangds5",
+              //   "user_cn_name": "张大山",
+              //   "active_state": "1",
+              //   "update_time": "2022-12-22 10:35:55",
+              //   "dept_code": "c01",
+              //   "dept_cn_name": "办公室",
+              //   "contact": "",
+              //   "email": "",
+              //   "registry_date": "2022-12-19 10:35:55"
+              //   }
+              // ]
+              this.newUserVisible = true;
+            } else {
+              this.$message.error(res.message)
+              this.newUserVisible = false;
+            }
+          })
+          .catch(() => {
+            this.newUserVisible = false;
+          })
+      },
+      selectUser (value) {
+        this.newUserList.forEach(u=>{
+          if(u.user_id == value)
+          this.userSelected = u;
+        })
+      },
+      handleAddUser(){
+        console.log(this.userSelected);
+        let u = this.userSelected;
+        let user = {
+          username : u.user_id,
+          realname: u.user_cn_name,
+        }
+        this.handleEdit(user);
+        this.newUserVisible = false;
+      },
+      handleSubmit(id){
+        let that = this;
+        putAction(this.url.submit,{"id":id}).then((res) => {
+          if (res.success) {
+            that.$message.success(res.message);
+            that.loadData();
+            that.onClearSelected();
+          } else {
+            
+            console.log(res.message);
+            that.$message.warning("提交失败");
+          }
+        }).error((err)=>{
+          console.log(res.message);
+          that.$message.error("提交失败");
+        })
+      }
+    }
+  }
+</script>
+<style scoped>
+  @import '~@assets/less/common.less';
+</style>

+ 2 - 2
src/views/oa/MaterialInDetailList.vue

@@ -60,10 +60,10 @@
     <!-- 操作按钮区域 -->
     <div class="table-operator">
       <a-button @click="handleMultiAdd" type="primary" icon="plus">新增</a-button>
-      <a-button type="primary" icon="download" @click="handleExportXls('物料入库明细')">导出</a-button>
+      <!-- <a-button type="primary" icon="download" @click="handleExportXls('物料入库明细')">导出</a-button>
       <a-upload name="file" :showUploadList="false" :multiple="false" :headers="tokenHeader" :action="importExcelUrl" @change="handleImportExcel">
         <a-button type="primary" icon="import">导入</a-button>
-      </a-upload>
+      </a-upload> -->
       <a-dropdown v-if="selectedRowKeys.length > 0">
         <a-menu slot="overlay">
           <a-menu-item key="1" @click="batchDel"><a-icon type="delete"/>删除</a-menu-item>

+ 2 - 2
src/views/oa/MaterialList.vue

@@ -45,10 +45,10 @@
     <!-- 操作按钮区域 -->
     <div class="table-operator">
       <a-button @click="handleAdd" type="primary" icon="plus">新增</a-button>
-      <a-button type="primary" icon="download" @click="handleExportXls('物料档案')">导出</a-button>
+      <!-- <a-button type="primary" icon="download" @click="handleExportXls('物料档案')">导出</a-button>
       <a-upload name="file" :showUploadList="false" :multiple="false" :headers="tokenHeader" :action="importExcelUrl" @change="handleImportExcel">
         <a-button type="primary" icon="import">导入</a-button>
-      </a-upload>
+      </a-upload> -->
       <a-dropdown v-if="selectedRowKeys.length > 0">
         <a-menu slot="overlay">
           <a-menu-item key="1" @click="batchDel"><a-icon type="delete"/>删除</a-menu-item>

+ 490 - 0
src/views/oa/modules/EnrollmentModal.vue

@@ -0,0 +1,490 @@
+<template>
+  <a-modal
+    :title="title"
+    :width="1600"
+    :visible="visible"
+    :maskClosable="false"
+    :confirmLoading="confirmLoading"
+    @ok="handleOk"
+    @cancel="handleCancel">
+    <a-spin :spinning="confirmLoading">
+      <!-- 主表单区域 -->
+      <a-form :form="form">
+        <a-row>
+
+          <a-col :span="8  ">
+            <a-form-item label="登记人	" :labelCol="labelCol" :wrapperCol="wrapperCol">
+              <j-popup
+                v-decorator="['operator', validatorRules.operator]"
+                :trigger-change="true"
+                org-fields="realname,depart_name"
+                dest-fields="operator,operatorDept"
+                code="user_dept"
+                @callback="popupCallback"/>
+            </a-form-item>
+          </a-col>
+          <a-col :span="8  ">
+            <a-form-item label="登记部门" :labelCol="labelCol" :wrapperCol="wrapperCol">
+              <a-input v-decorator="[ 'operatorDept', validatorRules.operatorDept]" placeholder="请输入登记部门" disabled></a-input>
+            </a-form-item>
+          </a-col>
+          <a-col :span="8  ">
+            <a-form-item label="登记日期" :labelCol="labelCol" :wrapperCol="wrapperCol">
+              <j-date placeholder="请选择登记日期" v-decorator="[ 'operateDate', validatorRules.operateDate]" :trigger-change="true" style="width: 100%"/>
+            </a-form-item>
+          </a-col>
+          <a-col :span="8  ">
+            <a-form-item label="姓名" :labelCol="labelCol" :wrapperCol="wrapperCol">
+              <a-input v-decorator="[ 'realname', validatorRules.realname]" placeholder="请输入姓名"></a-input>
+            </a-form-item>
+          </a-col>
+          <a-col :span="8  ">
+            <a-form-item label="用户账号" :labelCol="labelCol" :wrapperCol="wrapperCol">
+              <a-input v-decorator="[ 'username', validatorRules.username]" placeholder="请输入用户账号" disabled></a-input>
+            </a-form-item>
+          </a-col>
+          <a-col :span="8  ">
+            <a-form-item label="性别" :labelCol="labelCol" :wrapperCol="wrapperCol">
+              <a-select v-decorator="['gender', validatorRules.gender]" placeholder="请选择性别">
+                <a-select-option :value="1">男</a-select-option>
+                <a-select-option :value="2">女</a-select-option>
+              </a-select>
+            </a-form-item>
+          </a-col>
+          <a-col :span="8  ">
+            <a-form-item label="证件类型" :labelCol="labelCol" :wrapperCol="wrapperCol">
+              <a-select v-decorator="['idType', validatorRules.idType]" placeholder="请选择证件类型">
+                <a-select-option value="身份证">身份证</a-select-option>
+                <a-select-option value="其他">其他</a-select-option>
+              </a-select>
+            </a-form-item>
+          </a-col>
+          <a-col :span="8  ">
+            <a-form-item label="证件号码" :labelCol="labelCol" :wrapperCol="wrapperCol">
+              <a-input v-decorator="[ 'idNo', validatorRules.idNo]" placeholder="请输入证件号码"></a-input>
+            </a-form-item>
+          </a-col>
+          <a-col :span="8  ">
+            <a-form-item label="生日" :labelCol="labelCol" :wrapperCol="wrapperCol">
+              <j-date placeholder="请选择生日" v-decorator="[ 'birthday', validatorRules.birthday]" :trigger-change="true" style="width: 100%"/>
+            </a-form-item>
+          </a-col>
+          <a-col :span="8  ">
+            <a-form-item label="入职日期" :labelCol="labelCol" :wrapperCol="wrapperCol">
+              <j-date placeholder="请选择入职日期" v-decorator="[ 'joinDate', validatorRules.joinDate]" :trigger-change="true" style="width: 100%"/>
+            </a-form-item>
+          </a-col>
+          <a-col :span="8  ">
+            <a-form-item label="职务" :labelCol="labelCol" :wrapperCol="wrapperCol">
+              <j-select-position placeholder="请选择职务" :multiple="false" v-decorator="['post', validatorRules.post]" />
+            </a-form-item>
+          </a-col>
+          <a-col :span="8  ">
+            <a-form-item label="职级" :labelCol="labelCol" :wrapperCol="wrapperCol">
+              <a-input v-decorator="[ 'postLevel', validatorRules.postLevel]" placeholder="请输入职级"></a-input>
+            </a-form-item>
+          </a-col>
+          <a-col :span="8  ">
+            <a-form-item label="学历" :labelCol="labelCol" :wrapperCol="wrapperCol">
+              <a-input v-decorator="[ 'education', validatorRules.education]" placeholder="请输入学历"></a-input>
+            </a-form-item>
+          </a-col>
+          <a-col :span="8  ">
+            <a-form-item label="岗位类型" :labelCol="labelCol" :wrapperCol="wrapperCol">
+              <a-select v-decorator="['positionType', validatorRules.positionType]" placeholder="请选择岗位类型">
+                <a-select-option value="管理类">管理类</a-select-option>
+                <a-select-option value="专技类">专技类</a-select-option>
+              </a-select>
+            </a-form-item>
+          </a-col>
+          <a-col :span="8  ">
+            <a-form-item label="部门" :labelCol="labelCol" :wrapperCol="wrapperCol">
+              <j-select-depart v-decorator="['departIds', validatorRules.departIds]" :trigger-change="true"/>
+            </a-form-item>
+          </a-col>
+          <a-col :span="8  ">
+            <a-form-item label="手机号码" :labelCol="labelCol" :wrapperCol="wrapperCol">
+              <a-input v-decorator="[ 'mobile', validatorRules.mobile]" placeholder="请输入手机号码"></a-input>
+            </a-form-item>
+          </a-col>
+          <a-col :span="8  ">
+            <a-form-item label="座机" :labelCol="labelCol" :wrapperCol="wrapperCol">
+              <a-input v-decorator="[ 'phone', validatorRules.phone]" placeholder="请输入座机"></a-input>
+            </a-form-item>
+          </a-col>
+          <a-col :span="8  ">
+            <a-form-item label="联系地址" :labelCol="labelCol" :wrapperCol="wrapperCol">
+              <a-input v-decorator="[ 'address', validatorRules.address]" placeholder="请输入联系地址"></a-input>
+            </a-form-item>
+          </a-col>
+          <a-col :span="8  ">
+            <a-form-item label="试用结束日期" :labelCol="labelCol" :wrapperCol="wrapperCol">
+              <j-date placeholder="请选择试用结束日期" v-decorator="[ 'probationEnd', validatorRules.probationEnd]" :trigger-change="true" style="width: 100%"/>
+            </a-form-item>
+          </a-col>
+          <a-col :span="8  ">
+            <a-form-item label="合同起始日期" :labelCol="labelCol" :wrapperCol="wrapperCol">
+              <j-date placeholder="请选择合同起始日期" v-decorator="[ 'contractStart', validatorRules.contractStart]" :trigger-change="true" style="width: 100%"/>
+            </a-form-item>
+          </a-col>
+          <a-col :span="8  ">
+            <a-form-item label="合同结束日期" :labelCol="labelCol" :wrapperCol="wrapperCol">
+              <j-date placeholder="请选择合同结束日期" v-decorator="[ 'contractEnd', validatorRules.contractEnd]" :trigger-change="true" style="width: 100%"/>
+            </a-form-item>
+          </a-col>
+          <a-col :span="8  ">
+            <a-form-item label="身份" :labelCol="labelCol" :wrapperCol="wrapperCol">
+              <a-radio-group  v-decorator="[ 'identity', validatorRules.identity]">
+                <a-radio :value="1">普通用户</a-radio>
+                <a-radio :value="2">上级</a-radio>
+              </a-radio-group>
+            </a-form-item>
+          </a-col>
+          <a-col :span="8  ">
+            <a-form-item label="备注" :labelCol="labelCol" :wrapperCol="wrapperCol">
+              <a-input v-decorator="[ 'remark', validatorRules.remark]" placeholder="请输入备注"></a-input>
+            </a-form-item>
+          </a-col>
+          <a-col :span="8  ">
+            <a-form-item label="签字图片" :labelCol="labelCol" :wrapperCol="wrapperCol">
+              <j-upload v-decorator="['signature', validatorRules.signature]" :trigger-change="true"></j-upload>
+            </a-form-item>
+          </a-col>
+          <a-col :span="8  ">
+            <a-form-item label="附件" :labelCol="labelCol" :wrapperCol="wrapperCol">
+              <j-upload v-decorator="['attachment', validatorRules.attachment]" :trigger-change="true"></j-upload>
+            </a-form-item>
+          </a-col>
+
+        </a-row>
+      </a-form>
+
+      <!-- 子表单区域 -->
+      <a-tabs v-model="activeKey" @change="handleChangeTabs">
+        
+        <a-tab-pane tab="联系人" :key="refKeys[0]" :forceRender="true">
+          <j-editable-table
+            :ref="refKeys[0]"
+            :loading="enrollmentContactTable.loading"
+            :columns="enrollmentContactTable.columns"
+            :dataSource="enrollmentContactTable.dataSource"
+            :maxHeight="300"
+            :rowNumber="true"
+            :rowSelection="true"
+            :actionButton="true"/>
+        </a-tab-pane>
+
+        <a-tab-pane tab="工作经历" :key="refKeys[1]" :forceRender="true">
+          <j-editable-table
+            :ref="refKeys[1]"
+            :loading="enrollmentJobTable.loading"
+            :columns="enrollmentJobTable.columns"
+            :dataSource="enrollmentJobTable.dataSource"
+            :maxHeight="300"
+            :rowNumber="true"
+            :rowSelection="true"
+            :actionButton="true"/>
+        </a-tab-pane>
+        
+        <a-tab-pane tab="学习经历" :key="refKeys[2]" :forceRender="true">
+          <j-editable-table
+            :ref="refKeys[2]"
+            :loading="enrollmentEduTable.loading"
+            :columns="enrollmentEduTable.columns"
+            :dataSource="enrollmentEduTable.dataSource"
+            :maxHeight="300"
+            :rowNumber="true"
+            :rowSelection="true"
+            :actionButton="true"/>
+        </a-tab-pane>
+        
+      </a-tabs>
+
+    </a-spin>
+  </a-modal>
+</template>
+
+<script>
+
+  import pick from 'lodash.pick'
+  import { FormTypes,getRefPromise } from '@/utils/JEditableTableUtil'
+  import { JEditableTableMixin } from '@/mixins/JEditableTableMixin'
+  import { validateDuplicateValue } from '@/utils/util'
+  import JDate from '@/components/jeecg/JDate'  
+  import JUpload from '@/components/jeecg/JUpload'
+  import JSelectDepart from '@/components/jeecgbiz/JSelectDepart'
+  import JDictSelectTag from "@/components/dict/JDictSelectTag"
+  import JSelectPosition from '@/components/jeecgbiz/JSelectPosition'
+
+  export default {
+    name: 'EnrollmentModal',
+    mixins: [JEditableTableMixin],
+    components: {
+      JDate,
+      JUpload,
+      JSelectDepart,
+      JDictSelectTag,
+      JSelectPosition
+    },
+    data() {
+      return {
+        labelCol: {
+          span: 6
+        },
+        wrapperCol: {
+          span: 16
+        },
+        labelCol2: {
+          span: 3
+        },
+        wrapperCol2: {
+          span: 20
+        },
+        // 新增时子表默认添加几行空数据
+        addDefaultRowNum: 1,
+        validatorRules: {
+          operator: {rules: [
+            {required: true, message: '请输入登记人	!'},
+          ]},
+          operatorDept: {rules: [
+          ]},
+          operateDate: {rules: [
+            {required: true, message: '请输入登记日期!'},
+          ]},
+          realname: {rules: [
+          ]},
+          username: {rules: [
+          ]},
+          gender: {rules: [
+            {required: true, message: '请输入性别!'},
+          ]},
+          idType: {rules: [
+            {required: true, message: '请输入证件类型!'},
+          ]},
+          idNo: {rules: [
+            {required: true, message: '请输入证件号码!'},
+          ]},
+          birthday: {rules: [
+            {required: true, message: '请输入生日!'},
+          ]},
+          joinDate: {rules: [
+            {required: true, message: '请输入入职日期!'},
+          ]},
+          post: {rules: [
+            {required: true, message: '请输入职务!'},
+          ]},
+          postLevel: {rules: [
+            {required: true, message: '请输入职级!'},
+          ]},
+          education: {rules: [
+            {required: true, message: '请输入学历!'},
+          ]},
+          positionType: {rules: [
+            {required: true, message: '请输入岗位类型!'},
+          ]},
+          departIds: {rules: [
+            {required: true, message: '请输入部门!'},
+          ]},
+          mobile: {rules: [
+          ]},
+          phone: {rules: [
+          ]},
+          address: {rules: [
+          ]},
+          probationEnd: {rules: [
+            {required: true, message: '请输入试用结束日期!'},
+          ]},
+          contractStart: {rules: [
+            {required: true, message: '请输入合同起始日期!'},
+          ]},
+          contractEnd: {rules: [
+            {required: true, message: '请输入合同结束日期!'},
+          ]},
+          remark: {rules: [
+          ]},
+          identity: {rules: [
+          ]},
+          signature: {rules: [
+          ]},
+          attachment: {rules: [
+          ]},
+        },
+        refKeys: ['enrollmentContact', 'enrollmentJob', 'enrollmentEdu', ],
+        tableKeys:['enrollmentContact', 'enrollmentJob', 'enrollmentEdu', ],
+        activeKey: 'enrollmentContact',
+        // 工作经历
+        enrollmentJobTable: {
+          loading: false,
+          dataSource: [],
+          columns: [
+            {
+              title: '单位',
+              key: 'company',
+              type: FormTypes.input,
+              width:"200px",
+              placeholder: '请输入${title}',
+              defaultValue: '',
+            },
+            {
+              title: '职位',
+              key: 'position',
+              type: FormTypes.input,
+              width:"200px",
+              placeholder: '请输入${title}',
+              defaultValue: '',
+            },
+            {
+              title: '起始日期',
+              key: 'startDate',
+              type: FormTypes.date,
+              width:"200px",
+              placeholder: '请输入${title}',
+              defaultValue: '',
+            },
+            {
+              title: '截止日期',
+              key: 'endDate',
+              type: FormTypes.date,
+              width:"200px",
+              placeholder: '请输入${title}',
+              defaultValue: '',
+            },
+          ]
+        },
+        // 联系人
+        enrollmentContactTable: {
+          loading: false,
+          dataSource: [],
+          columns: [
+            {
+              title: '姓名',
+              key: 'name',
+              type: FormTypes.input,
+              width:"200px",
+              placeholder: '请输入${title}',
+              defaultValue: '',
+            },
+            {
+              title: '关系',
+              key: 'relation',
+              type: FormTypes.input,
+              width:"200px",
+              placeholder: '请输入${title}',
+              defaultValue: '',
+            },
+            {
+              title: '性别',
+              key: 'sex',
+              type: FormTypes.input,
+              width:"200px",
+              placeholder: '请输入${title}',
+              defaultValue: '',
+            },
+            {
+              title: '联系方式',
+              key: 'phone',
+              type: FormTypes.input,
+              width:"200px",
+              placeholder: '请输入${title}',
+              defaultValue: '',
+            },
+            {
+              title: '职业',
+              key: 'career',
+              type: FormTypes.input,
+              width:"200px",
+              placeholder: '请输入${title}',
+              defaultValue: '',
+            },
+          ]
+        },
+        // 学习经历
+        enrollmentEduTable: {
+          loading: false,
+          dataSource: [],
+          columns: [
+            {
+              title: '学校',
+              key: 'school',
+              type: FormTypes.input,
+              width:"200px",
+              placeholder: '请输入${title}',
+              defaultValue: '',
+            },
+            {
+              title: '起始日期',
+              key: 'startDate',
+              type: FormTypes.date,
+              width:"200px",
+              placeholder: '请输入${title}',
+              defaultValue: '',
+            },
+            {
+              title: '截止日期',
+              key: 'endDate',
+              type: FormTypes.date,
+              width:"200px",
+              placeholder: '请输入${title}',
+              defaultValue: '',
+            },
+          ]
+        },
+        url: {
+          add: "/oa/enrollment/add",
+          edit: "/oa/enrollment/edit",
+          enrollmentJob: {
+            list: '/oa/enrollment/queryEnrollmentJobByMainId'
+          },
+          enrollmentContact: {
+            list: '/oa/enrollment/queryEnrollmentContactByMainId'
+          },
+          enrollmentEdu: {
+            list: '/oa/enrollment/queryEnrollmentEduByMainId'
+          },
+        }
+      }
+    },
+    methods: {
+      getAllTable() {
+        let values = this.tableKeys.map(key => getRefPromise(this, key))
+        return Promise.all(values)
+      },
+      /** 调用完edit()方法之后会自动调用此方法 */
+      editAfter() {
+        let fieldval = pick(this.model,'operator','operatorDept','operateDate','realname','username','gender','idType','idNo','birthday','joinDate','post','postLevel','education','positionType','departIds','mobile','phone','address','probationEnd','contractStart','contractEnd','remark','identity','signature','attachment')
+        this.$nextTick(() => {
+          this.form.setFieldsValue(fieldval)
+        })
+        // 加载子表数据
+        if (this.model.id) {
+          let params = { id: this.model.id }
+          this.requestSubTableData(this.url.enrollmentJob.list, params, this.enrollmentJobTable)
+          this.requestSubTableData(this.url.enrollmentContact.list, params, this.enrollmentContactTable)
+          this.requestSubTableData(this.url.enrollmentEdu.list, params, this.enrollmentEduTable)
+        }
+      },
+      /** 整理成formData */
+      classifyIntoFormData(allValues) {
+        debugger
+        let main = Object.assign(this.model, allValues.formValue)
+
+        return {
+          ...main, // 展开
+          enrollmentContactList: allValues.tablesValue[0].values,
+          enrollmentJobList: allValues.tablesValue[1].values,
+          enrollmentEduList: allValues.tablesValue[2].values,
+        }
+      },
+      validateError(msg){
+        this.$message.error(msg)
+      },
+     popupCallback(row){
+       this.form.setFieldsValue(pick(row,'operator','operatorDept','operateDate','realname','username','gender','idType','idNo','birthday','joinDate','post','postLevel','education','positionType','departIds','mobile','phone','address','probationEnd','contractStart','contractEnd','remark','identity','signature','attachment'))
+     },
+
+    }
+  }
+</script>
+
+<style scoped>
+</style>

+ 269 - 0
src/views/system/NewUserList.vue

@@ -0,0 +1,269 @@
+<template>
+  <a-card :bordered="false">
+    <!-- 查询区域 -->
+    <div class="table-page-search-wrapper">
+      <a-form layout="inline" @keyup.enter.native="searchQuery">
+        <a-row :gutter="24">
+          <a-col :xl="6" :lg="7" :md="8" :sm="24">
+            <a-form-item label="姓名">
+              <a-input placeholder="请输入姓名" v-model="queryParam.realname"></a-input>
+            </a-form-item>
+          </a-col>
+          <a-col :xl="6" :lg="7" :md="8" :sm="24">
+            <a-form-item label="用户账号">
+              <a-input placeholder="请输入用户账号" v-model="queryParam.username"></a-input>
+            </a-form-item>
+          </a-col>
+          <a-col :xl="6" :lg="7" :md="8" :sm="24">
+            <a-form-item label="部门">
+              <j-select-depart  v-model="queryParam.departIds" :trigger-change="true"/>
+
+            </a-form-item>
+          </a-col>
+          <a-col :xl="6" :lg="7" :md="8" :sm="24">
+            <a-form-item label="职务">
+              <j-select-position placeholder="请选择职务" :multiple="false"  v-model="queryParam.post" />
+
+            </a-form-item>
+          </a-col>
+          <a-col :xl="6" :lg="7" :md="8" :sm="24">
+            <a-form-item label="职级">
+              <a-input placeholder="请输入职级" v-model="queryParam.postLevel"></a-input>
+            </a-form-item>
+          </a-col>
+          <a-col :xl="6" :lg="7" :md="8" :sm="24">
+            <a-form-item label="岗位类型">
+              <a-select v-model="queryParam.positionType" placeholder="请选择岗位类型">
+                <a-select-option value="管理类">管理类</a-select-option>
+                <a-select-option value="专技类">专技类</a-select-option>
+              </a-select>
+            </a-form-item>
+          </a-col>
+          <a-col :xl="6" :lg="7" :md="8" :sm="24">
+            <span style="float: left;overflow: hidden;" class="table-page-search-submitButtons">
+              <a-button type="primary" @click="searchQuery" icon="search">查询</a-button>
+              <a-button type="primary" @click="searchReset" icon="reload" style="margin-left: 8px">重置</a-button>
+              <!-- <a @click="handleToggleSearch" style="margin-left: 8px">
+                {{ toggleSearchStatus ? '收起' : '展开' }}
+                <a-icon :type="toggleSearchStatus ? 'up' : 'down'"/>
+              </a> -->
+            </span>
+          </a-col>
+
+        </a-row>
+      </a-form>
+    </div>
+    <!-- 查询区域-END -->
+    
+    <!-- 操作按钮区域 -->
+    <div class="table-operator">
+      <!-- <a-button @click="handleAdd" type="primary" icon="plus">新增</a-button>
+      <a-button type="primary" icon="download" @click="handleExportXls('入职登记')">导出</a-button>
+      <a-upload name="file" :showUploadList="false" :multiple="false" :headers="tokenHeader" :action="importExcelUrl" @change="handleImportExcel">
+        <a-button type="primary" icon="import">导入</a-button>
+      </a-upload> -->
+      <a-dropdown v-if="selectedRowKeys.length > 0">
+        <a-menu slot="overlay">
+          <a-menu-item key="1" @click="batchDel"><a-icon type="delete"/>删除</a-menu-item>
+        </a-menu>
+        <a-button style="margin-left: 8px"> 批量操作 <a-icon type="down" /></a-button>
+      </a-dropdown>
+    </div>
+
+    <!-- table区域-begin -->
+    <div>
+      <div class="ant-alert ant-alert-info" style="margin-bottom: 16px;">
+        <i class="anticon anticon-info-circle ant-alert-icon"></i> 已选择 <a style="font-weight: 600">{{ selectedRowKeys.length }}</a>项
+        <a style="margin-left: 24px" @click="onClearSelected">清空</a>
+      </div>
+
+      <a-table
+        ref="table"
+        size="middle"
+        bordered
+        rowKey="id"
+        :columns="columns"
+        :dataSource="dataSource"
+        :pagination="ipagination"
+        :loading="loading"
+        :rowSelection="{selectedRowKeys: selectedRowKeys, onChange: onSelectChange}"
+        @change="handleTableChange">
+
+        <template slot="htmlSlot" slot-scope="text">
+          <div v-html="text"></div>
+        </template>
+        <template slot="imgSlot" slot-scope="text">
+          <span v-if="!text" style="font-size: 12px;font-style: italic;">无此图片</span>
+          <img v-else :src="getImgView(text)" height="25px" alt="图片不存在" style="max-width:80px;font-size: 12px;font-style: italic;"/>
+        </template>
+        <template slot="fileSlot" slot-scope="text">
+          <span v-if="!text" style="font-size: 12px;font-style: italic;">无此文件</span>
+          <a-button
+            v-else
+            :ghost="true"
+            type="primary"
+            icon="download"
+            size="small"
+            @click="uploadFile(text)">
+            下载
+          </a-button>
+        </template>
+
+        <span slot="action" slot-scope="text, record">
+          <a @click="handleEdit(record)">编辑</a>
+
+          <a-divider type="vertical" />
+          <a-dropdown>
+            <a class="ant-dropdown-link">更多 <a-icon type="down" /></a>
+            <a-menu slot="overlay">
+              <a-menu-item>
+                <a-popconfirm title="确定删除吗?" @confirm="() => handleDelete(record.id)">
+                  <a>删除</a>
+                </a-popconfirm>
+              </a-menu-item>
+            </a-menu>
+          </a-dropdown>
+        </span>
+
+      </a-table>
+    </div>
+
+    <sysUser-modal ref="modalForm" @ok="modalFormOk"></sysUser-modal>
+  </a-card>
+</template>
+
+<script>
+
+  import { JeecgListMixin } from '@/mixins/JeecgListMixin'
+  import SysUserModal from './modules/NewUserModal'
+  import JDictSelectTag from '@/components/dict/JDictSelectTag.vue'
+  import JDate from '@/components/jeecg/JDate.vue'
+  import JSelectDepart from '@/components/jeecgbiz/JSelectDepart'
+  import JSelectPosition from '@/components/jeecgbiz/JSelectPosition'
+
+  export default {
+    name: "SysUserList",
+    mixins:[JeecgListMixin],
+    components: {
+      JDictSelectTag,
+      JDate,
+      SysUserModal,
+      JSelectDepart,
+      JSelectPosition
+    },
+    data () {
+      return {
+        description: '入职登记管理页面',
+        // 表头
+        columns: [
+          {
+            title: '#',
+            dataIndex: '',
+            key:'rowIndex',
+            width:60,
+            align:"center",
+            customRender:function (t,r,index) {
+              return parseInt(index)+1;
+            }
+          },
+          {
+            title:'部门',
+            align:"center",
+            dataIndex: 'departIds_dictText'
+          },
+          {
+            title:'姓名',
+            align:"center",
+            dataIndex: 'realname'
+          },
+          {
+            title:'用户账号',
+            align:"center",
+            dataIndex: 'username'
+          },
+          {
+            title:'入职日期',
+            align:"center",
+            dataIndex: 'joinDate',
+            customRender:function (text) {
+              return !text?"":(text.length>10?text.substr(0,10):text)
+            }
+          },
+          {
+            title:'职务',
+            align:"center",
+            dataIndex: 'post'
+          },
+          {
+            title:'职级',
+            align:"center",
+            dataIndex: 'postLevel'
+          },
+          {
+            title:'岗位类型',
+            align:"center",
+            dataIndex: 'positionType'
+          },
+          {
+            title:'手机号码',
+            align:"center",
+            dataIndex: 'mobile'
+          },
+          {
+            title:'座机',
+            align:"center",
+            dataIndex: 'phone'
+          },
+          {
+            title:'联系地址',
+            align:"center",
+            dataIndex: 'address'
+          },
+          {
+            title:'合同起始日期',
+            align:"center",
+            dataIndex: 'contractStart',
+            customRender:function (text) {
+              return !text?"":(text.length>10?text.substr(0,10):text)
+            }
+          },
+          {
+            title:'合同终止日期',
+            align:"center",
+            dataIndex: 'contractEnd',
+            customRender:function (text) {
+              return !text?"":(text.length>10?text.substr(0,10):text)
+            }
+          },
+          {
+            title: '操作',
+            dataIndex: 'action',
+            align:"center",
+            scopedSlots: { customRender: 'action' },
+          }
+        ],
+        url: {
+          list: "/sys/user/list",
+          delete: "/sys/user/delete",
+          deleteBatch: "/sys/user/deleteBatch",
+          exportXlsUrl: "/sys/user/exportXls",
+          importExcelUrl: "sys/user/importExcel",
+        },
+        dictOptions:{},
+      }
+    },
+    computed: {
+      importExcelUrl: function(){
+        return `${window._CONFIG['domianURL']}/${this.url.importExcelUrl}`;
+      }
+    },
+    methods: {
+      initDictConfig(){
+      }
+       
+    }
+  }
+</script>
+<style scoped>
+  @import '~@assets/less/common.less';
+</style>

+ 1 - 1
src/views/system/UserList.vue

@@ -223,7 +223,7 @@
 </template>
 
 <script>
-  import UserModal from './modules/NewUserModal'
+  import UserModal from './modules/UserModalNew'
   import PasswordModal from './modules/PasswordModal'
   import {putAction,getFileAccessHttpUrl,getAction} from '@/api/manage';
   import {frozenBatch} from '@/api/api'

+ 441 - 884
src/views/system/modules/NewUserModal.vue

@@ -1,913 +1,470 @@
 <template>
   <a-modal
     :title="title"
-    width="75%"
-    :closable="true"
-    @cancel="close"
-    @ok="handleSubmit"
+    :width="1600"
     :visible="visible"
-  >
-    <template slot="title">
-      <div style="width: 100%;">
-        <span>{{ title }}</span>
-        <span style="display:inline-block;width:calc(100% - 51px);padding-right:10px;text-align: right">
-          <a-button @click="toggleScreen" icon="appstore" style="height:20px;width:20px;border:0px"></a-button>
-        </span>
-      </div>
-    </template>
-
+    :maskClosable="false"
+    :confirmLoading="confirmLoading"
+    @ok="handleOk"
+    @cancel="handleCancel">
     <a-spin :spinning="confirmLoading">
+      <!-- 主表单区域 -->
       <a-form :form="form">
+        <a-row>
+
+            <a-col :span="8  ">
+            <a-form-item label="姓名" :labelCol="labelCol" :wrapperCol="wrapperCol">
+              <a-input v-decorator="[ 'realname', validatorRules.realname]" placeholder="请输入姓名"></a-input>
+            </a-form-item>
+          </a-col>
+          <a-col :span="8  ">
+            <a-form-item label="用户账号" :labelCol="labelCol" :wrapperCol="wrapperCol">
+              <a-input v-decorator="[ 'username', validatorRules.username]" placeholder="请输入用户账号" disabled></a-input>
+            </a-form-item>
+          </a-col>
+          <a-col :span="8  ">
+            <a-form-item label="性别" :labelCol="labelCol" :wrapperCol="wrapperCol">
+              <a-select v-decorator="['sex', validatorRules.sex]" placeholder="请选择性别">
+                <a-select-option :value="1">男</a-select-option>
+                <a-select-option :value="2">女</a-select-option>
+              </a-select>
+            </a-form-item>
+          </a-col>
+          <a-col :span="8  ">
+            <a-form-item label="证件类型" :labelCol="labelCol" :wrapperCol="wrapperCol">
+              <a-select v-decorator="['idType', validatorRules.idType]" placeholder="请选择证件类型">
+                <a-select-option value="身份证">身份证</a-select-option>
+                <a-select-option value="其他">其他</a-select-option>
+              </a-select>
+            </a-form-item>
+          </a-col>
+          <a-col :span="8  ">
+            <a-form-item label="证件号码" :labelCol="labelCol" :wrapperCol="wrapperCol">
+              <a-input v-decorator="[ 'idNo', validatorRules.idNo]" placeholder="请输入证件号码"></a-input>
+            </a-form-item>
+          </a-col>
+          <a-col :span="8  ">
+            <a-form-item label="生日" :labelCol="labelCol" :wrapperCol="wrapperCol">
+              <j-date placeholder="请选择生日" v-decorator="[ 'birthday', validatorRules.birthday]" :trigger-change="true" style="width: 100%"/>
+            </a-form-item>
+          </a-col>
+          <a-col :span="8  ">
+            <a-form-item label="入职日期" :labelCol="labelCol" :wrapperCol="wrapperCol">
+              <j-date placeholder="请选择入职日期" v-decorator="[ 'joinDate', validatorRules.joinDate]" :trigger-change="true" style="width: 100%"/>
+            </a-form-item>
+          </a-col>
+          <a-col :span="8  ">
+            <a-form-item label="职务" :labelCol="labelCol" :wrapperCol="wrapperCol">
+              <j-select-position placeholder="请选择职务" :multiple="false" v-decorator="['post', validatorRules.post]" />
+            </a-form-item>
+          </a-col>
+          <a-col :span="8  ">
+            <a-form-item label="职级" :labelCol="labelCol" :wrapperCol="wrapperCol">
+              <a-input v-decorator="[ 'postLevel', validatorRules.postLevel]" placeholder="请输入职级"></a-input>
+            </a-form-item>
+          </a-col>
+          <a-col :span="8  ">
+            <a-form-item label="学历" :labelCol="labelCol" :wrapperCol="wrapperCol">
+              <a-input v-decorator="[ 'education', validatorRules.education]" placeholder="请输入学历"></a-input>
+            </a-form-item>
+          </a-col>
+          <a-col :span="8  ">
+            <a-form-item label="岗位类型" :labelCol="labelCol" :wrapperCol="wrapperCol">
+              <a-select v-decorator="['positionType', validatorRules.positionType]" placeholder="请选择岗位类型">
+                <a-select-option value="管理类">管理类</a-select-option>
+                <a-select-option value="专技类">专技类</a-select-option>
+              </a-select>
+            </a-form-item>
+          </a-col>
+          <a-col :span="8  ">
+            <a-form-item label="部门" :labelCol="labelCol" :wrapperCol="wrapperCol">
+              <j-select-depart v-decorator="['departIds', validatorRules.departIds]" :trigger-change="true"/>
+            </a-form-item>
+          </a-col>
+          <a-col :span="8  ">
+            <a-form-item label="手机号码" :labelCol="labelCol" :wrapperCol="wrapperCol">
+              <a-input v-decorator="[ 'mobile', validatorRules.mobile]" placeholder="请输入手机号码"></a-input>
+            </a-form-item>
+          </a-col>
+          <a-col :span="8  ">
+            <a-form-item label="座机" :labelCol="labelCol" :wrapperCol="wrapperCol">
+              <a-input v-decorator="[ 'phone', validatorRules.phone]" placeholder="请输入座机"></a-input>
+            </a-form-item>
+          </a-col>
+          <a-col :span="8  ">
+            <a-form-item label="联系地址" :labelCol="labelCol" :wrapperCol="wrapperCol">
+              <a-input v-decorator="[ 'address', validatorRules.address]" placeholder="请输入联系地址"></a-input>
+            </a-form-item>
+          </a-col>
+          <a-col :span="8  ">
+            <a-form-item label="试用结束日期" :labelCol="labelCol" :wrapperCol="wrapperCol">
+              <j-date placeholder="请选择试用结束日期" v-decorator="[ 'probationEnd', validatorRules.probationEnd]" :trigger-change="true" style="width: 100%"/>
+            </a-form-item>
+          </a-col>
+          <a-col :span="8  ">
+            <a-form-item label="合同起始日期" :labelCol="labelCol" :wrapperCol="wrapperCol">
+              <j-date placeholder="请选择合同起始日期" v-decorator="[ 'contractStart', validatorRules.contractStart]" :trigger-change="true" style="width: 100%"/>
+            </a-form-item>
+          </a-col>
+          <a-col :span="8  ">
+            <a-form-item label="合同结束日期" :labelCol="labelCol" :wrapperCol="wrapperCol">
+              <j-date placeholder="请选择合同结束日期" v-decorator="[ 'contractEnd', validatorRules.contractEnd]" :trigger-change="true" style="width: 100%"/>
+            </a-form-item>
+          </a-col>
+          <a-col :span="8  ">
+            <a-form-item label="身份" :labelCol="labelCol" :wrapperCol="wrapperCol">
+              <a-radio-group  v-decorator="[ 'identity', validatorRules.identity]">
+                <a-radio :value="1">普通用户</a-radio>
+                <a-radio :value="2">上级</a-radio>
+              </a-radio-group>
+            </a-form-item>
+          </a-col>
+          <a-col :span="8  ">
+            <a-form-item label="备注" :labelCol="labelCol" :wrapperCol="wrapperCol">
+              <a-input v-decorator="[ 'remark', validatorRules.remark]" placeholder="请输入备注"></a-input>
+            </a-form-item>
+          </a-col>
+          <a-col :span="8  ">
+            <a-form-item label="签字图片" :labelCol="labelCol" :wrapperCol="wrapperCol">
+              <j-upload v-decorator="['signature', validatorRules.signature]" :trigger-change="true"></j-upload>
+            </a-form-item>
+          </a-col>
+          <a-col :span="8  ">
+            <a-form-item label="附件" :labelCol="labelCol" :wrapperCol="wrapperCol">
+              <j-upload v-decorator="['attachment', validatorRules.attachment]" :trigger-change="true"></j-upload>
+            </a-form-item>
+          </a-col>
+
+
+        </a-row>
+      </a-form>
 
-         <a-form-item label="用户姓名" :labelCol="labelCol" :wrapperCol="wrapperCol">
-          <a-input placeholder="请输入用户姓名" v-decorator="['realname', validatorRules.realname]" />
-        </a-form-item>
-        <a-form-item label="用户账号" :labelCol="labelCol" :wrapperCol="wrapperCol"  :validateOnRuleChange="true">
-          <a-input
-            placeholder="请输入用户账号"
-            v-decorator="['username', validatorRules.username]"
-            :readOnly="true"
-            autocomplete="off"
-          />
-        </a-form-item>
-
-         <a-form-item label="性别" :labelCol="labelCol" :wrapperCol="wrapperCol">
-          <a-select v-decorator="['sex', validatorRules.sex]" placeholder="请选择性别">
-            <a-select-option :value="1">男</a-select-option>
-            <a-select-option :value="2">女</a-select-option>
-          </a-select>
-        </a-form-item>
-
-        <a-form-item label="证件类型" :labelCol="labelCol" :wrapperCol="wrapperCol">
-          <a-select placeholder="请选择证件类型" v-decorator="[ 'idType', validatorRules.idType]" >
-            <a-select-option value="身份证">身份证</a-select-option>
-            <a-select-option value="港澳台胞证">港澳台胞证</a-select-option>
-          </a-select>
-        </a-form-item>
-
-        <a-form-item label="证件号码" :labelCol="labelCol" :wrapperCol="wrapperCol">
-          <a-input placeholder="请输入证件号码" v-decorator="['nidNo', validatorRules.nidNo]" />
-        </a-form-item>
-
-        <a-form-item label="生日" :labelCol="labelCol" :wrapperCol="wrapperCol">
-        <a-date-picker
-            style="width: 100%"
-            placeholder="请选择生日"
-            v-decorator="['birthday',{ initialValue: !model.birthday ? null : moment(model.birthday, dateFormat),rules: [{ required: true, message: '请选择生日日期' }] }]"
-        />
-        </a-form-item>
-
-        <a-form-item label="入司日期" :labelCol="labelCol" :wrapperCol="wrapperCol">
-          <a-date-picker
-            style="width: 100%"
-            placeholder="请选择入司日期"
-            v-decorator="['nInductionTime', { initialValue: !model.nInductionTime ? null : moment(model.nInductionTime, dateFormat) ,rules: [{ required: true, message: '请选择入司日期' }] }]"
-          />
-        </a-form-item>
-
-<!--        <a-form-item label="公司部门分配" :labelCol="labelCol" :wrapperCol="wrapperCol" v-show="!departDisabled">-->
-<!--          <a-input-search-->
-<!--            placeholder="点击右侧按钮选择公司和部门"-->
-<!--            v-model="checkedDepartNameString"-->
-<!--            disabled-->
-<!--            @search="onSearch"-->
-<!--          >-->
-<!--            <a-button slot="enterButton" icon="search">选择</a-button>-->
-<!--          </a-input-search>-->
-<!--        </a-form-item>-->
-
-        <a-form-item label="职务" :labelCol="labelCol" :wrapperCol="wrapperCol">
-          <j-select-position placeholder="请选择职务" :multiple="false" v-decorator="['post', validatorRules.post]" />
-        </a-form-item>
-
-        <a-form-item label="员工类型" :labelCol="labelCol" :wrapperCol="wrapperCol">
-          <a-select placeholder="请选择员工类型" v-decorator="[ 'type', validatorRules.type]" >
-            <a-select-option value="正式员工">正式员工</a-select-option>
-            <a-select-option value="临时">临时</a-select-option>
-            <a-select-option value="实习生">实习生</a-select-option>
-            <a-select-option value="劳务工">劳务工</a-select-option>
-          </a-select>
-        </a-form-item>
-        <!--部门分配-->
-        <a-form-item label="公司部门分配" :labelCol="labelCol" :wrapperCol="wrapperCol" v-show="!departDisabled">
-          <a-input-search
-            placeholder="点击右侧按钮选择公司和部门"
-            v-model="checkedDepartNameString"
-            disabled
-            @search="onSearch"
-          >
-            <a-button slot="enterButton" icon="search">选择</a-button>
-          </a-input-search>
-        </a-form-item>
-
-        <a-form-item label="公司座机" :labelCol="labelCol" :wrapperCol="wrapperCol">
-          <a-input placeholder="请输入公司座机" v-decorator="['ncompanyPhone', {}]" />
-        </a-form-item>
-
-        <a-form-item label="手机号码" :labelCol="labelCol" :wrapperCol="wrapperCol">
-          <a-input
-            placeholder="请输入手机号码"
-            :disabled="isDisabledAuth('user:form:phone')"
-            v-decorator="['phone', validatorRules.phone]"
-          />
-        </a-form-item>
-
-        <a-form-item label="邮箱" :labelCol="labelCol" :wrapperCol="wrapperCol">
-          <a-input placeholder="请输入邮箱" v-decorator="['email', validatorRules.email]" />
-        </a-form-item>
-
-        <a-form-item label="员工状态" :labelCol="labelCol" :wrapperCol="wrapperCol">
-          <a-select placeholder="请选择员工状态" v-decorator="[ 'syHireType', validatorRules.syHireType]" >
-            <a-select-option value="在职">在职</a-select-option>
-            <a-select-option value="离职">离职</a-select-option>
-            <a-select-option value="退休">退休</a-select-option>
-            <a-select-option value="辞退">辞退</a-select-option>
-          </a-select>
-        </a-form-item>
-
-        <a-form-item label="工资开户行" :labelCol="labelCol" :wrapperCol="wrapperCol">
-          <a-input v-decorator="[ 'bank', validatorRules.bank]" placeholder="请输入工资开户行"></a-input>
-        </a-form-item>
-
-        <a-form-item label="工资卡号" :labelCol="labelCol" :wrapperCol="wrapperCol">
-          <a-input placeholder="请输入工资卡号" v-decorator="['ncardNo', validatorRules.ncardNo]" />
-        </a-form-item>
-
-        <a-form-item label="公积金号" :labelCol="labelCol" :wrapperCol="wrapperCol">
-            <a-input v-decorator="[ 'cpf', validatorRules.cpf]" placeholder="请输入公积金号"></a-input>
-        </a-form-item>
-        <a-form-item label="社保缴纳地" :labelCol="labelCol" :wrapperCol="wrapperCol">
-            <a-input v-decorator="[ 'ssPlace', validatorRules.ssPlace]" placeholder="请输入社保缴纳地"></a-input>
-        </a-form-item>
-        <a-form-item label="社保号" :labelCol="labelCol" :wrapperCol="wrapperCol">
-            <a-input v-decorator="[ 'ssAccount', validatorRules.ssAccount]" placeholder="请输入社保号"></a-input>
-        </a-form-item>
-
-        <a-form-item label="身份" :labelCol="labelCol" :wrapperCol="wrapperCol">
-          <a-radio-group v-model="identity" @change="identityChange">
-            <a-radio value="1">普通用户</a-radio>
-            <a-radio value="2">上级</a-radio>
-          </a-radio-group>
-        </a-form-item>
-        <a-form-item label="负责部门" :labelCol="labelCol" :wrapperCol="wrapperCol" v-if="departIdShow == true">
-          <a-select
-            mode="multiple"
-            style="width: 100%"
-            placeholder="请选择负责部门"
-            v-model="departIds"
-            optionFilterProp="children"
-            :getPopupContainer="target => target.parentNode"
-            :dropdownStyle="{ maxHeight: '200px', overflow: 'auto' }"
-          >
-            <a-select-option v-for="item in resultDepartOptions" :key="item.key" :value="item.key">{{
-              item.title
-            }}</a-select-option>
-          </a-select>
-        </a-form-item>
-        <!-- <a-form-item label="工作流引擎" :labelCol="labelCol" :wrapperCol="wrapperCol">
-          <j-dict-select-tag
-            v-decorator="['activitiSync', {}]"
-            placeholder="请选择是否同步工作流引擎"
-            :type="'radio'"
-            :triggerChange="true"
-            dictCode="activiti_sync"
-          />
-        </a-form-item> -->
-
-        <a-form-item label="岗位职能要求" :labelCol="labelCol" :wrapperCol="wrapperCol" class="nresume">
-          <a-textarea  v-decorator="['requirement', validatorRules.requirement]" placeholder="请输入岗位职能要求"  :rows="4"></a-textarea >
-        </a-form-item>
-
-
-        <!-- <a-divider>IT维护</a-divider>
-        <a-form-item label="用户账号" :labelCol="labelCol" :wrapperCol="wrapperCol"  :validateOnRuleChange="true">
-          <a-input
-            placeholder="请输入用户账号"
-            v-decorator="['username', validatorRules.username]"
-            :readOnly="!!model.username"
-            autocomplete="off"
-          />
-        </a-form-item>
-
-        <template v-if="!model.id">
-          <a-form-item label="登陆密码" :labelCol="labelCol" :wrapperCol="wrapperCol">
-            <a-input type="password" placeholder="请输入登陆密码" v-decorator="['password', validatorRules.password]" autocomplete="new-password" @blur="changePssword"/>
-          </a-form-item>
-
-          <a-form-item label="确认密码" :labelCol="labelCol" :wrapperCol="wrapperCol">
-            <a-input
-              type="password"
-              @blur="handleConfirmBlur"
-              placeholder="请重新输入登陆密码"
-              v-decorator="['confirmpassword', validatorRules.confirmpassword]"
-            />
-          </a-form-item>
-        </template>
-        <a-form-item label="公司部门分配" :labelCol="labelCol" :wrapperCol="wrapperCol" v-show="!departDisabled">
-          <a-input-search
-            placeholder="点击右侧按钮选择公司和部门"
-            v-model="checkedDepartNameString"
-            disabled
-            @search="onSearch"
-          >
-            <a-button slot="enterButton" icon="search">选择</a-button>
-          </a-input-search>
-        </a-form-item>
-        <a-form-item label="角色分配" :labelCol="labelCol" :wrapperCol="wrapperCol" v-show="!roleDisabled">
-          <a-select
-            mode="multiple"
-            style="width: 100%"
-            placeholder="请选择用户角色"
-            optionFilterProp="children"
-            v-model="selectedRole"
-          >
-            <a-select-option v-for="(role, roleindex) in roleList" :key="roleindex.toString()" :value="role.id">
-              {{ role.roleName }}
-            </a-select-option>
-          </a-select>
-        </a-form-item> -->
+      <!-- 子表单区域 -->
+      <a-tabs v-model="activeKey" @change="handleChangeTabs">
+        
+        <a-tab-pane tab="联系人" :key="refKeys[0]" :forceRender="true">
+          <j-editable-table
+            :ref="refKeys[0]"
+            :loading="sysUserContactTable.loading"
+            :columns="sysUserContactTable.columns"
+            :dataSource="sysUserContactTable.dataSource"
+            :maxHeight="300"
+            :rowNumber="true"
+            :rowSelection="true"
+            :actionButton="true"/>
+        </a-tab-pane>
+
+        <a-tab-pane tab="工作经历" :key="refKeys[1]" :forceRender="true">
+          <j-editable-table
+            :ref="refKeys[1]"
+            :loading="sysUserJobTable.loading"
+            :columns="sysUserJobTable.columns"
+            :dataSource="sysUserJobTable.dataSource"
+            :maxHeight="300"
+            :rowNumber="true"
+            :rowSelection="true"
+            :actionButton="true"/>
+        </a-tab-pane>
+        
+        
+        <a-tab-pane tab="学习经历" :key="refKeys[2]" :forceRender="true">
+          <j-editable-table
+            :ref="refKeys[2]"
+            :loading="sysUserEduTable.loading"
+            :columns="sysUserEduTable.columns"
+            :dataSource="sysUserEduTable.dataSource"
+            :maxHeight="300"
+            :rowNumber="true"
+            :rowSelection="true"
+            :actionButton="true"/>
+        </a-tab-pane>
+        
+      </a-tabs>
 
-<!--         <a-form-item label="工作简历" :labelCol="labelCol" :wrapperCol="wrapperCol" class="nresume">-->
-<!--          <a-input type="textarea" placeholder="请输入" v-decorator="['nresume', {}]" />-->
-<!--        </a-form-item>-->
-      </a-form>
     </a-spin>
-
-    <depart-window ref="departWindow" @ok="modalFormOk"></depart-window>
-    <!-- <div class="drawer-bootom-button" v-show="!disableSubmit">
-      <a-button style="margin-right: .8rem" @click="handleCancel">取消</a-button>
-      <a-button @click="handleSubmit" type="primary" :loading="confirmLoading">提交</a-button>
-    </div> -->
   </a-modal>
 </template>
 
 <script>
-import pick from 'lodash.pick'
-import moment from 'moment'
-import Vue from 'vue'
-// 引入搜索部门弹出框的组件
-import departWindow from './DepartWindow'
-import JSelectPosition from '@/components/jeecgbiz/JSelectPosition'
-import { ACCESS_TOKEN } from '@/store/mutation-types'
-import { getAction } from '@/api/manage'
-import { addUser, editUser, queryUserRole, queryall, duplicateCheck } from '@/api/api'
-import { disabledAuthFilter } from '@/utils/authFilter'
-
-import JImageUpload from '../../../components/jeecg/JImageUpload'
 
-export default {
-    name: 'NewUserModal',
+  import pick from 'lodash.pick'
+  import { FormTypes,getRefPromise } from '@/utils/JEditableTableUtil'
+  import { JEditableTableMixin } from '@/mixins/JEditableTableMixin'
+  import { validateDuplicateValue } from '@/utils/util'
+  import JDate from '@/components/jeecg/JDate'  
+  import JUpload from '@/components/jeecg/JUpload'
+  import JSelectDepart from '@/components/jeecgbiz/JSelectDepart'
+  import JDictSelectTag from "@/components/dict/JDictSelectTag"
+  import JSelectPosition from '@/components/jeecgbiz/JSelectPosition'
+
+  export default {
+    name: 'SysUserModal',
+    mixins: [JEditableTableMixin],
     components: {
-        JImageUpload,
-        departWindow,
-        JSelectPosition
-    },
-    data () {
-        return {
-            departDisabled: false, // 是否是我的部门调用该页面
-            roleDisabled: false, // 是否是角色维护调用该页面
-            modalWidth: 800,
-            drawerWidth: 700,
-            modaltoggleFlag: true,
-            confirmDirty: false,
-            selectedDepartKeys: [], // 保存用户选择部门id
-            checkedDepartKeys: [],
-            checkedDepartNames: [], // 保存部门的名称 =>title
-            checkedDepartNameString: '', // 保存部门的名称 =>title
-            resultDepartOptions: [],
-            userId: '', // 保存用户id
-            disableSubmit: false,
-            userDepartModel: { userId: '', departIdList: [] }, // 保存SysUserDepart的用户部门中间表数据需要的对象
-            dateFormat: 'YYYY-MM-DD',
-            validatorRules: {
-                // username: {
-                //     rules: [
-                //         {
-                //             required: false,
-                //             message: '请输入用户账号!'
-                //         },
-                //         {
-                //             validator: this.validateUsername
-                //         }
-                //     ]
-                // },
-                // password: {
-                //     rules: [
-                //         {
-                //             required: false,
-                //              message: '请输入密码!'
-                //             // pattern: /^(?=.*[a-zA-Z])(?=.*\d)(?=.*[~!@#$%^&*()_+`\-={}:";'<>?,./]).{8,}$/,
-                //             // message: '密码由8位数字、大小写字母和特殊符号组成!'
-                //         },
-                //         {
-                //             validator: this.validateToNextPassword
-                //         }
-                //     ],
-                //     initialValue:'123456'
-                // },
-                // confirmpassword: {
-                //     rules: [
-                //         {
-                //             required: false,
-                //             message: '请重新输入登陆密码!'
-                //         },
-                //         {
-                //             validator: this.compareToFirstPassword
-                //         }
-                //     ]
-                // },
-                realname: { rules: [{ required: true, message: '请输入用户名称!' }] },
-                phone: { rules: [{ validator: this.validatePhone },{ required: true, message: '请输入手机号码!' }] },
-                email: {
-                    rules: [
-                        {
-                            // validator: this.validateEmail
-                        }
-                    ]
-                },
-                roles: {},
-                //  sex:{initialValue:((!this.model.sex)?"": (this.model.sex+""))}
-                telephone: {
-                    // rules: [{ required: true, message: '请输入座机' },{ pattern: /^0\d{2,3}-[1-9]\d{6,7}$/, message: '请输入正确的座机号码' }]
-                    rules: [{ required: true, message: '请输入家庭电话' }]
-                },
-                sex:{
-                    rules: [{ required: true, message: '请选择性别' }]
-                },
-                nidNo:{
-                    rules: [{ required: true, message: '输入身份证号码' }]
-                },
-                post:{
-                    rules: [{ required: true, message: '请选择职位' }]
-                },
-                ncardNo:{
-                    rules: [{ required: true, message: '请输入工资卡号' }]
-                },
-                bank:{
-                    rules: [{ required: true, message: '请输入工资开户行' }]
-                },
-                npersonnelType:{
-                    rules: [{ required: true, message: '请选择人员类型' }]
-                },
-                checkedDepartNameString:{
-                   rules: [{ required: true, message: '请选择部门!' }]
-                }
-            },
-            departIdShow: false,
-            departIds: [], // 负责部门id
-            title: '操作',
-            visible: false,
-            model: {},
-            roleList: [],
-            selectedRole: [],
-            labelCol: {
-                xs: { span: 24 },
-                sm: { span: 5 }
-            },
-            wrapperCol: {
-                xs: { span: 24 },
-                sm: { span: 16 }
-            },
-            uploadLoading: false,
-            confirmLoading: false,
-            headers: {},
-            form: this.$form.createForm(this),
-            picUrl: '',
-            url: {
-                fileUpload: window._CONFIG['domianURL'] + '/sys/common/upload',
-                imgerver: window._CONFIG['staticDomainURL'],
-                userWithDepart: '/sys/user/userDepartList', // 引入为指定用户查看部门信息需要的url
-                userId: '/sys/user/generateUserId', // 引入生成添加用户情况下的url
-                syncUserByUserName: '/process/extActProcess/doSyncUserByUserName' // 同步用户到工作流
-            },
-            identity: '1',
-            ifOa:'0',
-            fileList: [],
-            orgObject: {
-                pkOrg: '', // 选中的公司id
-                pkOrgName: '' // 选中的公司名称
-            },
-            userObject: {} // 用户信息
-        }
-    },
-    created () {
-        const token = Vue.ls.get(ACCESS_TOKEN)
-        this.headers = { 'X-Access-Token': token }
-    },
-    computed: {
-        uploadAction: function () {
-            return this.url.fileUpload
-        }
+      JDate,
+      JUpload,
+      JSelectDepart,
+      JDictSelectTag,
+      JSelectPosition
     },
-    methods: {
-        isDisabledAuth (code) {
-            return disabledAuthFilter(code)
-        },
-        // 窗口最大化切换
-        toggleScreen () {
-            if (this.modaltoggleFlag) {
-                this.modalWidth = window.innerWidth
-            } else {
-                this.modalWidth = 800
-            }
-            this.modaltoggleFlag = !this.modaltoggleFlag
-        },
-        initialRoleList () {
-            queryall().then(res => {
-                if (res.success) {
-                    this.roleList = res.result
-                } else {
-                    console.log(res.message)
-                }
-            })
-        },
-        loadUserRoles (userid) {
-            queryUserRole({ userid: userid }).then(res => {
-                if (res.success) {
-                    this.selectedRole = res.result
-                } else {
-                    console.log(res.message)
-                }
-            })
+    data() {
+      return {
+        labelCol: {
+          span: 6
         },
-        refresh () {
-            this.selectedDepartKeys = []
-            this.checkedDepartKeys = []
-            this.checkedDepartNames = []
-            this.checkedDepartNameString = ''
-            this.userId = ''
-            this.resultDepartOptions = []
-            this.departId = []
-            this.departIdShow = false
+        wrapperCol: {
+          span: 16
         },
-        add () {
-            this.picUrl = ''
-            this.refresh()
-            this.edit({ activitiSync: '1' })
+        labelCol2: {
+          span: 3
         },
-        edit (record) {
-            this.resetScreenSize() // 调用此方法,根据屏幕宽度自适应调整抽屉的宽度
-            let that = this
-            that.initialRoleList()
-            that.checkedDepartNameString = ''
-            that.form.resetFields()
-            if (record.hasOwnProperty('id')) {
-                that.loadUserRoles(record.id)
-                setTimeout(() => {
-                    this.fileList = record.avatar
-                }, 5)
-            }
-            that.userId = record.id
-            // 修改赋值公司id
-            this.orgObject.pkOrg = record.pkOrg
-            this.orgObject.pkOrgName = record.pkOrgName
-            this.userObject = record
-            that.visible = true
-            that.model = Object.assign({}, record)
-            that.$nextTick(() => {
-                that.form.setFieldsValue(
-                    pick(
-                        this.model,
-                        'username',
-                        'sex',
-                        'realname',
-                        'email',
-                        'phone',
-                        'activitiSync',
-                        'workNo',
-                        'telephone',
-                        'post',
-                        'nenName',
-                        'nmarriage',
-                        'nregistered',
-                        'noutlook',
-                        'nmajor',
-                        'neducation',
-                        'ngraduationTime',
-                        'ninductionTime',
-                        'ncompanyPhone',
-                        'ncompanyLine',
-                        'ncardNo',
-                        'nvirtualNo',
-                        'nBecomeTime',
-                        'nsocialTime',
-                        'nfundTime',
-                        'nfundBase',
-                        'nsocialBase',
-                        'nannualNum',
-                        'nannualOldNum',
-                        'nannualNowNum',
-                        'nnation',
-                        'nnativePlace',
-                        'nidNo',
-                        'nhomeAddress',
-                        'nrequirement',
-                        'nhopeFor',
-                        'nregisteredAddr',
-                        'nrelationshipFor',
-                        'npersonnelType',
-                        'nregisteredAddr',
-                        'ifOa',
-                        'idType',
-                        'type',
-                        'syHireType',
-                        'bank',
-                        'cpf',
-                        'ssPlace',
-                        'ssAccount',
-                        'requirement'
-                    )
-                )
-            })
-            // 身份为上级显示负责部门,否则不显示
-            if (this.model.identity == '2') {
-                this.identity = '2'
-                this.departIdShow = true
-            } else {
-                this.identity = '1'
-                this.departIdShow = false
-            }
-            // 调用查询用户对应的部门信息的方法
-            that.checkedDepartKeys = []
-            that.loadCheckedDeparts()
+        wrapperCol2: {
+          span: 20
         },
-        //
-        loadCheckedDeparts () {
-            let that = this
-            if (!that.userId) {
-                return
-            }
-            getAction(that.url.userWithDepart, { userId: that.userId }).then(res => {
-                that.checkedDepartNames = []
-                if (res.success) {
-                    var depart = []
-                    var departId = []
-                    for (let i = 0; i < res.result.length; i++) {
-                        that.checkedDepartNames.push(res.result[i].title)
-                        this.checkedDepartNameString = this.checkedDepartNames.join(',')
-                        that.checkedDepartKeys.push(res.result[i].key)
-                        // 新增负责部门选择下拉框
-                        depart.push({
-                            key: res.result[i].key,
-                            title: res.result[i].title
-                        })
-                        departId.push(res.result[i].key)
-                    }
-                    that.resultDepartOptions = depart
-                    // 判断部门id是否存在,不存在择直接默认当前所在部门
-                    if (this.model.departIds) {
-                        this.departIds = this.model.departIds.split(',')
-                    } else {
-                        this.departIds = departId
-                    }
-                    that.userDepartModel.departIdList = that.checkedDepartKeys
-                } else {
-                    console.log(res.message)
-                }
-            })
+        // 新增时子表默认添加几行空数据
+        addDefaultRowNum: 1,
+        validatorRules: {
+          operator: {rules: [
+            {required: true, message: '请输入登记人	!'},
+          ]},
+          operatorDept: {rules: [
+          ]},
+          operateDate: {rules: [
+            {required: true, message: '请输入登记日期!'},
+          ]},
+          realname: {rules: [
+          ]},
+          username: {rules: [
+          ]},
+          sex: {rules: [
+            {required: true, message: '请输入性别!'},
+          ]},
+          idType: {rules: [
+            {required: true, message: '请输入证件类型!'},
+          ]},
+          idNo: {rules: [
+            {required: true, message: '请输入证件号码!'},
+          ]},
+          birthday: {rules: [
+            {required: true, message: '请输入生日!'},
+          ]},
+          joinDate: {rules: [
+            {required: true, message: '请输入入职日期!'},
+          ]},
+          post: {rules: [
+            {required: true, message: '请输入职务!'},
+          ]},
+          postLevel: {rules: [
+            {required: true, message: '请输入职级!'},
+          ]},
+          education: {rules: [
+            {required: true, message: '请输入学历!'},
+          ]},
+          positionType: {rules: [
+            {required: true, message: '请输入岗位类型!'},
+          ]},
+          departIds: {rules: [
+            {required: true, message: '请输入部门!'},
+          ]},
+          mobile: {rules: [
+          ]},
+          phone: {rules: [
+          ]},
+          address: {rules: [
+          ]},
+          probationEnd: {rules: [
+            {required: true, message: '请输入试用结束日期!'},
+          ]},
+          contractStart: {rules: [
+            {required: true, message: '请输入合同起始日期!'},
+          ]},
+          contractEnd: {rules: [
+            {required: true, message: '请输入合同结束日期!'},
+          ]},
+          remark: {rules: [
+          ]},
+          identity: {rules: [
+          ]},
+          signature: {rules: [
+          ]},
+          attachment: {rules: [
+          ]},
         },
-        close () {
-            console.log('?????')
-            this.$emit('close')
-            this.visible = false
-            this.ifOa ='0'
-            this.disableSubmit = false
-            this.selectedRole = []
-            this.userDepartModel = { userId: '', departIdList: [] }
-            this.checkedDepartNames = []
-            this.checkedDepartNameString = ''
-            this.checkedDepartKeys = []
-            this.selectedDepartKeys = []
-            this.resultDepartOptions = []
-            this.departIds = []
-            this.departIdShow = false
-            this.identity = '1'
-            this.fileList = []
-            this.orgObject = []
-            this.userObject = {}
-            this.validatorRules.username.rules[0].required = false
-            this.validatorRules.confirmpassword.rules[0].required = false
-        },
-        moment,
-        handleSubmit () {
-            if(!this.orgObject.pkOrg){
-              this.$message.warning("请选择公司");
-              return
-            }
-            const that = this
-            // 触发表单验证
-            this.form.validateFields((err, values) => {
-                if (!err) {
-                    that.confirmLoading = true
-                    if (!values.birthday) {
-                        values.birthday = ''
-                    } else {
-                        values.birthday = values.birthday.format(this.dateFormat)
-                    }
-                    let formData = Object.assign(this.model, values)
-                    // 获取公司信息
-                    formData.pkOrg = this.orgObject.pkOrg
-                    formData.pkOrgName = this.orgObject.pkOrgName
-                    formData.avatar = that.fileList
-                    formData.selectedroles = this.selectedRole.length > 0 ? this.selectedRole.join(',') : ''
-                    formData.selecteddeparts =
-                    this.userDepartModel.departIdList.length > 0 ? this.userDepartModel.departIdList.join(',') : ''
-                    formData.identity = this.identity
-                    // 如果是上级择传入departIds,否则为空
-                    if (this.identity === '2') {
-                        formData.departIds = this.departIds.join(',')
-                    } else {
-                        formData.departIds = ''
-                    }
-                    // that.addDepartsToUser(that,formData); // 调用根据当前用户添加部门信息的方法
-                    let obj
-                    if (!this.model.id) {
-                        formData.id = this.userId
-                        obj = addUser(formData)
-                    } else {
-                        obj = editUser(formData)
-                    }
-                    obj
-                        .then(res => {
-                            if (res.success) {
-                                that.$message.success(res.message)
-                                that.$emit('ok')
-                            } else {
-                                that.$message.warning(res.message)
-                            }
-                        })
-                        .finally(() => {
-                            that.confirmLoading = false
-                            that.checkedDepartNames = []
-                            that.userDepartModel.departIdList = { userId: '', departIdList: [] }
-                            that.close()
-                        })
-                }
-            })
-        },
-        handleCancel () {
-            this.close()
-        },
-        validateToNextPassword (rule, value, callback) {
-            const form = this.form
-            const confirmpassword = form.getFieldValue('confirmpassword')
-
-            if (value && confirmpassword && value !== confirmpassword) {
-                callback('两次输入的密码不一样!')
-            }
-            if (value && this.confirmDirty) {
-                form.validateFields(['confirm'], { force: true })
-            }
-            callback()
-        },
-        compareToFirstPassword (rule, value, callback) {
-            const form = this.form
-            if (value && value !== form.getFieldValue('password')) {
-                callback('两次输入的密码不一样!')
-            } else {
-                callback()
-            }
-        },
-        validatePhone (rule, value, callback) {
-            if (!value) {
-                callback()
-            } else {
-                // update-begin--Author:kangxiaolin  Date:20190826 for:[05] 手机号不支持199号码段--------------------
-                if (new RegExp(/^1[3|4|5|7|8|9][0-9]\d{8}$/).test(value)) {
-                    // update-end--Author:kangxiaolin  Date:20190826 for:[05] 手机号不支持199号码段--------------------
-
-                    var params = {
-                        tableName: 'sys_user',
-                        fieldName: 'phone',
-                        fieldVal: value,
-                        dataId: this.userId
-                    }
-                    duplicateCheck(params).then(res => {
-                        if (res.success) {
-                            callback()
-                        } else {
-                            callback('手机号已存在!')
-                        }
-                    })
-                } else {
-                    callback('请输入正确格式的手机号码!')
-                }
-            }
-        },
-        validateEmail (rule, value, callback) {
-            if (!value) {
-                callback()
-            } else {
-                if (
-                    new RegExp(
-                        /^(([^<>()\[\]\\.,;:\s@"]+(\.[^<>()\[\]\\.,;:\s@"]+)*)|(".+"))@((\[[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}])|(([a-zA-Z\-0-9]+\.)+[a-zA-Z]{2,}))$/
-                    ).test(value)
-                ) {
-                    var params = {
-                        tableName: 'sys_user',
-                        fieldName: 'email',
-                        fieldVal: value,
-                        dataId: this.userId
-                    }
-                    duplicateCheck(params).then(res => {
-                        console.log(res)
-                        if (res.success) {
-                            callback()
-                        } else {
-                            callback('邮箱已存在!')
-                        }
-                    })
-                } else {
-                    callback('请输入正确格式的邮箱!')
-                }
-            }
-        },
-        validateUsername (rule, value, callback) {
-            var params = {
-                tableName: 'sys_user',
-                fieldName: 'username',
-                fieldVal: value,
-                dataId: this.userId
-            }
-            duplicateCheck(params).then(res => {
-                if (res.success) {
-                    callback()
-                } else {
-                    callback('用户名已存在!')
-                }
-            })
-        },
-        validateWorkNo (rule, value, callback) {
-            var params = {
-                tableName: 'sys_user',
-                fieldName: 'work_no',
-                fieldVal: value,
-                dataId: this.userId
-            }
-            duplicateCheck(params).then(res => {
-                if (res.success) {
-                    callback()
-                } else {
-                    callback('工号已存在!')
-                }
-            })
-        },
-        handleConfirmBlur (e) {
-            const value = e.target.value
-            this.confirmDirty = this.confirmDirty || !!value
-        },
-
-        normFile (e) {
-            console.log('Upload event:', e)
-            if (Array.isArray(e)) {
-                return e
-            }
-            return e && e.fileList
-        },
-        beforeUpload: function (file) {
-            var fileType = file.type
-            if (fileType.indexOf('image') < 0) {
-                this.$message.warning('请上传图片')
-                return false
-            }
-            // TODO 验证文件大小
+        refKeys: ['sysUserContact','sysUserJob',  'sysUserEdu', ],
+        tableKeys:['sysUserContact', 'sysUserJob', 'sysUserEdu', ],
+        activeKey: 'sysUserJob',
+        // 人员管理工作经历
+        sysUserJobTable: {
+          loading: false,
+          dataSource: [],
+          columns: [
+            {
+              title: '单位',
+              key: 'company',
+              type: FormTypes.input,
+              width:"200px",
+              placeholder: '请输入${title}',
+              defaultValue: '',
+            },
+            {
+              title: '职位',
+              key: 'position',
+              type: FormTypes.input,
+              width:"200px",
+              placeholder: '请输入${title}',
+              defaultValue: '',
+            },
+            {
+              title: '起始日期',
+              key: 'startDate',
+              type: FormTypes.date,
+              width:"200px",
+              placeholder: '请输入${title}',
+              defaultValue: '',
+            },
+            {
+              title: '截止日期',
+              key: 'endDate',
+              type: FormTypes.date,
+              width:"200px",
+              placeholder: '请输入${title}',
+              defaultValue: '',
+            },
+          ]
         },
-        handleChange (info) {
-            this.picUrl = ''
-            if (info.file.status === 'uploading') {
-                this.uploadLoading = true
-                return
-            }
-            if (info.file.status === 'done') {
-                var response = info.file.response
-                this.uploadLoading = false
-                console.log(response)
-                if (response.success) {
-                    this.model.avatar = response.message
-                    this.picUrl = 'Has no pic url yet'
-                } else {
-                    this.$message.warning(response.message)
-                }
-            }
+        // 人员管理联系人
+        sysUserContactTable: {
+          loading: false,
+          dataSource: [],
+          columns: [
+            {
+              title: '姓名',
+              key: 'name',
+              type: FormTypes.input,
+              width:"200px",
+              placeholder: '请输入${title}',
+              defaultValue: '',
+            },
+            {
+              title: '关系',
+              key: 'relation',
+              type: FormTypes.input,
+              width:"200px",
+              placeholder: '请输入${title}',
+              defaultValue: '',
+            },
+            {
+              title: '性别',
+              key: 'sex',
+              type: FormTypes.input,
+              width:"200px",
+              placeholder: '请输入${title}',
+              defaultValue: '',
+            },
+            {
+              title: '联系方式',
+              key: 'phone',
+              type: FormTypes.input,
+              width:"200px",
+              placeholder: '请输入${title}',
+              defaultValue: '',
+            },
+            {
+              title: '职业',
+              key: 'career',
+              type: FormTypes.input,
+              width:"200px",
+              placeholder: '请输入${title}',
+              defaultValue: '',
+            },
+          ]
         },
-        // 搜索用户对应的部门API
-        onSearch () {
-            this.$refs.departWindow.add(this.checkedDepartKeys, this.userId, this.userObject)
+        // 人员管理学习经历
+        sysUserEduTable: {
+          loading: false,
+          dataSource: [],
+          columns: [
+            {
+              title: '学校',
+              key: 'school',
+              type: FormTypes.input,
+              width:"200px",
+              placeholder: '请输入${title}',
+              defaultValue: '',
+            },
+            {
+              title: '起始日期',
+              key: 'startDate',
+              type: FormTypes.date,
+              width:"200px",
+              placeholder: '请输入${title}',
+              defaultValue: '',
+            },
+            {
+              title: '截止日期',
+              key: 'endDate',
+              type: FormTypes.date,
+              width:"200px",
+              placeholder: '请输入${title}',
+              defaultValue: '',
+            },
+          ]
         },
+        url: {
+          add: "/sys/user/add",
+          edit: "/sys/user/editNew",
+          sysUserJob: {
+            list: '/sys/user/querySysUserJobByMainId'
+          },
+          sysUserContact: {
+            list: '/sys/user/querySysUserContactByMainId'
+          },
+          sysUserEdu: {
+            list: '/sys/user/querySysUserEduByMainId'
+          },
+        }
+      }
+    },
+    methods: {
+      getAllTable() {
+        let values = this.tableKeys.map(key => getRefPromise(this, key))
+        return Promise.all(values)
+      },
+      /** 调用完edit()方法之后会自动调用此方法 */
+      editAfter() {
+        let fieldval = pick(this.model,'operator','operatorDept','operateDate','realname','username','sex','idType','idNo','birthday','joinDate','post','postLevel','education','positionType','departIds','mobile','phone','address','probationEnd','contractStart','contractEnd','remark','identity','signature','attachment')
+        this.$nextTick(() => {
+          this.form.setFieldsValue(fieldval)
+        })
+        // 加载子表数据
+        if (this.model.id) {
+          let params = { id: this.model.id }
+          this.requestSubTableData(this.url.sysUserJob.list, params, this.sysUserJobTable)
+          this.requestSubTableData(this.url.sysUserContact.list, params, this.sysUserContactTable)
+          this.requestSubTableData(this.url.sysUserEdu.list, params, this.sysUserEduTable)
+        }
+      },
+      /** 整理成formData */
+      classifyIntoFormData(allValues) {
+        let main = Object.assign(this.model, allValues.formValue)
 
-        // 获取用户对应部门弹出框提交给返回的数据
-        modalFormOk (formData) {
-            this.orgObject = formData.orgObject // 公司信息
-            // 没有选择则直接退出
-            if (!formData.departIdList || formData.departIdList.length == 0) {
-                return
-            }
-
-            this.checkedDepartNames = []
-            this.selectedDepartKeys = []
-            this.checkedDepartNameString = ''
-            this.userId = formData.userId
-            this.userDepartModel.userId = formData.userId
-            this.departIds = []
-            this.resultDepartOptions = []
-            var depart = []
-            for (let i = 0; i < formData.departIdList.length; i++) {
-                this.selectedDepartKeys.push(formData.departIdList[i].key)
-                this.checkedDepartNames.push(formData.departIdList[i].title)
-                this.checkedDepartNameString = this.checkedDepartNames.join(',')
-                // 新增部门选择,如果上面部门选择后不为空直接付给负责部门
-                depart.push({
-                    key: formData.departIdList[i].key,
-                    title: formData.departIdList[i].title
-                })
-                this.departIds.push(formData.departIdList[i].key)
-            }
-            this.resultDepartOptions = depart
-            this.userDepartModel.departIdList = this.selectedDepartKeys
-            this.checkedDepartKeys = this.selectedDepartKeys // 更新当前的选择keys
-        },
-        // 根据屏幕变化,设置抽屉尺寸
-        resetScreenSize () {
-            let screenWidth = document.body.clientWidth
-            if (screenWidth < 500) {
-                this.drawerWidth = screenWidth
-            } else {
-                this.drawerWidth = 700
-            }
-        },
-        identityChange (e) {
-            if (e.target.value === '1') {
-                this.departIdShow = false
-            } else {
-                this.departIdShow = true
-            }
-        },
-        changeOa(e){
-            if(e.target.value === '1'){
-                this.validatorRules.username.rules[0].required = true
-            }else{
-                this.validatorRules.username.rules[0].required = false
-            }
-        },
-        changePssword(){
-          this.validatorRules.confirmpassword.rules[0].required = true
+        return {
+          ...main, // 展开
+          sysUserContactList: allValues.tablesValue[0].values,
+          sysUserJobList: allValues.tablesValue[1].values,
+          sysUserEduList: allValues.tablesValue[2].values,
         }
+      },
+      validateError(msg){
+        this.$message.error(msg)
+      },
+     popupCallback(row){
+       this.form.setFieldsValue(pick(row,'operator','operatorDept','operateDate','realname','username','sex','idType','idNo','birthday','joinDate','post','postLevel','education','positionType','departIds','mobile','phone','address','probationEnd','contractStart','contractEnd','remark','identity','signature','attachment'))
+     },
+
     }
-}
+  }
 </script>
 
-<style scoped lang="less">
-.avatar-uploader > .ant-upload {
-  width: 104px;
-  height: 104px;
-}
-.ant-upload-select-picture-card i {
-  font-size: 49px;
-  color: #999;
-}
-
-.ant-upload-select-picture-card .ant-upload-text {
-  margin-top: 8px;
-  color: #666;
-}
-
-.ant-table-tbody .ant-table-row td {
-  padding-top: 10px;
-  padding-bottom: 10px;
-}
-
-.drawer-bootom-button {
-  position: absolute;
-  bottom: 0;
-  width: 100%;
-  border-top: 1px solid #e8e8e8;
-  padding: 10px 16px;
-  text-align: right;
-  left: 0;
-  background: #fff;
-  border-radius: 0 0 2px 2px;
-}
-/deep/.ant-form-item{
-    width: 31%;
-}
-/deep/.ant-form{
-    display: flex;
-    width: 100%;
-    flex-wrap: wrap;
-}
-.nresume{
-  width: 100% !important;
-}
-/deep/ .nresume .ant-form-item-label{
-  width: 8% !important;
-}
-/deep/ .nresume .ant-form-item-control-wrapper{
-  width: 84% !important;
-}
-/deep/ .nresume .ant-input{
-  height: 100px !important;
-}
-/deep/ .ant-col-sm-5{
-  width: 27%;
-}
-</style>
+<style scoped>
+</style>

+ 913 - 0
src/views/system/modules/UserModalNew.vue

@@ -0,0 +1,913 @@
+<template>
+  <a-modal
+    :title="title"
+    width="75%"
+    :closable="true"
+    @cancel="close"
+    @ok="handleSubmit"
+    :visible="visible"
+  >
+    <template slot="title">
+      <div style="width: 100%;">
+        <span>{{ title }}</span>
+        <span style="display:inline-block;width:calc(100% - 51px);padding-right:10px;text-align: right">
+          <a-button @click="toggleScreen" icon="appstore" style="height:20px;width:20px;border:0px"></a-button>
+        </span>
+      </div>
+    </template>
+
+    <a-spin :spinning="confirmLoading">
+      <a-form :form="form">
+
+         <a-form-item label="用户姓名" :labelCol="labelCol" :wrapperCol="wrapperCol">
+          <a-input placeholder="请输入用户姓名" v-decorator="['realname', validatorRules.realname]" />
+        </a-form-item>
+        <a-form-item label="用户账号" :labelCol="labelCol" :wrapperCol="wrapperCol"  :validateOnRuleChange="true">
+          <a-input
+            placeholder="请输入用户账号"
+            v-decorator="['username', validatorRules.username]"
+            :readOnly="true"
+            autocomplete="off"
+          />
+        </a-form-item>
+
+         <a-form-item label="性别" :labelCol="labelCol" :wrapperCol="wrapperCol">
+          <a-select v-decorator="['sex', validatorRules.sex]" placeholder="请选择性别">
+            <a-select-option :value="1">男</a-select-option>
+            <a-select-option :value="2">女</a-select-option>
+          </a-select>
+        </a-form-item>
+
+        <a-form-item label="证件类型" :labelCol="labelCol" :wrapperCol="wrapperCol">
+          <a-select placeholder="请选择证件类型" v-decorator="[ 'idType', validatorRules.idType]" >
+            <a-select-option value="身份证">身份证</a-select-option>
+            <a-select-option value="港澳台胞证">港澳台胞证</a-select-option>
+          </a-select>
+        </a-form-item>
+
+        <a-form-item label="证件号码" :labelCol="labelCol" :wrapperCol="wrapperCol">
+          <a-input placeholder="请输入证件号码" v-decorator="['nidNo', validatorRules.nidNo]" />
+        </a-form-item>
+
+        <a-form-item label="生日" :labelCol="labelCol" :wrapperCol="wrapperCol">
+        <a-date-picker
+            style="width: 100%"
+            placeholder="请选择生日"
+            v-decorator="['birthday',{ initialValue: !model.birthday ? null : moment(model.birthday, dateFormat),rules: [{ required: true, message: '请选择生日日期' }] }]"
+        />
+        </a-form-item>
+
+        <a-form-item label="入司日期" :labelCol="labelCol" :wrapperCol="wrapperCol">
+          <a-date-picker
+            style="width: 100%"
+            placeholder="请选择入司日期"
+            v-decorator="['nInductionTime', { initialValue: !model.nInductionTime ? null : moment(model.nInductionTime, dateFormat) ,rules: [{ required: true, message: '请选择入司日期' }] }]"
+          />
+        </a-form-item>
+
+<!--        <a-form-item label="公司部门分配" :labelCol="labelCol" :wrapperCol="wrapperCol" v-show="!departDisabled">-->
+<!--          <a-input-search-->
+<!--            placeholder="点击右侧按钮选择公司和部门"-->
+<!--            v-model="checkedDepartNameString"-->
+<!--            disabled-->
+<!--            @search="onSearch"-->
+<!--          >-->
+<!--            <a-button slot="enterButton" icon="search">选择</a-button>-->
+<!--          </a-input-search>-->
+<!--        </a-form-item>-->
+
+        <a-form-item label="职务" :labelCol="labelCol" :wrapperCol="wrapperCol">
+          <j-select-position placeholder="请选择职务" :multiple="false" v-decorator="['post', validatorRules.post]" />
+        </a-form-item>
+
+        <a-form-item label="员工类型" :labelCol="labelCol" :wrapperCol="wrapperCol">
+          <a-select placeholder="请选择员工类型" v-decorator="[ 'type', validatorRules.type]" >
+            <a-select-option value="正式员工">正式员工</a-select-option>
+            <a-select-option value="临时">临时</a-select-option>
+            <a-select-option value="实习生">实习生</a-select-option>
+            <a-select-option value="劳务工">劳务工</a-select-option>
+          </a-select>
+        </a-form-item>
+        <!--部门分配-->
+        <a-form-item label="公司部门分配" :labelCol="labelCol" :wrapperCol="wrapperCol" v-show="!departDisabled">
+          <a-input-search
+            placeholder="点击右侧按钮选择公司和部门"
+            v-model="checkedDepartNameString"
+            disabled
+            @search="onSearch"
+          >
+            <a-button slot="enterButton" icon="search">选择</a-button>
+          </a-input-search>
+        </a-form-item>
+
+        <a-form-item label="公司座机" :labelCol="labelCol" :wrapperCol="wrapperCol">
+          <a-input placeholder="请输入公司座机" v-decorator="['ncompanyPhone', {}]" />
+        </a-form-item>
+
+        <a-form-item label="手机号码" :labelCol="labelCol" :wrapperCol="wrapperCol">
+          <a-input
+            placeholder="请输入手机号码"
+            :disabled="isDisabledAuth('user:form:phone')"
+            v-decorator="['phone', validatorRules.phone]"
+          />
+        </a-form-item>
+
+        <a-form-item label="邮箱" :labelCol="labelCol" :wrapperCol="wrapperCol">
+          <a-input placeholder="请输入邮箱" v-decorator="['email', validatorRules.email]" />
+        </a-form-item>
+
+        <a-form-item label="员工状态" :labelCol="labelCol" :wrapperCol="wrapperCol">
+          <a-select placeholder="请选择员工状态" v-decorator="[ 'syHireType', validatorRules.syHireType]" >
+            <a-select-option value="在职">在职</a-select-option>
+            <a-select-option value="离职">离职</a-select-option>
+            <a-select-option value="退休">退休</a-select-option>
+            <a-select-option value="辞退">辞退</a-select-option>
+          </a-select>
+        </a-form-item>
+
+        <a-form-item label="工资开户行" :labelCol="labelCol" :wrapperCol="wrapperCol">
+          <a-input v-decorator="[ 'bank', validatorRules.bank]" placeholder="请输入工资开户行"></a-input>
+        </a-form-item>
+
+        <a-form-item label="工资卡号" :labelCol="labelCol" :wrapperCol="wrapperCol">
+          <a-input placeholder="请输入工资卡号" v-decorator="['ncardNo', validatorRules.ncardNo]" />
+        </a-form-item>
+
+        <a-form-item label="公积金号" :labelCol="labelCol" :wrapperCol="wrapperCol">
+            <a-input v-decorator="[ 'cpf', validatorRules.cpf]" placeholder="请输入公积金号"></a-input>
+        </a-form-item>
+        <a-form-item label="社保缴纳地" :labelCol="labelCol" :wrapperCol="wrapperCol">
+            <a-input v-decorator="[ 'ssPlace', validatorRules.ssPlace]" placeholder="请输入社保缴纳地"></a-input>
+        </a-form-item>
+        <a-form-item label="社保号" :labelCol="labelCol" :wrapperCol="wrapperCol">
+            <a-input v-decorator="[ 'ssAccount', validatorRules.ssAccount]" placeholder="请输入社保号"></a-input>
+        </a-form-item>
+
+        <a-form-item label="身份" :labelCol="labelCol" :wrapperCol="wrapperCol">
+          <a-radio-group v-model="identity" @change="identityChange">
+            <a-radio value="1">普通用户</a-radio>
+            <a-radio value="2">上级</a-radio>
+          </a-radio-group>
+        </a-form-item>
+        <a-form-item label="负责部门" :labelCol="labelCol" :wrapperCol="wrapperCol" v-if="departIdShow == true">
+          <a-select
+            mode="multiple"
+            style="width: 100%"
+            placeholder="请选择负责部门"
+            v-model="departIds"
+            optionFilterProp="children"
+            :getPopupContainer="target => target.parentNode"
+            :dropdownStyle="{ maxHeight: '200px', overflow: 'auto' }"
+          >
+            <a-select-option v-for="item in resultDepartOptions" :key="item.key" :value="item.key">{{
+              item.title
+            }}</a-select-option>
+          </a-select>
+        </a-form-item>
+        <!-- <a-form-item label="工作流引擎" :labelCol="labelCol" :wrapperCol="wrapperCol">
+          <j-dict-select-tag
+            v-decorator="['activitiSync', {}]"
+            placeholder="请选择是否同步工作流引擎"
+            :type="'radio'"
+            :triggerChange="true"
+            dictCode="activiti_sync"
+          />
+        </a-form-item> -->
+
+        <a-form-item label="岗位职能要求" :labelCol="labelCol" :wrapperCol="wrapperCol" class="nresume">
+          <a-textarea  v-decorator="['requirement', validatorRules.requirement]" placeholder="请输入岗位职能要求"  :rows="4"></a-textarea >
+        </a-form-item>
+
+
+        <!-- <a-divider>IT维护</a-divider>
+        <a-form-item label="用户账号" :labelCol="labelCol" :wrapperCol="wrapperCol"  :validateOnRuleChange="true">
+          <a-input
+            placeholder="请输入用户账号"
+            v-decorator="['username', validatorRules.username]"
+            :readOnly="!!model.username"
+            autocomplete="off"
+          />
+        </a-form-item>
+
+        <template v-if="!model.id">
+          <a-form-item label="登陆密码" :labelCol="labelCol" :wrapperCol="wrapperCol">
+            <a-input type="password" placeholder="请输入登陆密码" v-decorator="['password', validatorRules.password]" autocomplete="new-password" @blur="changePssword"/>
+          </a-form-item>
+
+          <a-form-item label="确认密码" :labelCol="labelCol" :wrapperCol="wrapperCol">
+            <a-input
+              type="password"
+              @blur="handleConfirmBlur"
+              placeholder="请重新输入登陆密码"
+              v-decorator="['confirmpassword', validatorRules.confirmpassword]"
+            />
+          </a-form-item>
+        </template>
+        <a-form-item label="公司部门分配" :labelCol="labelCol" :wrapperCol="wrapperCol" v-show="!departDisabled">
+          <a-input-search
+            placeholder="点击右侧按钮选择公司和部门"
+            v-model="checkedDepartNameString"
+            disabled
+            @search="onSearch"
+          >
+            <a-button slot="enterButton" icon="search">选择</a-button>
+          </a-input-search>
+        </a-form-item>
+        <a-form-item label="角色分配" :labelCol="labelCol" :wrapperCol="wrapperCol" v-show="!roleDisabled">
+          <a-select
+            mode="multiple"
+            style="width: 100%"
+            placeholder="请选择用户角色"
+            optionFilterProp="children"
+            v-model="selectedRole"
+          >
+            <a-select-option v-for="(role, roleindex) in roleList" :key="roleindex.toString()" :value="role.id">
+              {{ role.roleName }}
+            </a-select-option>
+          </a-select>
+        </a-form-item> -->
+
+<!--         <a-form-item label="工作简历" :labelCol="labelCol" :wrapperCol="wrapperCol" class="nresume">-->
+<!--          <a-input type="textarea" placeholder="请输入" v-decorator="['nresume', {}]" />-->
+<!--        </a-form-item>-->
+      </a-form>
+    </a-spin>
+
+    <depart-window ref="departWindow" @ok="modalFormOk"></depart-window>
+    <!-- <div class="drawer-bootom-button" v-show="!disableSubmit">
+      <a-button style="margin-right: .8rem" @click="handleCancel">取消</a-button>
+      <a-button @click="handleSubmit" type="primary" :loading="confirmLoading">提交</a-button>
+    </div> -->
+  </a-modal>
+</template>
+
+<script>
+import pick from 'lodash.pick'
+import moment from 'moment'
+import Vue from 'vue'
+// 引入搜索部门弹出框的组件
+import departWindow from './DepartWindow'
+import JSelectPosition from '@/components/jeecgbiz/JSelectPosition'
+import { ACCESS_TOKEN } from '@/store/mutation-types'
+import { getAction } from '@/api/manage'
+import { addUser, editUser, queryUserRole, queryall, duplicateCheck } from '@/api/api'
+import { disabledAuthFilter } from '@/utils/authFilter'
+
+import JImageUpload from '../../../components/jeecg/JImageUpload'
+
+export default {
+    name: 'NewUserModal',
+    components: {
+        JImageUpload,
+        departWindow,
+        JSelectPosition
+    },
+    data () {
+        return {
+            departDisabled: false, // 是否是我的部门调用该页面
+            roleDisabled: false, // 是否是角色维护调用该页面
+            modalWidth: 800,
+            drawerWidth: 700,
+            modaltoggleFlag: true,
+            confirmDirty: false,
+            selectedDepartKeys: [], // 保存用户选择部门id
+            checkedDepartKeys: [],
+            checkedDepartNames: [], // 保存部门的名称 =>title
+            checkedDepartNameString: '', // 保存部门的名称 =>title
+            resultDepartOptions: [],
+            userId: '', // 保存用户id
+            disableSubmit: false,
+            userDepartModel: { userId: '', departIdList: [] }, // 保存SysUserDepart的用户部门中间表数据需要的对象
+            dateFormat: 'YYYY-MM-DD',
+            validatorRules: {
+                // username: {
+                //     rules: [
+                //         {
+                //             required: false,
+                //             message: '请输入用户账号!'
+                //         },
+                //         {
+                //             validator: this.validateUsername
+                //         }
+                //     ]
+                // },
+                // password: {
+                //     rules: [
+                //         {
+                //             required: false,
+                //              message: '请输入密码!'
+                //             // pattern: /^(?=.*[a-zA-Z])(?=.*\d)(?=.*[~!@#$%^&*()_+`\-={}:";'<>?,./]).{8,}$/,
+                //             // message: '密码由8位数字、大小写字母和特殊符号组成!'
+                //         },
+                //         {
+                //             validator: this.validateToNextPassword
+                //         }
+                //     ],
+                //     initialValue:'123456'
+                // },
+                // confirmpassword: {
+                //     rules: [
+                //         {
+                //             required: false,
+                //             message: '请重新输入登陆密码!'
+                //         },
+                //         {
+                //             validator: this.compareToFirstPassword
+                //         }
+                //     ]
+                // },
+                realname: { rules: [{ required: true, message: '请输入用户名称!' }] },
+                phone: { rules: [{ validator: this.validatePhone },{ required: true, message: '请输入手机号码!' }] },
+                email: {
+                    rules: [
+                        {
+                            // validator: this.validateEmail
+                        }
+                    ]
+                },
+                roles: {},
+                //  sex:{initialValue:((!this.model.sex)?"": (this.model.sex+""))}
+                telephone: {
+                    // rules: [{ required: true, message: '请输入座机' },{ pattern: /^0\d{2,3}-[1-9]\d{6,7}$/, message: '请输入正确的座机号码' }]
+                    rules: [{ required: true, message: '请输入家庭电话' }]
+                },
+                sex:{
+                    rules: [{ required: true, message: '请选择性别' }]
+                },
+                nidNo:{
+                    rules: [{ required: true, message: '输入身份证号码' }]
+                },
+                post:{
+                    rules: [{ required: true, message: '请选择职位' }]
+                },
+                ncardNo:{
+                    rules: [{ required: true, message: '请输入工资卡号' }]
+                },
+                bank:{
+                    rules: [{ required: true, message: '请输入工资开户行' }]
+                },
+                npersonnelType:{
+                    rules: [{ required: true, message: '请选择人员类型' }]
+                },
+                checkedDepartNameString:{
+                   rules: [{ required: true, message: '请选择部门!' }]
+                }
+            },
+            departIdShow: false,
+            departIds: [], // 负责部门id
+            title: '操作',
+            visible: false,
+            model: {},
+            roleList: [],
+            selectedRole: [],
+            labelCol: {
+                xs: { span: 24 },
+                sm: { span: 5 }
+            },
+            wrapperCol: {
+                xs: { span: 24 },
+                sm: { span: 16 }
+            },
+            uploadLoading: false,
+            confirmLoading: false,
+            headers: {},
+            form: this.$form.createForm(this),
+            picUrl: '',
+            url: {
+                fileUpload: window._CONFIG['domianURL'] + '/sys/common/upload',
+                imgerver: window._CONFIG['staticDomainURL'],
+                userWithDepart: '/sys/user/userDepartList', // 引入为指定用户查看部门信息需要的url
+                userId: '/sys/user/generateUserId', // 引入生成添加用户情况下的url
+                syncUserByUserName: '/process/extActProcess/doSyncUserByUserName' // 同步用户到工作流
+            },
+            identity: '1',
+            ifOa:'0',
+            fileList: [],
+            orgObject: {
+                pkOrg: '', // 选中的公司id
+                pkOrgName: '' // 选中的公司名称
+            },
+            userObject: {} // 用户信息
+        }
+    },
+    created () {
+        const token = Vue.ls.get(ACCESS_TOKEN)
+        this.headers = { 'X-Access-Token': token }
+    },
+    computed: {
+        uploadAction: function () {
+            return this.url.fileUpload
+        }
+    },
+    methods: {
+        isDisabledAuth (code) {
+            return disabledAuthFilter(code)
+        },
+        // 窗口最大化切换
+        toggleScreen () {
+            if (this.modaltoggleFlag) {
+                this.modalWidth = window.innerWidth
+            } else {
+                this.modalWidth = 800
+            }
+            this.modaltoggleFlag = !this.modaltoggleFlag
+        },
+        initialRoleList () {
+            queryall().then(res => {
+                if (res.success) {
+                    this.roleList = res.result
+                } else {
+                    console.log(res.message)
+                }
+            })
+        },
+        loadUserRoles (userid) {
+            queryUserRole({ userid: userid }).then(res => {
+                if (res.success) {
+                    this.selectedRole = res.result
+                } else {
+                    console.log(res.message)
+                }
+            })
+        },
+        refresh () {
+            this.selectedDepartKeys = []
+            this.checkedDepartKeys = []
+            this.checkedDepartNames = []
+            this.checkedDepartNameString = ''
+            this.userId = ''
+            this.resultDepartOptions = []
+            this.departId = []
+            this.departIdShow = false
+        },
+        add () {
+            this.picUrl = ''
+            this.refresh()
+            this.edit({ activitiSync: '1' })
+        },
+        edit (record) {
+            this.resetScreenSize() // 调用此方法,根据屏幕宽度自适应调整抽屉的宽度
+            let that = this
+            that.initialRoleList()
+            that.checkedDepartNameString = ''
+            that.form.resetFields()
+            if (record.hasOwnProperty('id')) {
+                that.loadUserRoles(record.id)
+                setTimeout(() => {
+                    this.fileList = record.avatar
+                }, 5)
+            }
+            that.userId = record.id
+            // 修改赋值公司id
+            this.orgObject.pkOrg = record.pkOrg
+            this.orgObject.pkOrgName = record.pkOrgName
+            this.userObject = record
+            that.visible = true
+            that.model = Object.assign({}, record)
+            that.$nextTick(() => {
+                that.form.setFieldsValue(
+                    pick(
+                        this.model,
+                        'username',
+                        'sex',
+                        'realname',
+                        'email',
+                        'phone',
+                        'activitiSync',
+                        'workNo',
+                        'telephone',
+                        'post',
+                        'nenName',
+                        'nmarriage',
+                        'nregistered',
+                        'noutlook',
+                        'nmajor',
+                        'neducation',
+                        'ngraduationTime',
+                        'ninductionTime',
+                        'ncompanyPhone',
+                        'ncompanyLine',
+                        'ncardNo',
+                        'nvirtualNo',
+                        'nBecomeTime',
+                        'nsocialTime',
+                        'nfundTime',
+                        'nfundBase',
+                        'nsocialBase',
+                        'nannualNum',
+                        'nannualOldNum',
+                        'nannualNowNum',
+                        'nnation',
+                        'nnativePlace',
+                        'nidNo',
+                        'nhomeAddress',
+                        'nrequirement',
+                        'nhopeFor',
+                        'nregisteredAddr',
+                        'nrelationshipFor',
+                        'npersonnelType',
+                        'nregisteredAddr',
+                        'ifOa',
+                        'idType',
+                        'type',
+                        'syHireType',
+                        'bank',
+                        'cpf',
+                        'ssPlace',
+                        'ssAccount',
+                        'requirement'
+                    )
+                )
+            })
+            // 身份为上级显示负责部门,否则不显示
+            if (this.model.identity == '2') {
+                this.identity = '2'
+                this.departIdShow = true
+            } else {
+                this.identity = '1'
+                this.departIdShow = false
+            }
+            // 调用查询用户对应的部门信息的方法
+            that.checkedDepartKeys = []
+            that.loadCheckedDeparts()
+        },
+        //
+        loadCheckedDeparts () {
+            let that = this
+            if (!that.userId) {
+                return
+            }
+            getAction(that.url.userWithDepart, { userId: that.userId }).then(res => {
+                that.checkedDepartNames = []
+                if (res.success) {
+                    var depart = []
+                    var departId = []
+                    for (let i = 0; i < res.result.length; i++) {
+                        that.checkedDepartNames.push(res.result[i].title)
+                        this.checkedDepartNameString = this.checkedDepartNames.join(',')
+                        that.checkedDepartKeys.push(res.result[i].key)
+                        // 新增负责部门选择下拉框
+                        depart.push({
+                            key: res.result[i].key,
+                            title: res.result[i].title
+                        })
+                        departId.push(res.result[i].key)
+                    }
+                    that.resultDepartOptions = depart
+                    // 判断部门id是否存在,不存在择直接默认当前所在部门
+                    if (this.model.departIds) {
+                        this.departIds = this.model.departIds.split(',')
+                    } else {
+                        this.departIds = departId
+                    }
+                    that.userDepartModel.departIdList = that.checkedDepartKeys
+                } else {
+                    console.log(res.message)
+                }
+            })
+        },
+        close () {
+            console.log('?????')
+            this.$emit('close')
+            this.visible = false
+            this.ifOa ='0'
+            this.disableSubmit = false
+            this.selectedRole = []
+            this.userDepartModel = { userId: '', departIdList: [] }
+            this.checkedDepartNames = []
+            this.checkedDepartNameString = ''
+            this.checkedDepartKeys = []
+            this.selectedDepartKeys = []
+            this.resultDepartOptions = []
+            this.departIds = []
+            this.departIdShow = false
+            this.identity = '1'
+            this.fileList = []
+            this.orgObject = []
+            this.userObject = {}
+            this.validatorRules.username.rules[0].required = false
+            this.validatorRules.confirmpassword.rules[0].required = false
+        },
+        moment,
+        handleSubmit () {
+            if(!this.orgObject.pkOrg){
+              this.$message.warning("请选择公司");
+              return
+            }
+            const that = this
+            // 触发表单验证
+            this.form.validateFields((err, values) => {
+                if (!err) {
+                    that.confirmLoading = true
+                    if (!values.birthday) {
+                        values.birthday = ''
+                    } else {
+                        values.birthday = values.birthday.format(this.dateFormat)
+                    }
+                    let formData = Object.assign(this.model, values)
+                    // 获取公司信息
+                    formData.pkOrg = this.orgObject.pkOrg
+                    formData.pkOrgName = this.orgObject.pkOrgName
+                    formData.avatar = that.fileList
+                    formData.selectedroles = this.selectedRole.length > 0 ? this.selectedRole.join(',') : ''
+                    formData.selecteddeparts =
+                    this.userDepartModel.departIdList.length > 0 ? this.userDepartModel.departIdList.join(',') : ''
+                    formData.identity = this.identity
+                    // 如果是上级择传入departIds,否则为空
+                    if (this.identity === '2') {
+                        formData.departIds = this.departIds.join(',')
+                    } else {
+                        formData.departIds = ''
+                    }
+                    // that.addDepartsToUser(that,formData); // 调用根据当前用户添加部门信息的方法
+                    let obj
+                    if (!this.model.id) {
+                        formData.id = this.userId
+                        obj = addUser(formData)
+                    } else {
+                        obj = editUser(formData)
+                    }
+                    obj
+                        .then(res => {
+                            if (res.success) {
+                                that.$message.success(res.message)
+                                that.$emit('ok')
+                            } else {
+                                that.$message.warning(res.message)
+                            }
+                        })
+                        .finally(() => {
+                            that.confirmLoading = false
+                            that.checkedDepartNames = []
+                            that.userDepartModel.departIdList = { userId: '', departIdList: [] }
+                            that.close()
+                        })
+                }
+            })
+        },
+        handleCancel () {
+            this.close()
+        },
+        validateToNextPassword (rule, value, callback) {
+            const form = this.form
+            const confirmpassword = form.getFieldValue('confirmpassword')
+
+            if (value && confirmpassword && value !== confirmpassword) {
+                callback('两次输入的密码不一样!')
+            }
+            if (value && this.confirmDirty) {
+                form.validateFields(['confirm'], { force: true })
+            }
+            callback()
+        },
+        compareToFirstPassword (rule, value, callback) {
+            const form = this.form
+            if (value && value !== form.getFieldValue('password')) {
+                callback('两次输入的密码不一样!')
+            } else {
+                callback()
+            }
+        },
+        validatePhone (rule, value, callback) {
+            if (!value) {
+                callback()
+            } else {
+                // update-begin--Author:kangxiaolin  Date:20190826 for:[05] 手机号不支持199号码段--------------------
+                if (new RegExp(/^1[3|4|5|7|8|9][0-9]\d{8}$/).test(value)) {
+                    // update-end--Author:kangxiaolin  Date:20190826 for:[05] 手机号不支持199号码段--------------------
+
+                    var params = {
+                        tableName: 'sys_user',
+                        fieldName: 'phone',
+                        fieldVal: value,
+                        dataId: this.userId
+                    }
+                    duplicateCheck(params).then(res => {
+                        if (res.success) {
+                            callback()
+                        } else {
+                            callback('手机号已存在!')
+                        }
+                    })
+                } else {
+                    callback('请输入正确格式的手机号码!')
+                }
+            }
+        },
+        validateEmail (rule, value, callback) {
+            if (!value) {
+                callback()
+            } else {
+                if (
+                    new RegExp(
+                        /^(([^<>()\[\]\\.,;:\s@"]+(\.[^<>()\[\]\\.,;:\s@"]+)*)|(".+"))@((\[[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}])|(([a-zA-Z\-0-9]+\.)+[a-zA-Z]{2,}))$/
+                    ).test(value)
+                ) {
+                    var params = {
+                        tableName: 'sys_user',
+                        fieldName: 'email',
+                        fieldVal: value,
+                        dataId: this.userId
+                    }
+                    duplicateCheck(params).then(res => {
+                        console.log(res)
+                        if (res.success) {
+                            callback()
+                        } else {
+                            callback('邮箱已存在!')
+                        }
+                    })
+                } else {
+                    callback('请输入正确格式的邮箱!')
+                }
+            }
+        },
+        validateUsername (rule, value, callback) {
+            var params = {
+                tableName: 'sys_user',
+                fieldName: 'username',
+                fieldVal: value,
+                dataId: this.userId
+            }
+            duplicateCheck(params).then(res => {
+                if (res.success) {
+                    callback()
+                } else {
+                    callback('用户名已存在!')
+                }
+            })
+        },
+        validateWorkNo (rule, value, callback) {
+            var params = {
+                tableName: 'sys_user',
+                fieldName: 'work_no',
+                fieldVal: value,
+                dataId: this.userId
+            }
+            duplicateCheck(params).then(res => {
+                if (res.success) {
+                    callback()
+                } else {
+                    callback('工号已存在!')
+                }
+            })
+        },
+        handleConfirmBlur (e) {
+            const value = e.target.value
+            this.confirmDirty = this.confirmDirty || !!value
+        },
+
+        normFile (e) {
+            console.log('Upload event:', e)
+            if (Array.isArray(e)) {
+                return e
+            }
+            return e && e.fileList
+        },
+        beforeUpload: function (file) {
+            var fileType = file.type
+            if (fileType.indexOf('image') < 0) {
+                this.$message.warning('请上传图片')
+                return false
+            }
+            // TODO 验证文件大小
+        },
+        handleChange (info) {
+            this.picUrl = ''
+            if (info.file.status === 'uploading') {
+                this.uploadLoading = true
+                return
+            }
+            if (info.file.status === 'done') {
+                var response = info.file.response
+                this.uploadLoading = false
+                console.log(response)
+                if (response.success) {
+                    this.model.avatar = response.message
+                    this.picUrl = 'Has no pic url yet'
+                } else {
+                    this.$message.warning(response.message)
+                }
+            }
+        },
+        // 搜索用户对应的部门API
+        onSearch () {
+            this.$refs.departWindow.add(this.checkedDepartKeys, this.userId, this.userObject)
+        },
+
+        // 获取用户对应部门弹出框提交给返回的数据
+        modalFormOk (formData) {
+            this.orgObject = formData.orgObject // 公司信息
+            // 没有选择则直接退出
+            if (!formData.departIdList || formData.departIdList.length == 0) {
+                return
+            }
+
+            this.checkedDepartNames = []
+            this.selectedDepartKeys = []
+            this.checkedDepartNameString = ''
+            this.userId = formData.userId
+            this.userDepartModel.userId = formData.userId
+            this.departIds = []
+            this.resultDepartOptions = []
+            var depart = []
+            for (let i = 0; i < formData.departIdList.length; i++) {
+                this.selectedDepartKeys.push(formData.departIdList[i].key)
+                this.checkedDepartNames.push(formData.departIdList[i].title)
+                this.checkedDepartNameString = this.checkedDepartNames.join(',')
+                // 新增部门选择,如果上面部门选择后不为空直接付给负责部门
+                depart.push({
+                    key: formData.departIdList[i].key,
+                    title: formData.departIdList[i].title
+                })
+                this.departIds.push(formData.departIdList[i].key)
+            }
+            this.resultDepartOptions = depart
+            this.userDepartModel.departIdList = this.selectedDepartKeys
+            this.checkedDepartKeys = this.selectedDepartKeys // 更新当前的选择keys
+        },
+        // 根据屏幕变化,设置抽屉尺寸
+        resetScreenSize () {
+            let screenWidth = document.body.clientWidth
+            if (screenWidth < 500) {
+                this.drawerWidth = screenWidth
+            } else {
+                this.drawerWidth = 700
+            }
+        },
+        identityChange (e) {
+            if (e.target.value === '1') {
+                this.departIdShow = false
+            } else {
+                this.departIdShow = true
+            }
+        },
+        changeOa(e){
+            if(e.target.value === '1'){
+                this.validatorRules.username.rules[0].required = true
+            }else{
+                this.validatorRules.username.rules[0].required = false
+            }
+        },
+        changePssword(){
+          this.validatorRules.confirmpassword.rules[0].required = true
+        }
+    }
+}
+</script>
+
+<style scoped lang="less">
+.avatar-uploader > .ant-upload {
+  width: 104px;
+  height: 104px;
+}
+.ant-upload-select-picture-card i {
+  font-size: 49px;
+  color: #999;
+}
+
+.ant-upload-select-picture-card .ant-upload-text {
+  margin-top: 8px;
+  color: #666;
+}
+
+.ant-table-tbody .ant-table-row td {
+  padding-top: 10px;
+  padding-bottom: 10px;
+}
+
+.drawer-bootom-button {
+  position: absolute;
+  bottom: 0;
+  width: 100%;
+  border-top: 1px solid #e8e8e8;
+  padding: 10px 16px;
+  text-align: right;
+  left: 0;
+  background: #fff;
+  border-radius: 0 0 2px 2px;
+}
+/deep/.ant-form-item{
+    width: 31%;
+}
+/deep/.ant-form{
+    display: flex;
+    width: 100%;
+    flex-wrap: wrap;
+}
+.nresume{
+  width: 100% !important;
+}
+/deep/ .nresume .ant-form-item-label{
+  width: 8% !important;
+}
+/deep/ .nresume .ant-form-item-control-wrapper{
+  width: 84% !important;
+}
+/deep/ .nresume .ant-input{
+  height: 100px !important;
+}
+/deep/ .ant-col-sm-5{
+  width: 27%;
+}
+</style>