소스 검색

车辆信息、会议室管理、会议申请、人员维护

shenji 2 년 전
부모
커밋
58dab52bde

+ 190 - 0
src/views/oa/CarList.vue

@@ -0,0 +1,190 @@
+<template>
+  <a-card :bordered="false">
+    <!-- 查询区域 -->
+    <div class="table-page-search-wrapper">
+      <a-form layout="inline" @keyup.enter.native="searchQuery">
+        <a-row :gutter="24">
+
+        </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="{fixed:true,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>
+
+    <car-modal ref="modalForm" @ok="modalFormOk"></car-modal>
+  </a-card>
+</template>
+
+<script>
+
+  import { JeecgListMixin } from '@/mixins/JeecgListMixin'
+  import CarModal from './modules/CarModal'
+
+  export default {
+    name: "CarList",
+    mixins:[JeecgListMixin],
+    components: {
+      CarModal
+    },
+    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: 'number'
+          },
+          {
+            title:'车辆类型',
+            align:"center",
+            dataIndex: 'carType'
+          },
+          {
+            title:'能源类型',
+            align:"center",
+            dataIndex: 'energyType'
+          },
+          {
+            title:'座位数量',
+            align:"center",
+            dataIndex: 'seat'
+          },
+          {
+            title:'购买价格',
+            align:"center",
+            dataIndex: 'price'
+          },
+          {
+            title:'购置日期',
+            align:"center",
+            dataIndex: 'purchaseDate',
+            customRender:function (text) {
+              return !text?"":(text.length>10?text.substr(0,10):text)
+            }
+          },
+          {
+            title:'发动机号码',
+            align:"center",
+            dataIndex: 'engineNum'
+          },
+          {
+            title:'车架号',
+            align:"center",
+            dataIndex: 'vin'
+          },
+          {
+            title: '操作',
+            dataIndex: 'action',
+            align:"center",
+            scopedSlots: { customRender: 'action' }
+          }
+        ],
+        url: {
+          list: "/oa/car/list",
+          delete: "/oa/car/delete",
+          deleteBatch: "/oa/car/deleteBatch",
+          exportXlsUrl: "/oa/car/exportXls",
+          importExcelUrl: "oa/car/importExcel",
+        },
+        dictOptions:{},
+      }
+    },
+    computed: {
+      importExcelUrl: function(){
+        return `${window._CONFIG['domianURL']}/${this.url.importExcelUrl}`;
+      }
+    },
+    methods: {
+      initDictConfig(){
+      }
+    }
+  }
+</script>
+<style scoped>
+  @import '~@assets/less/common.less';
+</style>

+ 198 - 0
src/views/oa/MeetingApplyList.vue

@@ -0,0 +1,198 @@
+<template>
+  <a-card :bordered="false">
+    <!-- 查询区域 -->
+    <div class="table-page-search-wrapper">
+      <a-form layout="inline" @keyup.enter.native="searchQuery">
+        <a-row :gutter="24">
+
+        </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="{fixed:true,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>
+
+    <meetingApply-modal ref="modalForm" @ok="modalFormOk"></meetingApply-modal>
+  </a-card>
+</template>
+
+<script>
+
+  import { JeecgListMixin } from '@/mixins/JeecgListMixin'
+  import MeetingApplyModal from './meeting-apply/MeetingApplyModal'
+
+  export default {
+    name: "MeetingApplyList",
+    mixins:[JeecgListMixin],
+    components: {
+      MeetingApplyModal
+    },
+    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: 'name'
+          },
+          {
+            title:'开始日期',
+            align:"center",
+            dataIndex: 'startTime',
+            customRender:function (text) {
+              return !text?"":(text.length>16?text.substr(0,16):text)
+            }
+          },
+          {
+            title:'结束日期',
+            align:"center",
+            dataIndex: 'endTime',
+            customRender:function (text) {
+              return !text?"":(text.length>16?text.substr(0,16):text)
+            }
+          },
+          {
+            title:'会议地点',
+            align:"center",
+            dataIndex: 'place'
+          },
+          {
+            title:'主持人',
+            align:"center",
+            dataIndex: 'host'
+          },
+          {
+            title:'记录人',
+            align:"center",
+            dataIndex: 'recorder'
+          },
+          {
+            title:'博馆参会人',
+            align:"center",
+            dataIndex: 'participant'
+          },
+          {
+            title:'其他参会人',
+            align:"center",
+            dataIndex: 'others'
+          },
+          {
+            title:'会议议程',
+            align:"center",
+            dataIndex: 'schedule'
+          },
+          {
+            title: '操作',
+            dataIndex: 'action',
+            align:"center",
+            scopedSlots: { customRender: 'action' }
+          }
+        ],
+        url: {
+          list: "/oa/meetingApply/list",
+          delete: "/oa/meetingApply/delete",
+          deleteBatch: "/oa/meetingApply/deleteBatch",
+          exportXlsUrl: "/oa/meetingApply/exportXls",
+          importExcelUrl: "oa/meetingApply/importExcel",
+        },
+        dictOptions:{},
+      }
+    },
+    computed: {
+      importExcelUrl: function(){
+        return `${window._CONFIG['domianURL']}/${this.url.importExcelUrl}`;
+      }
+    },
+    methods: {
+      initDictConfig(){
+      }
+    }
+  }
+</script>
+<style scoped>
+  @import '~@assets/less/common.less';
+</style>

+ 162 - 0
src/views/oa/MeetingRoomList.vue

