2213980799@qq.com hai 1 ano
pai
achega
ce0bad7fe0

+ 42 - 0
src/api/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 - 1
src/enum/dict.js

@@ -54,7 +54,8 @@ export default {
   项目状态: 'pro_projects_status',
   项目类型: 'pro_projects_type',
   预算单位: 'pro_projects_budget_unit',
-
+  市场活动类型: 'activity_type',
+  
 };
 
 export const numberList = [

+ 31 - 0
src/utils/util.js

@@ -46,3 +46,34 @@ 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;
+}

+ 620 - 0
src/views/marketManagem/components/addOrEditDialog.vue

@@ -0,0 +1,620 @@
+<template>
+  <ele-modal
+    custom-class="ele-dialog-form long-dialog-form"
+    :centered="true"
+    :visible.sync="addOrEditDialogFlag"
+    :title="title"
+    :append-to-body="false"
+    :close-on-click-modal="false"
+    width="70%"
+    :before-close="cancel"
+    :fullscreen="fullscreen"
+  >
+    <template slot="title">
+      <modalTitle
+        :title="title"
+        @setFullscreen="fullscreen = !fullscreen"
+      ></modalTitle>
+    </template>
+    <el-form
+      ref="form"
+      :rules="rules"
+      class="el-form-box"
+      :model="form"
+      label-width="0"
+    >
+      <el-row :gutter="15">
+        <el-descriptions title="基本信息" :column="4" border>
+          <el-descriptions-item label="编码">
+            <el-input v-model="form.code" disabled></el-input
+          ></el-descriptions-item>
+          <el-descriptions-item label="类型">
+            <el-form-item prop="type">
+              <!-- <el-input
+                v-model="form.type"
+                placeholder="请选择"
+              ></el-input> -->
+              <DictSelection
+                dictName="市场活动类型"
+                clearable
+                v-model="form.type"
+              >
+              </DictSelection> </el-form-item
+          ></el-descriptions-item>
+          <el-descriptions-item label="主题"
+            ><el-form-item prop="name">
+              <el-input
+                v-model="form.name"
+                placeholder="请输入"
+              ></el-input> </el-form-item
+          ></el-descriptions-item>
+
+          <el-descriptions-item label="发起人">
+            <el-form-item prop="type">
+              <el-input
+                v-model="form.promoterName"
+                @click.native="userListOpen('promoterName')"
+                placeholder="请选择"
+              ></el-input>
+            </el-form-item>
+          </el-descriptions-item>
+        </el-descriptions>
+        <el-descriptions title="来访信息" :column="4" border>
+          <el-descriptions-item label="来访单位">
+            <el-form-item prop="visitingUnitsName">
+              <el-input
+                v-model="form.visitingUnitsName"
+                :disabled="!!form.visitingUnits"
+              >
+                <template slot="append">
+                  <el-link
+                    type="primary"
+                    :underline="false"
+                    @click.native="contactOpen"
+                  >
+                    选择</el-link
+                  >
+                </template>
+              </el-input>
+            </el-form-item>
+          </el-descriptions-item>
+
+          <el-descriptions-item label="人数">
+            <el-form-item prop="numberOfVisitors">
+              <el-input
+                v-model="form.numberOfVisitors"
+                type="number"
+                placeholder="请输入"
+              ></el-input></el-form-item
+          ></el-descriptions-item>
+          <el-descriptions-item label="负责人">
+            <el-form-item prop="commanderName">
+              <el-autocomplete
+                class="inline-input"
+                v-model="form.commanderName"
+                :fetch-suggestions="getLinkList"
+                placeholder="请输入"
+                @select="linkListClick"
+              ></el-autocomplete>
+              <!-- <el-select
+                v-model="form.commanderName"
+                placeholder="请选择"
+                style="width: 100%"
+              >
+                <el-option
+                  v-for="item in linkList"
+                  :key="item.linkName"
+                  :label="item.linkName"
+                  :value="item.linkName"
+                  @click="linkListClick(item)"
+                >
+                </el-option>
+              </el-select> -->
+            </el-form-item>
+          </el-descriptions-item>
+          <el-descriptions-item label="职位">
+            <el-form-item prop="positionName">
+              <el-input
+                v-model="form.positionName"
+                placeholder="请输入"
+              ></el-input>
+            </el-form-item>
+          </el-descriptions-item>
+          <el-descriptions-item label="联系方式">
+            <el-form-item prop="phone">
+              <el-input v-model="form.phone" placeholder="请输入"></el-input>
+            </el-form-item>
+          </el-descriptions-item>
+          <el-descriptions-item label="时间">
+            <el-form-item prop="TimeArr">
+              <el-date-picker
+                v-model="TimeArr"
+                type="datetimerange"
+                align="right"
+                start-placeholder="开始日期"
+                end-placeholder="结束日期"
+                :default-time="['9:00:00', '12:00:00']"
+                value-format="yyyy-MM-dd HH:mm:ss"
+              >
+              </el-date-picker> 
+              <span v-if="TimeArr.length>1">
+                 {{ getTimeArr }}  天
+              </span>
+              </el-form-item
+          ></el-descriptions-item>
+        </el-descriptions>
+        <el-descriptions title="接待项目" :column="4" border>
+          <el-descriptions-item label="项目类别">
+            <el-form-item prop="checkList">
+              <el-checkbox-group
+                v-model="checkList"
+                @change="changeCheckList"
+                style="margin-left: 10px"
+              >
+                <el-checkbox
+                  :label="item.refKey"
+                  v-for="item in checkboxGroup"
+                  :key="item.name"
+                  >{{ item.name }}</el-checkbox
+                >
+              </el-checkbox-group>
+            </el-form-item>
+          </el-descriptions-item>
+        </el-descriptions>
+        <el-descriptions title="接待人信息" :column="4" border>
+          <el-descriptions-item label="接待部门">
+            <el-form-item prop="receptionDepartmentId">
+              <el-cascader
+                class="ele-block"
+                :options="organizationList"
+                placeholder="请选择接待部门"
+                :props="defaultProps"
+                ref="deptRef"
+                :show-all-levels="false"
+                v-model="form.receptionDepartmentId"
+                @change="receptionDepartmentIdChange"
+                clearable
+              ></el-cascader>
+            </el-form-item>
+          </el-descriptions-item>
+          <el-descriptions-item label="接待人">
+            <el-form-item prop="receptionUserName">
+              <el-input
+                v-model="form.receptionUserName"
+                @click.native="receptionUserOpen"
+                placeholder="请选择"
+              ></el-input>
+            </el-form-item>
+          </el-descriptions-item>
+          <el-descriptions-item label="费用归属人">
+            <el-form-item prop="costOwnerName">
+              <el-input
+                v-model="form.costOwnerName"
+                @click.native="userListOpen('costOwnerId')"
+                placeholder="请选择"
+              ></el-input>
+            </el-form-item>
+          </el-descriptions-item>
+          <el-descriptions-item label="欢迎标语">
+            <el-form-item prop="welcomeSign">
+              <el-input
+                v-model="form.welcomeSign"
+                placeholder="请输入"
+              ></el-input>
+            </el-form-item>
+          </el-descriptions-item>
+          <el-descriptions-item label="接待流程">
+            <el-form-item prop="remark">
+              <el-input type="textarea" v-model="form.remark"></el-input>
+            </el-form-item>
+          </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
+                ref="taskInfoTableRef"
+                v-if="item.name == '用车'"
+                :key="'用车'"
+              ></taskInfoTable>
+              <mealList
+                ref="mealListRef"
+                v-if="item.name == '用餐'"
+                :organizationList="organizationList"
+              ></mealList>
+              <putUpList ref="putUpRef" v-if="item.name == '住宿'"></putUpList>
+              <souvenirList
+                ref="souvenirListRef"
+                v-if="item.name == '纪念品'"
+                :organizationList="organizationList"
+              ></souvenirList>
+              <conferenceList
+                ref="conferenceListRef"
+                v-if="item.name == '会议'"
+                :organizationList="organizationList"
+
+              ></conferenceList>
+              <companyList
+                ref="companyListRef"
+                v-if="item.name == '公司参观'"
+                :organizationList="organizationList"
+
+              ></companyList>
+              <visitList
+                ref="visitListRef"
+                v-if="item.name == '景点游览'"
+                :organizationList="organizationList"
+              ></visitList>
+            </el-tab-pane>
+          </el-tabs>
+        </el-col>
+      </el-row>
+    </el-form>
+    <div slot="footer">
+      <el-button type="primary" @click="save()">保存</el-button>
+      <el-button @click="cancel">返回</el-button>
+    </div>
+    <UserList ref="userListRef" @success="userListSuccess"></UserList>
+    <contact ref="contactRef" @changeParent="contactChange"></contact>
+    <staffSelection
+      ref="staffSelectionRef"
+      @confirm="staffSelectionbk"
+    ></staffSelection>
+  </ele-modal>
+</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 { listOrganizations } from '@/api/system/organization';
+import { save, getById } from '@/api/marketManagem/index';
+import { mapGetters } from 'vuex';
+
+import modalTitle from '@/BIZComponents/modalTitle.vue';
+import { contactDetail } from '@/api/saleManage/contact';
+
+import deptSelect from '@/components/CommomSelect/dept-select.vue';
+import staffSelection from './staffSelection.vue';
+
+import dictMixins from '@/mixins/dictMixins';
+import UserList from './userList.vue';
+//客户
+import contact from '@/views/saleManage/contact/components/parentList.vue';
+//车
+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: {
+    deptSelect,
+    UserList,
+    contact,
+    taskInfoTable,
+    mealList,
+    souvenirList,
+    conferenceList,
+    companyList,
+    modalTitle,
+    putUpList,
+    visitList,
+    staffSelection
+  },
+  mixins: [dictMixins],
+  computed: {
+    ...mapGetters(['user']),
+    getTimeArr(){
+      let [start,end]=this.TimeArr
+      return Math.ceil((new Date(end).getTime()-new Date(start).getTime())/1000/60/60/24)||''
+    }
+  },
+  data() {
+    return {
+      dialogType: '',
+      fullscreen: false,
+      title: '',
+      checkList: [],
+      TimeArr: [],
+      addOrEditDialogFlag: false,
+      activeName: '',
+      organizationList: [],
+      form: { ...defForm },
+      linkList: [],
+      checkboxGroup: [
+        {
+          refKey: 'taskInfoTableRef',
+          name: '用车'
+        },
+        {
+          refKey: 'mealListRef',
+          name: '用餐'
+        },
+        {
+          refKey: 'putUpRef',
+          name: '住宿'
+        },
+        {
+          refKey: 'souvenirListRef',
+          name: '纪念品'
+        },
+        {
+          refKey: 'conferenceListRef',
+          name: '会议'
+        },
+        {
+          refKey: 'companyListRef',
+          name: '公司参观'
+        },
+        {
+          refKey: 'visitListRef',
+          name: '景点游览'
+        }
+      ],
+      defaultProps: {
+        multiple: true,
+        checkStrictly: true,
+        emitPath: false,
+        children: 'children',
+        value: 'id',
+        label: 'name'
+      },
+      rules: {}
+    };
+  },
+  mounted() {},
+  created() {
+    this.getListOrganizations();
+  },
+  methods: {
+    //初始化
+    async open(row = {}, type) {
+      this.addOrEditDialogFlag = true;
+      this.title = type == 'add' ? '新增' : '修改';
+      this.dialogType = type;
+      if (type !== 'add') {
+        this.form = await getById(row.id);
+        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];
+          }
+          
+        });
+      } else {
+        this.form.promoterName = this.user.info.name;
+        this.form.promoterId = this.user.info.id;
+      }
+    },
+    async save() {
+      try {
+        await this.getValidate();
+        // 表单验证通过,执行保存操作
+        this.loading = true;
+        await this.$nextTick(() => {
+          this.form.receptionProjectList = this.form.receptionProjectList.map(
+            (item) => {
+              if (
+                this.$refs[item.refKey] &&
+                this.$refs[item.refKey][0].getTableValue
+              ) {
+                item.tableList = this.$refs[item.refKey][0].getTableValue();
+              }
+              return item;
+            }
+          );
+        });
+        this.form.start = this.TimeArr[0];
+        this.form.end = this.TimeArr[1];
+
+        // return;
+        save(this.form)
+          .then((res) => {
+            this.loading = false;
+            this.$message.success('操作成功');
+            this.cancel();
+            this.$emit('done');
+          })
+          .catch((e) => {
+            //this.loading = false;
+          });
+      } catch (error) {
+        console.log(error);
+        // 表单验证未通过,不执行保存操作
+      }
+    },
+    getValidate() {
+      return Promise.all([
+        new Promise((resolve, reject) => {
+          this.$refs.form.validate((valid) => {
+            if (!valid) {
+              reject(false);
+            } else {
+              resolve(true);
+            }
+          });
+        })
+      ]);
+    },
+    getListOrganizations() {
+      listOrganizations().then((list) => {
+        let _list = list.filter((i) => i.name != '超级管理员');
+
+        this.organizationList = this.$util.toTreeData({
+          data: _list,
+          idField: 'id',
+          parentIdField: 'parentId'
+        });
+      });
+    },
+    receptionUserOpen() {
+      this.$refs.staffSelectionRef.open(this.form.receptionUserId);
+    },
+    staffSelectionbk(data) {
+      this.form.receptionUserId = data;
+      this.form.receptionUserName = data.map((item) => item.name).toString();
+      // console.log(data,'data')
+    },
+    changeCheckList() {
+      this.activeName = this.checkList[0];
+      this.form.receptionProjectList = this.checkboxGroup.filter((item) =>
+        this.checkList.includes(item.refKey)
+      );
+    },
+    userListOpen(key) {
+      this.$refs.userListRef.open(key);
+    },
+    userListSuccess({ data, key }) {
+      if (key == 'promoterName') {
+        this.form.promoterName = data?.name;
+        this.form.promoterId = data?.id;
+      }
+
+      if (key == 'costOwnerId') {
+        this.form.costOwnerName = data?.name;
+        this.form.costOwnerId = data?.id;
+      }
+    },
+    contactOpen() {
+      this.$refs.contactRef.open();
+    },
+    //客户回调
+    async contactChange(data) {
+      this.form.visitingUnits = data?.id;
+      this.form.visitingUnitsName = data?.name;
+    },
+
+    async getLinkList(linkName, cb) {
+      if (!this.form.visitingUnits) {
+        cb([]);
+        return;
+      }
+      const res = await contactDetail(this.form.visitingUnits);
+      cb(
+        res.linkList.map((item) => {
+          return {
+            value: item.linkName,
+            commanderId: item.id,
+            phone: item.mobilePhone,
+            positionName: item.post
+          };
+        })
+      );
+    },
+    linkListClick({ commanderId, phone, positionName }) {
+      this.form.commanderId = commanderId;
+      this.form.phone = phone;
+      this.form.positionName = positionName;
+    },
+    receptionDepartmentIdChange(){
+      this.$nextTick(()=>{
+        const data =this.$refs.deptRef.getCheckedNodes()
+        console.log(data,'data')
+        this.form.receptionDepartmentName=data.map(item=>item.label).toString()
+
+      })
+    },
+   
+    //关闭弹窗
+    cancel() {
+      this.addOrEditDialogFlag = false;
+      this.checkList = [];
+      this.TimeArr=[]
+      this.form = {
+        ...defForm
+      };
+    }
+  }
+};
+</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) {
+  width: 130px;
+  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;
+}
+:deep(.el-descriptions-item__content) {
+  width: 285px;
+}
+:deep(.el-descriptions) {
+  td:nth-of-type(1) {
+    width: 400px;
+  }
+}
+</style>

