Browse Source

Merge branch 'wsm' of http://139.196.39.194:9021/chenc/cd-work-flow-web into wsm

jbb 2 năm trước cách đây
mục cha
commit
c2baaf85f4
32 tập tin đã thay đổi với 5127 bổ sung180 xóa
  1. 2 0
      src/config/router.config.js
  2. 28 1
      src/store/modules/user.js
  3. 61 4
      src/views/Index.vue
  4. 2 2
      src/views/activiti/historicDetail.vue
  5. 325 0
      src/views/oa/AssetInDetailList.vue
  6. 185 0
      src/views/oa/AssetInList.vue
  7. 262 0
      src/views/oa/AssetList.vue
  8. 280 0
      src/views/oa/CarfareDetailList.vue
  9. 177 0
      src/views/oa/CarfareList.vue
  10. 258 0
      src/views/oa/ConferenceApplyList.vue
  11. 209 0
      src/views/oa/ConferenceMinutesList.vue
  12. 225 0
      src/views/oa/ContractList.vue
  13. 252 0
      src/views/oa/MaterialInDetailList.vue
  14. 205 0
      src/views/oa/MaterialInList.vue
  15. 209 0
      src/views/oa/MaterialList.vue
  16. 177 0
      src/views/oa/MaterialStockList.vue
  17. 228 0
      src/views/oa/modules/AssetInDetailModal.vue
  18. 340 0
      src/views/oa/modules/AssetInModal.vue
  19. 180 0
      src/views/oa/modules/AssetModal.vue
  20. 12 4
      src/views/oa/modules/CarModal.vue
  21. 194 0
      src/views/oa/modules/CarfareDetailModal.vue
  22. 260 0
      src/views/oa/modules/CarfareModal.vue
  23. 193 0
      src/views/oa/modules/ContractModal.vue
  24. 175 0
      src/views/oa/modules/MaterialInDetailModal.vue
  25. 234 0
      src/views/oa/modules/MaterialInModal.vue
  26. 145 0
      src/views/oa/modules/MaterialModal.vue
  27. 22 10
      src/views/system/RoleUserList.vue
  28. 138 86
      src/views/system/UserList.vue
  29. 42 30
      src/views/system/modules/AddressListRight.vue
  30. 1 1
      src/views/system/modules/DepartWindow.vue
  31. 1 1
      src/views/system/modules/DeptUserInfo.vue
  32. 105 41
      src/views/system/modules/NewUserModal.vue

+ 2 - 0
src/config/router.config.js

@@ -388,6 +388,8 @@ export const constantRouterMap = [
   },
   {//////////////角色路径
     path: '/roleViewList',
+    name: 'roleViewList',
+    hidden: true,
     component: () => import(/* webpackChunkName: "fail" */ '../views/system/RoleUserList.vue')
   },
   {//////////////事故处理单路径

+ 28 - 1
src/store/modules/user.js

@@ -86,6 +86,31 @@ const user = {
         })
       })
     },
+    //单点登录uuid
+    uuidLogin({ commit }, param) {
+      return new Promise((resolve, reject) => {
+        postAction("/sys/uuid/login",param).then(response => {
+          if(response.success){
+            const result = response.result
+            const userInfo = result.userInfo
+            console.log(result)
+            console.log(userInfo)
+            Vue.ls.set(ACCESS_TOKEN, result.token, 7 * 24 * 60 * 60 * 1000)
+            Vue.ls.set(USER_NAME, userInfo.username, 7 * 24 * 60 * 60 * 1000)
+            Vue.ls.set(USER_INFO, userInfo, 7 * 24 * 60 * 60 * 1000)
+            commit('SET_TOKEN', result.token)
+            commit('SET_INFO', userInfo)
+            commit('SET_NAME', { username: userInfo.username,realname: userInfo.realname, welcome: welcome() })
+            commit('SET_AVATAR', userInfo.avatar)
+            resolve(response)
+          }else{
+            resolve(response)
+          }
+        }).catch(error => {
+          reject(error)
+        })
+      })
+    },
     // 登录
     Login({ commit }, userInfo) {
       return new Promise((resolve, reject) => {
@@ -212,6 +237,8 @@ const user = {
             let sevice = 'http://' + window.location.host + '/'
             let serviceUrl = encodeURIComponent(sevice)
             window.location.href = window._CONFIG['casPrefixUrl']+"/logout?service="+serviceUrl;
+              //博物馆单点登录注销
+//             window.location.href="http://172.18.91.12:8888/sso";
             // resolve()
         }).catch(() => {
           console.log("111111111111111")
@@ -244,4 +271,4 @@ const user = {
   }
 }
 
-export default user
+export default user

+ 61 - 4
src/views/Index.vue

@@ -7,7 +7,12 @@
   // @ is an alias to /src
 
   import Trend from '@/components/Trend'
-import { WindowsFill } from '@ant-design/icons/lib/dist';
+  import { WindowsFill } from '@ant-design/icons/lib/dist';
+  import { mapActions } from 'vuex'
+  import Vue from 'vue'
+  import { ACCESS_TOKEN, ENCRYPTED_STRING, USER_INFO } from '@/store/mutation-types'
+  import store from '@/store/'
+  import { timeFix } from '@/utils/util'
 
 
   export default {
@@ -17,14 +22,66 @@ import { WindowsFill } from '@ant-design/icons/lib/dist';
     },
     data () {
       return {
-        targetTime: new Date().getTime() + 3900000
       }
     },
     created(){
-      window.location.href = 'http://172.18.91.12:8888/sso/oauth/authorize?client_id=OAManager&response_type=code&redirect_url=http://172.18.91.36:8083/#/redirect/login'
+      this.getUUID();
     },
+    // created(){
+    //   window.location.href = 'http://172.18.91.12:8888/sso/oauth/authorize?client_id=OAManager&response_type=code&redirect_url=http://172.18.91.36:8083/#/redirect/login'
+    // },
     methods: {
-      
+      ...mapActions(['uuidLogin']),
+      getUUID(){
+        var url = window.location.href ;     
+        // var dz_url = url.split('#')[0];                //获取#/之前的字符串
+        var cs = url.split('?')[1];                //获取?之后的参数字符串
+        if(cs==undefined){
+          window.location.href = 'http://172.18.91.12:8888/sso/oauth/authorize?client_id=OAManager&response_type=code&redirect_url=http://172.18.91.36:8083/#/redirect/login'
+        }
+        var cs_arr = cs.split('&');                    //参数字符串分割为数组
+        var cs={};
+        for(var i=0;i<cs_arr.length;i++){         //遍历数组,拿到json对象
+          cs[cs_arr[i].split('=')[0]] = cs_arr[i].split('=')[1]
+        }
+
+        this.uuid = cs.uuid;
+        this.redirect = cs.redirect;
+        if(this.uuid){
+          this.uuidLogin({'uuid':this.uuid}).then(res=>{
+            if (res.success) {
+              console.log('用户信息', res)
+              let multi_depart = res.result.multi_depart
+              // 0:无部门 1:一个部门 2:多个部门
+              if (multi_depart == 0) {
+                  this.$notification.warn({
+                      message: '提示',
+                      description: `您尚未归属公司,请确认OA账号信息`,
+                      duration: 3
+                  })
+              } else {
+                  console.log('登录')
+                  const userInfo = res.result.userInfo
+                  Vue.ls.set(USER_INFO, userInfo, 7 * 24 * 60 * 60 * 1000)
+                  store.commit('SET_INFO', userInfo)
+                  if(this.redirect){
+                    this.$router.push({ name: this.redirect })
+                  }else{
+                    this.$router.push({ name: 'dashboard' })
+                  }
+              }
+            }
+          }).catch(err=>{
+            this.$notification['error']({
+              message: '认证失败',
+              description: ((err.response || {}).data || {}).message || err.message || '请求出现错误,请稍后再试',
+              duration: 4
+            })
+          })
+        }else{
+          window.location.href = 'http://172.18.91.12:8888/sso/oauth/authorize?client_id=OAManager&response_type=code&redirect_url=http://172.18.91.36:8083/#/redirect/login'
+        }
+      },
     }
   }
 </script>

+ 2 - 2
src/views/activiti/historicDetail.vue

@@ -43,7 +43,7 @@
               <span>{{t}}</span>
             </template>
           </a-table-column>
-          <a-table-column title="耗时" dataIndex="duration"  width="150" align="center">
+          <!-- <a-table-column title="耗时" dataIndex="duration"  width="150" align="center">
             <template slot-scope="t">
               <span>{{millsToTime(t)}}</span>
             </template>
@@ -52,7 +52,7 @@
             <template slot-scope="t">
               <span>{{t}}</span>
             </template>
-          </a-table-column>
+          </a-table-column> -->
           <a-table-column title="完成时间" dataIndex="endTime"  width="150" align="center">
             <template slot-scope="t">
               <span>{{t}}</span>

+ 325 - 0
src/views/oa/AssetInDetailList.vue

@@ -0,0 +1,325 @@
+<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.assetNumber"></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.assetName"></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="资产类别">
+                <a-input placeholder="请输入资产类别" v-model="queryParam.assetsCategory"></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.brand"></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.unitName"></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.model"></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.user"></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.userDept"></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.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>
+            <a-col :xl="10" :lg="11" :md="12" :sm="24">
+              <a-form-item label="入库日期">
+                <j-date placeholder="请选择开始日期" class="query-group-cust" v-model="queryParam.operatorDate_begin"></j-date>
+                <span class="query-group-split-cust"></span>
+                <j-date placeholder="请选择结束日期" class="query-group-cust" v-model="queryParam.operatorDate_end"></j-date>
+              </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="handleMultiAdd" 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>
+
+    <assetInDetail-modal ref="modalForm" @ok="modalFormOk"></assetInDetail-modal>
+    <assetIn-modal ref="multiAddModalForm" @ok="modalFormOk"></assetIn-modal>
+  </a-card>
+</template>
+
+<script>
+
+  import { JeecgListMixin } from '@/mixins/JeecgListMixin'
+  import AssetInDetailModal from './modules/AssetInDetailModal'
+  import AssetInModal from './modules/AssetInModal'
+
+  export default {
+    name: "AssetInDetailList",
+    mixins:[JeecgListMixin],
+    components: {
+      AssetInDetailModal,
+      AssetInModal
+    },
+    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: 'assetNumber'
+          },
+          {
+            title:'资产名称',
+            align:"center",
+            dataIndex: 'assetName'
+          },
+          {
+            title:'资产类别',
+            align:"center",
+            dataIndex: 'assetsCategory'
+          },
+          {
+            title:'品牌',
+            align:"center",
+            dataIndex: 'brand'
+          },
+          {
+            title:'单位名称',
+            align:"center",
+            dataIndex: 'unitName'
+          },
+          {
+            title:'规格型号',
+            align:"center",
+            dataIndex: 'model'
+          },
+          {
+            title:'计量单位',
+            align:"center",
+            dataIndex: 'unit'
+          },
+          {
+            title:'数量',
+            align:"center",
+            dataIndex: 'quantity'
+          },
+          {
+            title:'金额',
+            align:"center",
+            dataIndex: 'amount'
+          },
+          {
+            title:'使用年限',
+            align:"center",
+            dataIndex: 'exp'
+          },
+          {
+            title:'购置日期',
+            align:"center",
+            dataIndex: 'purhcaseDate',
+            customRender:function (text) {
+              return !text?"":(text.length>10?text.substr(0,10):text)
+            }
+          },
+          {
+            title:'入库日期',
+            align:"center",
+            dataIndex: 'inDate',
+            customRender:function (text) {
+              return !text?"":(text.length>10?text.substr(0,10):text)
+            }
+          },
+          {
+            title:'存放地点',
+            align:"center",
+            dataIndex: 'place'
+          },
+          {
+            title:'使用人',
+            align:"center",
+            dataIndex: 'user'
+          },
+          {
+            title:'使用部门',
+            align:"center",
+            dataIndex: 'userDept'
+          },
+          {
+            title:'资产状态',
+            align:"center",
+            dataIndex: 'state'
+          },
+          {
+            title:'入库人',
+            align:"center",
+            dataIndex: 'operator'
+          },
+          {
+            title:'入库部门',
+            align:"center",
+            dataIndex: 'operatorDept'
+          },
+          {
+            title:'入库日期',
+            align:"center",
+            dataIndex: 'operatorDate'
+          },
+          {
+            title: '操作',
+            dataIndex: 'action',
+            align:"center",
+            scopedSlots: { customRender: 'action' }
+          }
+        ],
+        url: {
+          list: "/oa/assetInDetail/list",
+          delete: "/oa/assetInDetail/delete",
+          deleteBatch: "/oa/assetInDetail/deleteBatch",
+          exportXlsUrl: "/oa/assetInDetail/exportXls",
+          importExcelUrl: "oa/assetInDetail/importExcel",
+        },
+        dictOptions:{},
+      }
+    },
+    computed: {
+      importExcelUrl: function(){
+        return `${window._CONFIG['domianURL']}/${this.url.importExcelUrl}`;
+      }
+    },
+    methods: {
+      initDictConfig(){
+      },
+      handleMultiAdd: function () {
+        this.$refs.multiAddModalForm.add();
+        this.$refs.multiAddModalForm.title = "新增";
+        this.$refs.multiAddModalForm.disableSubmit = false;
+      },
+    }
+  }
+</script>
+<style scoped>
+  @import '~@assets/less/common.less';
+</style>

+ 185 - 0
src/views/oa/AssetInList.vue