@@ -0,0 +1,162 @@
+<template>
+  <a-card :bordered="false">
+    <!-- 查询区域 -->
+    <div class="table-page-search-wrapper">
+      <a-form layout="inline" @keyup.enter.native="searchQuery">
+        <a-row :gutter="24">
+
+        </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="{fixed:true,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>
+
+    <meetingRoom-modal ref="modalForm" @ok="modalFormOk"></meetingRoom-modal>
+  </a-card>
+</template>
+
+<script>
+
+  import { JeecgListMixin } from '@/mixins/JeecgListMixin'
+  import MeetingRoomModal from './meeting-room/MeetingRoomModal'
+
+  export default {
+    name: "MeetingRoomList",
+    mixins:[JeecgListMixin],
+    components: {
+      MeetingRoomModal
+    },
+    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: 'name'
+          },
+          {
+            title:'容纳人数',
+            align:"center",
+            dataIndex: 'capacity'
+          },
+          {
+            title:'设备',
+            align:"center",
+            dataIndex: 'equipment'
+          },
+          {
+            title: '操作',
+            dataIndex: 'action',
+            align:"center",
+            scopedSlots: { customRender: 'action' }
+          }
+        ],
+        url: {
+          list: "/oa/meetingRoom/list",
+          delete: "/oa/meetingRoom/delete",
+          deleteBatch: "/oa/meetingRoom/deleteBatch",
+          exportXlsUrl: "/oa/meetingRoom/exportXls",
+          importExcelUrl: "oa/meetingRoom/importExcel",
+        },
+        dictOptions:{},
+      }
+    },
+    computed: {
+      importExcelUrl: function(){
+        return `${window._CONFIG['domianURL']}/${this.url.importExcelUrl}`;
+      }
+    },
+    methods: {
+      initDictConfig(){
+      }
+    }
+  }
+</script>
+<style scoped>
+  @import '~@assets/less/common.less';
+</style>

+ 235 - 0
src/views/oa/StaffList.vue

@@ -0,0 +1,235 @@
+<template>
+  <a-card :bordered="false">
+    <!-- 查询区域 -->
+    <div class="table-page-search-wrapper">
+      <a-form layout="inline" @keyup.enter.native="searchQuery">
+        <a-row :gutter="24">
+
+        </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="{fixed:true,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>
+
+    <staff-modal ref="modalForm" @ok="modalFormOk"></staff-modal>
+  </a-card>
+</template>
+
+<script>
+
+  import { JeecgListMixin } from '@/mixins/JeecgListMixin'
+  import StaffModal from './modules/StaffModal'
+
+  export default {
+    name: "StaffList",
+    mixins:[JeecgListMixin],
+    components: {
+      StaffModal
+    },
+    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: 'name'
+          },
+          {
+            title:'性别',
+            align:"center",
+            dataIndex: 'gender'
+          },
+          {
+            title:'证件类型',
+            align:"center",
+            dataIndex: 'idType'
+          },
+          {
+            title:'证件号码',
+            align:"center",
+            dataIndex: 'idNo'
+          },
+          {
+            title:'入职日期',
+            align:"center",
+            dataIndex: 'inDate',
+            customRender:function (text) {
+              return !text?"":(text.length>10?text.substr(0,10):text)
+            }
+          },
+          {
+            title:'部门',
+            align:"center",
+            dataIndex: 'dept'
+          },
+          {
+            title:'岗位',
+            align:"center",
+            dataIndex: 'post'
+          },
+          {
+            title:'员工类型',
+            align:"center",
+            dataIndex: 'type'
+          },
+          {
+            title:'办公电话',
+            align:"center",
+            dataIndex: 'tel'
+          },
+          {
+            title:'移动电话',
+            align:"center",
+            dataIndex: 'mobile'
+          },
+          {
+            title:'邮件',
+            align:"center",
+            dataIndex: 'email'
+          },
+          {
+            title:'工资开户行',
+            align:"center",
+            dataIndex: 'bank'
+          },
+          {
+            title:'工资账号',
+            align:"center",
+            dataIndex: 'bankAccount'
+          },
+          {
+            title:'公积金号',
+            align:"center",
+            dataIndex: 'cpf'
+          },
+          {
+            title:'社保缴纳地',
+            align:"center",
+            dataIndex: 'ssPlace'
+          },
+          {
+            title:'社保号',
+            align:"center",
+            dataIndex: 'ssAccount'
+          },
+          {
+            title:'员工状态',
+            align:"center",
+            dataIndex: 'status'
+          },
+          {
+            title: '操作',
+            dataIndex: 'action',
+            align:"center",
+            scopedSlots: { customRender: 'action' }
+          }
+        ],
+        url: {
+          list: "/oa/staff/list",
+          delete: "/oa/staff/delete",
+          deleteBatch: "/oa/staff/deleteBatch",
+          exportXlsUrl: "/oa/staff/exportXls",
+          importExcelUrl: "oa/staff/importExcel",
+        },
+        dictOptions:{},
+      }
+    },
+    computed: {
+      importExcelUrl: function(){
+        return `${window._CONFIG['domianURL']}/${this.url.importExcelUrl}`;
+      }
+    },
+    methods: {
+      initDictConfig(){
+      }
+    }
+  }
+</script>
+<style scoped>
+  @import '~@assets/less/common.less';
+</style>

+ 295 - 0
src/views/oa/componet/UserSelectModal.vue