+ 326 - 0
src/views/marketManagem/components/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/marketManagem/components/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/marketManagem/components/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/marketManagem/components/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>
+  

+ 117 - 0
src/views/marketManagem/components/searchTable.vue

@@ -0,0 +1,117 @@
+<!-- 搜索表单 -->
+<template>
+  <el-form
+    label-width="100px"
+    class="ele-form-search"
+    @keyup.enter.native="search"
+    @submit.native.prevent
+  >
+    <el-row :gutter="15">
+      <!-- <el-col v-bind="styleResponsive ? { lg: 6, md: 12 } : { span: 6 }">
+        <el-form-item label="编码:" prop="code">
+          <el-input
+            clearable
+            placeholder="请输入"
+            v-model.trim="params.code"
+          ></el-input>
+        </el-form-item>
+      </el-col> -->
+      <el-col v-bind="styleResponsive ? { lg: 4, md: 12 } : { span: 4 }">
+        <el-form-item label="类型" prop="type">
+          <DictSelection
+            dictName="市场活动类型"
+            clearable
+            v-model="params.type"
+          >
+          </DictSelection>
+        </el-form-item>
+      </el-col>
+      <el-col v-bind="styleResponsive ? { lg: 6, md: 12 } : { span: 6 }">
+        <el-form-item label="主题" prop="name">
+          <el-input
+            clearable
+            placeholder="请输入"
+            v-model.trim="params.name"
+          ></el-input>
+        </el-form-item>
+      </el-col>
+      <el-col v-bind="styleResponsive ? { lg: 4, md: 12 } : { span: 4 }">
+        <el-form-item label="来访单位" prop="visitingUnitsName">
+          <el-input
+            clearable
+            placeholder="请输入"
+            v-model.trim="params.visitingUnitsName"
+          ></el-input>
+        </el-form-item>
+      </el-col>
+      <el-col v-bind="styleResponsive ? { lg: 4, md: 12 } : { span: 4 }">
+        <el-form-item label="来访时间" prop="targetTime">
+          <el-date-picker
+            v-model="params.targetTime"
+            type="datetime"
+            value-format="yyyy-MM-dd HH:mm:ss"
+          >
+          </el-date-picker>
+        </el-form-item>
+      </el-col>
+      <el-col
+        style="display: flex; justify-content: end"
+        v-bind="styleResponsive ? { lg: 4, md: 6 } : { span: 4 }"
+      >
+        <div class="ele-form-actions">
+          <el-button
+            type="primary"
+            icon="el-icon-search"
+            class="ele-btn-icon"
+            @click="search"
+          >
+            查询
+          </el-button>
+          <el-button @click="reset">重置</el-button>
+        </div>
+      </el-col>
+    </el-row>
+  </el-form>
+</template>
+<script>
+import dictMixins from '@/mixins/dictMixins';
+
+export default {
+  mixins: [dictMixins],
+
+  data() {
+    // 默认表单数据
+    const defaultParams = {
+      code: '',
+      name: '',
+      targetTime:'',
+      visitingUnitsName:'',
+      type:''
+    };
+    return {
+      defaultParams,
+      // 表单数据
+      params: { ...defaultParams }
+    };
+  },
+  computed: {
+    // 是否开启响应式布局
+    styleResponsive() {
+      return this.$store.state.theme.styleResponsive;
+    }
+  },
+  methods: {
+    search() {
+      this.$emit('search', {
+        ...this.params
+      });
+    },
+    /*  重置 */
+    reset() {
+      this.createTime = [];
+      this.params = Object.assign({}, { ...this.defaultParams });
+      this.search();
+    }
+  }
+};
+</script>