@@ -0,0 +1,185 @@
+<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="{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>
+
+    <assetIn-modal ref="modalForm" @ok="modalFormOk"></assetIn-modal>
+  </a-card>
+</template>
+
+<script>
+
+  import { JeecgListMixin } from '@/mixins/JeecgListMixin'
+  import AssetInModal from './modules/AssetInModal'
+
+  export default {
+    name: "AssetInList",
+    mixins:[JeecgListMixin],
+    components: {
+      AssetInModal
+    },
+    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: 'title'
+          },
+          {
+            title:'单据号',
+            align:"center",
+            dataIndex: 'inNo'
+          },
+          {
+            title:'创建人',
+            align:"center",
+            dataIndex: 'creater'
+          },
+          {
+            title:'创建部门',
+            align:"center",
+            dataIndex: 'createrDept'
+          },
+          {
+            title:'入库人',
+            align:"center",
+            dataIndex: 'operator'
+          },
+          {
+            title:'入库部门',
+            align:"center",
+            dataIndex: 'operatorDept'
+          },
+          {
+            title:'入库日期',
+            align:"center",
+            dataIndex: 'operatorDate',
+            customRender:function (text) {
+              return !text?"":(text.length>10?text.substr(0,10):text)
+            }
+          },
+          {
+            title: '操作',
+            dataIndex: 'action',
+            align:"center",
+            scopedSlots: { customRender: 'action' },
+          }
+        ],
+        url: {
+          list: "/oa/assetIn/list",
+          delete: "/oa/assetIn/delete",
+          deleteBatch: "/oa/assetIn/deleteBatch",
+          exportXlsUrl: "/oa/assetIn/exportXls",
+          importExcelUrl: "oa/assetIn/importExcel",
+        },
+        dictOptions:{},
+      }
+    },
+    computed: {
+      importExcelUrl: function(){
+        return `${window._CONFIG['domianURL']}/${this.url.importExcelUrl}`;
+      }
+    },
+    methods: {
+      initDictConfig(){
+      }
+       
+    }
+  }
+</script>
+<style scoped>
+  @import '~@assets/less/common.less';
+</style>

+ 262 - 0
src/views/oa/AssetList.vue

@@ -0,0 +1,262 @@
+<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.assetNumber"></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.assetName"></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="资产类别">
+                <a-input placeholder="请输入资产类别" v-model="queryParam.assetsCategory"></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.brand"></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.unitName"></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.model"></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.user"></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.userDept"></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.state"></a-input>
+              </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 -->
+    
+    <!-- table区域-begin -->
+    <div>
+
+      <a-table
+        ref="table"
+        size="middle"
+        bordered
+        rowKey="id"
+        :columns="columns"
+        :dataSource="dataSource"
+        :pagination="ipagination"
+        :loading="loading"
+        rowselection="false"
+        
+        @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>
+
+        </span>
+
+      </a-table>
+    </div>
+
+    <asset-modal ref="modalForm" @ok="modalFormOk"></asset-modal>
+  </a-card>
+</template>
+
+<script>
+
+  import { JeecgListMixin } from '@/mixins/JeecgListMixin'
+  import AssetModal from './modules/AssetModal'
+  import JDate from '@/components/jeecg/JDate.vue'
+
+  export default {
+    name: "AssetList",
+    mixins:[JeecgListMixin],
+    components: {
+      JDate,
+      AssetModal
+    },
+    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: 'assetNumber'
+          },
+          {
+            title:'资产名称',
+            align:"center",
+            dataIndex: 'assetName'
+          },
+          {
+            title:'资产类别',
+            align:"center",
+            dataIndex: 'assetsCategory'
+          },
+          {
+            title:'品牌',
+            align:"center",
+            dataIndex: 'brand'
+          },
+          {
+            title:'单位名称',
+            align:"center",
+            dataIndex: 'unitName'
+          },
+          {
+            title:'规格型号',
+            align:"center",
+            dataIndex: 'model'
+          },
+          {
+            title:'计量单位',
+            align:"center",
+            dataIndex: 'unit'
+          },
+          {
+            title:'数量',
+            align:"center",
+            dataIndex: 'quantity'
+          },
+          {
+            title:'金额',
+            align:"center",
+            dataIndex: 'amount'
+          },
+          {
+            title:'使用年限',
+            align:"center",
+            dataIndex: 'exp'
+          },
+          {
+            title:'购置日期',
+            align:"center",
+            dataIndex: 'purhcaseDate',
+            customRender:function (text) {
+              return !text?"":(text.length>10?text.substr(0,10):text)
+            }
+          },
+          {
+            title:'入库日期',
+            align:"center",
+            dataIndex: 'inDate',
+            customRender:function (text) {
+              return !text?"":(text.length>10?text.substr(0,10):text)
+            }
+          },
+          {
+            title:'存放地点',
+            align:"center",
+            dataIndex: 'place'
+          },
+          {
+            title:'使用人',
+            align:"center",
+            dataIndex: 'user'
+          },
+          {
+            title:'使用部门',
+            align:"center",
+            dataIndex: 'userDept'
+          },
+          {
+            title:'资产状态',
+            align:"center",
+            dataIndex: 'state'
+          },
+          {
+            title: '操作',
+            dataIndex: 'action',
+            align:"center",
+            scopedSlots: { customRender: 'action' }
+          }
+        ],
+        url: {
+          list: "/oa/asset/list",
+          delete: "/oa/asset/delete",
+          deleteBatch: "/oa/asset/deleteBatch",
+          exportXlsUrl: "/oa/asset/exportXls",
+          importExcelUrl: "oa/asset/importExcel",
+        },
+        dictOptions:{},
+      }
+    },
+    computed: {
+      importExcelUrl: function(){
+        return `${window._CONFIG['domianURL']}/${this.url.importExcelUrl}`;
+      }
+    },
+    methods: {
+      initDictConfig(){
+      }
+    }
+  }
+</script>
+<style scoped>
+  @import '~@assets/less/common.less';
+</style>

+ 280 - 0
src/views/oa/CarfareDetailList.vue

@@ -0,0 +1,280 @@
+<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="报销日期">
+              <j-date placeholder="请选择报销日期" v-model="queryParam.reimbursementDate"></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.paymentNo"></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="车牌号">
+                <a-input placeholder="请输入车牌号" v-model="queryParam.carNo"></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.submitter"></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.dept"></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.registrant"></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.registrantDept"></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.financeOperator"></a-input>
+              </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="handleMultiAdd" 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>
+
+    <carfareDetail-modal ref="modalForm" @ok="modalFormOk"></carfareDetail-modal>
+    <carfare-modal ref="multiAddModalForm" @ok="modalFormOk"></carfare-modal>
+  </a-card>
+</template>
+
+<script>
+
+  import { JeecgListMixin } from '@/mixins/JeecgListMixin'
+  import CarfareDetailModal from './modules/CarfareDetailModal'
+  import CarfareModal from './modules/CarfareModal'
+  import JDate from '@/components/jeecg/JDate'  
+
+  export default {
+    name: "CarfareDetailList",
+    mixins:[JeecgListMixin],
+    components: {
+      JDate,
+      CarfareDetailModal,
+      CarfareModal
+    },
+    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: 'reimbursementDate'
+          },
+          {
+            title:'支付凭证编号',
+            align:"center",
+            dataIndex: 'paymentNo'
+          },
+          {
+            title:'车牌号',
+            align:"center",
+            dataIndex: 'carNo'
+          },
+          {
+            title:'报销人',
+            align:"center",
+            dataIndex: 'submitter'
+          },
+          {
+            title:'部门',
+            align:"center",
+            dataIndex: 'dept'
+          },
+          {
+            title:'报销内容',
+            align:"center",
+            dataIndex: 'content'
+          },
+          {
+            title:'金额',
+            align:"center",
+            dataIndex: 'amount'
+          },
+          {
+            title:'附件',
+            align:"center",
+            dataIndex: 'attachment',
+            scopedSlots: {customRender: 'fileSlot'}
+          },
+          {
+            title:'备注',
+            align:"center",
+            dataIndex: 'remark'
+          },
+          {
+            title:'登记人',
+            align:"center",
+            dataIndex: 'registrant'
+          },
+          {
+            title:'登记部门',
+            align:"center",
+            dataIndex: 'registrantDept'
+          },
+          {
+            title:'财务经办人',
+            align:"center",
+            dataIndex: 'financeOperator'
+          },
+          {
+            title:'财务经办部门',
+            align:"center",
+            dataIndex: 'financeDept'
+          },
+          {
+            title:'财务负责人',
+            align:"center",
+            dataIndex: 'financeHead'
+          },
+          {
+            title: '操作',
+            dataIndex: 'action',
+            align:"center",
+            scopedSlots: { customRender: 'action' }
+          }
+        ],
+        url: {
+          list: "/oa/carfareDetail/list",
+          delete: "/oa/carfareDetail/delete",
+          deleteBatch: "/oa/carfareDetail/deleteBatch",
+          exportXlsUrl: "/oa/carfareDetail/exportXls",
+          importExcelUrl: "oa/carfareDetail/importExcel",
+        },
+        dictOptions:{},
+      }
+    },
+    computed: {
+      importExcelUrl: function(){
+        return `${window._CONFIG['domianURL']}/${this.url.importExcelUrl}`;
+      }
+    },
+    methods: {
+      initDictConfig(){
+      },
+      handleMultiAdd: function () {
+        this.$refs.multiAddModalForm.add();
+        this.$refs.multiAddModalForm.title = "新增";
+        this.$refs.multiAddModalForm.disableSubmit = false;
+      },
+    }
+  }
+</script>
+<style scoped>
+  @import '~@assets/less/common.less';
+</style>

+ 177 - 0
src/views/oa/CarfareList.vue

@@ -0,0 +1,177 @@
+<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="{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>
+
+    <carfare-modal ref="modalForm" @ok="modalFormOk"></carfare-modal>
+  </a-card>
+</template>
+
+<script>
+
+  import { JeecgListMixin } from '@/mixins/JeecgListMixin'
+  import CarfareModal from './modules/CarfareModal'
+
+  export default {
+    name: "CarfareList",
+    mixins:[JeecgListMixin],
+    components: {
+      CarfareModal
+    },
+    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: 'registrant'
+          },
+          {
+            title:'登记部门',
+            align:"center",
+            dataIndex: 'registrantDept'
+          },
+          {
+            title:'报销总额',
+            align:"center",
+            dataIndex: 'totalAmount'
+          },
+          {
+            title:'财务经办人',
+            align:"center",
+            dataIndex: 'financeOperator'
+          },
+          {
+            title:'财务经办部门',
+            align:"center",
+            dataIndex: 'financeDept'
+          },
+          {
+            title:'财务负责人',
+            align:"center",
+            dataIndex: 'financeHead'
+          },
+          {
+            title: '操作',
+            dataIndex: 'action',
+            align:"center",
+            scopedSlots: { customRender: 'action' },
+          }
+        ],
+        url: {
+          list: "/oa/carfare/list",
+          delete: "/oa/carfare/delete",
+          deleteBatch: "/oa/carfare/deleteBatch",
+          exportXlsUrl: "/oa/carfare/exportXls",
+          importExcelUrl: "oa/carfare/importExcel",
+        },
+        dictOptions:{},
+      }
+    },
+    computed: {
+      importExcelUrl: function(){
+        return `${window._CONFIG['domianURL']}/${this.url.importExcelUrl}`;
+      }
+    },
+    methods: {
+      initDictConfig(){
+      }
+       
+    }
+  }
+</script>
+<style scoped>
+  @import '~@assets/less/common.less';
+</style>

+ 258 - 0
src/views/oa/ConferenceApplyList.vue

