Просмотр исходного кода

Merge remote-tracking branch 'origin/master'

Z 1 год назад
Родитель
Сommit
46b37ed4f9

+ 10 - 1
src/BIZComponents/addDoc/api/index.js

@@ -110,4 +110,13 @@ export async function getCode(id) {
     return res.data;
   }
   return Promise.reject(new Error(res.data.message));
-}
+}
+// 编码方案
+export async function listCode() {
+  const res = await request.get(`/main/business_code_category/listCode/WD0001`);
+  if (res.data.code == 0) {
+    return res.data.data;
+  }
+  return Promise.reject(new Error(res.data.message));
+}
+

+ 71 - 41
src/BIZComponents/addDoc/file-edit.vue

@@ -13,14 +13,35 @@
     <el-form ref="form" :model="form" :rules="rules" label-width="82px">
       <el-row :gutter="15">
         <el-col :span="24">
-          <el-form-item label="编码" prop="code">
-            <el-input v-model="form.code" placeholder="请申请编码" disabled>
-              <template slot="append">
-                <el-link :underline="false" @click.native="getCodeOpen"
-                  >申请编码
-                </el-link></template
+          <el-form-item label="编码分类" prop="codeType">
+            <ele-tree-select
+              clearable
+              :data="list"
+              v-model="form.codeType"
+              placeholder="请选择"
+              default-expand-all
+              labelKey="name"
+              childrenKey="sonDirectoryList"
+              valueKey="id"
+              @change="typeChange"
+            />
+          </el-form-item>
+        </el-col>
+        <el-col :span="24">
+          <el-form-item label="编码方案" prop="businessCodeId">
+            <el-select
+              v-model="form.businessCodeId"
+              placeholder="请选择"
+              style="width: 100%"
+            >
+              <el-option
+                v-for="item in options"
+                :key="item.id"
+                :label="item.name"
+                :value="item.id"
               >
-            </el-input>
+              </el-option>
+            </el-select>
           </el-form-item>
         </el-col>
         <el-col :span="24">
@@ -31,31 +52,18 @@
             ></DictSelection>
           </el-form-item>
         </el-col>
-        <!-- <el-col :span="24">
-          <el-form-item label="上传方式" prop="SCFS">
-            <el-radio-group v-model="SCFS">
-              <el-radio :label="1">手动上传</el-radio>
-              <el-radio :label="2">选择模板</el-radio>
-            </el-radio-group>
-          </el-form-item>
-        </el-col> -->
-        <el-col :span="24">
-          <el-form-item label="文档名称" prop="name">
-            <el-input
-              v-model="form.name"
-              placeholder="请输入文档名称"
-            ></el-input>
-          </el-form-item>
-        </el-col>
+
         <el-col :span="24">
           <el-form-item label="文档" prop="storagePath">
             <div style="display: flex; align-items: center">
               <fileUpload
                 v-model="form.storagePath"
                 module="main"
-                :limit="1"
+                :limit="100"
+                :multiple="true"
                 @fileChange="fileChange"
               >
+
               </fileUpload>
             </div>
           </el-form-item>
@@ -93,19 +101,16 @@
         确认
       </el-button>
     </template>
-    <getCode ref="getCode" @success="success"></getCode>
   </ele-modal>
 </template>
 
 <script>
-import { fileSaveAPI,getDocTreeListAPI } from './api';
+import { fileSaveAPI,selectTreeList, listParentId,getDocTreeListAPI,listCode} from './api/index';
 import FileUpload from './fileUpload.vue';
 import { setFolderList } from './util.js';
-import getCode from './getCode.vue';
 import { mapGetters } from 'vuex';
