Procházet zdrojové kódy

feat:车辆费用报销,物料档案,物料入库,物料库存,固定资产入库,固定资产查询

shenji před 2 roky
rodič
revize
38ef9d111c

+ 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>

+ 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>

+ 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>