@@ -0,0 +1,258 @@
+<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.conferenceTitle"></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.postedPerson"></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="发布部门">
+                <a-input placeholder="请输入发布部门" v-model="queryParam.postedDept"></a-input>
+              </a-form-item>
+            </a-col>
+            <a-col :xl="6" :lg="7" :md="8" :sm="24">
+              <a-form-item label="发布日期">
+                <j-date placeholder="请选择发布日期" v-model="queryParam.postedDate"></j-date>
+              </a-form-item>
+            </a-col>
+            <a-col :xl="6" :lg="7" :md="8" :sm="24">
+              <a-form-item label="会议日期">
+                <j-date placeholder="请选择会议日期" v-model="queryParam.conferenceDate"></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.conferenceAddress"></a-input>
+              </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="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>
+
+    <conferenceApply-modal ref="modalForm" @ok="modalFormOk"></conferenceApply-modal>
+  </a-card>
+</template>
+
+<script>
+
+  import { JeecgListMixin } from '@/mixins/JeecgListMixin'
+  import ConferenceApplyModal from './modules/ConferenceApplyModal'
+  import JDate from '@/components/jeecg/JDate.vue'
+
+  export default {
+    name: "ConferenceApplyList",
+    mixins:[JeecgListMixin],
+    components: {
+      JDate,
+      ConferenceApplyModal
+    },
+    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: 'conferenceTitle'
+          },
+          {
+            title:'会议信息发布人',
+            align:"center",
+            dataIndex: 'postedPerson'
+          },
+          {
+            title:'发布部门',
+            align:"center",
+            dataIndex: 'postedDept'
+          },
+          {
+            title:'发布日期',
+            align:"center",
+            dataIndex: 'postedDate',
+            customRender:function (text) {
+              return !text?"":(text.length>10?text.substr(0,10):text)
+            }
+          },
+          {
+            title:'会议日期',
+            align:"center",
+            dataIndex: 'conferenceDate',
+            customRender:function (text) {
+              return !text?"":(text.length>10?text.substr(0,10):text)
+            }
+          },
+          {
+            title:'开始时间',
+            align:"center",
+            dataIndex: 'startTime'
+          },
+          {
+            title:'结束时间',
+            align:"center",
+            dataIndex: 'endTime'
+          },
+          {
+            title:'会议地点',
+            align:"center",
+            dataIndex: 'conferenceAddress'
+          },
+          {
+            title:'出席人员',
+            align:"center",
+            dataIndex: 'attendPerson'
+          },
+          {
+            title:'出席部门',
+            align:"center",
+            dataIndex: 'attendDept'
+          },
+          {
+            title:'其他参会人',
+            align:"center",
+            dataIndex: 'otherPerson'
+          },
+          {
+            title: '操作',
+            dataIndex: 'action',
+            align:"center",
+            width: 120,
+            scopedSlots: { customRender: 'action' }
+          }
+        ],
+        url: {
+          list: "/conferenceApply/conferenceApply/list",
+          delete: "/conferenceApply/conferenceApply/delete",
+          deleteBatch: "/conferenceApply/conferenceApply/deleteBatch",
+          exportXlsUrl: "/conferenceApply/conferenceApply/exportXls",
+          importExcelUrl: "conferenceApply/conferenceApply/importExcel",
+        },
+        dictOptions:{},
+      }
+    },
+    computed: {
+      importExcelUrl: function(){
+        return `${window._CONFIG['domianURL']}/${this.url.importExcelUrl}`;
+      }
+    },
+    methods: {
+      initDictConfig(){
+      },
+      handleAdd: function () {
+        this.$refs.modalForm.add();
+        this.$refs.modalForm.title = "会务安排申请";
+        this.$refs.modalForm.disableSubmit = false;
+      },
+    }
+  }
+</script>
+<style scoped>
+  @import '~@assets/less/common.less';
+</style>

+ 209 - 0
src/views/oa/ConferenceMinutesList.vue

@@ -0,0 +1,209 @@
+<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.minutesId"></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.conferenceTitle"></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="上传人">
+                <a-input placeholder="请输入上传人" v-model="queryParam.uploadPerson"></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.uploadDept"></a-input>
+              </a-form-item>
+            </a-col>
+            <a-col :xl="6" :lg="7" :md="8" :sm="24">
+              <a-form-item label="上传时间">
+                <j-date :show-time="true" date-format="YYYY-MM-DD HH:mm:ss" placeholder="请选择上传时间" v-model="queryParam.uploadDate"></j-date>
+              </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="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>
+
+    <conferenceMinutes-modal ref="modalForm" @ok="modalFormOk"></conferenceMinutes-modal>
+  </a-card>
+</template>
+
+<script>
+
+  import { JeecgListMixin } from '@/mixins/JeecgListMixin'
+  import ConferenceMinutesModal from './modules/ConferenceMinutesModal'
+  import JDate from '@/components/jeecg/JDate'
+
+  export default {
+    name: "ConferenceMinutesList",
+    mixins:[JeecgListMixin],
+    components: {
+      ConferenceMinutesModal,
+      JDate
+    },
+    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: 'minutesId'
+          },
+          {
+            title:'会议议题',
+            align:"center",
+            dataIndex: 'conferenceTitle'
+          },
+          {
+            title:'上传人',
+            align:"center",
+            dataIndex: 'uploadPerson'
+          },
+          {
+            title:'上传部门',
+            align:"center",
+            dataIndex: 'uploadDept'
+          },
+          {
+            title:'上传时间',
+            align:"center",
+            dataIndex: 'uploadDate'
+          },
+          {
+            title: '操作',
+            dataIndex: 'action',
+            align:"center",
+            scopedSlots: { customRender: 'action' }
+          }
+        ],
+        url: {
+          list: "/conferenceMinutes/conferenceMinutes/list",
+          delete: "/conferenceMinutes/conferenceMinutes/delete",
+          deleteBatch: "/conferenceMinutes/conferenceMinutes/deleteBatch",
+          exportXlsUrl: "/conferenceMinutes/conferenceMinutes/exportXls",
+          importExcelUrl: "conferenceMinutes/conferenceMinutes/importExcel",
+        },
+        dictOptions:{},
+      }
+    },
+    computed: {
+      importExcelUrl: function(){
+        return `${window._CONFIG['domianURL']}/${this.url.importExcelUrl}`;
+      }
+    },
+    methods: {
+      initDictConfig(){
+      }
+    }
+  }
+</script>
+<style scoped>
+  @import '~@assets/less/common.less';
+</style>

+ 225 - 0
src/views/oa/ContractList.vue

@@ -0,0 +1,225 @@
+<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>
+
+    <contract-modal ref="modalForm" @ok="modalFormOk"></contract-modal>
+  </a-card>
+</template>
+
+<script>
+
+  import { JeecgListMixin } from '@/mixins/JeecgListMixin'
+  import ContractModal from './modules/ContractModal'
+
+  export default {
+    name: "ContractList",
+    mixins:[JeecgListMixin],
+    components: {
+      ContractModal
+    },
+    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: 'code'
+          },
+          {
+            title:'名称',
+            align:"center",
+            dataIndex: 'name'
+          },
+          {
+            title:'合同类型',
+            align:"center",
+            dataIndex: 'type_dictText'
+          },
+          {
+            title:'签订日期',
+            align:"center",
+            dataIndex: 'signDate',
+            customRender:function (text) {
+              return !text?"":(text.length>10?text.substr(0,10):text)
+            }
+          },
+          {
+            title:'客户',
+            align:"center",
+            dataIndex: 'customer'
+          },
+          {
+            title:'客户地址',
+            align:"center",
+            dataIndex: 'customerAddress'
+          },
+          {
+            title:'联系人',
+            align:"center",
+            dataIndex: 'contact'
+          },
+          {
+            title:'联系人手机',
+            align:"center",
+            dataIndex: 'contactPhone'
+          },
+          {
+            title:'销售员',
+            align:"center",
+            dataIndex: 'salesperson'
+          },
+          {
+            title:'合同简述',
+            align:"center",
+            dataIndex: 'memo'
+          },
+          {
+            title:'产品标准价',
+            align:"center",
+            dataIndex: 'standardPrice'
+          },
+          {
+            title:'产品报价',
+            align:"center",
+            dataIndex: 'quotationPrice'
+          },
+          {
+            title:'折扣率',
+            align:"center",
+            dataIndex: 'discountRate'
+          },
+          {
+            title:'合同金额',
+            align:"center",
+            dataIndex: 'amount'
+          },
+          {
+            title:'开工',
+            align:"center",
+            dataIndex: 'started'
+          },
+          {
+            title: '操作',
+            dataIndex: 'action',
+            align:"center",
+            scopedSlots: { customRender: 'action' }
+          }
+        ],
+        url: {
+          list: "/oa/contract/list",
+          delete: "/oa/contract/delete",
+          deleteBatch: "/oa/contract/deleteBatch",
+          exportXlsUrl: "/oa/contract/exportXls",
+          importExcelUrl: "oa/contract/importExcel",
+        },
+        dictOptions:{},
+      }
+    },
+    computed: {
+      importExcelUrl: function(){
+        return `${window._CONFIG['domianURL']}/${this.url.importExcelUrl}`;
+      }
+    },
+    methods: {
+      initDictConfig(){
+      }
+    }
+  }
+</script>
+<style scoped>
+  @import '~@assets/less/common.less';
+</style>

+ 252 - 0
src/views/oa/MaterialInDetailList.vue

@@ -0,0 +1,252 @@
+<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.materialName"></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.brand"></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="类别">
+                <a-input placeholder="请输入类别" v-model="queryParam.category"></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.model"></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.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>
+            <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>
+          </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="handleMultiAdd" 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>
+
+    <materialInDetail-modal ref="modalForm" @ok="modalFormOk"></materialInDetail-modal>
+    <MaterialIn-modal ref="multiAddModalForm" @ok="modalFormOk"></MaterialIn-modal>
+  </a-card>
+</template>
+
+<script>
+
+  import { JeecgListMixin } from '@/mixins/JeecgListMixin'
+  import MaterialInDetailModal from './modules/MaterialInDetailModal'
+  import MaterialInModal from './modules/MaterialInModal'
+  import JDate from '@/components/jeecg/JDate.vue'
+
+  export default {
+    name: "MaterialInDetailList",
+    mixins:[JeecgListMixin],
+    components: {
+      JDate,
+      MaterialInDetailModal,
+      MaterialInModal
+    },
+    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: 'materialName'
+          },
+          {
+            title:'品牌',
+            align:"center",
+            dataIndex: 'brand'
+          },
+          {
+            title:'类别',
+            align:"center",
+            dataIndex: 'category'
+          },
+          {
+            title:'规格型号',
+            align:"center",
+            dataIndex: 'model'
+          },
+          {
+            title:'计量单位',
+            align:"center",
+            dataIndex: 'unit'
+          },
+          {
+            title:'入库数量',
+            align:"center",
+            dataIndex: 'quantity'
+          },
+          {
+            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",
+            scopedSlots: { customRender: 'action' }
+          }
+        ],
+        url: {
+          list: "/oa/materialInDetail/list",
+          delete: "/oa/materialInDetail/delete",
+          deleteBatch: "/oa/materialInDetail/deleteBatch",
+          exportXlsUrl: "/oa/materialInDetail/exportXls",
+          importExcelUrl: "oa/materialInDetail/importExcel",
+        },
+        dictOptions:{},
+      }
+    },
+    computed: {
+      importExcelUrl: function(){
+        return `${window._CONFIG['domianURL']}/${this.url.importExcelUrl}`;
+      }
+    },
+    methods: {
+      initDictConfig(){
+      },
+      handleMultiAdd: function () {
+        this.$refs.multiAddModalForm.add();
+        this.$refs.multiAddModalForm.title = "新增";
+        this.$refs.multiAddModalForm.disableSubmit = false;
+      },
+    }
+  }
+</script>
+<style scoped>
+  @import '~@assets/less/common.less';
+</style>

+ 205 - 0
src/views/oa/MaterialInList.vue

@@ -0,0 +1,205 @@
+<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>
+          </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="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>
+
+    <materialIn-modal ref="modalForm" @ok="modalFormOk"></materialIn-modal>
+  </a-card>
+</template>
+
+<script>
+
+  import { JeecgListMixin } from '@/mixins/JeecgListMixin'
+  import MaterialInModal from './modules/MaterialInModal'
+  import JDate from '@/components/jeecg/JDate.vue'
+
+  export default {
+    name: "MaterialInList",
+    mixins:[JeecgListMixin],
+    components: {
+      JDate,
+      MaterialInModal
+    },
+    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: '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:'备注',
+            align:"center",
+            dataIndex: 'remark'
+          },
+          {
+            title:'附件',
+            align:"center",
+            dataIndex: 'attachment',
+            scopedSlots: {customRender: 'fileSlot'}
+          },
+          {
+            title: '操作',
+            dataIndex: 'action',
+            align:"center",
+            scopedSlots: { customRender: 'action' },
+          }
+        ],
+        url: {
+          list: "/oa/materialIn/list",
+          delete: "/oa/materialIn/delete",
+          deleteBatch: "/oa/materialIn/deleteBatch",
+          exportXlsUrl: "/oa/materialIn/exportXls",
+          importExcelUrl: "oa/materialIn/importExcel",
+        },
+        dictOptions:{},
+      }
+    },
+    computed: {
+      importExcelUrl: function(){
+        return `${window._CONFIG['domianURL']}/${this.url.importExcelUrl}`;
+      }
+    },
+    methods: {
+      initDictConfig(){
+      }
+       
+    }
+  }
+</script>
+<style scoped>
+  @import '~@assets/less/common.less';
+</style>

+ 209 - 0
src/views/oa/MaterialList.vue

@@ -0,0 +1,209 @@
+<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.materialName"></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.brand"></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="类别">
+                <a-input placeholder="请输入类别" v-model="queryParam.category"></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.model"></a-input>
+              </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="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>
+
+    <material-modal ref="modalForm" @ok="modalFormOk"></material-modal>
+  </a-card>
+</template>
+
+<script>
+
+  import { JeecgListMixin } from '@/mixins/JeecgListMixin'
+  import MaterialModal from './modules/MaterialModal'
+
+  export default {
+    name: "MaterialList",
+    mixins:[JeecgListMixin],
+    components: {
+      MaterialModal
+    },
+    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: 'materialName'
+          },
+          {
+            title:'品牌',
+            align:"center",
+            dataIndex: 'brand'
+          },
+          {
+            title:'类别',
+            align:"center",
+            dataIndex: 'category'
+          },
+          {
+            title:'规格型号',
+            align:"center",
+            dataIndex: 'model'
+          },
+          {
+            title:'计量单位',
+            align:"center",
+            dataIndex: 'unit'
+          },
+          {
+            title:'备注',
+            align:"center",
+            dataIndex: 'remark'
+          },
+          {
+            title: '操作',
+            dataIndex: 'action',
+            align:"center",
+            scopedSlots: { customRender: 'action' }
+          }
+        ],
+        url: {
+          list: "/oa/material/list",
+          delete: "/oa/material/delete",
+          deleteBatch: "/oa/material/deleteBatch",
+          exportXlsUrl: "/oa/material/exportXls",
+          importExcelUrl: "oa/material/importExcel",
+        },
+        dictOptions:{},
+      }
+    },
+    computed: {
+      importExcelUrl: function(){
+        return `${window._CONFIG['domianURL']}/${this.url.importExcelUrl}`;
+      }
+    },
+    methods: {
+      initDictConfig(){
+      }
+    }
+  }
+</script>
+<style scoped>
+  @import '~@assets/less/common.less';
+</style>