+ 319 - 0
src/views/marketManagem/components/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>
+  

+ 326 - 0
src/views/marketManagem/components/staffSelection.vue

@@ -0,0 +1,326 @@
+<template>
+  <div class="container">
+    <!-- 单据弹窗 -->
+    <el-dialog
+      title="员工"
+      :before-close="handleClose"
+      :visible.sync="dialogVisible"
+      :close-on-click-modal="false"
+      :append-to-body="true"
+      width="80%"
+    >
+      <el-row class="zw-page">
+        <el-col :span="6" class="zw-page-left">
+          <el-card>
+            <div class="zw-card-header" slot="header">
+              <span class="zw-header-title details-title">部门</span>
+            </div>
+            <div class="zw-page-left-tree">
+              <el-container class="zw-container">
+                <el-tree
+                  ref="tree"
+                  :data="treeList"
+                  highlight-current
+                  node-key="id"
+                  :props="{ label: 'name' }"
+                  :expand-on-click-node="false"
+                  :default-expand-all="true"
+                  @node-click="handleNodeClick"
+                >
+                </el-tree>
+              </el-container>
+            </div>
+          </el-card>
+        </el-col>
+        <el-col :span="9" class="zw-page-main">
+          <el-card>
+            <div class="zw-card-header" slot="header">
+              <span class="zw-header-title details-title">员工明细 </span>
+            </div>
+            <div class="zw-page-main-list">
+              <el-container class="zw-container">
+                <el-table
+                  :data="staffList"
+                  tooltip-effect="dark"
+                  style="width: 100%"
+                  max-height="500"
+                  :header-cell-style="{
+                    background: '#F0F3F3',
+                    border: 'none'
+                  }"
+                >
+                  <el-table-column prop="code" label="姓名">
+                    <template slot-scope="{ row }">
+                      <div>{{ row.name }}</div>
+                    </template>
+                  </el-table-column>
+                  <el-table-column label="工号">
+                    <template slot-scope="{ row }">
+                      <div>{{ row.jobNumber }}</div>
+                    </template>
+                  </el-table-column>
+                  <el-table-column width="80" label="操作">
+                    <template slot-scope="{ row }">
+                      <el-button
+                        size="mini"
+                        type="primary"
+                        @click="choiceAsset(row)"
+                        :disabled="row.disabled"
+                        icon="el-icon-arrow-right"
+                        circle
+                      >
+                      </el-button>
+                    </template>
+                  </el-table-column>
+                </el-table>
+                <div
+                  v-if="staffList.length !== 0 && isMore"
+                  class="zw-page-list-more"
+                >
+                  <el-link @click="getMore()" type="primary"
+                    >更多<i class="el-icon-caret-bottom"></i>
+                  </el-link>
+                </div>
+              </el-container>
+            </div>
+          </el-card>
+        </el-col>
+        <el-col :span="9" class="zw-page-right">
+          <el-card>
+            <div class="zw-card-header" slot="header">
+              <span class="zw-header-title">已选员工</span>
+            </div>
+            <div class="zw-page-right-list">
+              <el-container class="zw-container">
+                <el-table
+                  :data="selectStafflist"
+                  tooltip-effect="dark"
+                  style="width: 100%"
+                  max-height="500"
+                  :header-cell-style="{
+                    background: '#F0F3F3',
+                    border: 'none'
+                  }"
+                >
+                  <el-table-column prop="code" label="姓名">
+                    <template slot-scope="{ row }">
+                      <div>{{ row.name }}</div>
+                    </template>
+                  </el-table-column>
+                  <el-table-column label="工号">
+                    <template slot-scope="{ row }">
+                      <div>{{ row.jobNumber }}</div>
+                    </template>
+                  </el-table-column>
+                  <el-table-column width="80" label="操作">
+                    <template slot-scope="scope">
+                      <el-button
+                        @click="deleteSelectStaff(scope.row, scope.$index)"
+                        size="mini"
+                        type="danger"
+                        >删除
+                      </el-button>
+                    </template>
+                  </el-table-column>
+                </el-table>
+              </el-container>
+            </div>
+          </el-card>
+        </el-col>
+      </el-row>
+      <div slot="footer" class="dialog-footer">
+        <el-button size="small" @click="handleClose">关 闭</el-button>
+        <el-button size="small" @click="sumbit" type="primary">确 认</el-button>
+      </div>
+    </el-dialog>
+  </div>
+</template>
+<script>
+import { listOrganizations, getUserPage } from '@/api/system/organization';
+export default {
+  data() {
+    return {
+      form: {
+        groupId: null
+      },
+      treeList: [],
+      staffList: [],
+      selectStafflist: [], //已选员工
+      defaultProps: {
+        children: 'children',
+        label: 'name',
+        value: 'code'
+      },
+      pageNum: 1, //设备当前页数
+      size: 10,
+      isMore: false,
+      dialogVisible: false
+    };
+  },
+  created() {},
+  methods: {
+    open(selectedList) {
+      this.dialogVisible = true;
+      this.selectStafflist = selectedList;
+      this.getInfo();
+    },
+    //初始数据
+    async getInfo() {
+      let list = await listOrganizations();
+      this.treeList = this.$util.toTreeData({
+        data: list,
+        idField: 'id',
+        parentIdField: 'parentId'
+      });
+      //this.treeList = res.data;
+    },
+    //选择分类
+    handleNodeClick(data) {
+      this.staffList = [];
+
+      this.form.groupId = data.id;
+      let params = {
+        pageNum: 1,
+        size: this.size,
+        groupId: this.form.groupId
+      };
+      this.getStaffList(params);
+    },
+    //获取员工列表
+    async getStaffList(params) {
+      let res = await getUserPage(params);
+      let list = res.list;
+      if (list.length < res.count) {
+        this.isMore = true;
+      } else {
+        this.isMore = false;
+      }
+      list.forEach((el) => {
+        let _index = this.selectStafflist.findIndex((n) => n.id == el.id);
+        if (_index !== -1) {
+          el.disabled = true;
+        } else {
+          el.disabled = false;
+        }
+      });
+      this.staffList = [...this.staffList, ...list];
+      // this.pageNum = res.pageNum;
+    },
+    //查询更多员工
+    async getMore() {
+      this.pageNum = this.pageNum + 1;
+      let params = {
+        pageNum: this.pageNum,
+        size: this.size,
+        groupId: this.form.groupId
+      };
+      this.getStaffList(params);
+    },
+    //选择员工
+    choiceAsset(info) {
+      let data = JSON.parse(JSON.stringify(info));
+      this.selectStafflist.push(data);
+      info.disabled = true;
+    },
+    //删除已选员工
+    deleteSelectStaff(info, index) {
+      this.staffList.forEach((el) => {
+        if (el.id == info.id) {
+          el.disabled = false;
+        }
+      });
+      this.selectStafflist.splice(index, 1);
+    },
+    //保存
+    sumbit() {
+      this.selectStafflist = this.selectStafflist || [];
+      this.$emit('confirm', JSON.parse(JSON.stringify(this.selectStafflist)));
+      this.handleClose();
+    },
+    handleClose() {
+      this.staffList = [];
+      this.selectStafflist = [];
+      this.dialogVisible = false;
+    }
+  }
+};
+</script>
+
+<style lang="scss" scoped>
+.container {
+  padding: 10px 0;
+}
+.zw-container {
+  height: 500px;
+  overflow-y: auto;
+}
+.zw-header-title {
+  display: inline-block;
+  margin-right: 10px;
+  font-weight: 600;
+}
+.details-title {
+  line-height: 32px;
+  height: 32px;
+}
+.zw-page-list-p {
+  font-size: 14px;
+  margin-bottom: 18px;
+  display: flex;
+  justify-content: space-between;
+  // align-items: center;
+  .zw-page-list-right {
+    display: flex;
+  }
+}
+.zw-page {
+  background: #fff;
+  //padding: 20px 0;
+  height: 600px;
+  .zw-page-left {
+    padding: 0 10px;
+  }
+  .zw-page-main {
+    padding: 0 10px;
+    .zw-page-main-list {
+      span {
+        margin-right: 10px;
+      }
+      .zw-page-span-num {
+        font-size: 12px;
+        color: #157a2c;
+      }
+      .zw-page-p-operation {
+        text-align: right;
+        // width: 200px;
+      }
+      .zw-page-operation-num {
+        width: 100px;
+        margin: 0 10px;
+      }
+    }
+    .zw-page-list-more {
+      text-align: center;
+    }
+  }
+  .zw-page-right {
+    .zw-card-header {
+      display: flex;
+      justify-content: space-between;
+      align-items: center;
+      height: 32px;
+    }
+    span {
+      margin-right: 10px;
+    }
+    .zw-page-span-num {
+      font-size: 12px;
+      color: #157a2c;
+    }
+  }
+}
+.notes {
+  font-size: 12px;
+  color: #909090;
+}
+</style>