-
 export default {
-  components: { FileUpload, getCode },
+  components: { FileUpload },
 
   data() {
     const defaultForm = {
@@ -117,6 +122,7 @@ export default {
       status: '', //状态
       storagePathId: '',
       directoryId: '',
+      businessCodeId: '',
       storagePath: [],
       id: '',
       lcyStatus: 1,
@@ -124,13 +130,17 @@ export default {
     };
     return {
       rules: {
-        name: [{ required: true, message: '请输入', trigger: 'blur' }],
-        code: [{ required: true, message: '请输入', trigger: 'blur' }],
+        businessCodeId: [
+          { required: true, message: '请选择', trigger: 'blur' }
+        ],
+        // codeType: [{ required: true, message: '请选择', trigger: 'blur' }],
         directoryId: [{ required: true, message: '请选择', trigger: 'blur' }],
         storagePath: [{ required: true, message: '请选择', trigger: 'blur' }]
       },
       templateVisible: false,
       folderList: [],
+      list: [],
+      options: [],
       defaultForm,
       code: '',
       // 表单数据
@@ -139,7 +149,8 @@ export default {
       // 提交状态
       loading: false,
       showEditFlag: false,
-      title: '新建附件'
+      title: '',
+      type: '新建附件'
     };
   },
   computed: {
@@ -159,20 +170,39 @@ export default {
   },
   methods: {
     async open() {
+    
       this.showEditFlag = true;
+      this.list = await selectTreeList();
+      this.options= await listCode();
+      if(this.options.length>0){
+        this.form.businessCodeId=this.options[0].id
+      }
+      this.setTree(this.list);
     },
-    getCodeOpen() {
-      this.$refs.getCode.open();
+    setTree(data) {
+      data.forEach((item) => {
+        item.sonDirectoryList = item.sonDirectoryList.filter(
+          (item) => item.type == 1
+        );
+        if (item.sonDirectoryList.length > 0) {
+          this.setTree(item.sonDirectoryList);
+        }
+      });
     },
+    async typeChange(val) {
+      let data = await listParentId({
+        pageNum: 1,
+        size: 100,
+        parentId: val
+      });
+      this.options = data.list.filter((item) => item.type == 2);
+      this.form.businessCodeId = '';
+    },
+
     fileChange(file) {
       this.form.name = file.name.replace(/\.[^/.]+$/, '');
     },
-    success(code) {
-      this.code = code;
-      this.$nextTick(() => {
-        this.$set(this.form, 'code', code);
-      });
-    },
+
     /* 保存编辑 */
     save() {
       this.$refs.form.validate(async (valid) => {
@@ -186,7 +216,7 @@ export default {
 
         this.loading = true;
         fileSaveAPI(data)
-          .then((msg) => {
+          .then( (msg) => {
             this.loading = false;
 
             this.cancel();

+ 8 - 3
src/BIZComponents/addDoc/main.vue

@@ -16,7 +16,7 @@
       :needPage="false"
       row-key="id"
     >
-      <template v-slot:toolbar   v-if="type != 'view'">
+      <template v-slot:toolbar v-if="type != 'view'">
         <el-button type="primary" @click="fileEditOpen">本地上传</el-button>
         <el-button type="primary" @click="fileShow = true">
           关联文档库
@@ -49,7 +49,9 @@
     </ele-pro-table>
     <template v-slot:footer>
       <el-button @click="showEditFlag = false">取消</el-button>
-      <el-button type="primary" @click="addFile" v-if="type != 'view'"> 确认 </el-button>
+      <el-button type="primary" @click="addFile" v-if="type != 'view'">
+        确认
+      </el-button>
     </template>
     <fileEdit ref="fileEditRef" @done="done"></fileEdit>
     <ele-modal
@@ -162,6 +164,7 @@ export default {
 
   methods: {
     open(fileId, type) {
+      //查看详情:view 新增:add
       this.showEditFlag = true;
       this.fileId = fileId || [];
       if (type) {
@@ -179,10 +182,12 @@ export default {
     async init() {
       if (this.fileId.length > 0) {
         this.tableList = await queryIds({ ids: "'" + this.fileId + "'" });
+      } else {
+        this.tableList = [];
       }
     },
     done(id) {
-      this.fileId.push(id);
+      this.fileId.push(...id);
       this.init();
     },
     browseOpen(row) {

+ 360 - 0
src/BIZComponents/product-list.vue

@@ -0,0 +1,360 @@
+<template>
+  <el-dialog
+    title="选择物品"
+    :visible.sync="visible"
+    :before-close="handleClose"
+    :close-on-click-modal="false"
+    top="5vh"
+    :close-on-press-escape="false"
+    append-to-body
+    width="70%"
+  >
+    <el-card shadow="never">
+      <searchProduct @search="reload"></searchProduct>
+      <ele-split-layout
+        width="244px"
+        allow-collapse
+        :right-style="{ overflow: 'hidden' }"
+      >
+        <div class="ele-border-lighter split-layout-right-content">
+          <productTree
+            @handleNodeClick="handleNodeClick"
+            :isFirstRefreshTable="false"
+            ref="treeList"
+          />
+        </div>
+        <!-- 表格 -->
+        <template v-slot:content>
+          <ele-pro-table
+            ref="table"
+            :columns="columns"
+            :datasource="datasource"
+            @row-dblclick="handleDoubleClick"
+            row-key="id"
+            height="calc(100vh - 480px)"
+            class="dict-table"
+            @cell-click="cellClick"
+            :selection.sync="selection"
+          >
+            <!-- 表头工具栏 -->
+            <template v-slot:action="{ row }">
+              <el-radio class="radio" v-model="radio" :label="row.code"
+                ><i></i
+              ></el-radio>
+            </template>
+       
+          </ele-pro-table>
+        </template>
+      </ele-split-layout>
+    </el-card>
+
+    <div slot="footer">
+      <el-button type="primary" size="small" @click="selected">选择</el-button>
+      <el-button size="small" @click="handleClose">关闭</el-button>
+    </div>
+   
+  </el-dialog>
+</template>
+
+<script>
+  import { getProductList } from '@/api/bpm/components/saleManage/contact.js';
+  import searchProduct from './searchProduct.vue';
+  import productTree from '@/components/productTree/index.vue';
+
+  export default {
+    components: {
+      productTree,
+      searchProduct,
+    },
+    props: {
+      /*是否需要获取仓库产品数量*/
+      isGetInventoryTotal: {
+        type: Boolean,
+        default: false
+      },
+      /*已选择的产品*/
+      data: {
+        type: Array,
+        default: () => []
+      },
+      /*是否需要cBom*/
+      isShowCBom: {
+        type: Boolean,
+        default: false
+      }
+    },
+
+    data() {
+      return {
+        visible: false,
+        currentIndex: null,
+        radio: null,
+        cBomListDialogFlag: null,
+        dictList: {},
+        selection: []
+      };
+    },
+    watch: {},
+    computed: {
+      columns() {
+        return [
+          {
+            action: 'action',
+            slot: 'action',
+            align: 'center',
+            label: '选择',
+            show: this.currentIndex != -1
+          },
+          {
+            label: '选择',
+            show: this.currentIndex == -1,
+            width: 45,
+            type: 'selection',
+            columnKey: 'selection',
+            align: 'center'
+          },
+          {
+            columnKey: 'index',
+            type: 'index',
+            width: 50,
+            align: 'center',
+            showOverflowTooltip: true,
+            label: '序号'
+          },
+          {
+            prop: 'code',
+            label: '编码',
+            align: 'center',
+            showOverflowTooltip: true,
+            minWidth: 110
+          },
+          {
+            prop: 'name',
+            label: '名称',
+            align: 'center',
+            showOverflowTooltip: true,
+            minWidth: 110
+          },
+          {
+            prop: 'imgCode',
+            align: 'center',
+            label: '图号/件号',
+            showOverflowTooltip: true,
+            minWidth: 110
+          },
+       
+          {
+            prop: 'extField.approvalNumber',
+            align: 'center',
+            label: '批准文号',
+            showOverflowTooltip: true,
+            minWidth: 110
+          },
+          {
+            prop: 'extField.packingSpecification',
+            align: 'center',
+            label: '包装规格',
+            showOverflowTooltip: true,
+            minWidth: 110
+          },
+          {
+            prop: 'brandNum',
+            align: 'center',
+            label: '牌号',
+            showOverflowTooltip: true
+          },
+          {
+            prop: 'modelType',
+            label: '型号',
+            align: 'center',
+            showOverflowTooltip: true
+          },
+          {
+            prop: 'specification',
+            label: '规格',
+            align: 'center',
+            showOverflowTooltip: true
+          },
+          {
+            prop: 'measuringUnit',
+            label: '计量单位',
+            showOverflowTooltip: true,
+            align: 'center',
+            minWidth: 90
+          },
+
+          {
+            prop: 'weightUnit',
+            label: '重量单位',
+            showOverflowTooltip: true,
+            align: 'center',
+            minWidth: 90
+          },
+
+          {
+            prop: 'roughWeight',
+            label: '毛重',
+            showOverflowTooltip: true,
+            align: 'center',
+            minWidth: 90
+          },
+
+          {
+            prop: 'netWeight',
+            label: '净重',
+            showOverflowTooltip: true,
+            align: 'center',
+            minWidth: 90
+          },
+
+          {
+            prop: 'packingUnit',
+            align: 'center',
+            label: '包装单位',
+            showOverflowTooltip: true
+          },
+          {
+            prop: 'categoryLevelPath',
+            label: '分类',
+            align: 'center',
+            showOverflowTooltip: true
+          },
+          {
+            slot: 'cz',
+            align: 'center',
+            minWidth: 90,
+            fixed: 'right',
+            label: '操作',
+            show: this.isShowCBom
+          }
+        ];
+      }
+    },
+    methods: {
+      getDictV(code, val) {
+        if (!this.dictList[code]) return '';
+        return this.dictList[code].find((item) => item.value == val)?.label;
+      },
+
+      open(item, currentIndex) {
+        this.currentIndex = currentIndex;
+        this.visible = true;
+      },
+      /* 表格数据源 */
+      datasource({ page, limit, where, order }) {
+        return getProductList({
+          pageNum: page,
+          size: limit,
+          ...where
+        });
+      },
+
+      /* 刷新表格 */
+      reload(where) {
+        this.$refs.table.reload({ pageNum: 1, where: where });
+      },
+
+      handleNodeClick(data, node) {
+        this.curNodeData = data;
+        this.reload({ categoryLevelId: data.id });
+      },
+
+      // 单击获取id
+      cellClick(row) {
+        if (this.currentIndex == -1) return;
+        this.current = row;
+        this.radio = row.id;
+      },
+      handleDoubleClick(row) {
+        if (!this.isShowCBom) return;
+        this.cBomListDialogFlag = true;
+        this.current = row;
+        this.$nextTick(() => {
+          this.$refs.cBomRef.open(row);
+        });
+      },
+      getSelectionCbom(rows = []) {
+        this.$emit('getSelectionCbom', rows);
+        this.handleClose();
+      },
+      handleClose() {
+        this.visible = false;
+        this.current = null;
+        this.selection = [];
+        this.$refs.table.clearSelection();
+        this.radio = '';
+      },
+
+      async selected() {
+        if (!this.current && !this.selection.length) {
+          return this.$message.warning('请至少选择一条数据');
+        }
+        if (this.currentIndex != -1) {
+          if (
+            this.data
+              .map((item) => item.productCode)
+              .includes(this.current.code)
+          ) {
+            return this.$message.error('选择的产品已经存在列表了');
+          }
+        } else {
+          if (
+            this.selection.some((item) =>
+              this.data.some((i) => i.productCode == item.code)
+            )
+          ) {
+            return this.$message.error('选择的产品已经存在列表了');
+          }
+        }
+
+        let codeList = [];
+        let list = this.currentIndex == -1 ? this.selection : [this.current];
+        //获取仓库库存
+        if (this.isGetInventoryTotal) {
+          codeList = list.map((item) => item.code);
+          let inventoryTotalList = await getInventoryTotalAPI(codeList);
+          list.forEach((item) => {
+            let find =
+              inventoryTotalList.find((key) => key.code == item.code) || {};
+            item.availableCountBase = find.availableCountBase;
+          });
+        }
+        this.$emit('changeParent', list, this.currentIndex);
+
+        this.handleClose();
+      }
+    }
+  };
+</script>
+
+<style lang="scss" scoped>
+  .tree_col {
+    border: 1px solid #eee;
+    padding: 10px 0;
+    box-sizing: border-box;
+    height: 500px;
+    overflow: auto;
+  }
+
+  .table_col {
+    padding-left: 10px;
+
+    ::v-deep .el-table th.el-table__cell {
+      background: #f2f2f2;
+    }
+  }
+
+  .pagination {
+    text-align: right;
+    padding: 10px 0;
+  }
+
+  .btns {
+    text-align: center;
+    padding: 10px 0;
+  }
+
+  .topsearch {
+    margin-bottom: 15px;
+  }
+</style>

+ 127 - 0
src/BIZComponents/searchProduct.vue

@@ -0,0 +1,127 @@
+<!-- 搜索表单 -->
+<template>
+  <el-form
+    size="small"
+    label-width="60px"
+    class="ele-form-search"
+    @keyup.enter.native="search"
+    @submit.native.prevent
+  >
+    <el-row :gutter="10">
+      <el-col v-bind="styleResponsive ? { md: 6 } : { span: 6 }">
+        <el-form-item label="编码">
+          <el-input
+            clearable
+            size="small"
+            v-model="where.code"
+            placeholder="请输入"
+          />
+        </el-form-item>
+      </el-col>
+      <el-col v-bind="styleResponsive ? { md: 6 } : { span: 6 }">
+        <el-form-item label="名称">
+          <el-input
+            clearable
+            size="small"
+            v-model="where.name"
+            placeholder="请输入"
+          />
+        </el-form-item>
+      </el-col>
+
+      <el-col v-bind="styleResponsive ? { md: 6 } : { span: 6 }">
+        <el-form-item label="型号">
+          <el-input
+            clearable
+            size="small"
+            v-model="where.modelType"
+            placeholder="请输入"
+          />
+        </el-form-item>
+      </el-col>
+
+      <el-col v-bind="styleResponsive ? { md: 6 } : { span: 4 }">
+        <el-form-item>
+          <el-button
+            size="small"
+            type="primary"
+            icon="el-icon-search"
+            class="ele-btn-icon"
+            @click="search"
+          >
+            查询
+          </el-button>
+
+          <el-button
+            @click="reset"
+            icon="el-icon-refresh"
+            class="ele-btn-icon"
+            size="medium"
+            >重置</el-button
+          >
+          <slot></slot>
+        </el-form-item>
+      </el-col>
+    </el-row>
+    <el-row :gutter="10">
+      <el-col v-bind="styleResponsive ? { md: 6 } : { span: 6 }">
+        <el-form-item label="牌号">
+          <el-input
+            clearable
+            size="small"
+            v-model="where.brandNum"
+            placeholder="请输入"
+          />
+        </el-form-item>
+      </el-col>
+      <el-col v-bind="styleResponsive ? { md: 6 } : { span: 6 }">
+        <el-form-item label="规格">
+          <el-input
+            clearable
+            size="small"
+            v-model="where.specification"
+            placeholder="请输入"
+          />
+        </el-form-item>
+      </el-col>
+    </el-row>
+  </el-form>
+</template>
+
+<script>
+  export default {
+    data() {
+      // 默认表单数据
+      const defaultWhere = {
+        name: '',
+        code: '',
+        brandNum: '',
+        modelType: '',
+        specification: ''
+      };
+      return {
+        defaultWhere,
+        // 表单数据
+        where: { ...defaultWhere },
+        loading: false
+      };
+    },
+    computed: {
+      // 是否开启响应式布局
+      styleResponsive() {
+        return this.$store.state.theme.styleResponsive;
+      }
+    },
+    methods: {
+      /* 搜索 */
+      search() {
+        this.$emit('search', this.where);
+      },
+      /*  重置 */
+      reset() {
+        this.where = { ...this.defaultWhere };
+        this.search();
+      }
+    }
+  };
+</script>

+ 42 - 0
src/api/bpm/components/marketManagem/index.js

@@ -0,0 +1,42 @@
+import request from '@/utils/request';
+
+/**
+ * 列表
+ */
+ export async function getList (data) {
+    const res = await request.post('/eom/market_management/page', data);
+    if (res.data.code == 0) {
+      return res.data.data;
+    }
+    return Promise.reject(new Error(res.data.message));
+  }
+  /**
+ * 新增修改
+ */
+ export async function save (data) {
+  const res = await request.post('/eom/market_management/'+(data.id?'update':'save'), data);
+  if (res.data.code == 0) {
+    return res.data.data;
+  }
+  return Promise.reject(new Error(res.data.message));
+}
+  /**
+ * 详情
+ */
+   export async function getById (id) {
+    const res = await request.get('/eom/market_management/getById/'+id);
+    if (res.data.code == 0) {
+      return res.data.data;
+    }
+    return Promise.reject(new Error(res.data.message));
+  }
+/**
+ * 删除
+ */
+ export async function del(data) {
+  const res = await request.delete('/eom/market_management/delete', {data});
+  if (res.data.code == 0) {
+    return res.data.data;
+  }
+  return Promise.reject(new Error(res.data.message));
+}

+ 2 - 0
src/enum/dict.js

@@ -83,6 +83,8 @@ export default {
   不拆物料层规格: 'material_layer',
   生产类型: 'productionType',
   协同办公分类:'collaborative_type',
+  市场活动类型: 'activity_type',
+
 };
 
 export const numberList = [

+ 32 - 0
src/utils/util.js

@@ -47,3 +47,35 @@ export function copyObj(obj) {
   } else newobj = obj;
   return newobj;
 }
+
+//合计费用
+export function getSummaries(param,key) {
+  const { columns, data } = param;
+  const sums = [];
+  columns.forEach((column, index) => {
+    if (index === 0) {
+      sums[index] = '合计';
+      return;
+    }
+    if (column.property == key) {
+      const values = data.map((item) => Number(item['cost']));
+      if (!values.every((value) => isNaN(value))) {
+        sums[index] = values.reduce((prev, curr) => {
+          const value = Number(curr);
+          if (!isNaN(value)) {
+            return prev + curr;
+          } else {
+            return prev;
+          }
+        }, 0);
+        sums[index] += ' 元';
+      } else {
+        sums[index] = '';
+      }
+    } else {
+      sums[index] = '';
+    }
+  });
+
+  return sums;
+}

+ 326 - 0
src/views/bpm/handleTask/components/marketManagem/companyList.vue

@@ -0,0 +1,326 @@
+<template>
+  <div>
+    <el-form ref="form" >
+      <!-- 数据表格 -->
+      <ele-pro-table
+        ref="table"
+        :columns="columns"
+        :datasource="tableList"
+        :needPage="false"
+        :minHeight="100"
+        tool-class="ele-toolbar-form"
+        cache-key="eomContactPageTable"
+        :summary-method="getSummaries"
+        show-summary
+      >
+        <!-- 表头工具栏 -->
+        <template v-slot:toolbar>
+          <div class="listToolbar">
+            <el-button
+              v-if="dialogType !== 'view'"
+              size="small"
+              type="primary"
+              icon="el-icon-plus"
+              class="ele-btn-icon"
+              @click="handleAddInfo"
+            >
+              新增
+            </el-button>
+      
+          </div>
+        </template>
+
+        <template v-slot:action="{ row, $index }" v-if="dialogType !== 'view'">
+          <el-popconfirm
+            class="ele-action"
+            title="确定要删除此信息吗?"
+            @confirm="handleDelInfo($index)"
+          >
+            <template v-slot:reference>
+              <el-link type="danger" :underline="false" icon="el-icon-delete">
+                删除
+              </el-link>
+            </template>
+          </el-popconfirm>
+        </template>
+
+        <template v-slot:dataTime="{ row, $index }"  v-if="dialogType !== 'view'">
+          <el-form-item :prop="'tableList.' + $index + '.dataTime'">
+            <el-date-picker
+              v-model="row.dataTime"
+              type="date"
+              placeholder="选择日期"
+              value-format="yyyy-MM-dd"
+
+            >
+            </el-date-picker>
+          </el-form-item>
+        </template>
+        <template v-slot:cost="{ row, $index }" v-if="dialogType !== 'view'">
+          <el-form-item :prop="'datasource.' + $index + '.cost'">
+            <el-input type="number" v-model="row.cost"></el-input>
+          </el-form-item>
+        </template>
+        <template
+          v-slot:personal="{ row, $index }"
+          v-if="dialogType !== 'view'"
+        >
+          <el-form-item :prop="'datasource.' + $index + '.personal'">
+            <el-input type="number" v-model="row.personal"></el-input>
+          </el-form-item>
+        </template>
+        <template v-slot:place="{ row, $index }" v-if="dialogType !== 'view'">
+          <el-form-item :prop="'datasource.' + $index + '.place'">
+            <el-input v-model="row.place"></el-input>
+          </el-form-item>
+        </template>
+
+        <template
+          v-slot:materialName="{ row, $index }"
+          v-if="dialogType !== 'view'"
+        >
+          <el-form-item :prop="'datasource.' + $index + '.materialName'">
+            <el-input v-model="row.materialName">
+              <template slot="append">
+                <el-link
+                  type="primary"
+                  :underline="false"
+                  @click.native="materialOpen(row, $index)"
+                >
+                  选择</el-link
+                >
+              </template>
+            </el-input>
+          </el-form-item>
+        </template>
+        <template
+          v-slot:materialNum="{ row, $index }"
+          v-if="dialogType !== 'view'"
+        >
+          <el-form-item :prop="'datasource.' + $index + '.materialNum'">
+            <el-input type="number" v-model="row.materialNum"></el-input>
+          </el-form-item>
+        </template>
+        <template
+          v-slot:ownershipId="{ row, $index }"
+          v-if="dialogType !== 'view'"
+        >
+          <el-form-item :prop="'datasource.' + $index + '.ownershipId'">
+            <el-cascader
+              class="ele-block"
+              :options="organizationList"
+              placeholder="请选择"
+              :props="defaultProps"
+              ref="deptRef"
+              :show-all-levels="false"
+              v-model="row.ownershipId"
+              @change="ownershipChange($index)"
+              clearable
+            ></el-cascader>
+          </el-form-item>
+        </template>
+        <template v-slot:remark="{ row, $index }" v-if="dialogType !== 'view'">
+          <el-form-item :prop="'datasource.' + $index + '.remark'">
+            <el-input type="textarea" v-model="row.remark"></el-input>
+          </el-form-item>
+        </template>
+      </ele-pro-table>
+    </el-form>
+    <productList
+      :currentIndex="-1"
+      @changeParent="changeParent"
+      ref="productListRef"
+    ></productList>
+  </div>
+</template>
+  
+
+  <script>
+import { getSummaries } from '@/utils/util.js';
+import productList from '@/BIZComponents/product-list.vue';
+export default {
+  name: 'relatedInfoTable',
+
+  props: {
+    dialogType: '',
+    organizationList: {
+      type: Array,
+      default: () => {
+        return [];
+      }
+    }
+  },
+  components: { productList },
+
+  data() {
+    return {
+      tableList: [],
+      currentIndex: '',
+      defaultProps: {
+        multiple: false,
+        checkStrictly: true,
+        emitPath: false,
+        children: 'children',
+        value: 'id',
+        label: 'name'
+      }
+    };
+  },
+  computed: {
+    columns() {
+      return [
+        {
+          columnKey: 'index',
+          label: '序号',
+          type: 'index',
+          width: 55,
+          align: 'center',
+          showOverflowTooltip: true,
+          fixed: 'left'
+        },
+        {
+          prop: 'dataTime',
+          label: '日期',
+          align: 'center',
+          showOverflowTooltip: true,
+          minWidth: 150,
+          slot: 'dataTime'
+        },
+        {
+          prop: 'personal',
+          label: '人数',
+          align: 'center',
+          showOverflowTooltip: true,
+          width: 80,
+          slot: 'personal'
+        },
+        {
+          prop: 'place',
+          label: '地点',
+          align: 'center',
+          showOverflowTooltip: true,
+          minWidth: 220,
+          slot: 'place'
+        },
+        {
+          prop: 'materialName',
+          label: '物料名称',
+          align: 'center',
+          showOverflowTooltip: true,
+          minWidth: 200,
+          slot: 'materialName'
+        },
+        {
+          prop: 'materialNum',
+          label: '数量',
+          align: 'center',
+          showOverflowTooltip: true,
+          width: 100,
+          slot: 'materialNum'
+        },
+        {
+          prop: 'ownershipName',
+          label: '权属单位',
+          align: 'center',
+          showOverflowTooltip: true,
+          minWidth: 200,
+          slot: 'ownershipId'
+        },
+
+        {
+          prop: 'cost',
+          label: '预计费用',
+          align: 'center',
+          showOverflowTooltip: true,
+          minWidth: 120,
+          slot: 'cost'
+        },
+        {
+          prop: 'remark',
+          label: '备注',
+          minWidth: 200,
+          align: 'center',
+          showOverflowTooltip: true,
+          slot: 'remark'
+        },
+
+        {
+          columnKey: 'action',
+          slot: 'action',
+          label: '操作',
+          resizable: false,
+          width: 80,
+          align: 'center',
+          showOverflowTooltip: true,
+          fixed: 'right'
+        }
+      ];
+    }
+  },
+  mounted() {},
+  methods: {
+    getSummaries(param) {
+      return getSummaries(param, 'cost');
+    },
+    //删除任务信息数据
+    handleDelInfo(index) {
+      this.tableList.splice(index, 1);
+    },
+    //修改回显
+    putTableValue(data) {
+      this.tableList = data || [];
+    },
+    getTableValue() {
+      return this.tableList;
+    },
+    materialOpen(row, index) {
+      this.currentIndex = index;
+      this.$refs.productListRef.open(row, index);
+    },
+    changeParent(list) {
+      if (list.length > 0) {
+        this.$set(
+          this.tableList[this.currentIndex],
+          'materialName',
+          list[0].name
+        );
+        this.$set(this.tableList[this.currentIndex], 'materialId', list[0].id);
+      }
+    },
+    ownershipChange(index) {
+      this.$nextTick(()=>{
+        const data =this.$refs.deptRef.getCheckedNodes()
+        this.$set(this.tableList[index], 'ownershipName', data[0].label);
+
+      })
+    },
+    handleAddInfo() {
+      this.tableList.push({
+        dataTime: '',
+        personal: '',
+        place: '',
+        materialName: '',
+        materialId: '',
+        materialNum: '',
+        ownershipId: '',
+        ownershipName: '',
+        remark: '',
+        cost: ''
+      });
+    }
+  }
+};
+</script>
+  
+  
+  <style scoped lang="scss">
+:deep(.el-form-item) {
+  margin-bottom: 0;
+}
+.listToolbar {
+  display: flex;
+  justify-content: space-between;
+  align-items: center;
+}
+</style>
+  

+ 326 - 0
src/views/bpm/handleTask/components/marketManagem/conferenceList.vue

@@ -0,0 +1,326 @@
+<template>
+  <div>
+    <el-form ref="form">
+      <!-- 数据表格 -->
+      <ele-pro-table
+        ref="table"
+        :columns="columns"
+        :datasource="tableList"
+        :needPage="false"
+        :minHeight="100"
+        tool-class="ele-toolbar-form"
+        cache-key="eomContactPageTable"
+        :summary-method="getSummaries"
+        show-summary
+      >
+        <!-- 表头工具栏 -->
+        <template v-slot:toolbar>
+          <div class="listToolbar">
+            <el-button
+              v-if="dialogType !== 'view'"
+              size="small"
+              type="primary"
+              icon="el-icon-plus"
+              class="ele-btn-icon"
+              @click="handleAddInfo"
+            >
+              新增
+            </el-button>
+         
+          </div>
+        </template>
+
+        <template v-slot:action="{ row, $index }" v-if="dialogType !== 'view'">
+          <el-popconfirm
+            class="ele-action"
+            title="确定要删除此信息吗?"
+            @confirm="handleDelInfo($index)"
+          >
+            <template v-slot:reference>
+              <el-link type="danger" :underline="false" icon="el-icon-delete">
+                删除
+              </el-link>
+            </template>
+          </el-popconfirm>
+        </template>
+
+        <template v-slot:dataTime="{ row, $index }" v-if="dialogType !== 'view'">
+          <el-form-item :prop="'tableList.' + $index + '.dataTime'">
+            <el-date-picker
+              v-model="row.dataTime"
+              type="date"
+              placeholder="选择日期"
+              value-format="yyyy-MM-dd"
+
+            >
+            </el-date-picker>
+          </el-form-item>
+        </template>
+        <template v-slot:cost="{ row, $index }" v-if="dialogType !== 'view'">
+          <el-form-item :prop="'datasource.' + $index + '.cost'">
+            <el-input type="number" v-model="row.cost"></el-input>
+          </el-form-item>
+        </template>
+        <template
+          v-slot:personal="{ row, $index }"
+          v-if="dialogType !== 'view'"
+        >
+          <el-form-item :prop="'datasource.' + $index + '.personal'">
+            <el-input type="number" v-model="row.personal"></el-input>
+          </el-form-item>
+        </template>
+        <template v-slot:place="{ row, $index }" v-if="dialogType !== 'view'">
+          <el-form-item :prop="'datasource.' + $index + '.place'">
+            <el-input v-model="row.place"></el-input>
+          </el-form-item>
+        </template>
+
+        <template
+          v-slot:materialName="{ row, $index }"
+          v-if="dialogType !== 'view'"
+        >
+          <el-form-item :prop="'datasource.' + $index + '.materialName'">
+            <el-input v-model="row.materialName">
+              <template slot="append">
+                <el-link
+                  type="primary"
+                  :underline="false"
+                  @click.native="materialOpen(row, $index)"
+                >
+                  选择</el-link
+                >
+              </template>
+            </el-input>
+          </el-form-item>
+        </template>
+        <template
+          v-slot:materialNum="{ row, $index }"
+          v-if="dialogType !== 'view'"
+        >
+          <el-form-item :prop="'datasource.' + $index + '.materialNum'">
+            <el-input type="number" v-model="row.materialNum"></el-input>
+          </el-form-item>
+        </template>
+        <template
+          v-slot:ownershipId="{ row, $index }"
+          v-if="dialogType !== 'view'"
+        >
+          <el-form-item :prop="'datasource.' + $index + '.ownershipId'">
+            <el-cascader
+              class="ele-block"
+              :options="organizationList"
+              placeholder="请选择"
+              :props="defaultProps"
+              ref="deptRef"
+              :show-all-levels="false"
+              v-model="row.ownershipId"
+              @change="ownershipChange($index)"
+              clearable
+            ></el-cascader>
+          </el-form-item>
+        </template>
+        <template v-slot:remark="{ row, $index }" v-if="dialogType !== 'view'">
+          <el-form-item :prop="'datasource.' + $index + '.remark'">
+            <el-input type="textarea" v-model="row.remark"></el-input>
+          </el-form-item>
+        </template>
+      </ele-pro-table>
+    </el-form>
+    <productList
+      :currentIndex="-1"
+      @changeParent="changeParent"
+      ref="productListRef"
+    ></productList>
+  </div>
+</template>
+  
+
+  <script>
+import { getSummaries } from '@/utils/util.js';
+import productList from '@/BIZComponents/product-list.vue';
+export default {
+  name: 'relatedInfoTable',
+
+  props: {
+    dialogType: '',
+    organizationList: {
+      type: Array,
+      default: () => {
+        return [];
+      }
+    }
+  },
+  components: { productList },
+
+  data() {
+    return {
+      tableList: [],
+      currentIndex: '',
+      defaultProps: {
+        multiple: false,
+        checkStrictly: true,
+        emitPath: false,
+        children: 'children',
+        value: 'id',
+        label: 'name'
+      }
+    };
+  },
+  computed: {
+    columns() {
+      return [
+        {
+          columnKey: 'index',
+          label: '序号',
+          type: 'index',
+          width: 55,
+          align: 'center',
+          showOverflowTooltip: true,
+          fixed: 'left'
+        },
+        {
+          prop: 'dataTime',
+          label: '日期',
+          align: 'center',
+          showOverflowTooltip: true,
+          minWidth: 150,
+          slot: 'dataTime'
+        },
+        {
+          prop: 'personal',
+          label: '人数',
+          align: 'center',
+          showOverflowTooltip: true,
+          width: 80,
+          slot: 'personal'
+        },
+        {
+          prop: 'place',
+          label: '会议地点',
+          align: 'center',
+          showOverflowTooltip: true,
+          minWidth: 220,
+          slot: 'place'
+        },
+        {
+          prop: 'materialName',
+          label: '物料名称',
+          align: 'center',
+          showOverflowTooltip: true,
+          minWidth: 200,
+          slot: 'materialName'
+        },
+        {
+          prop: 'materialNum',
+          label: '数量',
+          align: 'center',
+          showOverflowTooltip: true,
+          width: 100,
+          slot: 'materialNum'
+        },
+        {
+          prop: 'ownershipId',
+          label: '权属单位',
+          align: 'center',
+          showOverflowTooltip: true,
+          minWidth: 200,
+          slot: 'ownershipId'
+        },
+
+        {
+          prop: 'cost',
+          label: '预计费用',
+          align: 'center',
+          showOverflowTooltip: true,
+          minWidth: 120,
+          slot: 'cost'
+        },
+        {
+          prop: 'remark',
+          label: '备注',
+          minWidth: 200,
+          align: 'center',
+          showOverflowTooltip: true,
+          slot: 'remark'
+        },
+
+        {
+          columnKey: 'action',
+          slot: 'action',
+          label: '操作',
+          resizable: false,
+          width: 80,
+          align: 'center',
+          showOverflowTooltip: true,
+          fixed: 'right'
+        }
+      ];
+    }
+  },
+  mounted() {},
+  methods: {
+    getSummaries(param) {
+      return getSummaries(param, 'cost');
+    },
+    //删除任务信息数据
+    handleDelInfo(index) {
+      this.tableList.splice(index, 1);
+    },
+    //修改回显
+    putTableValue(data) {
+      this.tableList = data || [];
+    },
+    getTableValue() {
+      return this.tableList;
+    },
+    materialOpen(row, index) {
+      this.currentIndex = index;
+      this.$refs.productListRef.open(row, index);
+    },
+    changeParent(list) {
+      if (list.length > 0) {
+        this.$set(
+          this.tableList[this.currentIndex],
+          'materialName',
+          list[0].name
+        );
+        this.$set(this.tableList[this.currentIndex], 'materialId', list[0].id);
+      }
+    },
+    ownershipChange(index) {
+      this.$nextTick(()=>{
+        const data =this.$refs.deptRef.getCheckedNodes()
+        this.$set(this.tableList[index], 'ownershipName', data[0].label);
+
+      })
+    },
+    handleAddInfo() {
+      this.tableList.push({
+        dataTime: '',
+        personal: '',
+        place: '',
+        materialName: '',
+        materialId: '',
+        materialNum: '',
+        ownershipId: '',
+        ownershipName: '',
+        remark: '',
+        cost: ''
+      });
+    }
+  }
+};
+</script>
+  
+  
+  <style scoped lang="scss">
+:deep(.el-form-item) {
+  margin-bottom: 0;
+}
+.listToolbar {
+  display: flex;
+  justify-content: space-between;
+  align-items: center;
+}
+</style>
+  

+ 325 - 0
src/views/bpm/handleTask/components/marketManagem/mealList.vue

@@ -0,0 +1,325 @@
+<template>
+  <div>
+    <el-form ref="form">
+      <!-- 数据表格 -->
+      <ele-pro-table
+        ref="table"
+        :columns="columns"
+        :datasource="tableList"
+        :needPage="false"
+        :minHeight="100"
+        tool-class="ele-toolbar-form"
+        cache-key="eomContactPageTable"
+        :summary-method="getSummaries"
+        show-summary
+      >
+        <!-- 表头工具栏 -->
+        <template v-slot:toolbar>
+          <div class="listToolbar">
+            <el-button
+              v-if="dialogType !== 'view'"
+              size="small"
+              type="primary"
+              icon="el-icon-plus"
+              class="ele-btn-icon"
+              @click="handleAddInfo"
+            >
+              新增
+            </el-button>
+           
+          </div>
+        </template>
+
+        <template v-slot:action="{ row, $index }" v-if="dialogType !== 'view'">
+          <el-popconfirm
+            class="ele-action"
+            title="确定要删除此信息吗?"
+            @confirm="handleDelInfo($index)"
+          >
+            <template v-slot:reference>
+              <el-link type="danger" :underline="false" icon="el-icon-delete">
+                删除
+              </el-link>
+            </template>
+          </el-popconfirm>
+        </template>
+
+        <template v-slot:dataTime="{ row, $index }" v-if="dialogType !== 'view'">
+          <el-form-item :prop="'tableList.' + $index + '.dataTime'">
+            <el-date-picker
+              v-model="row.dataTime"
+              type="date"
+              placeholder="选择日期"
+              value-format="yyyy-MM-dd"
+            >
+            </el-date-picker>
+          </el-form-item>
+        </template>
+        <template v-slot:cost="{ row, $index }" v-if="dialogType !== 'view'">
+          <el-form-item :prop="'datasource.' + $index + '.cost'">
+            <el-input type="number" v-model="row.cost"></el-input>
+          </el-form-item>
+        </template>
+        <template
+          v-slot:personal="{ row, $index }"
+          v-if="dialogType !== 'view'"
+        >
+          <el-form-item :prop="'datasource.' + $index + '.personal'">
+            <el-input type="number" v-model="row.personal"></el-input>
+          </el-form-item>
+        </template>
+        <template v-slot:place="{ row, $index }" v-if="dialogType !== 'view'">
+          <el-form-item :prop="'datasource.' + $index + '.place'">
+            <el-input v-model="row.place"></el-input>
+          </el-form-item>
+        </template>
+
+        <template
+          v-slot:materialName="{ row, $index }"
+          v-if="dialogType !== 'view'"
+        >
+          <el-form-item :prop="'datasource.' + $index + '.materialName'">
+            <el-input v-model="row.materialName">
+              <template slot="append">
+                <el-link
+                  type="primary"
+                  :underline="false"
+                  @click.native="materialOpen(row, $index)"
+                >
+                  选择</el-link
+                >
+              </template>
+            </el-input>
+          </el-form-item>
+        </template>
+        <template
+          v-slot:materialNum="{ row, $index }"
+          v-if="dialogType !== 'view'"
+        >
+          <el-form-item :prop="'datasource.' + $index + '.materialNum'">
+            <el-input type="number" v-model="row.materialNum"></el-input>
+          </el-form-item>
+        </template>
+        <template
+          v-slot:ownershipId="{ row, $index }"
+          v-if="dialogType !== 'view'"
+        >
+          <el-form-item :prop="'datasource.' + $index + '.ownershipId'">
+            <el-cascader
+              class="ele-block"
+              :options="organizationList"
+              placeholder="请选择"
+              :props="defaultProps"
+              ref="deptRef"
+              :show-all-levels="false"
+              v-model="row.ownershipId"
+              @change="ownershipChange($index)"
+              clearable
+            ></el-cascader>
+          </el-form-item>
+        </template>
+        <template v-slot:remark="{ row, $index }" v-if="dialogType !== 'view'">
+          <el-form-item :prop="'datasource.' + $index + '.remark'">
+            <el-input type="textarea" v-model="row.remark"></el-input>
+          </el-form-item>
+        </template>
+      </ele-pro-table>
+    </el-form>
+    <productList
+      :currentIndex="-1"
+      @changeParent="changeParent"
+      ref="productListRef"
+    ></productList>
+  </div>
+</template>
+  
+
+  <script>
+import { getSummaries } from '@/utils/util.js';
+import productList from '@/BIZComponents/product-list.vue';
+export default {
+  name: 'relatedInfoTable',
+
+  props: {
+    dialogType: '',
+    organizationList: {
+      type: Array,
+      default: () => {
+        return [];
+      }
+    }
+  },
+  components: { productList },
+
+  data() {
+    return {
+      tableList: [],
+      currentIndex: '',
+      defaultProps: {
+        multiple: false,
+        checkStrictly: true,
+        emitPath: false,
+        children: 'children',
+        value: 'id',
+        label: 'name'
+      }
+    };
+  },
+  computed: {
+    columns() {
+      return [
+        {
+          columnKey: 'index',
+          label: '序号',
+          type: 'index',
+          width: 55,
+          align: 'center',
+          showOverflowTooltip: true,
+          fixed: 'left'
+        },
+        {
+          prop: 'dataTime',
+          label: '日期',
+          align: 'center',
+          showOverflowTooltip: true,
+          minWidth: 150,
+          slot: 'dataTime'
+        },
+        {
+          prop: 'personal',
+          label: '人数',
+          align: 'center',
+          showOverflowTooltip: true,
+          width: 80,
+          slot: 'personal'
+        },
+        {
+          prop: 'place',
+          label: '接待场所',
+          align: 'center',
+          showOverflowTooltip: true,
+          minWidth: 220,
+          slot: 'place'
+        },
+        {
+          prop: 'materialName',
+          label: '物料名称',
+          align: 'center',
+          showOverflowTooltip: true,
+          minWidth: 200,
+          slot: 'materialName'
+        },
+        {
+          prop: 'materialNum',
+          label: '数量',
+          align: 'center',
+          showOverflowTooltip: true,
+          width: 100,
+          slot: 'materialNum'
+        },
+        {
+          prop: 'ownershipName',
+          label: '权属单位',
+          align: 'center',
+          showOverflowTooltip: true,
+          minWidth: 200,
+          slot: 'ownershipId'
+        },
+
+        {
+          prop: 'cost',
+          label: '预计费用',
+          align: 'center',
+          showOverflowTooltip: true,
+          minWidth: 120,
+          slot: 'cost'
+        },
+        {
+          prop: 'remark',
+          label: '备注',
+          minWidth: 200,
+          align: 'center',
+          showOverflowTooltip: true,
+          slot: 'remark'
+        },
+
+        {
+          columnKey: 'action',
+          slot: 'action',
+          label: '操作',
+          resizable: false,
+          width: 80,
+          align: 'center',
+          showOverflowTooltip: true,
+          fixed: 'right'
+        }
+      ];
+    }
+  },
+  mounted() {},
+  methods: {
+    getSummaries(param) {
+      return getSummaries(param, 'cost');
+    },
+    //删除任务信息数据
+    handleDelInfo(index) {
+      this.tableList.splice(index, 1);
+    },
+    //修改回显
+    putTableValue(data) {
+      this.tableList = data || [];
+    },
+    getTableValue() {
+      return this.tableList;
+    },
+    materialOpen(row, index) {
+      this.currentIndex = index;
+      this.$refs.productListRef.open(row, index);
+    },
+    changeParent(list) {
+      if (list.length > 0) {
+        this.$set(
+          this.tableList[this.currentIndex],
+          'materialName',
+          list[0].name
+        );
+        this.$set(this.tableList[this.currentIndex], 'materialId', list[0].id);
+      }
+    },
+    ownershipChange(index) {
+      this.$nextTick(()=>{
+        const data =this.$refs.deptRef.getCheckedNodes()
+        this.$set(this.tableList[index], 'ownershipName', data[0].label);
+
+      })
+    },
+    handleAddInfo() {
+      this.tableList.push({
+        dataTime: '',
+        personal: '',
+        place: '',
+        materialName: '',
+        materialId: '',
+        materialNum: '',
+        ownershipId: '',
+        ownershipName: '',
+        remark: '',
+        cost: ''
+      });
+    }
+  }
+};
+</script>
+  
+  
+  <style scoped lang="scss">
+:deep(.el-form-item) {
+  margin-bottom: 0;
+}
+.listToolbar {
+  display: flex;
+  justify-content: space-between;
+  align-items: center;
+}
+</style>
+  

+ 258 - 0
src/views/bpm/handleTask/components/marketManagem/putUpList.vue

@@ -0,0 +1,258 @@
+<template>
+  <div>
+    <el-form ref="form" >
+      <!-- 数据表格 -->
+      <ele-pro-table
+        ref="table"
+        :columns="columns"
+        :datasource="tableList"
+        :needPage="false"
+        :minHeight="100"
+        tool-class="ele-toolbar-form"
+
+        :summary-method="getSummaries"
+        show-summary
+      >
+        <!-- 表头工具栏 -->
+        <template v-slot:toolbar>
+          <el-button
+            v-if="dialogType !== 'view'"
+            size="small"
+            type="primary"
+            icon="el-icon-plus"
+            class="ele-btn-icon"
+            @click="handleAddInfo"
+          >
+            新增
+          </el-button>
+        </template>
+
+        <template v-slot:action="{ row, $index }" v-if="dialogType !== 'view'">
+          <el-popconfirm
+            class="ele-action"
+            title="确定要删除此信息吗?"
+            @confirm="handleDelInfo($index)"
+          >
+            <template v-slot:reference>
+              <el-link type="danger" :underline="false" icon="el-icon-delete">
+                删除
+              </el-link>
+            </template>
+          </el-popconfirm>
+        </template>
+        <template v-slot:dataTime="{ row, $index }" v-if="dialogType !== 'view'">
+          <el-form-item :prop="'tableList.' + $index + '.dataTime'">
+            <el-date-picker
+              v-model="row.dataTime"
+              type="date"
+              placeholder="选择日期"
+              value-format="yyyy-MM-dd"
+            >
+            </el-date-picker>
+          </el-form-item>
+        </template>
+        <template v-slot:cost="{ row, $index }" v-if="dialogType !== 'view'">
+          <el-form-item :prop="'datasource.' + $index + '.cost'">
+            <el-input type="number" v-model="row.cost"></el-input>
+          </el-form-item>
+        </template>
+        <template v-slot:personal="{ row, $index }" v-if="dialogType !== 'view'">
+          <el-form-item :prop="'datasource.' + $index + '.personal'">
+            <el-input type="number" v-model="row.personal"></el-input>
+          </el-form-item>
+        </template>
+        <template v-slot:place="{ row, $index }" v-if="dialogType !== 'view'">
+          <el-form-item :prop="'datasource.' + $index + '.place'">
+            <el-input  v-model="row.place"></el-input>
+          </el-form-item>
+        </template>
+        <template v-slot:placeType="{ row, $index }" v-if="dialogType !== 'view'">
+          <el-form-item :prop="'datasource.' + $index + '.placeType'">
+            <el-input  v-model="row.placeType"></el-input>
+          </el-form-item>
+        </template>
+        <template v-slot:placeNum="{ row, $index }" v-if="dialogType !== 'view'">
+          <el-form-item :prop="'datasource.' + $index + '.placeNum'">
+            <el-input type="number"   v-model="row.placeNum"></el-input>
+          </el-form-item>
+        </template>
+        <template v-slot:remark="{ row, $index }" v-if="dialogType !== 'view'">
+          <el-form-item :prop="'datasource.' + $index + '.remark'">
+            <el-input type="textarea" v-model="row.remark"></el-input>
+          </el-form-item>
+        </template>
+        <template v-slot:start="{ row, $index }" v-if="dialogType !== 'view'">
+          <el-form-item :prop="'tableList.' + $index + '.start'">
+            <el-date-picker
+              v-model="row.start"
+              type="datetime"
+              value-format="yyyy-MM-dd HH:mm:ss"
+              placeholder="选择"
+            >
+            </el-date-picker>
+          </el-form-item>
+        </template>
+        <template v-slot:end="{ row, $index }" v-if="dialogType !== 'view'">
+          <el-form-item :prop="'tableList.' + $index + '.end'">
+            <el-date-picker
+              v-model="row.end"
+              type="datetime"
+              value-format="yyyy-MM-dd HH:mm:ss"
+              placeholder="选择"
+            >
+            </el-date-picker>
+          </el-form-item>
+        </template>
+      </ele-pro-table>
+    </el-form>
+  </div>
+</template>
+  
+  
+  <script>
+import { getSummaries } from '@/utils/util.js';
+
+export default {
+  name: 'relatedInfoTable',
+
+  props: {
+    dialogType: ''
+  },
+  data() {
+    return {
+      tableList:[]
+    };
+  },
+  computed: {
+    columns() {
+      return [
+        {
+          columnKey: 'index',
+          label: '序号',
+          type: 'index',
+          width: 55,
+          align: 'center',
+          showOverflowTooltip: true,
+          fixed: 'left'
+        },
+        {
+          prop: 'dataTime',
+          label: '日期',
+          align: 'center',
+          showOverflowTooltip: true,
+          minWidth: 150,
+          slot: 'dataTime'
+        },
+        {
+          prop: 'personal',
+          label: '人数',
+          align: 'center',
+          showOverflowTooltip: true,
+          minWidth: 80,
+          slot: 'personal'
+        },
+        {
+          prop: 'place',
+          label: '酒店名称',
+          align: 'center',
+          showOverflowTooltip: true,
+          minWidth: 240,
+          slot: 'place'
+        },
+        {
+          prop: 'placeNum',
+          label: '房间数量',
+          align: 'center',
+          showOverflowTooltip: true,
+          minWidth: 100,
+          slot: 'placeNum'
+        },
+        {
+          prop: 'placeType',
+          label: '房型',
+          align: 'center',
+          showOverflowTooltip: true,
+          minWidth: 120,
+          slot: 'placeType'
+        },
+        {
+          prop: 'start',
+          label: '入住时间',
+          align: 'center',
+          showOverflowTooltip: true,
+          minWidth: 150,
+          slot: 'start'
+        },
+
+        {
+          prop: 'end',
+          label: '退房时间',
+          align: 'center',
+          showOverflowTooltip: true,
+          minWidth: 150,
+          slot: 'end'
+        },
+        {
+          prop: 'cost',
+          label: '预计费用',
+          align: 'center',
+          showOverflowTooltip: true,
+          minWidth: 120,
+          slot: 'cost'
+        },
+        {
+          columnKey: 'action',
+          slot: 'action',
+          label: '操作',
+          resizable: false,
+          width: 80,
+          align: 'center',
+          showOverflowTooltip: true,
+          fixed: 'right'
+        }
+      ];
+    }
+  },
+  mounted() {},
+  methods: {
+    getSummaries(param) {
+      return getSummaries(param, 'cost');
+    },
+    //删除任务信息数据
+    handleDelInfo(index) {
+      this.tableList.splice(index, 1);
+    },
+    //修改回显
+    putTableValue(data) {
+      this.tableList = data || [];
+    },
+    getTableValue() {
+      return this.tableList;
+    },
+    
+    handleAddInfo() {
+      this.tableList.push({
+        dataTime: '',
+        personal: '',
+        place: '',
+        materialName: '',
+
+        remark: '',
+        cost: '',
+        placeType: '',
+        placeNum: '',
+        start: '',
+        end: ''
+      });
+    }
+  }
+};
+</script>
+  
+  
+  <style scoped lang="scss">
+:deep(.el-form-item) {
+  margin-bottom: 0;
+}
+</style>
+  

+ 319 - 0
src/views/bpm/handleTask/components/marketManagem/souvenirList.vue

@@ -0,0 +1,319 @@
+<template>
+  <div>
+    <el-form ref="form">
+      <!-- 数据表格 -->
+      <ele-pro-table
+        ref="table"
+        :columns="columns"
+        :datasource="tableList"
+        :needPage="false"
+        :minHeight="100"
+        tool-class="ele-toolbar-form"
+        cache-key="eomContactPageTable"
+        :summary-method="getSummaries"
+        show-summary
+      >
+        <!-- 表头工具栏 -->
+        <template v-slot:toolbar>
+          <div class="listToolbar">
+            <el-button
+              v-if="dialogType !== 'view'"
+              size="small"
+              type="primary"
+              icon="el-icon-plus"
+              class="ele-btn-icon"
+              @click="handleAddInfo"
+            >
+              新增
+            </el-button>
+           
+          </div>
+        </template>
+
+        <template v-slot:action="{ row, $index }" v-if="dialogType !== 'view'">
+          <el-popconfirm
+            class="ele-action"
+            title="确定要删除此信息吗?"
+            @confirm="handleDelInfo($index)"
+          >
+            <template v-slot:reference>
+              <el-link type="danger" :underline="false" icon="el-icon-delete">
+                删除
+              </el-link>
+            </template>
+          </el-popconfirm>
+        </template>
+
+        <template v-slot:dataTime="{ row, $index }" v-if="dialogType !== 'view'">
+          <el-form-item :prop="'tableList.' + $index + '.dataTime'">
+            <el-date-picker
+              v-model="row.dataTime"
+              type="date"
+              placeholder="选择日期"
+              value-format="yyyy-MM-dd"
+
+            >
+            </el-date-picker>
+          </el-form-item>
+        </template>
+        <template v-slot:cost="{ row, $index }" v-if="dialogType !== 'view'">
+          <el-form-item :prop="'datasource.' + $index + '.cost'">
+            <el-input type="number" v-model="row.cost"></el-input>
+          </el-form-item>
+        </template>
+        <template
+          v-slot:personal="{ row, $index }"
+          v-if="dialogType !== 'view'"
+        >
+          <el-form-item :prop="'datasource.' + $index + '.personal'">
+            <el-input  v-model="row.personal"></el-input>
+          </el-form-item>
+        </template>
+        <template v-slot:place="{ row, $index }" v-if="dialogType !== 'view'">
+          <el-form-item :prop="'datasource.' + $index + '.place'">
+            <el-input v-model="row.place"></el-input>
+          </el-form-item>
+        </template>
+
+        <template
+          v-slot:materialName="{ row, $index }"
+          v-if="dialogType !== 'view'"
+        >
+          <el-form-item :prop="'datasource.' + $index + '.materialName'">
+            <el-input v-model="row.materialName">
+              <template slot="append">
+                <el-link
+                  type="primary"
+                  :underline="false"
+                  @click.native="materialOpen(row, $index)"
+                >
+                  选择</el-link
+                >
+              </template>
+            </el-input>
+          </el-form-item>
+        </template>
+        <template
+          v-slot:materialNum="{ row, $index }"
+          v-if="dialogType !== 'view'"
+        >
+          <el-form-item :prop="'datasource.' + $index + '.materialNum'">
+            <el-input type="number" v-model="row.materialNum"></el-input>
+          </el-form-item>
+        </template>
+        <template
+          v-slot:ownershipId="{ row, $index }"
+          v-if="dialogType !== 'view'"
+        >
+          <el-form-item :prop="'datasource.' + $index + '.ownershipId'">
+            <el-cascader
+              class="ele-block"
+              :options="organizationList"
+              placeholder="请选择"
+              :props="defaultProps"
+              ref="deptRef"
+              :show-all-levels="false"
+              v-model="row.ownershipId"
+              @change="ownershipChange($index)"
+              clearable
+            ></el-cascader>
+          </el-form-item>
+        </template>
+        <template v-slot:remark="{ row, $index }" v-if="dialogType !== 'view'">
+          <el-form-item :prop="'datasource.' + $index + '.remark'">
+            <el-input type="textarea" v-model="row.remark"></el-input>
+          </el-form-item>
+        </template>
+      </ele-pro-table>
+    </el-form>
+    <productList
+      :currentIndex="-1"
+      @changeParent="changeParent"
+      ref="productListRef"
+    ></productList>
+  </div>
+</template>
+  
+
+  <script>
+import { getSummaries } from '@/utils/util.js';
+import productList from '@/BIZComponents/product-list.vue';
+export default {
+  name: 'relatedInfoTable',
+
+  props: {
+    dialogType: '',
+    organizationList: {
+      type: Array,
+      default: () => {
+        return [];
+      }
+    }
+  },
+  components: { productList },
+
+  data() {
+    return {
+      tableList: [],
+      currentIndex: '',
+      defaultProps: {
+        multiple: false,
+        checkStrictly: true,
+        emitPath: false,
+        children: 'children',
+        value: 'id',
+        label: 'name'
+      }
+    };
+  },
+  computed: {
+    columns() {
+      return [
+        {
+          columnKey: 'index',
+          label: '序号',
+          type: 'index',
+          width: 55,
+          align: 'center',
+          showOverflowTooltip: true,
+          fixed: 'left'
+        },
+        {
+          prop: 'dataTime',
+          label: '日期',
+          align: 'center',
+          showOverflowTooltip: true,
+          minWidth: 150,
+          slot: 'dataTime'
+        },
+        {
+          prop: 'personal',
+          label: '领用人',
+          align: 'center',
+          showOverflowTooltip: true,
+          width: 120,
+          slot: 'personal'
+        },
+
+        {
+          prop: 'materialName',
+          label: '物料名称',
+          align: 'center',
+          showOverflowTooltip: true,
+          minWidth: 200,
+          slot: 'materialName'
+        },
+        {
+          prop: 'materialNum',
+          label: '数量',
+          align: 'center',
+          showOverflowTooltip: true,
+          width: 100,
+          slot: 'materialNum'
+        },
+        {
+          prop: 'ownershipName',
+          label: '权属单位',
+          align: 'center',
+          showOverflowTooltip: true,
+          minWidth: 200,
+          slot: 'ownershipId'
+        },
+
+        {
+          prop: 'cost',
+          label: '预计费用',
+          align: 'center',
+          showOverflowTooltip: true,
+          minWidth: 120,
+          slot: 'cost'
+        },
+        {
+          prop: 'remark',
+          label: '备注',
+          minWidth: 200,
+          align: 'center',
+          showOverflowTooltip: true,
+          slot: 'remark'
+        },
+
+        {
+          columnKey: 'action',
+          slot: 'action',
+          label: '操作',
+          resizable: false,
+          width: 80,
+          align: 'center',
+          showOverflowTooltip: true,
+          fixed: 'right'
+        }
+      ];
+    }
+  },
+  mounted() {},
+  methods: {
+    getSummaries(param) {
+      return getSummaries(param, 'cost');
+    },
+    //删除任务信息数据
+    handleDelInfo(index) {
+      this.tableList.splice(index, 1);
+    },
+    //修改回显
+    putTableValue(data) {
+      this.tableList = data || [];
+    },
+    getTableValue() {
+      return this.tableList;
+    },
+    materialOpen(row, index) {
+      this.currentIndex = index;
+      this.$refs.productListRef.open(row, index);
+    },
+    changeParent(list) {
+      if (list.length > 0) {
+        this.$set(
+          this.tableList[this.currentIndex],
+          'materialName',
+          list[0].name
+        );
+        this.$set(this.tableList[this.currentIndex], 'materialId', list[0].id);
+      }
+    },
+    ownershipChange(index) {
+      this.$nextTick(()=>{
+        const data =this.$refs.deptRef.getCheckedNodes()
+        this.$set(this.tableList[index], 'ownershipName', data[0].label);
+
+      })
+    },
+    handleAddInfo() {
+      this.tableList.push({
+        dataTime: '',
+        personal: '',
+        place: '',
+        materialName: '',
+        materialId: '',
+        materialNum: '',
+        ownershipId: '',
+        ownershipName: '',
+        remark: '',
+        cost: ''
+      });
+    }
+  }
+};
+</script>
+  
+  
+  <style scoped lang="scss">
+:deep(.el-form-item) {
+  margin-bottom: 0;
+}
+.listToolbar {
+  display: flex;
+  justify-content: space-between;
+  align-items: center;
+}
+</style>
+  

+ 146 - 0
src/views/bpm/handleTask/components/marketManagem/submit.vue

@@ -0,0 +1,146 @@
+<template>
+  <el-col :span="16" :offset="6">
+    <el-form label-width="100px" ref="formRef" :model="form">
+      <el-form-item
+        label="审批建议"
+        prop="reason"
+        style="margin-bottom: 20px"
+        :rules="{
+          required: true,
+          message: '请选择',
+          trigger: 'change'
+        }"
+      >
+        <el-input
+          type="textarea"
+          v-model="form.reason"
+          placeholder="请输入审批建议"
+        />
+      </el-form-item>
+    </el-form>
+    <div style="margin-left: 10%; margin-bottom: 20px; font-size: 14px">
+      <el-button
+        icon="el-icon-edit-outline"
+        type="success"
+        size="mini"
+        @click="handleAudit(1)"
+        >通过
+      </el-button>
+
+      <el-button
+        icon="el-icon-circle-close"
+        type="danger"
+        size="mini"
+        @click="handleAudit(0)"
+        v-if="!['starter'].includes(taskDefinitionKey)"
+        >驳回
+      </el-button>
+
+      <el-dropdown
+        @command="(command) => handleCommand(command)"
+        style="margin-left: 30px"
+      >
+        <span class="el-dropdown-link"
+          >更多<i class="el-icon-arrow-down el-icon--right"></i
+        ></span>
+        <el-dropdown-menu slot="dropdown">
+          <el-dropdown-item command="cancel">作废</el-dropdown-item>
+        </el-dropdown-menu>
+      </el-dropdown>
+    </div>
+  </el-col>
+</template>
+
+<script>
+import {approveTaskWithVariables, rejectTask} from '@/api/bpm/task';
+// 流程实例的详情页,可用于审批
+export default {
+  name: '',
+  components: {
+  },
+  props: {
+    businessId: {
+      default: ''
+    },
+    taskId: {
+      default: ''
+    },
+    id: {
+      default: ''
+    },
+    taskDefinitionKey: {
+      default: ''
+    }
+  },
+  data() {
+    return {
+      form: {
+        reason: ''
+      },
+    };
+  },
+  created() {
+
+  },
+  methods: {
+    /** 处理转办审批人 */
+    handleUpdateAssignee() {
+      this.$emit('handleUpdateAssignee');
+    },
+    /** 退回 */
+    handleBackList() {
+      this.$emit('handleBackList');
+    },
+
+    async handleAudit(status, type) {
+      this._approveTaskWithVariables(status);
+    },
+    async _approveTaskWithVariables(status) {
+      let variables = {
+        pass: !!status
+      };
+
+      let API = !!status ? approveTaskWithVariables : rejectTask;
+      API({
+        id: this.taskId,
+        reason: this.form.reason,
+        variables
+      }).then((res) => {
+        if (res.data.code != '-1') {
+          this.$emit('handleAudit', {
+            status,
+            title: status === 0 ? '驳回' : ''
+          });
+        }
+      });
+    },
+
+    //更多
+    handleCommand(command) {
+      if (command === 'cancel') {
+        this.$confirm('是否确认作废?', {
+          type: 'warning',
+          cancelButtonText: '取消',
+          confirmButtonText: '确定'
+        })
+          .then(() => {
+            cancel({
+              id: this.taskId,
+              reason: this.form.reason,
+              businessId: this.businessId
+            })
+              .then(() => {
+                this.$emit('handleClose');
+              })
+              .catch(() => {
+                this.$message.error('流程作废失败');
+              });
+          })
+          .catch(() => {});
+      }
+    }
+  }
+};
+</script>
+
+<style lang="scss"></style>

+ 477 - 0
src/views/bpm/handleTask/components/marketManagem/taskInfoTable.vue

@@ -0,0 +1,477 @@
+<template>
+  <div>
+    <el-form ref="form" :model="form">
+      <!-- 数据表格 -->
+      <ele-pro-table
+        ref="table"
+        :columns="columns"
+        :datasource="form.datasource"
+        :needPage="false"
+        :toolkit="[]"
+        :minHeight="100"
+        tool-class="ele-toolbar-form"
+        cache-key="eomContactPageTable"
+        :summary-method="getSummaries"
+        show-summary
+      >
+        <!-- 表头工具栏 -->
+        <template v-slot:toolbar>
+          <el-button
+            v-if="dialogType !== 'view'"
+            size="small"
+            type="primary"
+            icon="el-icon-plus"
+            class="ele-btn-icon"
+            @click="handleAddInfo"
+          >
+            新增
+          </el-button>
+        </template>
+
+        <template v-slot:action="{ row, $index }" v-if="dialogType !== 'view'">
+          <el-popconfirm
+            class="ele-action"
+            title="确定要删除此信息吗?"
+            @confirm="handleDelInfo($index)"
+          >
+            <template v-slot:reference>
+              <el-link type="danger" :underline="false" icon="el-icon-delete">
+                删除
+              </el-link>
+            </template>
+          </el-popconfirm>
+        </template>
+        <template
+          v-slot:trakNumber="{ row, $index }"
+          v-if="dialogType !== 'view'"
+        >
+          <el-form-item
+            :prop="'datasource.' + $index + '.trakNumber'"
+            :rules="{
+              required: true,
+              message: '请选择车辆',
+              trigger: ['blur', 'change']
+            }"
+          >
+            <el-input v-model="row.trakNumber">
+              <template slot="append">
+                <el-link
+                  type="primary"
+                  :underline="false"
+                  @click.native="handleCar(row, $index)"
+                >
+                  选择</el-link
+                >
+              </template>
+            </el-input>
+          </el-form-item>
+        </template>
+        <template
+          v-slot:driverName="{ row, $index }"
+          v-if="dialogType !== 'view'"
+        >
+          <el-form-item
+            :prop="'datasource.' + $index + '.driverName'"
+            :rules="{
+              required: false,
+              message: '请选择司机',
+              trigger: ['blur', 'change']
+            }"
+          >
+            <el-input v-model="row.driverName">
+              <template slot="append">
+                <el-link
+                  type="primary"
+                  :underline="false"
+                  @click.native="handleDriver(row, $index)"
+                >
+                  选择</el-link
+                >
+              </template>
+            </el-input>
+          </el-form-item>
+        </template>
+        <template v-slot:phone="{ row, $index }" v-if="dialogType !== 'view'">
+          <el-form-item
+            :prop="'datasource.' + $index + '.phone'"
+            :rules="{
+              required: false,
+              message: '请输入司机电话',
+              trigger: ['blur', 'change']
+            }"
+          >
+            <el-input v-model="row.phone"></el-input>
+          </el-form-item>
+        </template>
+        <template
+          v-slot:startPlace="{ row, $index }"
+          v-if="dialogType !== 'view'"
+        >
+          <el-form-item
+            :prop="'datasource.' + $index + '.startPlace'"
+            :rules="{
+              required: false,
+              message: '请输入出发地',
+              trigger: ['blur', 'change']
+            }"
+          >
+            <el-input v-model="row.startPlace"></el-input>
+          </el-form-item>
+        </template>
+        <template
+          v-slot:endPlace="{ row, $index }"
+          v-if="dialogType !== 'view'"
+        >
+          <el-form-item
+            :prop="'datasource.' + $index + '.endPlace'"
+            :rules="{
+              required: false,
+              message: '请输入目的地',
+              trigger: ['blur', 'change']
+            }"
+          >
+            <el-input v-model="row.endPlace"></el-input>
+          </el-form-item>
+        </template>
+        <template
+          v-slot:planTimeStart="{ row, $index }"
+          v-if="dialogType !== 'view'"
+        >
+          <el-form-item
+            :prop="'datasource.' + $index + '.planTimeStart'"
+            :rules="{
+              required: false,
+              message: '请选择发车时间',
+              trigger: ['blur', 'change']
+            }"
+          >
+            <el-date-picker
+              v-model="row.planTimeStart"
+              :picker-options="{
+                disabledDate: (time) => {
+                  return (
+                    row.planTimeEnd &&
+                    time.getTime() > new Date(row.planTimeEnd)
+                  );
+                }
+              }"
+              type="datetime"
+              @change="() => handleCheckCarOrDriverIsBusy(row)"
+              style="width: 90%"
+              value-format="yyyy-MM-dd HH:mm:ss"
+              placeholder="选择日期时间"
+            >
+            </el-date-picker>
+          </el-form-item>
+        </template>
+        <template
+          v-slot:planTimeEnd="{ row, $index }"
+          v-if="dialogType !== 'view'"
+        >
+          <el-form-item
+            :prop="'datasource.' + $index + '.planTimeEnd'"
+            :rules="{
+              required: false,
+              message: '请选择结束时间',
+              trigger: ['blur', 'change']
+            }"
+          >
+            <el-date-picker
+              v-model="row.planTimeEnd"
+              :picker-options="{
+                disabledDate: (time) => {
+                  return (
+                    row.planTimeStart &&
+                    time.getTime() < new Date(row.planTimeStart)
+                  );
+                }
+              }"
+              type="datetime"
+              @change="() => handleCheckCarOrDriverIsBusy(row)"
+              style="width: 90%"
+              value-format="yyyy-MM-dd HH:mm:ss"
+              placeholder="选择日期时间"
+            >
+            </el-date-picker>
+          </el-form-item>
+        </template>
+        <template v-slot:remark="{ row, $index }" v-if="dialogType !== 'view'">
+          <el-form-item :prop="'datasource.' + $index + '.remark'">
+            <el-input type="textarea" v-model="row.remark"></el-input>
+          </el-form-item>
+        </template>
+        <template v-slot:cost="{ row, $index }" v-if="dialogType !== 'view'">
+          <el-form-item :prop="'datasource.' + $index + '.cost'">
+            <el-input type="number" v-model="row.cost"></el-input>
+          </el-form-item>
+        </template>
+        
+
+        <template v-slot:headerGLLXMC="{ column }">
+          <span class="is-required">{{ column.label }}</span>
+        </template>
+      </ele-pro-table>
+    </el-form>
+
+   
+  </div>
+</template>
+
+
+<script>
+// import { checkDriverIsBusyAPI } from '@/api/transportManager/shipManage';
+
+import { getSummaries } from '@/utils/util.js';
+
+export default {
+  name: 'relatedInfoTable',
+  props: {
+
+    dialogType: {
+      type: String,
+      default: ''
+    }
+  },
+  data() {
+    return {
+      editIndex: undefined, //当前修改数据的下标
+
+      form: {
+        datasource: []
+      }
+    };
+  },
+  computed: {
+    columns() {
+      let list = [
+        {
+          columnKey: 'index',
+          label: '序号',
+          type: 'index',
+          width: 55,
+          align: 'center',
+          showOverflowTooltip: true,
+          fixed: 'left'
+        },
+        {
+          prop: 'trakNumber',
+          label: '车牌号',
+          align: 'center',
+          showOverflowTooltip: true,
+          minWidth: 160,
+          slot: 'trakNumber',
+          headerSlot: 'headerGLLXMC'
+        },
+        {
+          prop: 'startPlace',
+          label: '出发地',
+          align: 'center',
+          showOverflowTooltip: true,
+          minWidth: 120,
+          slot: 'startPlace'
+        },
+        {
+          prop: 'endPlace',
+          label: '目的地',
+          align: 'center',
+          showOverflowTooltip: true,
+          minWidth: 120,
+          slot: 'endPlace'
+        },
+        {
+          prop: 'planTimeStart',
+          label: '预计发车日期',
+          align: 'center',
+          showOverflowTooltip: true,
+          minWidth: 240,
+          slot: 'planTimeStart'
+        },
+        {
+          prop: 'planTimeEnd',
+          label: '预计结束日期',
+          align: 'center',
+          showOverflowTooltip: true,
+          minWidth: 240,
+          slot: 'planTimeEnd'
+        },
+        {
+          prop: 'driverName',
+          label: '司机',
+          align: 'center',
+          showOverflowTooltip: true,
+          minWidth: 150,
+          slot: 'driverName'
+        },
+        {
+          prop: 'phone',
+          label: '司机电话',
+          align: 'center',
+          showOverflowTooltip: true,
+          minWidth: 120,
+          slot: 'phone'
+        },
+        {
+          prop: 'cost',
+          label: '预计费用',
+          align: 'center',
+          showOverflowTooltip: true,
+          minWidth: 120,
+          slot: 'cost'
+        },
+
+        {
+          prop: 'remark',
+          label: '备注',
+          align: 'center',
+          showOverflowTooltip: true,
+          minWidth: 120,
+          slot: 'remark'
+        }
+      ];
+      let action = [
+        {
+          columnKey: 'action',
+          slot: 'action',
+          label: '操作',
+          resizable: false,
+          width: 80,
+          align: 'center',
+          showOverflowTooltip: true,
+          fixed: 'right'
+        }
+      ];
+      this.dialogType === 'view'
+        ? (list = [...list])
+        : (list = [...list, ...action]);
+      return list;
+    }
+  },
+
+  methods: {
+    getSummaries(param) {
+      return getSummaries(param,'cost')
+    },
+    //新增任务信息数据
+    handleAddInfo() {
+      this.form.datasource.push({
+        driverId: '',
+        driverName: '',
+        endPlace: '',
+        phone: '',
+        planId: '',
+        planTimeEnd: '',
+        planTimeStart: '',
+        realEntTime: '',
+        realStartTime: '',
+        remark: '',
+        startPlace: '',
+        trakId: '',
+        trakNumber: '',
+        taskId: '',
+        taskType: '1',
+        taskCode: '',
+        cost: ''
+      });
+    },
+    setSelectData(val) {
+      this.$set(this.form.datasource[this.editIndex], 'taskId', val.id);
+      this.$set(this.form.datasource[this.editIndex], 'taskCode', val.code);
+    },
+    //删除任务信息数据
+    handleDelInfo(index) {
+      this.form.datasource.splice(index, 1);
+    },
+    //修改任务类型
+    handleChangeFinLink(val, row, index) {
+      this.editIndex = index;
+      this.setSelectData({
+        id: '',
+        code: ''
+      });
+      this.$nextTick(() => {
+        this.$refs.form.clearValidate('datasource.' + index + '.taskCode');
+      });
+    },
+    //选择司机
+    handleDriver(row, index) {
+      this.editIndex = index;
+      this.selectDriverDialogFlag = true;
+    },
+    //选择司机回调
+    getDriverInfo(row) {
+      this.$set(this.form.datasource[this.editIndex], 'driverId', row.driverId);
+      this.$set(
+        this.form.datasource[this.editIndex],
+        'driverName',
+        row.driverName
+      );
+      this.$set(this.form.datasource[this.editIndex], 'phone', row.phone);
+
+      this.handleCheckCarOrDriverIsBusy(this.form.datasource[this.editIndex]);
+    },
+    //选择车辆
+    handleCar(row, index) {
+      this.editIndex = index;
+      this.selectCarDialogFlag = true;
+    },
+    //选择车辆回调
+    getCarInfo(row) {
+      this.$set(
+        this.form.datasource[this.editIndex],
+        'driverId',
+        row.defaultDriverId
+      );
+      this.$set(
+        this.form.datasource[this.editIndex],
+        'driverName',
+        row.defaultDriver
+      );
+      this.$set(this.form.datasource[this.editIndex], 'phone', row.phone);
+      this.$set(
+        this.form.datasource[this.editIndex],
+        'trakNumber',
+        row.trakNumber
+      );
+      this.$set(this.form.datasource[this.editIndex], 'trakId', row.id);
+
+      this.handleCheckCarOrDriverIsBusy(this.form.datasource[this.editIndex]);
+    },
+    //检查车辆或司机是否在运输中
+    async handleCheckCarOrDriverIsBusy(row) {
+      return;
+      if (
+        (row.driverName || row.trakNumber) &&
+        row.planTimeStart &&
+        row.planTimeEnd
+      ) {
+        let data = await checkDriverIsBusyAPI(row);
+        console.log(data);
+        if (data.code == 1) {
+          this.$message.warning(data.message);
+        }
+      }
+    },
+    //修改回显
+    putTableValue(data) {
+      if (data) {
+        this.form.datasource = data;
+      }
+    },
+    getTableValue() {
+      return this.form.datasource;
+    },
+    getTableValidate(callback) {
+      this.$refs.form.validate((valid) => {
+        callback(valid);
+      });
+    }
+  }
+};
+</script>
+
+
+<style scoped lang="scss">
+:deep(.el-form-item) {
+  margin-bottom: 0;
+}
+</style>

+ 275 - 0
src/views/bpm/handleTask/components/marketManagem/view.vue

@@ -0,0 +1,275 @@
+<template>
+
+
+    <el-form
+      ref="form"
+      class="el-form-box"
+      :model="form"
+      label-width="0"
+    >
+      <el-row :gutter="15">
+        <el-descriptions title="基本信息" :column="4">
+          <el-descriptions-item label="编码">
+            {{ form.code }}
+          </el-descriptions-item>
+          <el-descriptions-item label="类型">
+            {{ form.code }}
+          </el-descriptions-item>
+          <el-descriptions-item label="主题">{{
+            form.name
+          }}</el-descriptions-item>
+
+          <el-descriptions-item label="发起人">
+            {{ form.promoterName }}
+          </el-descriptions-item>
+        </el-descriptions>
+        <el-descriptions title="来访信息" :column="4">
+          <el-descriptions-item label="来访单位">
+            {{ form.visitingUnitsName }}
+          </el-descriptions-item>
+
+          <el-descriptions-item label="人数">
+            {{ form.numberOfVisitors }}
+          </el-descriptions-item>
+          <el-descriptions-item label="负责人">
+            {{ form.commanderName }}
+          </el-descriptions-item>
+          <el-descriptions-item label="职位">
+            {{ form.positionName }}
+          </el-descriptions-item>
+          <el-descriptions-item label="联系方式">
+            {{ form.phone }}
+          </el-descriptions-item>
+          <el-descriptions-item label="时间">
+            {{ form.start }}
+            <span style="margin-left: 15px" v-if="TimeArr.length > 1">
+              {{ getTimeArr }} 天
+            </span>
+          </el-descriptions-item>
+        </el-descriptions>
+
+        <el-descriptions title="接待人信息" :column="4">
+          <el-descriptions-item label="接待部门">
+            {{ form.receptionDepartmentName }}
+          </el-descriptions-item>
+          <el-descriptions-item label="接待人">
+            {{ form.receptionUserName }}
+          </el-descriptions-item>
+          <el-descriptions-item label="费用归属人">
+            {{ form.costOwnerName }}
+          </el-descriptions-item>
+          <el-descriptions-item label="欢迎标语">
+            {{ form.welcomeSign }}
+          </el-descriptions-item>
+          <el-descriptions-item label="接待流程">
+            {{ form.remark }}
+          </el-descriptions-item>
+        </el-descriptions>
+      </el-row>
+      <el-row
+        :gutter="15"
+        style="margin-top: 20px"
+        v-if="form.receptionProjectList.length > 0"
+      >
+        <el-col :span="24">
+          <el-tabs
+            v-model="activeName"
+            type="border-card"
+            style="height: calc(100% - 124px); width: 100%"
+          >
+            <el-tab-pane
+              v-for="item in form.receptionProjectList"
+              :label="item.name"
+              :name="item.refKey"
+              :key="item.refKey"
+            >
+              <taskInfoTable
+                :dialogType="'view'"
+                ref="taskInfoTableRef"
+                v-if="item.name == '用车'"
+                :key="'用车'"
+              ></taskInfoTable>
+              <mealList
+                ref="mealListRef"
+                :dialogType="'view'"
+                v-if="item.name == '用餐'"
+                :organizationList="organizationList"
+              ></mealList>
+              <putUpList
+                :dialogType="'view'"
+                ref="putUpRef"
+                v-if="item.name == '住宿'"
+              ></putUpList>
+              <souvenirList
+                :dialogType="'view'"
+                ref="souvenirListRef"
+                v-if="item.name == '纪念品'"
+                :organizationList="organizationList"
+              ></souvenirList>
+              <conferenceList
+                :dialogType="'view'"
+                ref="conferenceListRef"
+                v-if="item.name == '会议'"
+                :organizationList="organizationList"
+              ></conferenceList>
+              <companyList
+                :dialogType="'view'"
+                ref="companyListRef"
+                v-if="item.name == '公司参观'"
+                :organizationList="organizationList"
+              ></companyList>
+              <visitList
+                :dialogType="'view'"
+                ref="visitListRef"
+                v-if="item.name == '景点游览'"
+                :organizationList="organizationList"
+              ></visitList>
+            </el-tab-pane>
+          </el-tabs>
+        </el-col>
+      </el-row>
+    </el-form>
+
+</template>
+<script>
+const defForm = {
+  name: '', //名称
+  type: '', //类型
+  state: '', //状态
+  promoterId: '', //发起人id
+  promoterName: '', //发起人名称
+  visitingUnits: '', //来访单位id
+  visitingUnitsName: '', //来访单位名称
+  numberOfVisitors: '', //来访人数
+  commanderId: '', //负责人id
+  commanderName: '', //负责人名称
+  positionId: '', //职位id
+  positionName: '', //职位名称
+  phone: '', //电话
+  start: '', //开始时间
+  end: '', //结束
+  receptionDepartmentId: [], //接待部门id
+  receptionDepartmentName: '', //接待部门名称
+  receptionUserId: [], //接待人id
+  receptionUserName: '', //接待人名称
+  costOwnerId: '', //费用归属人id
+  costOwnerName: '', //归属人名称
+  welcomeSign: '', //欢迎标语
+  receptionProjectList: [] //接待项目
+};
+import { getById } from '@/api/bpm/components/marketManagem/index';
+
+
+import dictMixins from '@/mixins/dictMixins';
+
+//车
+import taskInfoTable from './taskInfoTable.vue';
+//用餐
+import mealList from './mealList.vue';
+//纪念品
+import souvenirList from './souvenirList.vue';
+//会议
+import conferenceList from './conferenceList.vue';
+//参观
+import companyList from './companyList.vue';
+//游览
+import visitList from './visitList.vue';
+//住宿
+import putUpList from './putUpList.vue';
+export default {
+  components: {
+    taskInfoTable,
+    mealList,
+    souvenirList,
+    conferenceList,
+    companyList,
+    putUpList,
+    visitList
+  },
+  props: {
+    businessId: {
+      default: ''
+    }
+  },
+  mixins: [dictMixins],
+  computed: {
+    getTimeArr() {
+      let [start, end] = this.TimeArr;
+      return (
+        Math.ceil(
+          (new Date(end).getTime() - new Date(start).getTime()) /
+            1000 /
+            60 /
+            60 /
+            24
+        ) || ''
+      );
+    }
+  },
+  data() {
+    return {
+      checkList: [],
+      TimeArr: [],
+      activeName: '',
+      organizationList: [],
+      form: { ...defForm },
+
+    };
+  },
+  mounted() {},
+  created() {
+    this.init()
+  },
+  methods: {
+    //初始化
+    async init() {
+      this.addOrEditDialogFlag = true;
+
+      this.form = await getById(this.businessId);
+      this.$nextTick(() => {
+        this.form.receptionProjectList.forEach((item) => {
+          if (
+            this.$refs[item.refKey] &&
+            this.$refs[item.refKey][0].putTableValue
+          ) {
+            this.$refs[item.refKey][0].putTableValue(item.tableList);
+          }
+          this.checkList.push(item.refKey);
+        });
+        this.activeName = this.checkList[0];
+        if (this.form.start && this.form.end) {
+          this.TimeArr = [this.form.start, this.form.end];
+        }
+      });
+    }
+  }
+};
+</script>
+<style scoped lang="scss">
+:deep(.el-input__inner) {
+  border: none;
+}
+:deep(.el-input-group__append) {
+  border-left: 1px solid var(--border-color-base);
+}
+:deep(.el-descriptions--medium.is-bordered .el-descriptions-item__cell) {
+  padding: 2px;
+}
+:deep(.el-descriptions-item__label) {
+  color: #333;
+  text-align: center !important;
+}
+:deep(.el-form-box .el-form-item) {
+  margin-bottom: 0 !important;
+}
+:deep(.el-descriptions__header) {
+  margin-top: 10px;
+  margin-bottom: 10px;
+}
+:deep(.el-textarea__inner) {
+  border: none;
+}
+:deep(.el-descriptions__title) {
+  color: #1890ff;
+}
+</style>

+ 324 - 0
src/views/bpm/handleTask/components/marketManagem/visitList.vue

@@ -0,0 +1,324 @@
+<template>
+  <div>
+    <el-form ref="form">
+      <!-- 数据表格 -->
+      <ele-pro-table
+        ref="table"
+        :columns="columns"
+        :datasource="tableList"
+        :needPage="false"
+        :minHeight="100"
+        tool-class="ele-toolbar-form"
+        cache-key="eomContactPageTable"
+        :summary-method="getSummaries"
+        show-summary
+      >
+        <!-- 表头工具栏 -->
+        <template v-slot:toolbar>
+          <div class="listToolbar">
+            <el-button
+              v-if="dialogType !== 'view'"
+              size="small"
+              type="primary"
+              icon="el-icon-plus"
+              class="ele-btn-icon"
+              @click="handleAddInfo"
+            >
+              新增
+            </el-button>
+           
+          </div>
+        </template>
+
+        <template v-slot:action="{ row, $index }" v-if="dialogType !== 'view'">
+          <el-popconfirm
+            class="ele-action"
+            title="确定要删除此信息吗?"
+            @confirm="handleDelInfo($index)"
+          >
+            <template v-slot:reference>
+              <el-link type="danger" :underline="false" icon="el-icon-delete">
+                删除
+              </el-link>
+            </template>
+          </el-popconfirm>
+        </template>
+
+        <template v-slot:dataTime="{ row, $index }" v-if="dialogType !== 'view'">
+          <el-form-item :prop="'tableList.' + $index + '.dataTime'">
+            <el-date-picker
+              v-model="row.dataTime"
+              type="date"
+              placeholder="选择日期"
+            >
+            </el-date-picker>
+          </el-form-item>
+        </template>
+        <template v-slot:cost="{ row, $index }" v-if="dialogType !== 'view'">
+          <el-form-item :prop="'datasource.' + $index + '.cost'">
+            <el-input type="number" v-model="row.cost"></el-input>
+          </el-form-item>
+        </template>
+        <template
+          v-slot:personal="{ row, $index }"
+          v-if="dialogType !== 'view'"
+        >
+          <el-form-item :prop="'datasource.' + $index + '.personal'">
+            <el-input type="number" v-model="row.personal"></el-input>
+          </el-form-item>
+        </template>
+        <template v-slot:place="{ row, $index }" v-if="dialogType !== 'view'">
+          <el-form-item :prop="'datasource.' + $index + '.place'">
+            <el-input v-model="row.place"></el-input>
+          </el-form-item>
+        </template>
+
+        <template
+          v-slot:materialName="{ row, $index }"
+          v-if="dialogType !== 'view'"
+        >
+          <el-form-item :prop="'datasource.' + $index + '.materialName'">
+            <el-input v-model="row.materialName">
+              <template slot="append">
+                <el-link
+                  type="primary"
+                  :underline="false"
+                  @click.native="materialOpen(row, $index)"
+                >
+                  选择</el-link
+                >
+              </template>
+            </el-input>
+          </el-form-item>
+        </template>
+        <template
+          v-slot:materialNum="{ row, $index }"
+          v-if="dialogType !== 'view'"
+        >
+          <el-form-item :prop="'datasource.' + $index + '.materialNum'">
+            <el-input type="number" v-model="row.materialNum"></el-input>
+          </el-form-item>
+        </template>
+        <template
+          v-slot:ownershipId="{ row, $index }"
+          v-if="dialogType !== 'view'"
+        >
+          <el-form-item :prop="'datasource.' + $index + '.ownershipId'">
+            <el-cascader
+              class="ele-block"
+              :options="organizationList"
+              placeholder="请选择"
+              :props="defaultProps"
+              ref="deptRef"
+              :show-all-levels="false"
+              v-model="row.ownershipId"
+              @change="ownershipChange($index)"
+              clearable
+            ></el-cascader>
+          </el-form-item>
+        </template>
+        <template v-slot:remark="{ row, $index }" v-if="dialogType !== 'view'">
+          <el-form-item :prop="'datasource.' + $index + '.remark'">
+            <el-input type="textarea" v-model="row.remark"></el-input>
+          </el-form-item>
+        </template>
+      </ele-pro-table>
+    </el-form>
+    <productList
+      :currentIndex="-1"
+      @changeParent="changeParent"
+      ref="productListRef"
+    ></productList>
+  </div>
+</template>
+  
+
+  <script>
+import { getSummaries } from '@/utils/util.js';
+import productList from '@/BIZComponents/product-list.vue';
+export default {
+  name: 'relatedInfoTable',
+
+  props: {
+    dialogType: '',
+    organizationList: {
+      type: Array,
+      default: () => {
+        return [];
+      }
+    }
+  },
+  components: { productList },
+
+  data() {
+    return {
+      tableList: [],
+      currentIndex: '',
+      defaultProps: {
+        multiple: false,
+        checkStrictly: true,
+        emitPath: false,
+        children: 'children',
+        value: 'id',
+        label: 'name'
+      }
+    };
+  },
+  computed: {
+    columns() {
+      return [
+        {
+          columnKey: 'index',
+          label: '序号',
+          type: 'index',
+          width: 55,
+          align: 'center',
+          showOverflowTooltip: true,
+          fixed: 'left'
+        },
+        {
+          prop: 'dataTime',
+          label: '日期',
+          align: 'center',
+          showOverflowTooltip: true,
+          minWidth: 150,
+          slot: 'dataTime'
+        },
+        {
+          prop: 'personal',
+          label: '人数',
+          align: 'center',
+          showOverflowTooltip: true,
+          width: 80,
+          slot: 'personal'
+        },
+        {
+          prop: 'place',
+          label: '地点',
+          align: 'center',
+          showOverflowTooltip: true,
+          minWidth: 220,
+          slot: 'place'
+        },
+        {
+          prop: 'materialName',
+          label: '物料名称',
+          align: 'center',
+          showOverflowTooltip: true,
+          minWidth: 200,
+          slot: 'materialName'
+        },
+        {
+          prop: 'materialNum',
+          label: '数量',
+          align: 'center',
+          showOverflowTooltip: true,
+          width: 100,
+          slot: 'materialNum'
+        },
+        {
+          prop: 'ownershipId',
+          label: '权属单位',
+          align: 'center',
+          showOverflowTooltip: true,
+          minWidth: 200,
+          slot: 'ownershipId'
+        },
+
+        {
+          prop: 'cost',
+          label: '预计费用',
+          align: 'center',
+          showOverflowTooltip: true,
+          minWidth: 120,
+          slot: 'cost'
+        },
+        {
+          prop: 'remark',
+          label: '备注',
+          minWidth: 200,
+          align: 'center',
+          showOverflowTooltip: true,
+          slot: 'remark'
+        },
+
+        {
+          columnKey: 'action',
+          slot: 'action',
+          label: '操作',
+          resizable: false,
+          width: 80,
+          align: 'center',
+          showOverflowTooltip: true,
+          fixed: 'right'
+        }
+      ];
+    }
+  },
+  mounted() {},
+  methods: {
+    getSummaries(param) {
+      return getSummaries(param, 'cost');
+    },
+    //删除任务信息数据
+    handleDelInfo(index) {
+      this.tableList.splice(index, 1);
+    },
+    //修改回显
+    putTableValue(data) {
+      this.tableList = data || [];
+    },
+    getTableValue() {
+      return this.tableList;
+    },
+    materialOpen(row, index) {
+      this.currentIndex = index;
+      this.$refs.productListRef.open(row, index);
+    },
+    changeParent(list) {
+      if (list.length > 0) {
+        this.$set(
+          this.tableList[this.currentIndex],
+          'materialName',
+          list[0].name
+        );
+        this.$set(this.tableList[this.currentIndex], 'materialId', list[0].id);
+      }
+    },
+    ownershipChange(index) {
+      this.$nextTick(()=>{
+        const data =this.$refs.deptRef.getCheckedNodes()
+        this.$set(this.tableList[index], 'ownershipName', data[0].label);
+
+      })
+    },
+    handleAddInfo() {
+      this.tableList.push({
+        dataTime: '',
+        personal: '',
+        place: '',
+        materialName: '',
+        materialId: '',
+        materialNum: '',
+        ownershipId: '',
+        ownershipName: '',
+        remark: '',
+        cost: ''
+      });
+    }
+  }
+};
+</script>
+  
+  
+  <style scoped lang="scss">
+:deep(.el-form-item) {
+  margin-bottom: 0;
+}
+.listToolbar {
+  display: flex;
+  justify-content: space-between;
+  align-items: center;
+}
+</style>
+