+ 177 - 0
src/views/oa/MaterialStockList.vue

@@ -0,0 +1,177 @@
+<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.materialName"></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.brand"></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="类别">
+                <a-input placeholder="请输入类别" v-model="queryParam.category"></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.model"></a-input>
+              </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 -->
+
+    <!-- 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="false"
+        
+        @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>
+
+      </a-table>
+    </div>
+
+    <material-modal ref="modalForm" @ok="modalFormOk"></material-modal>
+  </a-card>
+</template>
+
+<script>
+
+  import { JeecgListMixin } from '@/mixins/JeecgListMixin'
+  import MaterialModal from './modules/MaterialModal'
+
+  export default {
+    name: "MaterialList",
+    mixins:[JeecgListMixin],
+    components: {
+      MaterialModal
+    },
+    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: 'materialName'
+          },
+          {
+            title:'品牌',
+            align:"center",
+            dataIndex: 'brand'
+          },
+          {
+            title:'类别',
+            align:"center",
+            dataIndex: 'category'
+          },
+          {
+            title:'规格型号',
+            align:"center",
+            dataIndex: 'model'
+          },
+          {
+            title:'计量单位',
+            align:"center",
+            dataIndex: 'unit'
+          },
+          {
+            title:'剩余数量',
+            align:"center",
+            dataIndex: 'quantity'
+          },
+          {
+            title:'备注',
+            align:"center",
+            dataIndex: 'remark'
+          },
+        ],
+        url: {
+          list: "/oa/material/list",
+          delete: "/oa/material/delete",
+          deleteBatch: "/oa/material/deleteBatch",
+          exportXlsUrl: "/oa/material/exportXls",
+          importExcelUrl: "oa/material/importExcel",
+        },
+        dictOptions:{},
+      }
+    },
+    computed: {
+      importExcelUrl: function(){
+        return `${window._CONFIG['domianURL']}/${this.url.importExcelUrl}`;
+      }
+    },
+    methods: {
+      initDictConfig(){
+      }
+    }
+  }
+</script>
+<style scoped>
+  @import '~@assets/less/common.less';
+</style>

+ 228 - 0
src/views/oa/modules/AssetInDetailModal.vue

@@ -0,0 +1,228 @@
+<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="[ 'assetNumber', validatorRules.assetNumber]" placeholder="请输入资产编号"></a-input>
+        </a-form-item>
+        <a-form-item label="资产名称" :labelCol="labelCol" :wrapperCol="wrapperCol">
+          <a-input v-decorator="[ 'assetName', validatorRules.assetName]" placeholder="请输入资产名称"></a-input>
+        </a-form-item>
+        <a-form-item label="资产类别" :labelCol="labelCol" :wrapperCol="wrapperCol">
+          <a-input v-decorator="[ 'assetsCategory', validatorRules.assetsCategory]" placeholder="请输入资产类别"></a-input>
+        </a-form-item>
+        <a-form-item label="品牌" :labelCol="labelCol" :wrapperCol="wrapperCol">
+          <a-input v-decorator="[ 'brand', validatorRules.brand]" placeholder="请输入品牌"></a-input>
+        </a-form-item>
+        <a-form-item label="单位名称" :labelCol="labelCol" :wrapperCol="wrapperCol">
+          <a-input v-decorator="[ 'unitName', validatorRules.unitName]" placeholder="请输入单位名称"></a-input>
+        </a-form-item>
+        <a-form-item label="规格型号" :labelCol="labelCol" :wrapperCol="wrapperCol">
+          <a-input v-decorator="[ 'model', validatorRules.model]" placeholder="请输入规格型号"></a-input>
+        </a-form-item>
+        <a-form-item label="计量单位" :labelCol="labelCol" :wrapperCol="wrapperCol">
+          <a-input v-decorator="[ 'unit', validatorRules.unit]" placeholder="请输入计量单位"></a-input>
+        </a-form-item>
+        <a-form-item label="数量" :labelCol="labelCol" :wrapperCol="wrapperCol">
+          <a-input-number v-decorator="[ 'quantity', validatorRules.quantity]" placeholder="请输入数量" style="width: 100%"/>
+        </a-form-item>
+        <a-form-item label="金额" :labelCol="labelCol" :wrapperCol="wrapperCol">
+          <a-input-number v-decorator="[ 'amount', validatorRules.amount]" placeholder="请输入金额" style="width: 100%"/>
+        </a-form-item>
+        <a-form-item label="使用年限" :labelCol="labelCol" :wrapperCol="wrapperCol">
+          <a-input-number v-decorator="[ 'exp', validatorRules.exp]" placeholder="请输入使用年限" style="width: 100%"/>
+        </a-form-item>
+        <a-form-item label="购置日期" :labelCol="labelCol" :wrapperCol="wrapperCol">
+          <j-date placeholder="请选择购置日期" v-decorator="[ 'purhcaseDate', validatorRules.purhcaseDate]" :trigger-change="true" style="width: 100%"/>
+        </a-form-item>
+        <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-form-item label="存放地点" :labelCol="labelCol" :wrapperCol="wrapperCol">
+          <a-input v-decorator="[ 'place', validatorRules.place]" placeholder="请输入存放地点"></a-input>
+        </a-form-item>
+        <a-form-item label="使用人" :labelCol="labelCol" :wrapperCol="wrapperCol">
+          <j-popup
+            v-decorator="['user', validatorRules.user]"
+            :trigger-change="true"
+            org-fields="realname,depart_name"
+            dest-fields="user,userDept"
+            code="user_dept"
+            @callback="popupCallback"/>
+        </a-form-item>
+        <a-form-item label="使用部门" :labelCol="labelCol" :wrapperCol="wrapperCol">
+          <a-input v-decorator="[ 'userDept', validatorRules.userDept]" placeholder="请输入使用部门"></a-input>
+        </a-form-item>
+        <a-form-item label="资产状态" :labelCol="labelCol" :wrapperCol="wrapperCol">
+          <a-input v-decorator="[ 'state', validatorRules.state]" placeholder="请输入资产状态"></a-input>
+        </a-form-item>
+        <a-form-item label="备注" :labelCol="labelCol" :wrapperCol="wrapperCol">
+          <a-textarea v-decorator="['remark', validatorRules.remark]" rows="4" placeholder="请输入备注"/>
+        </a-form-item>
+        <a-form-item label="附件" :labelCol="labelCol" :wrapperCol="wrapperCol">
+          <j-upload v-decorator="['attachment', validatorRules.attachment]" :trigger-change="true"></j-upload>
+        </a-form-item>
+        <a-form-item label="入库人" :labelCol="labelCol" :wrapperCol="wrapperCol">
+          <a-input v-decorator="[ 'operator', validatorRules.operator]" placeholder="请输入入库人"></a-input>
+        </a-form-item>
+        <a-form-item label="入库部门" :labelCol="labelCol" :wrapperCol="wrapperCol">
+          <a-input v-decorator="[ 'operatorDept', validatorRules.operatorDept]" placeholder="请输入入库部门"></a-input>
+        </a-form-item>
+        <a-form-item label="入库日期" :labelCol="labelCol" :wrapperCol="wrapperCol">
+          <j-date placeholder="请选择入库日期" v-decorator="[ 'operatorDate', validatorRules.operatorDate]" :trigger-change="true" style="width: 100%"/>
+        </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'  
+  import JUpload from '@/components/jeecg/JUpload'
+
+  export default {
+    name: "AssetInDetailModal",
+    components: { 
+      JDate,
+      JUpload,
+    },
+    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: {
+          assetNumber: {rules: [
+          ]},
+          assetName: {rules: [
+          ]},
+          assetsCategory: {rules: [
+          ]},
+          brand: {rules: [
+          ]},
+          unitName: {rules: [
+          ]},
+          model: {rules: [
+          ]},
+          unit: {rules: [
+          ]},
+          quantity: {rules: [
+          ]},
+          amount: {rules: [
+          ]},
+          exp: {rules: [
+          ]},
+          purhcaseDate: {rules: [
+          ]},
+          inDate: {rules: [
+          ]},
+          place: {rules: [
+          ]},
+          user: {rules: [
+          ]},
+          userDept: {rules: [
+          ]},
+          state: {rules: [
+          ]},
+          remark: {rules: [
+          ]},
+          attachment: {rules: [
+          ]},
+          operator: {rules: [
+          ]},
+          operatorDept: {rules: [
+          ]},
+          operatorDate: {rules: [
+          ]},
+        },
+        url: {
+          add: "/oa/assetInDetail/add",
+          edit: "/oa/assetInDetail/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,'assetNumber','assetName','assetsCategory','brand','unitName','model','unit','quantity','amount','exp','purhcaseDate','inDate','place','user','userDept','state','remark','attachment','operator','operatorDept','operatorDate'))
+        })
+      },
+      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,'assetNumber','assetName','assetsCategory','brand','unitName','model','unit','quantity','amount','exp','purhcaseDate','inDate','place','user','userDept','state','remark','attachment','operator','operatorDept','operatorDate'))
+      },
+
+      
+    }
+  }
+</script>

+ 340 - 0
src/views/oa/modules/AssetInModal.vue