+ 500 - 0
src/views/marketManagem/components/taskInfoTable.vue

@@ -0,0 +1,500 @@
+<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:taskType="{row,$index}">
+          <el-form-item :prop="'datasource.'+$index+'.taskType'"
+                        :rules="{required:false,message:'请选择任务类型',trigger:['blur','change']}">
+            <DictSelection clearable dictName="派车任务类型" v-model="row.taskType"
+                           :disabled="dialogType==='view'"
+                           disabled
+                           @itemChange="(val)=>handleChangeFinLink(val,row,$index)"></DictSelection>
+          </el-form-item>
+        </template> -->
+        <template v-slot:headerGLLXMC="{ column }">
+          <span class="is-required">{{ column.label }}</span>
+        </template>
+      </ele-pro-table>
+    </el-form>
+
+    <!-- 选择司机   -->
+    <select-driver-dialog
+      ref="selectDriverDialogRef"
+      :selectDriverDialogFlag.sync="selectDriverDialogFlag"
+      v-if="selectDriverDialogFlag"
+      @changeParent="getDriverInfo"
+    ></select-driver-dialog>
+    <select-car-dialog
+      ref="selectCarDialogRef"
+      :selectCarDialogFlag.sync="selectCarDialogFlag"
+      v-if="selectCarDialogFlag"
+      @changeParent="getCarInfo"
+    ></select-car-dialog>
+  </div>
+</template>
+
+
+<script>
+import { checkDriverIsBusyAPI } from '@/api/transportManager/shipManage';
+import SelectDriverDialog from '@/views/transportManager/shipManage/dispatchManage/components/selectDriverDialog.vue';
+import SelectCarDialog from '@/views/transportManager/shipManage/dispatchManage/components/selectCarDialog.vue';
+import { getSummaries } from '@/utils/util.js';
+
+export default {
+  name: 'relatedInfoTable',
+  components: { SelectCarDialog, SelectDriverDialog },
+  props: {
+
+    dialogType: {
+      type: String,
+      default: ''
+    }
+  },
+  data() {
+    return {
+      editIndex: undefined, //当前修改数据的下标
+      selectDriverDialogFlag: false,
+      selectCarDialogFlag: false,
+      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>

+ 197 - 0
src/views/marketManagem/components/userList.vue

@@ -0,0 +1,197 @@
+<!-- 用户编辑弹窗 -->
+<template>
+  <ele-modal
+    width="65vw"
+    :visible.sync="show"
+    :close-on-click-modal="false"
+    custom-class="ele-dialog-form"
+    append-to-body
+    @close="cancel"
+  >
+    <ele-split-layout
+      width="210px"
+      allow-collapse
+      :right-style="{ overflow: 'hidden' }"
+    >
+      <div>
+        <div class="ele-border-lighter sys-organization-list">
+          <el-tree
+            ref="tree"
+            :data="data"
+            highlight-current
+            node-key="id"
+            :props="{ label: 'name' }"
+            :expand-on-click-node="false"
+            :default-expand-all="true"
+            @node-click="onNodeClick"
+          /> </div
+        >.
+      </div>
+      <template v-slot:content>
+        <ele-pro-table
+
+          ref="table"
+            :columns="columns"
+            :datasource="datasource"
+            :selection.sync="selection"
+            :current.sync="current"
+            highlight-current-row
+            cache-key="systemRoleTable3"
+            aaaaaa
+            row-key="id"
+        >
+        </ele-pro-table>
+      </template>
+    </ele-split-layout>
+    <template v-slot:footer>
+      <el-button @click="cancel">取消</el-button>
+      <el-button type="primary" @click="save"> 确认 </el-button>
+    </template>
+  </ele-modal>
+</template>
+
+<script>
+import { getUserPage } from '@/api/system/organization';
+
+import { listOrganizations } from '@/api/system/organization';
+export default {
+  data() {
+    return {
+      data: [],
+      show: false,
+      organizationId: '',
+      // 表格列配置
+      current: {},
+      selection: [],
+      disArr: [],
+      key: '',
+      isAll:2 //多选:1 单选:2
+    };
+  },
+  computed: {
+    columns() {
+      return [
+        {
+          width: 45,
+          type: 'selection',
+          columnKey: 'selection',
+          align: 'center', reserveSelection: true,
+          show: this.isAll == 1,
+          selectable: (row, index) => {
+            return !this.disArr.includes(row.id);
+          }
+        },
+        {
+          columnKey: 'index',
+          type: 'index',
+          label: '序号',
+          width: 45,
+          align: 'center',
+          showOverflowTooltip: true,
+          fixed: 'left'
+        },
+        {
+          prop: 'name',
+          label: '姓名',
+          sortable: 'custom',
+          showOverflowTooltip: true,
+          minWidth: 110
+        },
+        {
+          prop: 'jobNumber',
+          label: '工号',
+          sortable: 'custom',
+          showOverflowTooltip: true,
+          minWidth: 110
+        },
+        {
+          prop: 'loginName',
+          label: '用户账号',
+          sortable: 'custom',
+          showOverflowTooltip: true,
+          minWidth: 110
+        },
+        {
+          prop: 'sex',
+          label: '性别',
+          sortable: 'custom',
+          showOverflowTooltip: true,
+          minWidth: 80,
+          formatter: (_row, _column, cellValue) => {
+            return cellValue == 1 ? '男' : cellValue == 2 ? '女' : '';
+          }
+        }
+      ];
+    }
+  },
+  created() {},
+  methods: {
+    /* 查询 */
+    query() {
+      listOrganizations()
+        .then((list) => {
+          let _list = list.filter((i) => i.name != '超级管理员');
+
+          this.data = this.$util.toTreeData({
+            data: _list,
+            idField: 'id',
+            parentIdField: 'parentId'
+          });
+
+          this.$nextTick(() => {
+            this.onNodeClick(this.data[0]);
+          });
+        })
+        .catch((e) => {
+          // this.$message.error(e.message);
+        });
+    },
+    async open(key) {
+      this.query();
+      this.key = key;
+      this.show = true;
+    },
+    /* 表格数据源 */
+    async datasource({ page, limit, where, order }) {
+      let data = await getUserPage({
+        ...where,
+        ...order,
+        pageNum: page,
+        size: limit,
+        groupId: this.organizationId
+      });
+
+      return data;
+    },
+    /* 保存编辑 */
+    save() {
+      let data =
+        this.isAll == 1
+          ? JSON.parse(JSON.stringify(this.selection))
+          : JSON.parse(JSON.stringify(this.current));
+      this.$emit('success', { data, key: this.key });
+      this.show = false;
+    },
+    onNodeClick(val) {
+      this.organizationId = val.id;
+      this.reload();
+    },
+    /* 刷新表格 */
+    reload(where) {
+      this.$refs.table.reload({ pageNum: 1, where: where });
+    },
+    cancel() {
+      this.show = false;
+    }
+  }
+};
+</script>
+<style scoped lang="scss">
+:deep(.ele-split-panel-wrap) {
+  height: 50vh;
+  overflow-y: auto;
+}
+:deep(.el-checkbox__input.is-disabled .el-checkbox__inner) {
+  background-color: #f3f3f3;
+}
+</style>

+ 315 - 0
src/views/marketManagem/components/viewDialog.vue

@@ -0,0 +1,315 @@
+<template>
+  <ele-modal
+    custom-class="ele-dialog-form long-dialog-form"
+    :centered="true"
+    :visible.sync="addOrEditDialogFlag"
+    :append-to-body="false"
+    :close-on-click-modal="false"
+    width="70%"
+    :fullscreen="fullscreen"
+  >
+    <template slot="title">
+      <modalTitle
+        title="详情"
+        @setFullscreen="fullscreen = !fullscreen"
+      ></modalTitle>
+    </template>
+    <div class="switch">
+      <div class="switch_left">
+        <ul>
+          <li
+            v-for="item in tabOptions"
+            :key="item.key"
+            :class="{ active: activeComp == item.key }"
+            @click="activeComp = item.key"
+          >
+            {{ item.name }}
+          </li>
+        </ul>
+      </div>
+    </div>
+    <el-form
+      ref="form"
+      class="el-form-box"
+      :model="form"
+      label-width="0"
+      v-if="activeComp=='main'"
+    >
+      <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>
+    <div slot="footer">
+      <el-button @click="addOrEditDialogFlag = false">返回</el-button>
+    </div>
+    <bpmDetail
+      v-if="activeComp === 'bpm' && form.businessId"
+      :id="form.businessId"
+    ></bpmDetail>
+
+  </ele-modal>
+</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/marketManagem/index';
+
+import modalTitle from '@/BIZComponents/modalTitle.vue';
+import bpmDetail from '@/views/bpm/processInstance/detail.vue';
+
+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,
+    modalTitle,
+    putUpList,
+    visitList,bpmDetail
+  },
+  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 {
+      activeComp: 'main',
+        tabOptions: [
+          { key: 'main', name: '详情' },
+          { key: 'bpm', name: '审批流程' }
+        ],
+      fullscreen: false,
+      checkList: [],
+      TimeArr: [],
+      addOrEditDialogFlag: false,
+      activeName: '',
+      organizationList: [],
+      form: { ...defForm },
+
+      rules: {}
+    };
+  },
+  mounted() {},
+  created() {},
+  methods: {
+    //初始化
+    async open(row = {}, type) {
+      this.addOrEditDialogFlag = true;
+
+      this.form = await getById(row.id);
+      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/marketManagem/components/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>
+  

+ 345 - 0
src/views/marketManagem/index.vue

@@ -0,0 +1,345 @@
+<template>
+  <div class="ele-body">
+    <el-card shadow="never" v-loading="loading">
+      <search-table @search="reload"></search-table>
+      <!-- 数据表格 -->
+      <ele-pro-table
+        ref="table"
+        :columns="columns"
+        :datasource="datasource"
+        height="calc(100vh - 325px)"
+        full-height="calc(100vh - 116px)"
+        tool-class="ele-toolbar-form"
+        :selection.sync="selection"
+        cache-key="eomContactPageTable"
+      >
+        <!-- 表头工具栏 -->
+        <template v-slot:toolbar>
+          <el-button
+            size="small"
+            type="primary"
+            icon="el-icon-plus"
+            class="ele-btn-icon"
+            @click="handleAddOrEdit('', 'add')"
+          >
+            新建
+          </el-button>
+          <el-button
+            size="small"
+            type="danger"
+            el-icon-delete
+            class="ele-btn-icon"
+            @click="allDelBtn"
+            :disabled="selection?.length === 0"
+          >
+            批量删除
+          </el-button>
+        </template>
+        <!-- 操作 -->
+        <template v-slot:action="{ row }">
+          <el-link
+            type="primary"
+            :underline="false"
+            icon="el-icon-edit"
+            @click="handleAddOrEdit(row, 'update')"
+            v-if="row.reviewStatus == 0 || row.reviewStatus == 3"
+          >
+            修改
+          </el-link>
+          <el-link
+            type="primary"
+            :underline="false"
+            icon="el-icon-edit"
+            @click="submit(row)"
+            v-if="row.reviewStatus == 0 || row.reviewStatus == 3"
+          >
+            提交
+          </el-link>
+          <el-popconfirm
+            class="ele-action"
+            title="确定要删除此信息吗?"
+            @confirm="remove([row.id])"
+            v-if="row.reviewStatus == 0 || row.reviewStatus == 3"
+          >
+            <template v-slot:reference>
+              <el-link type="danger" :underline="false" icon="el-icon-delete">
+                删除
+              </el-link>
+            </template>
+          </el-popconfirm>
+        </template>
+        <template v-slot:code="{ row }">
+          <el-link
+            type="primary"
+            :underline="false"
+            @click="handleAddOrEdit(row, 'view')"
+          >
+            {{ row.code }}
+          </el-link>
+        </template>
+      </ele-pro-table>
+    </el-card>
+
+    <add-or-edit-dialog
+      ref="addOrEditDialogRef"
+      @done="reload"
+    ></add-or-edit-dialog>
+
+    <viewDialog ref="viewDialogRef"></viewDialog>
+    <process-submit-dialog
+      :processSubmitDialogFlag.sync="processSubmitDialogFlag"
+      v-if="processSubmitDialogFlag"
+      ref="processSubmitDialogRef"
+      @reload="reload"
+    ></process-submit-dialog>
+  </div>
+</template>
+
+<script>
+import dictMixins from '@/mixins/dictMixins';
+import addOrEditDialog from './components/addOrEditDialog.vue';
+import viewDialog from './components/viewDialog.vue';
+import searchTable from './components/searchTable.vue';
+import { getList, del } from '@/api/marketManagem/index';
+import processSubmitDialog from '@/BIZComponents/processSubmitDialog/processSubmitDialog.vue';
+
+export default {
+  mixins: [dictMixins],
+  components: {
+    processSubmitDialog,
+    addOrEditDialog,
+    viewDialog,
+    searchTable
+  },
+  data() {
+    return {
+      // 加载状态
+      loading: false,
+      delVisible: false,
+      selection: [],
+      processSubmitDialogFlag: false
+    };
+  },
+  computed: {
+    columns() {
+      return [
+        {
+          width: 45,
+          type: 'selection',
+          columnKey: 'selection',
+          align: 'center',
+          selectable: (row, index) => {
+            return (
+              row.reviewStatus != 1 && row.reviewStatus != 2
+            );
+          }
+        },
+        {
+          width: 60,
+          label: '序号',
+          type: 'index',
+          columnKey: 'index',
+          align: 'center'
+        },
+        {
+          minWidth: 200,
+          prop: 'code',
+          label: '编码',
+          align: 'center',
+          slot: 'code',
+          showOverflowTooltip: true
+        },
+        {
+          minWidth: 80,
+          prop: 'type',
+          label: '类型',
+          align: 'center',
+          showOverflowTooltip: true
+        },
+
+        {
+          minWidth: 200,
+          prop: 'name',
+          label: '主题',
+          align: 'center',
+          showOverflowTooltip: true
+        },
+        {
+          minWidth: 200,
+          prop: 'visitingUnitsName',
+          label: '来访单位',
+          align: 'center',
+          showOverflowTooltip: true
+        },
+        {
+          minWidth: 120,
+          prop: 'start',
+          label: '来访时间',
+          align: 'center',
+          showOverflowTooltip: true
+        },
+        {
+          minWidth: 120,
+          prop: 'numberOfVisitors',
+          label: '来访总人数',
+          align: 'center',
+          showOverflowTooltip: true
+        },
+        {
+          minWidth: 100,
+          prop: 'commanderName',
+          label: '负责人',
+          align: 'center',
+          showOverflowTooltip: true
+        },
+        {
+          minWidth: 120,
+          prop: 'promoterName',
+          label: '发起人',
+          align: 'center',
+          showOverflowTooltip: true
+        },
+
+        {
+          minWidth: 120,
+          label: '审核状态',
+          align: 'center',
+          prop: 'reviewStatus',
+          showOverflowTooltip: true,
+          formatter: (row, column, val) => {
+            return val == 0
+              ? '未提交'
+              : val == 1
+              ? '审核中'
+              : val == 2
+              ? '审核通过'
+              : '审核不通过';
+          }
+        },
+        {
+          minWidth: 100,
+          prop: 'createUserName',
+          label: '创建人',
+          align: 'center',
+          slot: 'createTime',
+          showOverflowTooltip: true
+        },
+        {
+          minWidth: 100,
+          prop: 'createTime',
+          label: '创建时间',
+          align: 'center',
+          slot: 'createTime',
+          showOverflowTooltip: true
+        },
+        {
+          columnKey: 'action',
+          label: '操作',
+          width: 200,
+          align: 'center',
+          resizable: false,
+          slot: 'action',
+          showOverflowTooltip: true,
+          fixed: 'right'
+        }
+      ];
+    }
+  },
+  created() {},
+  methods: {
+    //新增、修改
+    handleAddOrEdit(row = {}, type) {
+      this.$nextTick(() => {
+        if (type == 'view') {
+          this.$refs.viewDialogRef.open(row, type);
+        } else {
+          this.$refs.addOrEditDialogRef.open(row, type);
+        }
+      });
+    },
+    //新增、修改
+    handleDetail(row = {}, type) {
+      this.detailDialogFlag = true;
+      this.$nextTick(() => {
+        this.$refs.detailDialogRef.init(row, type);
+      });
+    },
+
+    /* 表格数据源 */
+    datasource({ page, limit, where, order }) {
+      return getList({
+        pageNum: page,
+        size: limit,
+        ...where
+      });
+    },
+    submit(res) {
+      this.processSubmitDialogFlag = true;
+      this.$nextTick(() => {
+        let params = {
+          businessId: res.id,
+          businessKey: 'market_management_approve',
+          formCreateUserId: res.createUserId,
+          pcHandle: '/bpm/handleTask/components/marketManagem/submit.vue',
+          pcView: '/bpm/handleTask/components/marketManagem/view.vue',
+          variables: {
+            businessCode: res.docNo
+          }
+        };
+        this.$refs.processSubmitDialogRef.init(params);
+      });
+    },
+    /* 刷新表格 */
+    reload(where = {}) {
+      this.$refs.table.reload({ page: 1, where });
+    },
+
+    //批量删除
+    allDelBtn() {
+      if (this.selection.length === 0) return;
+      let flag = this.selection.some((item) =>
+        [1, 2].includes(item.approvalStatus)
+      );
+      if (flag)
+        return this.$message.warning('抱歉已审核、审核中的数据不能删除,请检查');
+      this.delVisible = true;
+    },
+
+    commitBtn() {
+      const dataId = this.selection.map((v) => v.id);
+      del(dataId).then((res) => {
+        this.$message.success('删除成功!');
+        this.reload();
+      });
+    },
+    remove(row) {
+      del(row).then((res) => {
+        this.$message.success('删除成功!');
+        this.reload();
+      });
+    }
+  }
+};
+</script>
+
+<style lang="scss" scoped>
+:deep(.el-link--inner) {
+  margin-left: 0px !important;
+}
+
+.sys-organization-list {
+  height: calc(100vh - 264px);
+  box-sizing: border-box;
+  border-width: 1px;
+  border-style: solid;
+  overflow: auto;
+}
+
+.sys-organization-list :deep(.el-tree-node__content) {
+  height: 40px;
+
+  & > .el-tree-node__expand-icon {
+    margin-left: 10px;
+  }
+}
+</style>

+ 6 - 2
src/views/saleManage/saleOrder/components/drawer.vue

@@ -14,8 +14,12 @@
     <headerTitle title="摘要卡片" style="margin-top: 15px"></headerTitle>
 
     <div class="card">
-      <span>订单总额:</span>
-      <span> 退货单总额:</span>
+      <span>订单数量:</span>
+      <span>订单总金额:</span>
+      <span>应收款:</span>
+      <span>发货数量:</span>
+      <span>退货数量:</span>
+      <span> 退货金额:</span>
       <!-- <span>预计结单日期:</span> -->
     </div>
     <div class="ele-body" style="height: calc(100% - 124px)">

+ 1 - 1
src/views/targetManage/salesTarget/index.vue

@@ -149,7 +149,7 @@ export default {
           formatter: (row, column) => {
             return row.assessmentObject == 1
               ? '公司'
-              : row.type == 2
+              : row.assessmentObject == 2
               ? '部门'
               : '个人';
           }