@@ -0,0 +1,295 @@
+<template>
+  <a-modal
+    :title="title"
+    :width="1200"
+    :visible="visible"
+    @ok="handleOk"
+    @cancel="handleCancel"
+    cancelText="关闭">
+
+    <div class="table-page-search-wrapper">
+      <a-form layout="inline">
+        <a-row :gutter="24">
+
+          <a-col :span="6">
+            <a-form-item label="账号">
+              <a-input placeholder="请输入账号" v-model="queryParam.username"></a-input>
+            </a-form-item>
+          </a-col>
+
+          <a-col :span="6">
+            <a-form-item label="性别">
+              <a-select v-model="queryParam.sex" placeholder="请选择性别">
+                <a-select-option value="">请选择性别查询</a-select-option>
+                <a-select-option value="1">男性</a-select-option>
+                <a-select-option value="2">女性</a-select-option>
+              </a-select>
+            </a-form-item>
+          </a-col>
+
+
+          <template v-if="toggleSearchStatus">
+            <a-col :span="6">
+              <a-form-item label="邮箱">
+                <a-input placeholder="请输入邮箱" v-model="queryParam.email"></a-input>
+              </a-form-item>
+            </a-col>
+
+            <a-col :span="6">
+              <a-form-item label="手机号码">
+                <a-input placeholder="请输入手机号码" v-model="queryParam.phone"></a-input>
+              </a-form-item>
+            </a-col>
+
+            <a-col :span="6">
+              <a-form-item label="状态">
+                <a-select v-model="queryParam.status" placeholder="请选择状态">
+                  <a-select-option value="">请选择状态</a-select-option>
+                  <a-select-option value="1">正常</a-select-option>
+                  <a-select-option value="2">解冻</a-select-option>
+                </a-select>
+              </a-form-item>
+            </a-col>
+          </template>
+
+          <a-col :span="6" >
+            <span style="float: left;overflow: hidden;" class="table-page-search-submitButtons">
+              <a-button type="primary" @click="searchByquery" 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>
+    <a-table
+      ref="table"
+      rowKey="id"
+      :columns="columns"
+      :dataSource="dataSource"
+      :pagination="ipagination"
+      :rowSelection="{type:selectionType,selectedRowKeys: selectedRowKeys, onChange: onSelectChange,onSelect:onSelect}"
+      @change="handleTableChange"
+      
+    >
+  </a-table>
+  </a-modal>
+</template>
+
+<script>
+  import { filterObj } from '@/utils/util';
+
+  import { getUserList } from '@/api/api'
+
+  export default {
+    name: "UserSelectModal",
+    components: {
+    },
+    props: {
+      selectionType:{
+        type: String,
+        required: false,
+        default: 'checkbox'
+      },
+    },
+    data () {
+      return {
+        title:"选择用户",
+        queryParam: {},
+        columns: [{
+          title: '用户账号',
+          align:"center",
+          dataIndex: 'username',
+          fixed:'left',
+          width:200
+        },{
+          title: '用户名称',
+          align:"center",
+          dataIndex: 'realname',
+        },{
+          title: '性别',
+          align:"center",
+          dataIndex: 'sex',
+          customRender:function (text) {
+            if(text==1){
+              return "男";
+            }else if(text==2){
+              return "女";
+            }else{
+              return text;
+            }
+          }
+        },{
+          title: '手机号码',
+          align:"center",
+          dataIndex: 'phone'
+        },{
+          title: '邮箱',
+          align:"center",
+          dataIndex: 'email'
+        },{
+          title: '状态',
+          align:"center",
+          dataIndex: 'status',
+          customRender:function (text) {
+            if(text==1){
+              return "正常";
+            }else if(text==2){
+              return "冻结";
+            }else{
+              return text;
+            }
+          }
+        }],
+        dataSource:[],
+        ipagination:{
+          current: 1,
+          pageSize: 5,
+          pageSizeOptions: ['5', '10', '20'],
+          showTotal: (total, range) => {
+            return range[0] + "-" + range[1] + " 共" + total + "条"
+          },
+          showQuickJumper: true,
+          showSizeChanger: true,
+          total: 0
+        },
+        isorter:{
+          column: 'createTime',
+          order: 'desc',
+        },
+        selectedRowKeys: [],
+        selectionRows: [],
+        visible:false,
+        toggleSearchStatus:false,
+      }
+    },
+    created() {
+      this.loadData();
+    },
+    methods: {
+      add (selectUser,userIds) {
+        this.visible = true;
+        this.edit(selectUser,userIds);
+      },
+      edit(selectUser,userIds){
+        if(!userIds){
+          this.selectedRowKeys = []
+        }else{
+          this.selectedRowKeys = userIds;
+        }
+        if(!selectUser){
+          this.selectionRows=[]
+        }else{
+          var that=this;
+          that.selectionRows=[];
+          selectUser.forEach(function(record,index){
+            console.log(record)
+            that.selectionRows.push({id: that.selectedRowKeys[index],realname:record})
+          })
+          // this.selectionRows = selectUser;
+        }
+      },
+      loadData (arg){
+        if(arg===1){
+          this.ipagination.current = 1;
+        }
+        let params = this.getQueryParams();//查询条件
+        getUserList(params).then((res)=>{
+          if(res.success){
+            this.dataSource = res.result.records;
+            this.ipagination.total = res.result.total;
+          }
+        })
+      },
+      getQueryParams(){
+        let param = Object.assign({}, this.queryParam,this.isorter);
+        param.field = this.getQueryField();
+        param.pageNo = this.ipagination.current;
+        param.pageSize = this.ipagination.pageSize;
+        return filterObj(param);
+      },
+      getQueryField(){
+        let str = "id,";
+        for(let a = 0;a<this.columns.length;a++){
+          str+=","+this.columns[a].dataIndex;
+        }
+        return str;
+      },
+      onSelectChange (selectedRowKeys) {
+        this.selectedRowKeys = selectedRowKeys;
+      },
+      onSelect(record, selected){
+        if(this.selectionType=='checkbox'){
+          if(selected == true ){
+            this.selectionRows.push(record);
+          }else {
+            this.selectionRows.forEach(function(item,index,arr){
+              if(item.id == record.id) {
+                arr.splice(index, 1);
+              }
+            })
+          }
+        }else if(this.selectionType=='radio'){
+            this.selectionRows = [];
+            this.selectionRows.push(record);
+        }
+        
+      },
+
+      searchReset(){
+        let that = this;
+        Object.keys(that.queryParam).forEach(function(key){
+          that.queryParam[key] = '';
+        });
+        that.loadData(1);
+      },
+      handleTableChange(pagination, filters, sorter){
+        //TODO 筛选
+        if (Object.keys(sorter).length>0){
+          this.isorter.column = sorter.field;
+          this.isorter.order = "ascend"==sorter.order?"asc":"desc"
+        }
+        this.ipagination = pagination;
+        this.loadData();
+      },
+      handleCancel () {
+        this.selectionRows = [];
+        this.selectedRowKeys = [];
+        this.visible = false;
+      },
+      handleOk () {
+        this.$emit("choseUser",this.selectionRows);
+        this.handleCancel();
+      },
+      searchByquery(){
+        this.loadData(1);
+      },
+      handleToggleSearch(){
+        this.toggleSearchStatus = !this.toggleSearchStatus;
+      },
+    }
+  }
+</script>
+<style scoped>
+  .ant-card-body .table-operator{
+    margin-bottom: 18px;
+  }
+
+  .ant-table-tbody .ant-table-row td{
+    padding-top:15px;
+    padding-bottom:15px;
+  }
+  .anty-row-operator button{margin: 0 5px}
+  .ant-btn-danger{background-color: #ffffff}
+
+  .ant-modal-cust-warp{height: 100%}
+  .ant-modal-cust-warp .ant-modal-body{height:calc(100% - 110px) !important;overflow-y: auto}
+  .ant-modal-cust-warp .ant-modal-content{height:90% !important;overflow-y: hidden}
+
+  .anty-img-wrap{height:25px;position: relative;}
+  .anty-img-wrap > img{max-height:100%;}
+</style>

+ 317 - 0
src/views/oa/meeting-apply/MeetingApplyModal.vue

@@ -0,0 +1,317 @@
+<template>
+  <a-modal
+    :title="title"
+    :width="width"
+    :visible="visible"
+    :confirmLoading="confirmLoading"
+    @ok="handleOk"
+    @cancel="handleCancel"
+    cancelText="关闭">
+    <a-spin :spinning="confirmLoading">
+      <a-form :form="form">
+
+        <a-form-item label="会议名称" :labelCol="labelCol" :wrapperCol="wrapperCol">
+          <a-input v-decorator="[ 'name', validatorRules.name]" placeholder="请输入会议名称"></a-input>
+        </a-form-item>
+        <a-form-item label="开始日期" :labelCol="labelCol" :wrapperCol="wrapperCol">
+          <j-date placeholder="请选择开始日期" :getCalendarContainer="node => node.parentNode" dateFormat="YYYY-MM-DD HH:mm" show-time v-decorator="[ 'startTime', validatorRules.startTime]" style="width: 100%"/>
+        </a-form-item>
+        <a-form-item label="结束日期" :labelCol="labelCol" :wrapperCol="wrapperCol">
+          <j-date placeholder="请选择结束日期" :getCalendarContainer="node => node.parentNode" dateFormat="YYYY-MM-DD HH:mm" show-time v-decorator="[ 'endTime', validatorRules.endTime]" style="width: 100%"/>
+        </a-form-item>
+        <a-form-item label="会议地点" :labelCol="labelCol" :wrapperCol="wrapperCol">
+          <a-select placeholder="请选择" v-decorator="[ 'roomId', validatorRules.roomId]">
+            <!-- <a-select-option :value="undefined">请选择</a-select-option> -->
+            <a-select-option
+              v-for="(item,index) in rooms"
+              :key="index"
+              :value="item.id">
+              {{ item.name }}
+            </a-select-option>
+          </a-select>
+        </a-form-item>
+        <a-form-item label="主持人" :labelCol="labelCol" :wrapperCol="wrapperCol">
+          <a-select
+                placeholder="请选择主持人"
+                v-model="selectedHost"
+                @dropdownVisibleChange="selectHost"
+              >
+              </a-select>
+        </a-form-item>
+        <a-form-item label="记录人" :labelCol="labelCol" :wrapperCol="wrapperCol">
+          <a-select
+                placeholder="请选择记录人"
+                v-model="selectedRecorder"
+                @dropdownVisibleChange="selectRecorder"
+              >
+              </a-select>
+        </a-form-item>
+        <a-form-item label="博馆参会人" :labelCol="labelCol" :wrapperCol="wrapperCol">
+          <a-select
+                mode="multiple"
+                placeholder="请选择博馆参会人"
+                v-model="selectedParticipant"
+                @dropdownVisibleChange="selectParticipant"
+              >
+              </a-select>
+        </a-form-item>
+        <a-form-item label="其他参会人" :labelCol="labelCol" :wrapperCol="wrapperCol">
+          <a-input v-decorator="[ 'others', validatorRules.others]" placeholder="请输入其他参会人"></a-input>
+        </a-form-item>
+        <a-form-item label="会议议程" :labelCol="labelCol" :wrapperCol="wrapperCol">
+          <a-input v-decorator="[ 'schedule', validatorRules.schedule]" placeholder="请输入会议议程"></a-input>
+        </a-form-item>
+        
+
+        <user-select-modal ref="HostSelectModal" @choseUser="chooseHost" selectionType="radio"></user-select-modal>
+        <user-select-modal ref="RecorderSelectModal" @choseUser="chooseRecorder" selectionType="radio"></user-select-modal>
+        <user-select-modal ref="ParticipantSelectModal" @choseUser="chooseParticipant"></user-select-modal>
+      </a-form>
+    </a-spin>
+  </a-modal>
+</template>
+
+<script>
+
+  import { httpAction, getAction } from '@/api/manage'
+  import pick from 'lodash.pick'
+  import { validateDuplicateValue } from '@/utils/util'
+  import JDate from '@/components/jeecg/JDate'  
+  import moment from 'moment'
+  import UserSelectModal from '../componet/UserSelectModal'
+
+  export default {
+    name: "MeetingApplyModal",
+    components: { 
+      JDate,
+      UserSelectModal,
+    },
+    data () {
+      return {
+        form: this.$form.createForm(this),
+        title:"操作",
+        width:800,
+        visible: false,
+        model: {
+          host:'',
+          recorder:'',
+          participant:'',
+          hostId:'',
+          recorderId:'',
+          participantIds:'',
+          roomId:''
+        },
+        labelCol: {
+          xs: { span: 24 },
+          sm: { span: 5 },
+        },
+        wrapperCol: {
+          xs: { span: 24 },
+          sm: { span: 16 },
+        },
+        confirmLoading: false,
+        validatorRules: {
+          name: {rules: [
+            { required: true, message: '请输入名称!' }
+          ]},
+          startTime: {rules: [
+            { required: true, message: '请选择开始时间!' },
+            { validator: this.startTimeValidate }
+          ]},
+          endTime: {rules: [
+            { required: true, message: '请选择结束时间!' },
+            { validator: this.endTimeValidate }
+          ]},
+          place: {rules: [
+          ]},
+          host: {rules: [
+          ]},
+          recorder: {rules: [
+          ]},
+          participant: {rules: [
+          ]},
+          others: {rules: [
+          ]},
+          schedule: {rules: [
+          ]},
+          roomId: {rules: [
+            { required: true, message: '请选择会议地点!' }
+          ]},
+          hostId: {rules: [
+          ]},
+          recorderId: {rules: [
+          ]},
+          participantIds: {rules: [
+          ]},
+        },
+        url: {
+          add: "/oa/meetingApply/add",
+          edit: "/oa/meetingApply/edit",
+          all: "/oa/meetingRoom/all",
+        },
+        rooms: [],
+        selectedHostIds: [],
+        selectedHost: [],
+        selectedRecorderIds: [],
+        selectedRecorder: [],
+        selectedParticipantIds: [],
+        selectedParticipant: [],
+      }
+    },
+    mounted () {
+      this.initRooms()
+    },
+    methods: {
+      add () {
+        this.edit({});
+      },
+      edit (record) {
+        this.form.resetFields();
+        this.model = Object.assign({}, record);
+        this.visible = true;
+        this.$nextTick(() => {
+          this.form.setFieldsValue(pick(this.model,'name','startTime','endTime','place','host','recorder','participant','others','schedule','accessory','roomId','hostId','recorderId','participantIds'))
+        })
+        if(this.model!=undefined){
+          this.selectedHost = this.model.host==undefined||this.model.host.length==0?[]:this.model.host.split(",")
+          this.selectedHostIds = this.model.hostId==undefined||this.model.hostId.length==0?[]:this.model.hostId.split(",")
+          this.selectedRecorder = this.model.recorder==undefined||this.model.recorder.length==0?[]:this.model.recorder.split(",")
+          this.selectedRecorderIds = this.model.recorderId==undefined||this.model.recorderId.length==0?[]:this.model.recorderId.split(",")
+          this.selectedParticipantIds = this.model.participantIds==undefined||this.model.participantIds.length==0?[]:this.model.participantIds.split(",")
+          this.selectedParticipant = this.model.participant==undefined||this.model.participant.length==0?[]:this.model.participant.split(",")
+        }
+      },
+      close () {
+        this.$emit('close');
+        this.visible = false;
+      },
+      handleOk () {
+        console.log('start');
+        const that = this;
+        // 触发表单验证
+        this.form.validateFields((err, values) => {
+          if (!err) {
+            that.confirmLoading = true;
+            let httpurl = '';
+            let method = '';
+            if(!this.model.id){
+              httpurl+=this.url.add;
+              method = 'post';
+            }else{
+              httpurl+=this.url.edit;
+               method = 'put';
+            }
+            let formData = Object.assign(that.model, values);
+            formData.hostId = that.selectedHostIds.join(',')
+            formData.host = that.selectedHost.join(',')
+            formData.recorderId = that.selectedRecorderIds.join(',')
+            formData.recorder = that.selectedRecorder.join(',')
+            formData.participantIds = that.selectedParticipantIds.join(',')
+            formData.participant = that.selectedParticipant.join(',')
+            console.log("表单提交数据",formData)
+            httpAction(httpurl,formData,method).then((res)=>{
+              if(res.success){
+                that.$message.success(res.message);
+                that.$emit('ok');
+                that.close();
+              }else{
+                that.$message.warning(res.message);
+              }
+            }).finally(() => {
+              that.confirmLoading = false;
+            })
+          }
+         
+        })
+      },
+      handleCancel () {
+        this.close()
+        this.resetUser()
+      },
+      resetUser () {
+        this.selectedHost = []
+        this.selectedHostIds = []
+        this.selectedRecorder = []
+        this.selectedRecorderIds = []
+        this.selectedParticipantIds = []
+        this.selectedParticipant = []
+        this.$refs.HostSelectModal.edit(null, null)
+        this.$refs.RecorderSelectModal.edit(null, null)
+        this.$refs.ParticipantSelectModal.edit(null, null)
+      },
+      popupCallback(row){
+        this.form.setFieldsValue(pick(row,'name','startTime','endTime','place','host','recorder','participant','others','schedule','accessory','roomId','hostId','recorderId','participantIds'))
+      },
+      initRooms(){
+        getAction(this.url.all).then((res)=>{
+          if(res.success){
+            this.rooms = res.result
+          }else {
+            this.$message.warning(res.message)
+          }
+        })
+      },
+      selectHost () {
+        this.$refs.HostSelectModal.add(this.selectedHost, this.selectedHostIds)
+      },
+      // 子modal回调
+      chooseHost: function (userList) {
+        console.log(userList.length);
+          this.selectedHost = []
+          this.selectedHostIds = []
+          for (var i = 0; i < userList.length; i++) {
+              this.selectedHost.push(userList[i].realname)
+              this.selectedHostIds.push(userList[i].id)
+          }
+      },
+      selectRecorder () {
+        this.$refs.RecorderSelectModal.add(this.selectedRecorder, this.selectedRecorderIds)
+      },
+      // 子modal回调
+      chooseRecorder: function (userList) {
+        console.log(userList.length);
+          this.selectedRecorder = []
+          this.selectedRecorderIds = []
+          for (var i = 0; i < userList.length; i++) {
+              this.selectedRecorder.push(userList[i].realname)
+              this.selectedRecorderIds.push(userList[i].id)
+          }
+      },
+      selectParticipant () {
+        this.$refs.ParticipantSelectModal.add(this.selectedParticipant, this.selectedParticipantIds)
+      },
+      // 子modal回调
+      chooseParticipant: function (userList) {
+        console.log(userList.length);
+          this.selectedParticipant = []
+          this.selectedParticipantIds = []
+          for (var i = 0; i < userList.length; i++) {
+              this.selectedParticipant.push(userList[i].realname)
+              this.selectedParticipantIds.push(userList[i].id)
+          }
+      },
+      startTimeValidate (rule, value, callback) {
+          let endTime = this.form.getFieldValue('endTime')
+          if (!value || !endTime) {
+              callback()
+          } else if (moment(value).isBefore(endTime)) {
+              callback()
+          } else {
+              callback('开始时间需小于结束时间')
+          }
+      },
+      endTimeValidate (rule, value, callback) {
+          let startTime = this.form.getFieldValue('startTime')
+          if (!value || !startTime) {
+              callback()
+          } else if (moment(startTime).isBefore(value)) {
+              callback()
+          } else {
+              callback('结束时间需大于开始时间')
+          }
+      }
+
+      
+    }
+  }
+</script>

+ 130 - 0
src/views/oa/meeting-room/MeetingRoomModal.vue

@@ -0,0 +1,130 @@
+<template>
+  <a-modal
+    :title="title"
+    :width="width"
+    :visible="visible"
+    :confirmLoading="confirmLoading"
+    @ok="handleOk"
+    @cancel="handleCancel"
+    cancelText="关闭">
+    <a-spin :spinning="confirmLoading">
+      <a-form :form="form">
+
+        <a-form-item label="会议室名称" :labelCol="labelCol" :wrapperCol="wrapperCol">
+          <a-input v-decorator="[ 'name', validatorRules.name]" placeholder="请输入会议室名称"></a-input>
+        </a-form-item>
+        <a-form-item label="容纳人数" :labelCol="labelCol" :wrapperCol="wrapperCol">
+          <a-input-number v-decorator="[ 'capacity', validatorRules.capacity]" placeholder="请输入容纳人数" style="width: 100%"/>
+        </a-form-item>
+        <a-form-item label="设备" :labelCol="labelCol" :wrapperCol="wrapperCol">
+          <a-input v-decorator="[ 'equipment', validatorRules.equipment]" placeholder="请输入设备"></a-input>
+        </a-form-item>
+
+      </a-form>
+    </a-spin>
+  </a-modal>
+</template>
+
+<script>
+
+  import { httpAction } from '@/api/manage'
+  import pick from 'lodash.pick'
+  import { validateDuplicateValue } from '@/utils/util'
+
+  export default {
+    name: "MeetingRoomModal",
+    components: { 
+    },
+    data () {
+      return {
+        form: this.$form.createForm(this),
+        title:"操作",
+        width:800,
+        visible: false,
+        model: {},
+        labelCol: {
+          xs: { span: 24 },
+          sm: { span: 5 },
+        },
+        wrapperCol: {
+          xs: { span: 24 },
+          sm: { span: 16 },
+        },
+        confirmLoading: false,
+        validatorRules: {
+          name: {rules: [
+            {required: true, message: '请输入会议室名称!'},
+          ]},
+          capacity: {rules: [
+            {required: true, message: '请输入容纳人数!'},
+          ]},
+          equipment: {rules: [
+          ]},
+        },
+        url: {
+          add: "/oa/meetingRoom/add",
+          edit: "/oa/meetingRoom/edit",
+        }
+      }
+    },
+    created () {
+    },
+    methods: {
+      add () {
+        this.edit({});
+      },
+      edit (record) {
+        this.form.resetFields();
+        this.model = Object.assign({}, record);
+        this.visible = true;
+        this.$nextTick(() => {
+          this.form.setFieldsValue(pick(this.model,'name','capacity','equipment'))
+        })
+      },
+      close () {
+        this.$emit('close');
+        this.visible = false;
+      },
+      handleOk () {
+        const that = this;
+        // 触发表单验证
+        this.form.validateFields((err, values) => {
+          if (!err) {
+            that.confirmLoading = true;
+            let httpurl = '';
+            let method = '';
+            if(!this.model.id){
+              httpurl+=this.url.add;
+              method = 'post';
+            }else{
+              httpurl+=this.url.edit;
+               method = 'put';
+            }
+            let formData = Object.assign(this.model, values);
+            console.log("表单提交数据",formData)
+            httpAction(httpurl,formData,method).then((res)=>{
+              if(res.success){
+                that.$message.success(res.message);
+                that.$emit('ok');
+              }else{
+                that.$message.warning(res.message);
+              }
+            }).finally(() => {
+              that.confirmLoading = false;
+              that.close();
+            })
+          }
+         
+        })
+      },
+      handleCancel () {
+        this.close()
+      },
+      popupCallback(row){
+        this.form.setFieldsValue(pick(row,'name','capacity','equipment'))
+      },
+
+      
+    }
+  }
+</script>

+ 164 - 0
src/views/oa/modules/CarModal.vue

@@ -0,0 +1,164 @@
+<template>
+  <a-modal
+    :title="title"
+    :width="width"
+    :visible="visible"
+    :confirmLoading="confirmLoading"
+    @ok="handleOk"
+    @cancel="handleCancel"
+    cancelText="关闭">
+    <a-spin :spinning="confirmLoading">
+      <a-form :form="form">
+
+        <a-form-item label="车牌号" :labelCol="labelCol" :wrapperCol="wrapperCol">
+          <a-input v-decorator="[ 'number', validatorRules.number]" placeholder="请输入车牌号"></a-input>
+        </a-form-item>
+        <a-form-item label="车辆类型" :labelCol="labelCol" :wrapperCol="wrapperCol">
+          <a-select placeholder="请选择车辆类型" v-decorator="[ 'carType', validatorRules.carType]" >
+            <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-select placeholder="请选择能源类型" v-decorator="[ 'energyType', validatorRules.energyType]" >
+            <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="[ 'seat', validatorRules.seat]" placeholder="请输入座位数量"></a-input>
+        </a-form-item>
+        <a-form-item label="购买价格" :labelCol="labelCol" :wrapperCol="wrapperCol">
+          <a-input-number v-decorator="[ 'price', validatorRules.price]" placeholder="请输入购买价格" style="width: 100%"/>
+        </a-form-item>
+        <a-form-item label="购置日期" :labelCol="labelCol" :wrapperCol="wrapperCol">
+          <j-date placeholder="请选择购置日期" v-decorator="[ 'purchaseDate', validatorRules.purchaseDate]" :trigger-change="true" style="width: 100%"/>
+        </a-form-item>
+        <a-form-item label="发动机号码" :labelCol="labelCol" :wrapperCol="wrapperCol">
+          <a-input v-decorator="[ 'engineNum', validatorRules.engineNum]" placeholder="请输入发动机号码"></a-input>
+        </a-form-item>
+        <a-form-item label="车架号" :labelCol="labelCol" :wrapperCol="wrapperCol">
+          <a-input v-decorator="[ 'vin', validatorRules.vin]" placeholder="请输入车架号"></a-input>
+        </a-form-item>
+
+      </a-form>
+    </a-spin>
+  </a-modal>
+</template>
+
+<script>
+
+  import { httpAction } from '@/api/manage'
+  import pick from 'lodash.pick'
+  import { validateDuplicateValue } from '@/utils/util'
+  import JDate from '@/components/jeecg/JDate'  
+
+  export default {
+    name: "CarModal",
+    components: { 
+      JDate,
+    },
+    data () {
+      return {
+        form: this.$form.createForm(this),
+        title:"操作",
+        width:800,
+        visible: false,
+        model: {},
+        labelCol: {
+          xs: { span: 24 },
+          sm: { span: 5 },
+        },
+        wrapperCol: {
+          xs: { span: 24 },
+          sm: { span: 16 },
+        },
+        confirmLoading: false,
+        validatorRules: {
+          number: {rules: [
+          ]},
+          carType: {rules: [
+          ]},
+          energyType: {rules: [
+          ]},
+          seat: {rules: [
+          ]},
+          price: {rules: [
+          ]},
+          purchaseDate: {rules: [
+          ]},
+          engineNum: {rules: [
+          ]},
+          vin: {rules: [
+          ]},
+          accesory: {rules: [
+          ]},
+        },
+        url: {
+          add: "/oa/car/add",
+          edit: "/oa/car/edit",
+        }
+      }
+    },
+    created () {
+    },
+    methods: {
+      add () {
+        this.edit({});
+      },
+      edit (record) {
+        this.form.resetFields();
+        this.model = Object.assign({}, record);
+        this.visible = true;
+        this.$nextTick(() => {
+          this.form.setFieldsValue(pick(this.model,'number','carType','energyType','seat','price','purchaseDate','engineNum','vin','accesory'))
+        })
+      },
+      close () {
+        this.$emit('close');
+        this.visible = false;
+      },
+      handleOk () {
+        const that = this;
+        // 触发表单验证
+        this.form.validateFields((err, values) => {
+          if (!err) {
+            that.confirmLoading = true;
+            let httpurl = '';
+            let method = '';
+            if(!this.model.id){
+              httpurl+=this.url.add;
+              method = 'post';
+            }else{
+              httpurl+=this.url.edit;
+               method = 'put';
+            }
+            let formData = Object.assign(this.model, values);
+            console.log("表单提交数据",formData)
+            httpAction(httpurl,formData,method).then((res)=>{
+              if(res.success){
+                that.$message.success(res.message);
+                that.$emit('ok');
+              }else{
+                that.$message.warning(res.message);
+              }
+            }).finally(() => {
+              that.confirmLoading = false;
+              that.close();
+            })
+          }
+         
+        })
+      },
+      handleCancel () {
+        this.close()
+      },
+      popupCallback(row){
+        this.form.setFieldsValue(pick(row,'number','carType','energyType','seat','price','purchaseDate','engineNum','vin','accesory'))
+      },
+
+      
+    }
+  }
+</script>

+ 327 - 0
src/views/oa/modules/StaffModal.vue

@@ -0,0 +1,327 @@
+<template>
+  <a-modal
+    :title="title"
+    width="80%"
+    :visible="visible"
+    :confirmLoading="confirmLoading"
+    @ok="handleOk"
+    @cancel="handleCancel"
+    cancelText="关闭">
+    <a-spin :spinning="confirmLoading">
+      <a-form :form="form">
+        <a-row :gutter="24">
+          <a-col :span="12">
+            <a-form-item label="姓名" :labelCol="labelCol" :wrapperCol="wrapperCol">
+              <a-input v-decorator="[ 'name', validatorRules.name]" placeholder="请输入姓名"></a-input>
+            </a-form-item>
+          </a-col>
+
+          <a-col :span="12">
+            <a-form-item label="性别" :labelCol="labelCol" :wrapperCol="wrapperCol">
+              <a-select placeholder="请选择性别" v-decorator="[ 'gender', validatorRules.gender]" >
+                <a-select-option value="男">男</a-select-option>
+                <a-select-option value="女">女</a-select-option>
+              </a-select>
+            </a-form-item>
+          </a-col>
+        </a-row>
+        <a-row :gutter="24">
+          <a-col :span="12">
+            <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-col>
+
+          <a-col :span="12">
+            <a-form-item label="证件号码" :labelCol="labelCol" :wrapperCol="wrapperCol">
+              <a-input v-decorator="[ 'idNo', validatorRules.idNo]" placeholder="请输入证件号码"></a-input>
+            </a-form-item>
+          </a-col>
+        </a-row>
+        <a-row :gutter="24">
+          <a-col :span="12">
+            <a-form-item label="入职日期" :labelCol="labelCol" :wrapperCol="wrapperCol">
+              <j-date placeholder="请选择入职日期" v-decorator="[ 'inDate', validatorRules.inDate]" :trigger-change="true" style="width: 100%"/>
+            </a-form-item>
+          </a-col>
+
+          <a-col :span="12">
+            <a-form-item label="部门" :labelCol="labelCol" :wrapperCol="wrapperCol">
+              <a-tree-select
+                v-model="selectedDept"
+                style="width: 100%"
+                :tree-data="deptTree"
+                tree-checkable
+                allow-clear
+                placeholder="请选择部门"
+                @change="handleDeptChange"
+              />
+            </a-form-item>
+          </a-col>
+        </a-row>
+        <a-row :gutter="24">
+          <a-col :span="12">
+            <a-form-item label="岗位" :labelCol="labelCol" :wrapperCol="wrapperCol">
+              <a-input v-decorator="[ 'post', validatorRules.post]" placeholder="请输入岗位"></a-input>
+            </a-form-item>
+          </a-col>
+
+          <a-col :span="12">
+            <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-col>
+        </a-row>
+        <a-row :gutter="24">
+          <a-col :span="12">
+            <a-form-item label="办公电话" :labelCol="labelCol" :wrapperCol="wrapperCol">
+              <a-input v-decorator="[ 'tel', validatorRules.tel]" placeholder="请输入办公电话"></a-input>
+            </a-form-item>
+          </a-col>
+
+          <a-col :span="12">
+            <a-form-item label="移动电话" :labelCol="labelCol" :wrapperCol="wrapperCol">
+              <a-input v-decorator="[ 'mobile', validatorRules.mobile]" placeholder="请输入移动电话"></a-input>
+            </a-form-item>
+          </a-col>
+        </a-row>
+        <a-row :gutter="24">
+          <a-col :span="12">
+            <a-form-item label="邮件" :labelCol="labelCol" :wrapperCol="wrapperCol">
+              <a-input v-decorator="[ 'email', validatorRules.email]" placeholder="请输入邮件"></a-input>
+            </a-form-item>
+          </a-col>
+
+          <a-col :span="12">
+            <a-form-item label="员工状态" :labelCol="labelCol" :wrapperCol="wrapperCol">
+              <a-select placeholder="请选择员工状态" v-decorator="[ 'status', validatorRules.status]" >
+                <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-col>
+        </a-row>
+        <a-row :gutter="24">
+          <a-col :span="12">
+            <a-form-item label="工资开户行" :labelCol="labelCol" :wrapperCol="wrapperCol">
+              <a-input v-decorator="[ 'bank', validatorRules.bank]" placeholder="请输入工资开户行"></a-input>
+            </a-form-item>
+          </a-col>
+
+          <a-col :span="12">
+            <a-form-item label="工资账号" :labelCol="labelCol" :wrapperCol="wrapperCol">
+              <a-input v-decorator="[ 'bankAccount', validatorRules.bankAccount]" placeholder="请输入工资账号"></a-input>
+            </a-form-item>
+          </a-col>
+        </a-row>
+        <a-row :gutter="24">
+          <a-col :span="12">
+            <a-form-item label="公积金号" :labelCol="labelCol" :wrapperCol="wrapperCol">
+              <a-input v-decorator="[ 'cpf', validatorRules.cpf]" placeholder="请输入公积金号"></a-input>
+            </a-form-item>
+          </a-col>
+
+          <a-col :span="12">
+            <a-form-item label="社保缴纳地" :labelCol="labelCol" :wrapperCol="wrapperCol">
+              <a-input v-decorator="[ 'ssPlace', validatorRules.ssPlace]" placeholder="请输入社保缴纳地"></a-input>
+            </a-form-item>
+          </a-col>
+        </a-row>
+        <a-row :gutter="24">
+          <a-col :span="12">
+            <a-form-item label="社保号" :labelCol="labelCol" :wrapperCol="wrapperCol">
+              <a-input v-decorator="[ 'ssAccount', validatorRules.ssAccount]" placeholder="请输入社保号"></a-input>
+            </a-form-item>
+          </a-col>
+        </a-row>
+        <a-row :gutter="24">
+          <a-col :span="12">
+            <a-form-item label="岗位职能要求" :labelCol="labelCol" :wrapperCol="wrapperCol">
+              <a-textarea  v-decorator="[ 'requirement', validatorRules.requirement]" placeholder="请输入岗位职能要求" :rows="4"></a-textarea >
+            </a-form-item>
+          </a-col>
+        </a-row>
+
+      </a-form>
+    </a-spin>
+  </a-modal>
+</template>
+
+<script>
+
+  import { httpAction } from '@/api/manage'
+  import pick from 'lodash.pick'
+  import { validateDuplicateValue } from '@/utils/util'
+  import JDate from '@/components/jeecg/JDate'  
+  import { queryDepartTreeList } from '@/api/api'
+
+  export default {
+    name: "StaffModal",
+    components: { 
+      JDate,
+    },
+    data () {
+      return {
+        form: this.$form.createForm(this),
+        title:"操作",
+        visible: false,
+        model: {},
+        labelCol: {
+          xs: { span: 24 },
+          sm: { span: 5 },
+        },
+        wrapperCol: {
+          xs: { span: 24 },
+          sm: { span: 16 },
+        },
+        confirmLoading: false,
+        validatorRules: {
+          name: {rules: [
+            { required: true, message: '请输入姓名!' }
+          ]},
+          gender: {rules: [
+          ]},
+          idType: {rules: [
+          ]},
+          idNo: {rules: [
+          ]},
+          inDate: {rules: [
+          ]},
+          dept: {rules: [
+          ]},
+          deptId: {rules: [
+          ]},
+          post: {rules: [
+          ]},
+          type: {rules: [
+          ]},
+          tel: {rules: [
+          ]},
+          mobile: {rules: [
+          ]},
+          email: {rules: [
+          ]},
+          requirement: {rules: [
+          ]},
+          accesory: {rules: [
+          ]},
+          bank: {rules: [
+          ]},
+          bankAccount: {rules: [
+          ]},
+          cpf: {rules: [
+          ]},
+          ssPlace: {rules: [
+          ]},
+          ssAccount: {rules: [
+          ]},
+          status: {rules: [
+          ]},
+        },
+        url: {
+          add: "/oa/staff/add",
+          edit: "/oa/staff/edit",
+        },
+        deptTree: [],
+        selectedDept:[],
+        selectedDeptName:'',
+      }
+    },
+    mounted () {
+      this.initTreeData();
+    },
+    methods: {
+      add () {
+        this.edit({});
+      },
+      edit (record) {
+        this.form.resetFields();
+        this.model = Object.assign({}, record);
+        this.visible = true;
+        this.$nextTick(() => {
+          this.form.setFieldsValue(pick(this.model,'name','gender','idType','idNo','inDate','dept','post','type','tel','mobile','email','requirement','accesory','bank','bankAccount','cpf','ssPlace','ssAccount','status','deptId'))
+        })
+        if(this.model){
+          this.selectedDept = this.model.deptId==undefined||this.model.deptId.length==0?[]:this.model.deptId.split(",")
+          this.selectedDeptName = this.model.dept
+        }
+      },
+      close () {
+        this.$emit('close');
+        this.visible = false;
+      },
+      handleOk () {
+        const that = this;
+        // 触发表单验证
+        this.form.validateFields((err, values) => {
+          if (!err) {
+            that.confirmLoading = true;
+            let httpurl = '';
+            let method = '';
+            if(!this.model.id){
+              httpurl+=this.url.add;
+              method = 'post';
+            }else{
+              httpurl+=this.url.edit;
+               method = 'put';
+            }
+            let formData = Object.assign(this.model, values);
+            formData.deptId = this.selectedDept.join(',')
+            formData.dept = this.selectedDeptName
+            console.log("表单提交数据",formData)
+            httpAction(httpurl,formData,method).then((res)=>{
+              if(res.success){
+                that.$message.success(res.message);
+                that.$emit('ok');
+              }else{
+                that.$message.warning(res.message);
+              }
+            }).finally(() => {
+              that.confirmLoading = false;
+              that.close();
+            })
+          }
+         
+        })
+      },
+      handleCancel () {
+        this.close()
+      },
+      popupCallback(row){
+        this.form.setFieldsValue(pick(row,'name','gender','idType','idNo','inDate','dept','post','type','tel','mobile','email','requirement','accesory','bank','bankAccount','cpf','ssPlace','ssAccount','status','deptId'))
+      },
+
+      initTreeData() {
+        queryDepartTreeList().then((res)=>{
+          if (res.success) {
+            this.deptTree = res.result
+          } else {
+            this.$message.warn(res.message)
+          }
+        })
+      },
+      handleDeptChange(value, label, extra) {
+        if(!label){
+          this.selectedDept = []
+          this.selectedDeptName = ''
+        } else if (label instanceof Array) {
+          this.selectedDept = value
+          this.selectedDeptName = label.join(',')
+        } else {
+          this.selectedDept = value 
+          this.selectedDeptName = label 
+        }
+      },
+    }
+  }
+</script>