@@ -0,0 +1,340 @@
+<template>
+  <a-modal
+    :title="title"
+    :width="1800"
+    :visible="visible"
+    :maskClosable="false"
+    :confirmLoading="confirmLoading"
+    @ok="handleOk"
+    @cancel="handleCancel">
+    <a-spin :spinning="confirmLoading">
+      <!-- 主表单区域 -->
+      <a-form :form="form">
+        <a-row>
+
+          <a-col :span="16">
+            <a-form-item label="标题" :labelCol="{          span: 3        }" :wrapperCol="{          span: 21        }">
+              <a-input v-decorator="[ 'title', validatorRules.title]" placeholder="请输入标题"></a-input>
+            </a-form-item>
+          </a-col>
+          <a-col :span="8">
+            <a-form-item label="单据号" :labelCol="labelCol" :wrapperCol="wrapperCol">
+              <a-input v-decorator="[ 'inNo', validatorRules.inNo]" placeholder="请输入单据号"></a-input>
+            </a-form-item>
+          </a-col>
+          <a-col :span="8">
+            <a-form-item label="创建人" :labelCol="labelCol" :wrapperCol="wrapperCol">
+              <a-input v-decorator="[ 'creater', validatorRules.creater]" placeholder="请输入创建人"></a-input>
+            </a-form-item>
+          </a-col>
+          <a-col :span="8">
+            <a-form-item label="创建部门" :labelCol="labelCol" :wrapperCol="wrapperCol">
+              <a-input v-decorator="[ 'createrDept', validatorRules.createrDept]" 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="[ 'createDate']" :trigger-change="true" style="width: 100%"/>
+            </a-form-item>
+          </a-col>
+          <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="[ 'operatorDate', validatorRules.operatorDate]" :trigger-change="true" style="width: 100%"/>
+            </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="assetInDetailTable.loading"
+            :columns="assetInDetailTable.columns"
+            :dataSource="assetInDetailTable.dataSource"
+            :maxHeight="300"
+            :rowNumber="false"
+            :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'  
+
+  export default {
+    name: 'AssetInModal',
+    mixins: [JEditableTableMixin],
+    components: {
+      JDate,
+    },
+    data() {
+      return {
+        labelCol: {
+          span: 6
+        },
+        wrapperCol: {
+          span: 16
+        },
+        labelCol2: {
+          span: 3
+        },
+        wrapperCol2: {
+          span: 20
+        },
+        // 新增时子表默认添加几行空数据
+        addDefaultRowNum: 1,
+        validatorRules: {
+          title: {rules: [
+          ]},
+          inNo: {rules: [
+          ]},
+          creater: {rules: [
+          ]},
+          createrDept: {rules: [
+          ]},
+          operator: {rules: [
+          ]},
+          operatorDept: {rules: [
+          ]},
+          operatorDate: {rules: [
+          ]},
+        },
+        refKeys: ['assetInDetail', ],
+        tableKeys:['assetInDetail', ],
+        activeKey: 'assetInDetail',
+        // 固定资产入库明细
+        assetInDetailTable: {
+          loading: false,
+          dataSource: [],
+          columns: [
+            {
+              title: '资产编号',
+              key: 'assetNumber',
+              type: FormTypes.input,
+              width:"200px",
+              placeholder: '请输入${title}',
+              defaultValue: '',
+            },
+            {
+              title: '资产名称',
+              key: 'assetName',
+              type: FormTypes.input,
+              width:"200px",
+              placeholder: '请输入${title}',
+              defaultValue: '',
+            },
+            {
+              title: '资产类别',
+              key: 'assetsCategory',
+              type: FormTypes.input,
+              width:"200px",
+              placeholder: '请输入${title}',
+              defaultValue: '',
+            },
+            {
+              title: '品牌',
+              key: 'brand',
+              type: FormTypes.input,
+              width:"200px",
+              placeholder: '请输入${title}',
+              defaultValue: '',
+            },
+            {
+              title: '单位名称',
+              key: 'unitName',
+              type: FormTypes.input,
+              width:"200px",
+              placeholder: '请输入${title}',
+              defaultValue: '',
+            },
+            {
+              title: '规格型号',
+              key: 'model',
+              type: FormTypes.input,
+              width:"200px",
+              placeholder: '请输入${title}',
+              defaultValue: '',
+            },
+            {
+              title: '计量单位',
+              key: 'unit',
+              type: FormTypes.input,
+              width:"200px",
+              placeholder: '请输入${title}',
+              defaultValue: '',
+            },
+            {
+              title: '数量',
+              key: 'quantity',
+              type: FormTypes.input,
+              width:"200px",
+              placeholder: '请输入${title}',
+              defaultValue: '',
+            },
+            {
+              title: '金额',
+              key: 'amount',
+              type: FormTypes.input,
+              width:"200px",
+              placeholder: '请输入${title}',
+              defaultValue: '',
+            },
+            {
+              title: '使用年限',
+              key: 'exp',
+              type: FormTypes.input,
+              width:"200px",
+              placeholder: '请输入${title}',
+              defaultValue: '',
+            },
+            {
+              title: '购置日期',
+              key: 'purhcaseDate',
+              type: FormTypes.date,
+              width:"200px",
+              placeholder: '请输入${title}',
+              defaultValue: '',
+            },
+            {
+              title: '入库日期',
+              key: 'inDate',
+              type: FormTypes.date,
+              width:"200px",
+              placeholder: '请输入${title}',
+              defaultValue: '',
+            },
+            {
+              title: '存放地点',
+              key: 'place',
+              type: FormTypes.input,
+              width:"200px",
+              placeholder: '请输入${title}',
+              defaultValue: '',
+            },
+            {
+              title: '使用人',
+              key: 'user',
+              type: FormTypes.popup,
+              popupCode:"user_dept",
+              destFields:"user,userDept",
+              orgFieldse:"realname,depart_name",
+              width:"200px",
+              placeholder: '请输入${title}',
+              defaultValue: '',
+            },
+            {
+              title: '使用部门',
+              key: 'userDept',
+              type: FormTypes.input,
+              width:"200px",
+              placeholder: '请输入${title}',
+              defaultValue: '',
+              disabled:true
+            },
+            {
+              title: '资产状态',
+              key: 'state',
+              type: FormTypes.input,
+              width:"200px",
+              placeholder: '请输入${title}',
+              defaultValue: '',
+            },
+            {
+              title: '备注',
+              key: 'remark',
+              type: FormTypes.input,
+              width:"200px",
+              placeholder: '请输入${title}',
+              defaultValue: '',
+            },
+            {
+              title: '附件',
+              key: 'attachment',
+              type: FormTypes.file,
+              token:true,
+              responseName:"message",
+              width:"200px",
+              placeholder: '请选择文件',
+              defaultValue: '',
+            },
+
+
+          ]
+        },
+        url: {
+          add: "/oa/assetIn/add",
+          edit: "/oa/assetIn/edit",
+          assetInDetail: {
+            list: '/oa/assetIn/queryAssetInDetailByMainId'
+          },
+        }
+      }
+    },
+    methods: {
+      getAllTable() {
+        let values = this.tableKeys.map(key => getRefPromise(this, key))
+        return Promise.all(values)
+      },
+      /** 调用完edit()方法之后会自动调用此方法 */
+      editAfter() {
+        let fieldval = pick(this.model,'title','inNo','creater','createrDept','operator','operatorDept','operatorDate')
+        this.$nextTick(() => {
+          this.form.setFieldsValue(fieldval)
+        })
+        // 加载子表数据
+        if (this.model.id) {
+          let params = { id: this.model.id }
+          this.requestSubTableData(this.url.assetInDetail.list, params, this.assetInDetailTable)
+        }
+      },
+      /** 整理成formData */
+      classifyIntoFormData(allValues) {
+        let main = Object.assign(this.model, allValues.formValue)
+
+        return {
+          ...main, // 展开
+          assetInDetailList: allValues.tablesValue[0].values,
+        }
+      },
+      validateError(msg){
+        this.$message.error(msg)
+      },
+     popupCallback(row){
+       this.form.setFieldsValue(pick(row,'title','inNo','creater','createrDept','operator','operatorDept','operatorDate'))
+     },
+
+    }
+  }
+</script>
+
+<style scoped>
+</style>

+ 180 - 0
src/views/oa/modules/AssetModal.vue

@@ -0,0 +1,180 @@
+<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="[ 'assetNumber', validatorRules.assetNumber]" placeholder="请输入资产编号" disabled></a-input>
+        </a-form-item>
+        <a-form-item label="资产名称" :labelCol="labelCol" :wrapperCol="wrapperCol">
+          <a-input v-decorator="[ 'assetName', validatorRules.assetName]" placeholder="请输入资产名称" disabled></a-input>
+        </a-form-item>
+        <a-form-item label="使用人" :labelCol="labelCol" :wrapperCol="wrapperCol">
+          <j-popup
+            v-decorator="['user', validatorRules.user]"
+            :trigger-change="true"
+            org-fields="realname,depart_name"
+            dest-fields="user,userDept"
+            code="user_dept"
+            @callback="popupCallback"/>
+        </a-form-item>
+        <a-form-item label="使用部门" :labelCol="labelCol" :wrapperCol="wrapperCol">
+          <a-input v-decorator="[ 'userDept', validatorRules.userDept]" placeholder="请输入使用部门"></a-input>
+        </a-form-item>
+        <a-form-item label="资产状态" :labelCol="labelCol" :wrapperCol="wrapperCol">
+          <a-input v-decorator="[ 'state', validatorRules.state]" 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'  
+  import JUpload from '@/components/jeecg/JUpload'
+
+  export default {
+    name: "AssetModal",
+    components: { 
+      JDate,
+      JUpload,
+    },
+    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: {
+          assetNumber: {rules: [
+          ]},
+          assetName: {rules: [
+          ]},
+          assetsCategory: {rules: [
+          ]},
+          brand: {rules: [
+          ]},
+          unitName: {rules: [
+          ]},
+          model: {rules: [
+          ]},
+          unit: {rules: [
+          ]},
+          quantity: {rules: [
+          ]},
+          amount: {rules: [
+          ]},
+          exp: {rules: [
+          ]},
+          purhcaseDate: {rules: [
+          ]},
+          inDate: {rules: [
+          ]},
+          place: {rules: [
+          ]},
+          user: {rules: [
+          ]},
+          userDept: {rules: [
+          ]},
+          state: {rules: [
+          ]},
+          remark: {rules: [
+          ]},
+          attachment: {rules: [
+          ]},
+          operator: {rules: [
+          ]},
+          operatorDept: {rules: [
+          ]},
+          operatorDate: {rules: [
+          ]},
+        },
+        url: {
+          add: "/oa/asset/add",
+          edit: "/oa/asset/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,'assetNumber','assetName','assetsCategory','brand','unitName','model','unit','quantity','amount','exp','purhcaseDate','inDate','place','user','userDept','state','remark','attachment','operator','operatorDept','operatorDate'))
+        })
+      },
+      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,'assetNumber','assetName','assetsCategory','brand','unitName','model','unit','quantity','amount','exp','purhcaseDate','inDate','place','user','userDept','state','remark','attachment','operator','operatorDept','operatorDate'))
+      },
+
+      
+    }
+  }
+</script>

+ 12 - 4
src/views/oa/modules/CarModal.vue

@@ -61,13 +61,13 @@
 
 
         <a-col :span="24">
-          <a-form-item label="备注" :labelCol="labelCol" :wrapperCol="wrapperCol">
+          <a-form-item label="备注" :labelCol="labelCol1" :wrapperCol="wrapperCol1">
             <a-input v-decorator="[ 'remark', validatorRules.remark]" placeholder="请输入备注"></a-input>
           </a-form-item>
         </a-col>
 
         <a-col :span="24">
-          <a-form-item label="文件" :labelCol="labelCol" :wrapperCol="wrapperCol">
+          <a-form-item label="文件" :labelCol="labelCol1" :wrapperCol="wrapperCol1">
             <j-upload v-decorator="['accesory', validatorRules.accesory]" :trigger-change="true"></j-upload>
           </a-form-item>
         </a-col>
@@ -100,11 +100,19 @@
         model: {},
         labelCol: {
           xs: { span: 24 },
-          sm: { span: 5 },
+          sm: { span: 6 },
         },
         wrapperCol: {
           xs: { span: 24 },
-          sm: { span: 16 },
+          sm: { span: 15 },
+        },
+        labelCol1: {
+          xs: { span: 24 },
+          sm: { span: 2 },
+        },
+        wrapperCol1: {
+          xs: { span: 24 },
+          sm: { span: 21 },
         },
         confirmLoading: false,
         validatorRules: {

+ 194 - 0
src/views/oa/modules/CarfareDetailModal.vue

@@ -0,0 +1,194 @@
+<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">
+          <j-date placeholder="请选择入库日期" v-decorator="[ 'reimbursementDate', validatorRules.reimbursementDate]" :trigger-change="true" style="width: 100%"/>
+        </a-form-item>
+        <a-form-item label="支付凭证编号" :labelCol="labelCol" :wrapperCol="wrapperCol">
+          <a-input v-decorator="[ 'paymentNo', validatorRules.paymentNo]" placeholder="请输入支付凭证编号"></a-input>
+        </a-form-item>
+        <a-form-item label="车牌号" :labelCol="labelCol" :wrapperCol="wrapperCol">
+          <a-input v-decorator="[ 'carNo', validatorRules.carNo]" placeholder="请输入车牌号"></a-input>
+        </a-form-item>
+        <a-form-item label="报销人" :labelCol="labelCol" :wrapperCol="wrapperCol">
+          <j-popup
+            v-decorator="['submitter', validatorRules.submitter]"
+            placeholder="请选择报销人"
+            :trigger-change="true"
+            org-fields="realname,depart_name"
+            dest-fields="submitter,dept"
+            code="user_dept"
+            @callback="popupCallback"/>
+        </a-form-item>
+        <a-form-item label="部门" :labelCol="labelCol" :wrapperCol="wrapperCol">
+          <a-input v-decorator="[ 'dept', validatorRules.dept]" placeholder="请输入部门" disabled></a-input>
+        </a-form-item>
+        <a-form-item label="报销内容" :labelCol="labelCol" :wrapperCol="wrapperCol">
+          <a-input v-decorator="[ 'content', validatorRules.content]" placeholder="请输入报销内容"></a-input>
+        </a-form-item>
+        <a-form-item label="金额" :labelCol="labelCol" :wrapperCol="wrapperCol">
+          <a-input-number v-decorator="[ 'amount', validatorRules.amount]" placeholder="请输入金额" style="width: 100%"/>
+        </a-form-item>
+        <a-form-item label="附件" :labelCol="labelCol" :wrapperCol="wrapperCol">
+          <j-upload v-decorator="['attachment', validatorRules.attachment]" :trigger-change="true"></j-upload>
+        </a-form-item>
+        <a-form-item label="备注" :labelCol="labelCol" :wrapperCol="wrapperCol">
+          <a-input v-decorator="[ 'remark', validatorRules.remark]" placeholder="请输入备注"></a-input>
+        </a-form-item>
+        <a-form-item label="登记人" :labelCol="labelCol" :wrapperCol="wrapperCol">
+          <a-input v-decorator="[ 'registrant', validatorRules.registrant]" placeholder="请输入登记人" disabled></a-input>
+        </a-form-item>
+        <a-form-item label="登记部门" :labelCol="labelCol" :wrapperCol="wrapperCol">
+          <a-input v-decorator="[ 'registrantDept', validatorRules.registrantDept]" placeholder="请输入登记部门" disabled></a-input>
+        </a-form-item>
+        <a-form-item label="财务经办人" :labelCol="labelCol" :wrapperCol="wrapperCol">
+          <a-input v-decorator="[ 'financeOperator', validatorRules.financeOperator]" placeholder="请输入财务经办人" disabled></a-input>
+        </a-form-item>
+        <a-form-item label="财务经办部门" :labelCol="labelCol" :wrapperCol="wrapperCol">
+          <a-input v-decorator="[ 'financeDept', validatorRules.financeDept]" placeholder="请输入财务经办部门" disabled></a-input>
+        </a-form-item>
+        <a-form-item label="财务负责人" :labelCol="labelCol" :wrapperCol="wrapperCol">
+          <a-input v-decorator="[ 'financeHead', validatorRules.financeHead]" placeholder="请输入财务负责人" disabled></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 JUpload from '@/components/jeecg/JUpload'
+  import JDate from '@/components/jeecg/JDate'  
+
+  export default {
+    name: "CarfareDetailModal",
+    components: { 
+      JUpload,
+      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: {
+          reimbursementDate: {rules: [
+          ]},
+          paymentNo: {rules: [
+          ]},
+          carNo: {rules: [
+          ]},
+          submitter: {rules: [
+          ]},
+          dept: {rules: [
+          ]},
+          content: {rules: [
+          ]},
+          amount: {rules: [
+          ]},
+          attachment: {rules: [
+          ]},
+          remark: {rules: [
+          ]},
+          registrant: {rules: [
+          ]},
+          registrantDept: {rules: [
+          ]},
+          financeOperator: {rules: [
+          ]},
+          financeDept: {rules: [
+          ]},
+          financeHead: {rules: [
+          ]},
+        },
+        url: {
+          add: "/oa/carfareDetail/add",
+          edit: "/oa/carfareDetail/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,'reimbursementDate','paymentNo','carNo','submitter','dept','content','amount','attachment','remark','registrant','registrantDept','financeOperator','financeDept','financeHead'))
+        })
+      },
+      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,'reimbursementDate','paymentNo','carNo','submitter','dept','content','amount','attachment','remark','registrant','registrantDept','financeOperator','financeDept','financeHead'))
+      },
+
+      
+    }
+  }
+</script>

+ 260 - 0
src/views/oa/modules/CarfareModal.vue

@@ -0,0 +1,260 @@
+<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="['registrant', validatorRules.registrant]"
+                placeholder="请选择登记人"
+                :trigger-change="true"
+                org-fields="realname,depart_name"
+                dest-fields="registrant,registrantDept"
+                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="[ 'registrantDept', validatorRules.registrantDept]" placeholder="请输入登记部门" disabled></a-input>
+            </a-form-item>
+          </a-col>
+          <a-col :span="8">
+            <a-form-item label="报销总额" :labelCol="labelCol" :wrapperCol="wrapperCol">
+              <a-input-number v-decorator="[ 'totalAmount', validatorRules.totalAmount]" placeholder="请输入报销总额" style="width: 100%"/>
+            </a-form-item>
+          </a-col>
+          <a-col :span="8">
+            <a-form-item label="财务经办人" :labelCol="labelCol" :wrapperCol="wrapperCol">
+              <j-popup
+                v-decorator="['financeOperator', validatorRules.financeOperator]"
+                placeholder="请选择财务经办人"
+                :trigger-change="true"
+                org-fields="realname,depart_name"
+                dest-fields="financeOperator,financeDept"
+                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="[ 'financeDept', validatorRules.financeDept]" placeholder="请输入财务经办部门" disabled></a-input>
+            </a-form-item>
+          </a-col>
+          <a-col :span="8">
+            <a-form-item label="财务负责人" :labelCol="labelCol" :wrapperCol="wrapperCol">
+              <a-input v-decorator="[ 'financeHead', validatorRules.financeHead]" placeholder="请输入财务负责人"></a-input>
+            </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="carfareDetailTable.loading"
+            :columns="carfareDetailTable.columns"
+            :dataSource="carfareDetailTable.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'
+
+  export default {
+    name: 'CarfareModal',
+    mixins: [JEditableTableMixin],
+    components: {
+    },
+    data() {
+      return {
+        labelCol: {
+          span: 6
+        },
+        wrapperCol: {
+          span: 16
+        },
+        labelCol2: {
+          span: 3
+        },
+        wrapperCol2: {
+          span: 20
+        },
+        // 新增时子表默认添加几行空数据
+        addDefaultRowNum: 1,
+        validatorRules: {
+          registrant: {rules: [
+          ]},
+          registrantDept: {rules: [
+          ]},
+          totalAmount: {rules: [
+          ]},
+          financeOperator: {rules: [
+          ]},
+          financeDept: {rules: [
+          ]},
+          financeHead: {rules: [
+          ]},
+        },
+        refKeys: ['carfareDetail', ],
+        tableKeys:['carfareDetail', ],
+        activeKey: 'carfareDetail',
+        // 车辆费用报销明细
+        carfareDetailTable: {
+          loading: false,
+          dataSource: [],
+          columns: [
+            {
+              title: '报销日期',
+              key: 'reimbursementDate',
+              type: FormTypes.date,
+              width:"200px",
+              placeholder: '请输入${title}',
+              defaultValue: '',
+            },
+            {
+              title: '支付凭证编号',
+              key: 'paymentNo',
+              type: FormTypes.input,
+              width:"200px",
+              placeholder: '请输入${title}',
+              defaultValue: '',
+            },
+            {
+              title: '车牌号',
+              key: 'carNo',
+              type: FormTypes.input,
+              width:"200px",
+              placeholder: '请输入${title}',
+              defaultValue: '',
+            },
+            {
+              title: '报销人',
+              key: 'submitter',
+              type: FormTypes.popup,
+              popupCode:"user_dept",
+              destFields:"submitter,dept",
+              orgFieldse:"realname,depart_name",
+              width:"200px",
+              placeholder: '请输入${title}',
+              defaultValue: '',
+            },
+            {
+              title: '部门',
+              key: 'dept',
+              type: FormTypes.input,
+              width:"200px",
+              placeholder: '请输入${title}',
+              defaultValue: '',
+              disabled: true
+            },
+            {
+              title: '报销内容',
+              key: 'content',
+              type: FormTypes.input,
+              width:"200px",
+              placeholder: '请输入${title}',
+              defaultValue: '',
+            },
+            {
+              title: '金额',
+              key: 'amount',
+              type: FormTypes.input,
+              width:"200px",
+              placeholder: '请输入${title}',
+              defaultValue: '',
+            },
+            {
+              title: '附件',
+              key: 'attachment',
+              type: FormTypes.file,
+              token:true,
+              responseName:"message",
+              width:"200px",
+              placeholder: '请选择文件',
+              defaultValue: '',
+            },
+            {
+              title: '备注',
+              key: 'remark',
+              type: FormTypes.input,
+              width:"200px",
+              placeholder: '请输入${title}',
+              defaultValue: '',
+            },
+          ]
+        },
+        url: {
+          add: "/oa/carfare/add",
+          edit: "/oa/carfare/edit",
+          carfareDetail: {
+            list: '/oa/carfare/queryCarfareDetailByMainId'
+          },
+        }
+      }
+    },
+    methods: {
+      getAllTable() {
+        let values = this.tableKeys.map(key => getRefPromise(this, key))
+        return Promise.all(values)
+      },
+      /** 调用完edit()方法之后会自动调用此方法 */
+      editAfter() {
+        let fieldval = pick(this.model,'registrant','registrantDept','totalAmount','financeOperator','financeDept','financeHead')
+        this.$nextTick(() => {
+          this.form.setFieldsValue(fieldval)
+        })
+        // 加载子表数据
+        if (this.model.id) {
+          let params = { id: this.model.id }
+          this.requestSubTableData(this.url.carfareDetail.list, params, this.carfareDetailTable)
+        }
+      },
+      /** 整理成formData */
+      classifyIntoFormData(allValues) {
+        let main = Object.assign(this.model, allValues.formValue)
+
+        return {
+          ...main, // 展开
+          carfareDetailList: allValues.tablesValue[0].values,
+        }
+      },
+      validateError(msg){
+        this.$message.error(msg)
+      },
+     popupCallback(row){
+       this.form.setFieldsValue(pick(row,'registrant','registrantDept','totalAmount','financeOperator','financeDept','financeHead'))
+     },
+
+    }
+  }
+</script>
+
+<style scoped>
+</style>

+ 193 - 0
src/views/oa/modules/ContractModal.vue

@@ -0,0 +1,193 @@
+<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="[ 'code', validatorRules.code]" placeholder="请输入编码"></a-input>
+        </a-form-item>
+        <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-dict-select-tag type="list" v-decorator="['type', validatorRules.type]" :trigger-change="true" dictCode="contract_type" placeholder="请选择合同类型"/>
+        </a-form-item>
+        <a-form-item label="签订日期" :labelCol="labelCol" :wrapperCol="wrapperCol">
+          <j-date placeholder="请选择签订日期" v-decorator="[ 'signDate', validatorRules.signDate]" :trigger-change="true" style="width: 100%"/>
+        </a-form-item>
+        <a-form-item label="客户" :labelCol="labelCol" :wrapperCol="wrapperCol">
+          <a-input v-decorator="[ 'customer', validatorRules.customer]" placeholder="请输入客户"></a-input>
+        </a-form-item>
+        <a-form-item label="客户地址" :labelCol="labelCol" :wrapperCol="wrapperCol">
+          <a-input v-decorator="[ 'customerAddress', validatorRules.customerAddress]" placeholder="请输入客户地址"></a-input>
+        </a-form-item>
+        <a-form-item label="联系人" :labelCol="labelCol" :wrapperCol="wrapperCol">
+          <a-input v-decorator="[ 'contact', validatorRules.contact]" placeholder="请输入联系人"></a-input>
+        </a-form-item>
+        <a-form-item label="联系人手机" :labelCol="labelCol" :wrapperCol="wrapperCol">
+          <a-input v-decorator="[ 'contactPhone', validatorRules.contactPhone]" placeholder="请输入联系人手机"></a-input>
+        </a-form-item>
+        <a-form-item label="销售员" :labelCol="labelCol" :wrapperCol="wrapperCol">
+          <a-input v-decorator="[ 'salesperson', validatorRules.salesperson]" placeholder="请输入销售员"></a-input>
+        </a-form-item>
+        <a-form-item label="合同简述" :labelCol="labelCol" :wrapperCol="wrapperCol">
+          <a-textarea v-decorator="['memo', validatorRules.memo]" rows="4" placeholder="请输入合同简述"/>
+        </a-form-item>
+        <a-form-item label="产品标准价" :labelCol="labelCol" :wrapperCol="wrapperCol">
+          <a-input-number v-decorator="[ 'standardPrice', validatorRules.standardPrice]" placeholder="请输入产品标准价" style="width: 100%"/>
+        </a-form-item>
+        <a-form-item label="产品报价" :labelCol="labelCol" :wrapperCol="wrapperCol">
+          <a-input-number v-decorator="[ 'quotationPrice', validatorRules.quotationPrice]" placeholder="请输入产品报价" style="width: 100%"/>
+        </a-form-item>
+        <a-form-item label="折扣率" :labelCol="labelCol" :wrapperCol="wrapperCol">
+          <a-input-number v-decorator="[ 'discountRate', validatorRules.discountRate]" placeholder="请输入折扣率" style="width: 100%"/>
+        </a-form-item>
+        <a-form-item label="合同金额" :labelCol="labelCol" :wrapperCol="wrapperCol">
+          <a-input-number v-decorator="[ 'amount', validatorRules.amount]" placeholder="请输入合同金额" style="width: 100%"/>
+        </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'  
+  import JDictSelectTag from "@/components/dict/JDictSelectTag"
+
+  export default {
+    name: "ContractModal",
+    components: { 
+      JDate,
+      JDictSelectTag,
+    },
+    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: {
+          code: {rules: [
+          ]},
+          name: {rules: [
+            {required: true, message: '请输入名称!'},
+          ]},
+          type: {rules: [
+            {required: true, message: '请输入合同类型!'},
+          ]},
+          signDate: {rules: [
+          ]},
+          customer: {rules: [
+            {required: true, message: '请输入客户!'},
+          ]},
+          customerAddress: {rules: [
+          ]},
+          contact: {rules: [
+            {required: true, message: '请输入联系人!'},
+          ]},
+          contactPhone: {rules: [
+          ]},
+          salesperson: {rules: [
+            {required: true, message: '请输入销售员!'},
+          ]},
+          memo: {rules: [
+          ]},
+          standardPrice: {rules: [
+          ]},
+          quotationPrice: {rules: [
+          ]},
+          discountRate: {rules: [
+          ]},
+          amount: {rules: [
+            {required: true, message: '请输入合同金额!'},
+          ]},
+        },
+        url: {
+          add: "/oa/contract/add",
+          edit: "/oa/contract/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,'code','name','type','signDate','customer','customerAddress','contact','contactPhone','salesperson','memo','standardPrice','quotationPrice','discountRate','amount','started'))
+        })
+      },
+      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,'code','name','type','signDate','customer','customerAddress','contact','contactPhone','salesperson','memo','standardPrice','quotationPrice','discountRate','amount','started'))
+      },
+
+      
+    }
+  }
+</script>

+ 175 - 0
src/views/oa/modules/MaterialInDetailModal.vue

@@ -0,0 +1,175 @@
+<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" v-show="false">
+          <a-input v-decorator="[ 'cdMaterialId']"></a-input>
+        </a-form-item>
+
+        <a-form-item label="物料名称" :labelCol="labelCol" :wrapperCol="wrapperCol">
+          <j-popup
+            v-decorator="['materialName', validatorRules.materialName]"
+            placeholder="请选择物料"
+            :trigger-change="true"
+            org-fields="material_name,brand,category,model,unit,id"
+            dest-fields="materialName,brand,category,model,unit,cdMaterialId"
+            code="sel_material"
+            @callback="popupCallback"/>
+        </a-form-item>
+        <a-form-item label="品牌" :labelCol="labelCol" :wrapperCol="wrapperCol">
+          <a-input v-decorator="[ 'brand', validatorRules.brand]" placeholder="请输入品牌" disabled></a-input>
+        </a-form-item>
+        <a-form-item label="类别" :labelCol="labelCol" :wrapperCol="wrapperCol">
+          <a-input v-decorator="[ 'category', validatorRules.category]" placeholder="请输入类别" disabled></a-input>
+        </a-form-item>
+        <a-form-item label="规格型号" :labelCol="labelCol" :wrapperCol="wrapperCol">
+          <a-input v-decorator="[ 'model', validatorRules.model]" placeholder="请输入规格型号" disabled></a-input>
+        </a-form-item>
+        <a-form-item label="计量单位" :labelCol="labelCol" :wrapperCol="wrapperCol">
+          <a-input v-decorator="[ 'unit', validatorRules.unit]" placeholder="请输入计量单位" disabled></a-input>
+        </a-form-item>
+        <a-form-item label="入库数量" :labelCol="labelCol" :wrapperCol="wrapperCol">
+          <a-input-number v-decorator="[ 'quantity', validatorRules.quantity]" placeholder="请输入入库数量" style="width: 100%"/>
+        </a-form-item>
+        <a-form-item label="备注" :labelCol="labelCol" :wrapperCol="wrapperCol">
+          <a-input v-decorator="[ 'remark', validatorRules.remark]" placeholder="请输入备注"></a-input>
+        </a-form-item>
+        <a-form-item label="入库人" :labelCol="labelCol" :wrapperCol="wrapperCol">
+          <a-input v-decorator="[ 'operator', validatorRules.operator]" placeholder="请输入入库人" disabled></a-input>
+        </a-form-item>
+        <a-form-item label="入库部门" :labelCol="labelCol" :wrapperCol="wrapperCol">
+          <a-input v-decorator="[ 'operatorDept', validatorRules.operatorDept]" placeholder="请输入入库部门" disabled></a-input>
+        </a-form-item>
+        <a-form-item label="入库日期" :labelCol="labelCol" :wrapperCol="wrapperCol">
+          <j-date placeholder="请选择入库日期" v-decorator="[ 'operateDate', validatorRules.operateDate]" :trigger-change="true" style="width: 100%" disabled/>
+        </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: "MaterialInDetailModal",
+    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: {
+          quantity: {rules: [
+          ]},
+          materialName: {rules: [
+          ]},
+          brand: {rules: [
+          ]},
+          category: {rules: [
+          ]},
+          model: {rules: [
+          ]},
+          unit: {rules: [
+          ]},
+          operator: {rules: [
+          ]},
+          operatorDept: {rules: [
+          ]},
+          operateDate: {rules: [
+          ]},
+          remark: {rules: [
+          ]},
+        },
+        url: {
+          add: "/oa/materialInDetail/add",
+          edit: "/oa/materialInDetail/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,'quantity','materialName','brand','category','model','unit','operator','operatorDept','operateDate','remark'))
+        })
+      },
+      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,'quantity','materialName','brand','category','model','unit','operator','operatorDept','operateDate','remark','cdMaterialId'))
+      },
+
+      
+    }
+  }
+</script>

+ 234 - 0
src/views/oa/modules/MaterialInModal.vue

@@ -0,0 +1,234 @@
+<template>
+  <a-modal
+    :title="title"
+    :width="1200"
+    :visible="visible"
+    :maskClosable="false"
+    :confirmLoading="confirmLoading"
+    @ok="handleOk"
+    @cancel="handleCancel">
+    <a-spin :spinning="confirmLoading">
+      <!-- 主表单区域 -->
+      <a-form :form="form">
+        <a-row>
+
+          <a-col :span="12">
+            <a-form-item label="入库人" :labelCol="labelCol" :wrapperCol="wrapperCol">
+              <j-popup
+                v-decorator="['operator', validatorRules.operator]"
+                placeholder="请选择入库人"
+                :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="12">
+            <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="12">
+            <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="24">
+            <a-form-item label="备注" :labelCol="labelCol2" :wrapperCol="wrapperCol2">
+              <a-textarea v-decorator="['remark', validatorRules.remark]" rows="4" placeholder="请输入备注"/>
+            </a-form-item>
+          </a-col>
+          <a-col :span="12">
+            <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="materialInDetailTable.loading"
+            :columns="materialInDetailTable.columns"
+            :dataSource="materialInDetailTable.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'
+
+  export default {
+    name: 'MaterialInModal',
+    mixins: [JEditableTableMixin],
+    components: {
+      JDate,
+      JUpload,
+    },
+    data() {
+      return {
+        labelCol: {
+          span: 6
+        },
+        wrapperCol: {
+          span: 16
+        },
+        labelCol2: {
+          span: 3
+        },
+        wrapperCol2: {
+          span: 20
+        },
+        // 新增时子表默认添加几行空数据
+        addDefaultRowNum: 1,
+        validatorRules: {
+          operator: {rules: [
+          ]},
+          operatorDept: {rules: [
+          ]},
+          operateDate: {rules: [
+          ]},
+          remark: {rules: [
+          ]},
+          attachment: {rules: [
+          ]},
+        },
+        refKeys: ['materialInDetail', ],
+        tableKeys:['materialInDetail', ],
+        activeKey: 'materialInDetail',
+        // 物料入库明细
+        materialInDetailTable: {
+          loading: false,
+          dataSource: [],
+          columns: [
+            {
+              title: '物料名称',
+              key: 'materialName',
+              type: FormTypes.popup,
+              popupCode:"sel_material",
+              destFields:"materialName,brand,category,model,unit,cdMaterialId",
+              orgFieldse:"material_name,brand,category,model,unit,id",
+              width:"200px",
+              placeholder: '请选择物料',
+              defaultValue: '',
+            },
+            {
+              title: '品牌',
+              key: 'brand',
+              type: FormTypes.input,
+              width:"200px",
+              placeholder: '请输入${title}',
+              defaultValue: '',
+              disabled: true
+            },
+            {
+              title: '类别',
+              key: 'category',
+              type: FormTypes.input,
+              width:"200px",
+              placeholder: '请输入${title}',
+              defaultValue: '',
+              disabled: true
+            },
+            {
+              title: '规格型号',
+              key: 'model',
+              type: FormTypes.input,
+              width:"200px",
+              placeholder: '请输入${title}',
+              defaultValue: '',
+              disabled: true
+            },
+            {
+              title: '计量单位',
+              key: 'unit',
+              type: FormTypes.input,
+              width:"200px",
+              placeholder: '请输入${title}',
+              defaultValue: '',
+              disabled: true
+            },
+            {
+              title: '入库数量',
+              key: 'quantity',
+              type: FormTypes.input,
+              width:"200px",
+              placeholder: '请输入${title}',
+              defaultValue: '',
+            },
+            {
+              title: 'ID',
+              key: 'cdMaterialId',
+              type: FormTypes.hidden,
+              width:"200px",
+              defaultValue: '',
+            },
+          ]
+        },
+        url: {
+          add: "/oa/materialIn/add",
+          edit: "/oa/materialIn/edit",
+          materialInDetail: {
+            list: '/oa/materialIn/queryMaterialInDetailByMainId'
+          },
+        }
+      }
+    },
+    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','remark','attachment')
+        this.$nextTick(() => {
+          this.form.setFieldsValue(fieldval)
+        })
+        // 加载子表数据
+        if (this.model.id) {
+          let params = { id: this.model.id }
+          this.requestSubTableData(this.url.materialInDetail.list, params, this.materialInDetailTable)
+        }
+      },
+      /** 整理成formData */
+      classifyIntoFormData(allValues) {
+        let main = Object.assign(this.model, allValues.formValue)
+
+        return {
+          ...main, // 展开
+          materialInDetailList: allValues.tablesValue[0].values,
+        }
+      },
+      validateError(msg){
+        this.$message.error(msg)
+      },
+     popupCallback(row){
+       this.form.setFieldsValue(pick(row,'operator','operatorDept','operateDate','remark','attachment'))
+     },
+
+    }
+  }
+</script>
+
+<style scoped>
+</style>

+ 145 - 0
src/views/oa/modules/MaterialModal.vue

@@ -0,0 +1,145 @@
+<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="[ 'materialName', validatorRules.materialName]" placeholder="请输入物料名称"></a-input>
+        </a-form-item>
+        <a-form-item label="品牌" :labelCol="labelCol" :wrapperCol="wrapperCol">
+          <a-input v-decorator="[ 'brand', validatorRules.brand]" placeholder="请输入品牌"></a-input>
+        </a-form-item>
+        <a-form-item label="类别" :labelCol="labelCol" :wrapperCol="wrapperCol">
+          <a-input v-decorator="[ 'category', validatorRules.category]" placeholder="请输入类别"></a-input>
+        </a-form-item>
+        <a-form-item label="规格型号" :labelCol="labelCol" :wrapperCol="wrapperCol">
+          <a-input v-decorator="[ 'model', validatorRules.model]" placeholder="请输入规格型号"></a-input>
+        </a-form-item>
+        <a-form-item label="计量单位" :labelCol="labelCol" :wrapperCol="wrapperCol">
+          <a-input v-decorator="[ 'unit', validatorRules.unit]" placeholder="请输入计量单位"></a-input>
+        </a-form-item>
+        <a-form-item label="备注" :labelCol="labelCol" :wrapperCol="wrapperCol">
+          <a-textarea v-decorator="['remark', validatorRules.remark]" rows="4" placeholder="请输入备注"/>
+        </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: "MaterialModal",
+    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: {
+          materialName: {rules: [
+          ]},
+          brand: {rules: [
+          ]},
+          category: {rules: [
+          ]},
+          model: {rules: [
+          ]},
+          unit: {rules: [
+          ]},
+          quantity: {rules: [
+          ]},
+          remark: {rules: [
+          ]},
+        },
+        url: {
+          add: "/oa/material/add",
+          edit: "/oa/material/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,'materialName','brand','category','model','unit','quantity','remark'))
+        })
+      },
+      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,'materialName','brand','category','model','unit','quantity','remark'))
+      },
+
+      
+    }
+  }
+</script>

+ 22 - 10
src/views/system/RoleUserList.vue

@@ -34,10 +34,10 @@
         <div class="table-operator" style="margin: 5px 0 10px 2px">
           <a-button @click="handleAdd" type="primary" icon="plus">角色录入</a-button>
           <!--<a-button @click="handleEdit(model1)" type="primary" icon="plus">角色编辑</a-button>-->
-          <a-upload name="file" :showUploadList="false" :multiple="false" :headers="tokenHeader" :action="importExcelUrl" @change="handleImportExcel">
+          <a-upload name="file" :showUploadList="false" :multiple="false" :headers="tokenHeader" :action="importExcelUrl" @change="handleImportExcel" v-show="showOP">
             <a-button type="primary" icon="import">导入</a-button>
           </a-upload>
-          <a-button type="primary" icon="download" @click="handleExportXls">导出</a-button>
+          <a-button type="primary" icon="download" @click="handleExportXls" v-show="showOP">导出</a-button>
         </div>
 
         <div class="ant-alert ant-alert-info" style="margin-bottom: 16px;">
@@ -116,7 +116,7 @@
         </div>
         <!-- 操作按钮区域 -->
         <div class="table-operator" :md="24" :sm="24" >
-          <a-button @click="handleAdd2" type="primary" icon="plus" style="margin-top: 16px">用户录入</a-button>
+          <a-button @click="handleAdd2" type="primary" icon="plus" style="margin-top: 16px" v-show="showOP">用户录入</a-button>
           <!--<a-button @click="handleEdit2" type="primary" icon="edit" style="margin-top: 16px">用户编辑</a-button>-->
           <a-button @click="handleAddUserRole" type="primary" icon="plus" style="margin-top: 16px">添加已有用户</a-button>
 
@@ -124,7 +124,7 @@
             <a-menu slot="overlay">
               <a-menu-item key="1" @click="batchDel2">
                 <a-icon type="delete"/>
-                删除
+                移出
               </a-menu-item>
             </a-menu>
             <a-button style="margin-left: 8px"> 批量操作
@@ -152,20 +152,24 @@
             :rowSelection="{selectedRowKeys: selectedRowKeys2, onChange: onSelectChange2}"
             @change="handleTableChange2">
            <span slot="action" slot-scope="text, record">
-           <a @click="handleEdit2(record)">编辑</a>
-          <a-divider type="vertical"/>
+           <a @click="handleEdit2(record)" v-show="showOP">编辑</a>
+           <a-divider type="vertical" v-show="showOP"/>
+            <a-popconfirm title="确定移出吗?" @confirm="() => handleDelete2(record.id)">
+              <a>移出</a>
+            </a-popconfirm>
+          <!-- <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="() => handleDelete2(record.id)">
-                  <a>删除</a>
+                <a-popconfirm title="确定移出吗?" @confirm="() => handleDelete2(record.id)">
+                  <a>移出</a>
                 </a-popconfirm>
               </a-menu-item>
             </a-menu>
-          </a-dropdown>
+          </a-dropdown> -->
         </span>
           </a-table>
         </div>
@@ -182,7 +186,7 @@
   import { deleteAction, postAction, getAction } from '@/api/manage'
   import SelectUserModal from './modules/SelectUserModal'
   import RoleModal from './modules/RoleModal'
-  import UserModal from './modules/UserModal'
+  import UserModal from './modules/NewUserModal'
   import { filterObj } from '@/utils/util'
   import UserRoleModal from './modules/UserRoleModal'
   import moment from 'moment'
@@ -199,6 +203,7 @@
     },
     data() {
       return {
+        showOP: true,
         model1: {},
         model2: {},
         currentRoleId: '',
@@ -301,6 +306,7 @@
             width: 120
           }],
 
+
         url: {
           list: '/sys/role/list',
           delete: '/sys/role/delete',
@@ -313,6 +319,12 @@
         }
       }
     },
+    created(){
+        var url = window.location.href
+        if(url.indexOf("roleViewList")>0){
+          this.showOP = false
+        }
+    },
     computed: {
       importExcelUrl: function() {
         return `${window._CONFIG['domianURL']}/${this.url.importExcelUrl}`

+ 138 - 86
src/views/system/UserList.vue

@@ -5,28 +5,7 @@
     <div class="table-page-search-wrapper">
       <a-form layout="inline" @keyup.enter.native="searchQuery">
         <a-row :gutter="24">
-          <a-col :md="6" :sm="8">
-              <a-form-item label="所属公司">
-                <j-dict-select-tag  v-model="queryParam.belongingCompany" placeholder="请输入用户性别"
-                  dictCode="affiliated-company"/>
-              </a-form-item>
-            </a-col>
-
-            <a-col :md="6" :sm="8">
-              <a-form-item label="部门">
-                <j-search-select-tag v-model="queryParam.deptName" placeholder="请选择部门" 
-                     dict="sys_depart,depart_name,depart_name,org_type='3' or org_code='TBD' or org_code='TWH' order by org_code"/>
-              </a-form-item>
-            </a-col>
-
 
-
-          <template v-if="toggleSearchStatus">
-          <a-col :md="6" :sm="12">
-            <a-form-item label="员工姓名">
-               <j-input placeholder="请输入" v-model="queryParam.realname"></j-input>
-            </a-form-item>
-          </a-col>
           <a-col :md="6" :sm="12">
             <a-form-item label="账号">
               <!--<a-input placeholder="请输入账号查询" v-model="queryParam.username"></a-input>-->
@@ -34,7 +13,31 @@
             </a-form-item>
           </a-col>
 
-            <!-- <a-col :md="6" :sm="8">
+          <a-col :md="6" :sm="8">
+            <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 :md="6" :sm="8">
+              <a-form-item label="真实名字">
+                <j-input placeholder="请输入真实名字" v-model="queryParam.realname"></j-input>
+              </a-form-item>
+            </a-col>
+
+            <a-col :md="6" :sm="8">
+              <a-form-item label="手机号码">
+                <j-input placeholder="请输入手机号码查询" v-model="queryParam.phone"></j-input>
+              </a-form-item>
+            </a-col>
+
+            <a-col :md="6" :sm="8">
               <a-form-item label="用户状态">
                 <a-select v-model="queryParam.status" placeholder="请选择">
                   <a-select-option value="">请选择</a-select-option>
@@ -42,7 +45,7 @@
                   <a-select-option value="2">冻结</a-select-option>
                 </a-select>
               </a-form-item>
-            </a-col> -->
+            </a-col>
           </template>
 
           <a-col :md="6" :sm="8">
@@ -62,7 +65,7 @@
 
     <!-- 操作按钮区域 -->
     <div class="table-operator" style="border-top: 5px">
-      <a-button @click="handleAdd" type="primary" icon="plus">添加用户</a-button>
+      <a-button @click="showUserSelection" type="primary" icon="plus">添加用户</a-button>
       <a-button @click="handleSyncUser"  v-has="'user:syncbpm'" 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">
@@ -141,9 +144,9 @@
                 <a href="javascript:;" @click="handleDetail(record)">详情</a>
               </a-menu-item>
 
-              <a-menu-item>
+              <!-- <a-menu-item>
                 <a href="javascript:;" @click="handleChangePassword(record.username)">密码</a>
-              </a-menu-item>
+              </a-menu-item> -->
 
               <a-menu-item>
                 <a-popconfirm title="确定删除吗?" @confirm="() => handleDelete(record.id)">
@@ -163,9 +166,9 @@
                 </a-popconfirm>
               </a-menu-item>
 
-              <a-menu-item>
+              <!-- <a-menu-item>
                 <a href="javascript:;" @click="handleAgentSettings(record.username)">代理人</a>
-              </a-menu-item>
+              </a-menu-item> -->
 
             </a-menu>
           </a-dropdown>
@@ -185,19 +188,49 @@
     <!-- 用户回收站 -->
     <user-recycle-bin-modal :visible.sync="recycleBinVisible" @ok="modalFormOk"/>
 
+    <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 UserModal from './modules/UserModal'
+  import UserModal from './modules/NewUserModal'
   import PasswordModal from './modules/PasswordModal'
-  import {putAction,getFileAccessHttpUrl} from '@/api/manage';
+  import {putAction,getFileAccessHttpUrl,getAction} from '@/api/manage';
   import {frozenBatch} from '@/api/api'
   import {JeecgListMixin} from '@/mixins/JeecgListMixin'
   import SysUserAgentModal from "./modules/SysUserAgentModal";
   import JInput from '@/components/jeecg/JInput'
   import UserRecycleBinModal from './modules/UserRecycleBinModal'
-  import JSearchSelectTag from '@/components/dict/JSearchSelectTag'
 
   export default {
     name: "UserList",
@@ -207,8 +240,7 @@
       UserModal,
       PasswordModal,
       JInput,
-      UserRecycleBinModal,
-      JSearchSelectTag
+      UserRecycleBinModal
     },
     data() {
       return {
@@ -216,15 +248,14 @@
         queryParam: {},
         recycleBinVisible: false,
         userVisible: false,
+        newUserVisible: false,
+        newUserList: [],
+        userSelected:{},
         sheBao: '',
         gongJiJin: '',
         ipagination:{
           pageSizeOptions: ["10", "20", "30", "300"]
         },
-        isorter:{
-          column: "",
-          order: ''
-        },
         columns: [
           /*{
             title: '#',
@@ -237,84 +268,62 @@
             }
           },*/
           {
-            title: '部门',
+            title: '用户账号',
             align: "center",
-            width: 180,
-            dataIndex: 'orgCode'
+            dataIndex: 'username',
+            width: 120
           },
           {
-            title: '员工姓名',
+            title: '用户姓名',
             align: "center",
             width: 100,
             dataIndex: 'realname',
           },
           {
-            title: '工号',
+            title: '头像',
             align: "center",
             width: 120,
-            dataIndex: 'workNo',
+            dataIndex: 'avatar',
+            scopedSlots: {customRender: "avatarslot"}
           },
+
           {
-            title: '身份证号',
+            title: '性别',
             align: "center",
-            width: 120,
-            dataIndex: 'nidNo',
+            width: 80,
+            dataIndex: 'sex_dictText',
+            sorter: true
           },
           {
-            title: '手机号码',
+            title: '生日',
             align: "center",
             width: 100,
-            dataIndex: 'phone'
-          },
-          {
-            title: '所属公司',
-            align: "center",
-            width: 180,
-            dataIndex: 'belongingCompany'
+            dataIndex: 'birthday'
           },
           {
-            title: '生日',
+            title: '手机号码',
             align: "center",
             width: 100,
-            dataIndex: 'birthday'
-          },     
+            dataIndex: 'phone'
+          },
           // {
-          //   title: '状态',
+          //   title: '公司',
           //   align: "center",
-          //   width: 80,
-          //   dataIndex: 'status_dictText'
+          //   width: 180,
+          //   dataIndex: 'pkOrgName'
           // },
           {
-            title: '雇佣状态',
+            title: '部门',
             align: "center",
-            width: 80,
-            dataIndex: 'syHireType'
+            width: 180,
+            dataIndex: 'orgCode'
           },
           {
-            title: '用户账号',
+            title: '状态',
             align: "center",
-            dataIndex: 'username',
-            width: 120
+            width: 80,
+            dataIndex: 'status_dictText'
           },
-          
-          
-          
-          // {
-          //   title: '头像',
-          //   align: "center",
-          //   width: 120,
-          //   dataIndex: 'avatar',
-          //   scopedSlots: {customRender: "avatarslot"}
-          // },
-
-          // {
-          //   title: '性别',
-          //   align: "center",
-          //   width: 80,
-          //   dataIndex: 'sex_dictText',
-          //   sorter: true
-          // },
-          
           {
             title: '操作',
             dataIndex: 'action',
@@ -459,7 +468,50 @@
       },
       passwordModalOk() {
         //TODO 密码修改完成 不需要刷新页面,可以把datasource中的数据更新一下
-      }
+      },
+      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);
+        }
     }
 
   }

+ 42 - 30
src/views/system/modules/AddressListRight.vue

@@ -11,7 +11,7 @@
           </a-col>
 
 
-          <a-col :md="6" :sm="12">
+          <!-- <a-col :md="6" :sm="12">
             <a-form-item label="工号" style="margin-left:8px">
               <a-input placeholder="请输入工号查询" v-model="queryParam.workNo"></a-input>
             </a-form-item>
@@ -22,7 +22,7 @@
                <j-search-select-tag v-model="queryParam.deptName" placeholder="请选择部门" 
                    dict="sys_depart,depart_name,depart_name,org_type='3' or org_code='TBD' order by org_code"/>
             </a-form-item>
-          </a-col>
+          </a-col> -->
 
           <span style="float: left;overflow: hidden;" class="table-page-search-submitButtons">
             <a-col :md="6" :sm="24">
@@ -85,15 +85,21 @@
           // },
           {
             title: '姓名',
-            width: '7%',
+            width: '10%',
             align: 'center',
             dataIndex: 'realname'
           },
+          // {
+          //   title: '工号',
+          //   width: '7%',
+          //   align: 'center',
+          //   dataIndex: 'workNo'
+          // },
           {
-            title: '工号',
+            title: '性别',
             width: '7%',
-            align: 'center',
-            dataIndex: 'workNo'
+            align: "center",
+            dataIndex: 'sex_dictText',
           },
           {
             title: '部门',
@@ -102,45 +108,51 @@
             dataIndex: 'departIds'
           },
           {
-            title: '职务',
-            width: '10%',
+            title: '岗位',
+            width: '15%',
             align: 'center',
             dataIndex: 'post',
             customRender: (text) => (text || '').split(',').map(t => this.positionInfo[t] ? this.positionInfo[t] : t).join(',')
           },
           {
             title: '手机',
-            width: '10%',
+            width: '15%',
             align: 'center',
             dataIndex: 'phone'
           },
           {
-            title: '虚拟网号',
-            width: '10%',
-            align: 'center',
-            dataIndex: 'nvirtualNo'
-          },
-          {
-            title: '公司电话',
-            width: '10%',
+            title: '座机',
+            width: '15%',
             align: 'center',
             dataIndex: 'ncompanyPhone'
           },
-          {
-            title: '公司内线',
-            width: '10%',
-            align: 'center',
-            dataIndex: 'ncompanyLine'
-          },
-          {
-            title: '家电',
-            width: '10%',
-            align: 'center',
-            dataIndex: 'telephone'
-          },
+          // {
+          //   title: '虚拟网号',
+          //   width: '10%',
+          //   align: 'center',
+          //   dataIndex: 'nvirtualNo'
+          // },
+          // {
+          //   title: '公司电话',
+          //   width: '10%',
+          //   align: 'center',
+          //   dataIndex: 'ncompanyPhone'
+          // },
+          // {
+          //   title: '公司内线',
+          //   width: '10%',
+          //   align: 'center',
+          //   dataIndex: 'ncompanyLine'
+          // },
+          // {
+          //   title: '家电',
+          //   width: '10%',
+          //   align: 'center',
+          //   dataIndex: 'telephone'
+          // },
           {
             title: '公司邮箱',
-            width: '11%',
+            width: '15%',
             align: 'center',
             dataIndex: 'email'
           }

+ 1 - 1
src/views/system/modules/DepartWindow.vue

@@ -44,7 +44,7 @@
 import pick from 'lodash.pick'
 import { getAction } from '@/api/manage'
 import { queryIdTree } from '@/api/api'
-import userModal from './UserModal'
+import userModal from './NewUserModal'
 export default {
   name: 'DepartWindow',
   components: {

+ 1 - 1
src/views/system/modules/DeptUserInfo.vue

@@ -107,7 +107,7 @@
   import {JeecgListMixin} from '@/mixins/JeecgListMixin'
   import {getAction, postAction, deleteAction} from '@/api/manage'
   import SelectUserModal from './SelectUserModal'
-  import UserModal from './UserModal'
+  import UserModal from './NewUserModal'
   import DeptRoleUserModal from './DeptRoleUserModal'
 
   export default {

+ 105 - 41
src/views/system/modules/NewUserModal.vue

@@ -22,6 +22,14 @@
          <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="请选择性别">
@@ -41,6 +49,14 @@
           <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%"
@@ -72,6 +88,17 @@
             <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', {}]" />
@@ -90,7 +117,7 @@
         </a-form-item>
 
         <a-form-item label="员工状态" :labelCol="labelCol" :wrapperCol="wrapperCol">
-          <a-select placeholder="请选择员工状态" v-decorator="[ 'status', validatorRules.status]" >
+          <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>
@@ -116,13 +143,43 @@
             <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-divider>IT维护</a-divider>
         <a-form-item label="用户账号" :labelCol="labelCol" :wrapperCol="wrapperCol"  :validateOnRuleChange="true">
           <a-input
             placeholder="请输入用户账号"
@@ -146,7 +203,6 @@
             />
           </a-form-item>
         </template>
-        <!--部门分配-->
         <a-form-item label="公司部门分配" :labelCol="labelCol" :wrapperCol="wrapperCol" v-show="!departDisabled">
           <a-input-search
             placeholder="点击右侧按钮选择公司和部门"
@@ -169,7 +225,7 @@
               {{ role.roleName }}
             </a-select-option>
           </a-select>
-        </a-form-item>
+        </a-form-item> -->
 
 <!--         <a-form-item label="工作简历" :labelCol="labelCol" :wrapperCol="wrapperCol" class="nresume">-->
 <!--          <a-input type="textarea" placeholder="请输入" v-decorator="['nresume', {}]" />-->
@@ -224,42 +280,42 @@ export default {
             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
-                        }
-                    ]
-                },
+                // 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: {
@@ -451,7 +507,15 @@ export default {
                         'nrelationshipFor',
                         'npersonnelType',
                         'nregisteredAddr',
-                        'ifOa'
+                        'ifOa',
+                        'idType',
+                        'type',
+                        'syHireType',
+                        'bank',
+                        'cpf',
+                        'ssPlace',
+                        'ssAccount',
+                        'requirement'
                     )
                 )
             })