Kaynağa Gözat

附件上传;采购申请优化;

yijing 1 yıl önce
ebeveyn
işleme
19a723ee55

BIN
src/assets/wjj.png


+ 122 - 0
src/components/addDoc/api/index.js

@@ -0,0 +1,122 @@
+import request from '@/utils/request';
+
+/**
+ * 查询文件夹分类数据
+ * @data data
+ */
+export async function getDocTreeListAPI(data) {
+  const res = await request.post('/fm/directory/selectTreeList', data);
+  if (res.data.code == 0) {
+    return res.data.data;
+  }
+  return Promise.reject(new Error(res.data.message));
+}
+
+/**
+* 查询文件数据
+* @data data
+*/
+export async function filePageAPI(data) {
+  const res = await request.post('/fm/file/pageBusiness', data);
+  if (res.data.code == 0) {
+    return res.data.data;
+  }
+  return Promise.reject(new Error(res.data.message));
+}
+/**
+ * 保存
+ * @data data
+ */
+export async function fileSaveAPI(data) {
+  const res = await request.post('/fm/file/save', data);
+  if (res.data.code == 0) {
+    return res.data.data;
+  }
+  return Promise.reject(new Error(res.data.message));
+}
+
+/**
+ * 详情
+ * @id id
+ */
+export async function fileGetByIdAPI(id) {
+  const res = await request.get(`/fm/file/getById/${id}`);
+  if (res.data.code == 0) {
+    return res.data.data;
+  }
+  return Promise.reject(new Error(res.data.message));
+}
+
+/**
+ * ids查询文件列表
+ * @data data
+ */
+ export async function queryIds(data) {
+  const res = await request.post('/fm/file/queryIds', data);
+  if (res.data.code == 0) {
+    return res.data.data;
+  }
+  return Promise.reject(new Error(res.data.message));
+}
+
+
+
+
+// 获取编码树
+export async function selectTreeList(data) {
+  const res = await request.post(`/main/business_code_category/selectTreeList`, data);
+  if (res.data.code == 0) {
+    return res.data.data;
+  }
+  return Promise.reject(new Error(res.data.message));
+}
+// 获取右侧列表
+export async function listParentId(data) {
+  const res = await request.post(`/main/business_code_category/listPageParentId`, data);
+  if (res.data.code == 0) {
+    return res.data.data;
+  }
+  return Promise.reject(new Error(res.data.message));
+}
+// 获取右侧码段列表
+export async function pageSegment(data) {
+  const res = await request.post(`/main/business_code_manage/page`, data);
+  if (res.data.code == 0) {
+    return res.data.data;
+  }
+  return Promise.reject(new Error(res.data.message));
+}
+
+
+// 生成编码
+export async function getCode(id) {
+  const res = await request.get(`/main/business_code_category/applyForCode/`+id);
+  if (res.data.code == 0) {
+    return res.data.data;
+  }
+  return Promise.reject(new Error(res.data.message));
+}
+
+/**
+ * 上传文件
+ * @param file 文件
+ */
+ export async function uploadFileNew (data) {
+  const formData = new FormData();
+  formData.append('multiPartFile', data.multiPartFile);
+  formData.append('module', data.module);
+  const res = await request.post('/main/file/uploadFile', formData);
+  if (res.data.code === '0') {
+    return res.data;
+  }
+  return Promise.reject(new Error(res.data.message));
+}
+// 编码方案
+export async function listCode() {
+  const res = await request.get(`/main/business_code_category/listCode/WD0001`);
+  if (res.data.code == 0) {
+    return res.data.data;
+  }
+  return Promise.reject(new Error(res.data.message));
+}
+

+ 52 - 0
src/components/addDoc/browse.vue

@@ -0,0 +1,52 @@
+<template>
+  <ele-modal
+    :visible.sync="showEditFlag"
+    :close-on-click-modal="false"
+    custom-class="ele-dialog-form"
+    append-to-body
+    :fullscreen="true"
+  >
+    <iframe
+      :src="fileUrl"
+      width="100%"
+      v-if="showEditFlag"
+      style="height: calc(100vh - 100px)"
+      frameborder="0"
+      allowfullscreen="true"
+    ></iframe
+  ></ele-modal>
+</template>
+
+<script>
+  import { getFileType } from './util.js';
+
+  export default {
+    data() {
+      return {
+        fileUrl: '',
+        showEditFlag: false
+      };
+    },
+
+    methods: {
+      open(row) {
+        this.showEditFlag = true;
+        this.setFileUrl(row);
+      },
+      setFileUrl(row) {
+        console.log(row);
+        let file = row.storagePath[0];
+        let fileNames = file.storePath.split('/');
+        let url =
+          window.location.origin +
+          '/api/main/file/getFile?objectName=' +
+          file.storePath +
+          '&fullfilename=' +
+          fileNames[fileNames.length - 1];
+        this.fileUrl = '/kkfile/onlinePreview?url=' + btoa(url);
+        this.visible = true;
+      }
+    }
+  };
+</script>
+<style scoped lang="scss"></style>

+ 175 - 0
src/components/addDoc/doc_template.vue

@@ -0,0 +1,175 @@
+<template>
+  <div class="ele-body" style="height: 60vh; overflow: auto">
+    <el-card shadow="never" v-loading="loading">
+      <ele-split-layout
+        width="210px"
+        allow-collapse
+        :right-style="{ overflow: 'hidden' }"
+      >
+        <div>
+          <!-- 操作按钮 -->
+          <ele-toolbar class="ele-toolbar-actions">
+            <div style="margin: 5px 0"> </div>
+          </ele-toolbar>
+          <div class="ele-border-lighter sys-organization-list">
+            <el-tree
+              ref="tree"
+              :data="data"
+              highlight-current
+              :draggable="true"
+              node-key="id"
+              :props="{ label: 'name', children: 'sonDirectoryList' }"
+              :expand-on-click-node="false"
+              :default-expand-all="true"
+              @node-click="onNodeClick"
+            >
+              <span class="custom-tree-node" slot-scope="{ node }">
+                <ElementTreeLine
+                  :node="node"
+                  :showLabelLine="true"
+                  :indent="20"
+                >
+                  <img src="../../assets/wjj.png" />
+
+                  <span>{{ node.label }}</span>
+                </ElementTreeLine>
+              </span>
+            </el-tree>
+          </div>
+        </div>
+        <template v-slot:content>
+          <FileTableList
+            ref="tableRef"
+            :parentData="current"
+            :disabledTableList="disabledTableList"
+          />
+        </template>
+      </ele-split-layout>
+    </el-card>
+
+    <!-- {{current?.id}} -->
+  </div>
+</template>
+
+<script>
+  //
+  import FileTableList from './file-table-listTemplate.vue';
+  import { getDocTreeListAPI } from './api';
+  import { mapGetters } from 'vuex';
+
+  import ElementTreeLine from 'element-tree-line';
+  // css
+  import 'element-tree-line/dist/style.scss';
+  export default {
+    components: { FileTableList, ElementTreeLine },
+
+    data() {
+      return {
+        loading: true,
+        // 列表数据
+        data: [],
+        fileType: 0,
+        // 选中数据
+        current: {}
+      };
+    },
+    props: {
+      lcyStatus: null, //1:文档工作区 2:文档归档区 3:文档发布区 4:文档废止区
+
+      disabledTableList: {
+        //已选择列表
+        default: () => []
+      }
+    },
+    computed: {
+      ...mapGetters(['user'])
+    },
+    created() {
+      this.query();
+    },
+
+    methods: {
+      /* 查询 */
+      async query() {
+        this.loading = true;
+        let query = {
+          type: this.fileType,
+          currentUserId: this.user.info.userId
+        };
+        this.data = await getDocTreeListAPI(query);
+
+        this.current = null;
+        this.$nextTick(() => {
+          this.$refs.tree.setCurrentKey(this.data[0].id);
+
+          this.onNodeClick(this.data[0]);
+        });
+        this.loading = false;
+      },
+      /* 选择数据 */
+      onNodeClick(row) {
+        if (row) {
+          this.current = row;
+          this.$nextTick(() => {
+            this.$refs.tableRef.reload();
+          });
+        } else {
+          this.current = null;
+        }
+      },
+
+      getTableList() {
+        return this.$refs.tableRef.getTableList();
+      }
+    }
+  };
+</script>
+
+<style lang="scss" scoped>
+  .sys-organization-list {
+    height: calc(100vh - 180px);
+    box-sizing: border-box;
+    border-width: 1px;
+    border-style: solid;
+    overflow: auto;
+  }
+
+  .sys-organization-list :deep(.el-tree-node__content) {
+    height: 30px;
+
+    & > .el-tree-node__expand-icon {
+      margin-left: 10px;
+    }
+  }
+  .custom-tree-node {
+    display: flex;
+    align-items: center;
+  }
+  :deep(.el-popover) {
+    min-width: 50px;
+    position: fixed;
+  }
+  :deep(.el-link--inner) {
+    padding: 3px 0;
+  }
+  // :deep(.element-tree-node-line-hor) {
+  //   border-bottom: 1px solid #dcdfe6;
+  // }
+  // :deep(.element-tree-node-line-ver) {
+  //   border-left: 1px solid #dcdfe6;
+  // }
+</style>
+<style lang="scss">
+  .el-tree
+    > .el-tree-node
+    > .el-tree-node__content:nth-of-type(1)
+    .element-tree-node-line-hor {
+    border: none;
+  }
+  .el-tree
+    > .el-tree-node
+    > .el-tree-node__content:nth-of-type(1)
+    .element-tree-node-line-ver {
+    border: none;
+  }
+</style>

+ 263 - 0
src/components/addDoc/file-edit.vue

@@ -0,0 +1,263 @@
+<!-- 用户编辑弹窗 -->
+<template>
+  <ele-modal
+    width="500px"
+    :visible.sync="showEditFlag"
+    :close-on-click-modal="false"
+    custom-class="ele-dialog-form"
+    append-to-body
+    @close="cancel"
+    :title="title"
+    ref="Emodal"
+  >
+    <el-form ref="form" :model="form" :rules="rules" label-width="82px">
+      <el-row :gutter="15">
+        <el-col :span="24">
+          <el-form-item label="编码分类" prop="codeType">
+            <ele-tree-select
+              clearable
+              :data="list"
+              v-model="form.codeType"
+              placeholder="请选择"
+              default-expand-all
+              labelKey="name"
+              childrenKey="sonDirectoryList"
+              valueKey="id"
+              @change="typeChange"
+            />
+          </el-form-item>
+        </el-col>
+        <el-col :span="24">
+          <el-form-item label="编码方案" prop="businessCodeId">
+            <el-select
+              v-model="form.businessCodeId"
+              placeholder="请选择"
+              style="width: 100%"
+            >
+              <el-option
+                v-for="item in options"
+                :key="item.id"
+                :label="item.name"
+                :value="item.id"
+              >
+              </el-option>
+            </el-select>
+          </el-form-item>
+        </el-col>
+        <el-col :span="24">
+          <el-form-item label="文档类型" prop="type">
+            <DictSelection
+              dictName="文档类型"
+              v-model="form.type"
+            ></DictSelection>
+          </el-form-item>
+        </el-col>
+
+        <el-col :span="24">
+          <el-form-item label="文档" prop="storagePath">
+            <div style="display: flex; align-items: center">
+              <fileUpload
+                v-model="form.storagePath"
+                module="main"
+                :limit="100"
+                :multiple="true"
+                @fileChange="fileChange"
+              >
+
+              </fileUpload>
+            </div>
+          </el-form-item>
+        </el-col>
+        <el-col :span="24">
+          <el-form-item label="文档位置" prop="directoryId">
+            <el-cascader
+              style="width: 100%"
+              v-model="form.directoryId"
+              :options="folderList"
+              :props="{
+                value: 'id',
+                label: 'name',
+                children: 'sonDirectoryList',
+                emitPath: false,
+                checkStrictly: true
+              }"
+            ></el-cascader>
+          </el-form-item>
+        </el-col>
+        <el-col :span="24">
+          <el-form-item label="备注" prop="remark">
+            <el-input
+              v-model="form.remark"
+              type="textarea"
+              placeholder="请输入"
+            ></el-input>
+          </el-form-item>
+        </el-col>
+      </el-row>
+    </el-form>
+    <template v-slot:footer>
+      <el-button @click="cancel">取消</el-button>
+      <el-button type="primary" :loading="loading" @click="save">
+        确认
+      </el-button>
+    </template>
+  </ele-modal>
+</template>
+
+<script>
+import { fileSaveAPI,selectTreeList, listParentId,getDocTreeListAPI,listCode} from './api/index';
+import FileUpload from './fileUpload.vue';
+import { setFolderList } from './util.js';
+import { mapGetters } from 'vuex';
+export default {
+  components: { FileUpload },
+
+  data() {
+    const defaultForm = {
+      name: '', //名称
+      type: '', //类型
+      sizeUnit: '', //大小,
+      unit: '', //单位
+      remark: '', //备注
+      status: '', //状态
+      storagePathId: '',
+      directoryId: '',
+      businessCodeId: '',
+      storagePath: [],
+      id: '',
+      lcyStatus: 1,
+      fileType:0
+    };
+    return {
+      rules: {
+        businessCodeId: [
+          { required: true, message: '请选择', trigger: 'blur' }
+        ],
+        // codeType: [{ required: true, message: '请选择', trigger: 'blur' }],
+        directoryId: [{ required: true, message: '请选择', trigger: 'blur' }],
+        storagePath: [{ required: true, message: '请选择', trigger: 'blur' }]
+      },
+      templateVisible: false,
+      folderList: [],
+      list: [],
+      options: [],
+      defaultForm,
+      code: '',
+      // 表单数据
+      form: { ...defaultForm },
+
+      // 提交状态
+      loading: false,
+      showEditFlag: false,
+      title: '',
+      type: '新建附件'
+    };
+  },
+  computed: {
+    // 是否开启响应式布局
+    styleResponsive() {
+      return this.$store.state.theme.styleResponsive;
+    },
+    ...mapGetters(['user'])
+  },
+  async created() {
+    let query = {
+      type: 0,
+      currentUserId: this.user.info.userId
+    };
+    this.folderList = await getDocTreeListAPI(query);
+    setFolderList(this.folderList); //权限过滤
+  },
+  methods: {
+    async open() {
+    
+      this.showEditFlag = true;
+      this.list = await selectTreeList();
+      this.options= await listCode();
+      if(this.options.length>0){
+        this.form.businessCodeId=this.options[0].id
+      }
+      this.setTree(this.list);
+    },
+    setTree(data) {
+      data.forEach((item) => {
+        item.sonDirectoryList = item.sonDirectoryList.filter(
+          (item) => item.type == 1
+        );
+        if (item.sonDirectoryList.length > 0) {
+          this.setTree(item.sonDirectoryList);
+        }
+      });
+    },
+    async typeChange(val) {
+      let data = await listParentId({
+        pageNum: 1,
+        size: 100,
+        parentId: val
+      });
+      this.options = data.list.filter((item) => item.type == 2);
+      this.form.businessCodeId = '';
+    },
+
+    fileChange(file) {
+      this.form.name = file.name.replace(/\.[^/.]+$/, '');
+    },
+
+    /* 保存编辑 */
+    save() {
+      this.$refs.form.validate(async (valid) => {
+        if (!valid) {
+          return false;
+        }
+
+        const data = {
+          ...this.form,
+        };
+
+        this.loading = true;
+        fileSaveAPI(data)
+          .then( (msg) => {
+            this.loading = false;
+
+            this.cancel();
+            this.$emit('done',msg);
+          })
+          .catch((e) => {
+            this.loading = false;
+          });
+      });
+    },
+
+    cancel() {
+      this.form = { ...this.defaultForm };
+      this.$refs.form.clearValidate();
+      this.showEditFlag = false;
+    }
+  }
+};
+</script>
+<style scoped lang="scss">
+.aaa {
+  width: 100%;
+
+  ::v-deep .upload-demo {
+    width: 100%;
+
+    .el-upload--text {
+      width: 100%;
+
+      button {
+        width: 100%;
+        background: #ffffff;
+        border: 1px solid #dbdbdb;
+        border-radius: 5px;
+      }
+    }
+
+    .el-upload-list {
+      transform: translate(10px, -39px);
+      position: absolute;
+    }
+  }
+}
+</style>

+ 199 - 0
src/components/addDoc/file-table-listTemplate.vue

@@ -0,0 +1,199 @@
+<template>
+  <div>
+    <!-- 数据表格 -->
+    <ele-pro-table
+      ref="table"
+      :columns="columns"
+      :datasource="datasource"
+      tool-class="ele-toolbar-form"
+      :needPage="false"
+      row-key="id"
+      :selection.sync="selection"
+      :toolbar="false"
+    >
+      <!-- 操作列 -->
+      <template v-slot:action="{ row }">
+        <el-link
+          type="primary"
+          :underline="false"
+          icon="el-icon-edit"
+          @click="browseOpen(row)"
+        >
+          浏览
+        </el-link>
+      </template>
+    </ele-pro-table>
+    <browse ref="browseRef"></browse>
+  </div>
+</template>
+
+<script>
+  import { filePageAPI } from './api';
+  import browse from './browse.vue';
+
+  export default {
+    components: { browse },
+    props: {
+      // 上级
+      parentData: {
+        type: Object,
+        default: () => {}
+      },
+
+      disabledTableList: {
+        //已选择列表
+        default: () => []
+      }
+    },
+
+    data() {
+      return {
+        selection: [],
+        columns: [
+          {
+            width: 45,
+            type: 'selection',
+            columnKey: 'selection',
+            align: 'center',
+            selectable: (row, index) => {
+              return !this.disabledTableList
+                .map((item) => item.id)
+                .includes(row.id);
+            }
+          },
+          {
+            label: '编码',
+            prop: 'code',
+            width: 180,
+            align: 'center',
+            fixed: 'left',
+            showOverflowTooltip: true
+          },
+          {
+            prop: 'name',
+            label: '文档名称',
+            align: 'center',
+            slot: 'name',
+            showOverflowTooltip: true,
+            minWidth: 200
+          },
+          {
+            prop: 'storagePath',
+            label: '文件名称',
+            align: 'center',
+
+            showOverflowTooltip: true,
+            minWidth: 200,
+            formatter: (_row, _column, cellValue) => {
+              return cellValue[0]?.name;
+            }
+          },
+          {
+            prop: 'version',
+            label: '版本',
+            align: 'center',
+            showOverflowTooltip: true,
+            minWidth: 100
+          },
+          {
+            prop: 'checkOutUserName',
+            label: '检出人',
+            align: 'center',
+            showOverflowTooltip: true,
+            minWidth: 100
+          },
+          {
+            prop: 'checkOutStatus',
+            label: '检出状态',
+            align: 'center',
+            showOverflowTooltip: true,
+            minWidth: 100,
+            formatter: (_row, _column, cellValue) => {
+              return cellValue == 1 ? '已检出' : '';
+            }
+          },
+          {
+            prop: 'checkOutTime',
+            label: '检出时间',
+            align: 'center',
+            showOverflowTooltip: true,
+            minWidth: 160
+          },
+          {
+            prop: 'createUserName',
+            label: '创建人',
+            align: 'center',
+            showOverflowTooltip: true,
+            minWidth: 100
+          },
+          {
+            prop: 'createTime',
+            label: '创建时间',
+            align: 'center',
+            showOverflowTooltip: true,
+            minWidth: 160,
+            formatter: (_row, _column, cellValue) => {
+              return this.$util.toDateString(cellValue);
+            }
+          },
+          {
+            prop: 'updateUserName',
+            label: '修改人',
+            align: 'center',
+            showOverflowTooltip: true,
+            minWidth: 100
+          },
+          {
+            prop: 'updateTime',
+            label: '修改时间',
+            align: 'center',
+            showOverflowTooltip: true,
+            minWidth: 160
+          },
+          {
+            prop: 'sizeUnit',
+            label: '文档大小',
+            align: 'center',
+            showOverflowTooltip: true,
+            minWidth: 100
+          },
+          {
+            columnKey: 'action',
+            label: '操作',
+            width: 150,
+            align: 'center',
+            resizable: false,
+            slot: 'action',
+            showOverflowTooltip: true,
+            fixed: 'right'
+          }
+        ]
+      };
+    },
+    created() {},
+
+    methods: {
+      /* 表格数据源 */
+      datasource({ page, limit, where, order }) {
+        return filePageAPI({
+          ...where,
+          ...order,
+          pageNum: page,
+          size: limit,
+          directoryId: this.parentData?.id
+        });
+      },
+      /* 刷新表格 */
+      reload(where) {
+        this.$refs.table.reload({ pageNum: 1, where: where });
+      },
+
+      browseOpen(row) {
+        this.$refs.browseRef.open(row);
+      },
+      getTableList() {
+        return JSON.parse(JSON.stringify(this.selection));
+      }
+    }
+  };
+</script>

+ 255 - 0
src/components/addDoc/fileUpload.vue

@@ -0,0 +1,255 @@
+<template>
+  <div class="upload-file">
+    <el-upload
+      class="upload-demo"
+      action="#"
+      v-loading="loading"
+      element-loading-text="上传中"
+      :http-request="handlRequest"
+      :before-remove="beforeRemove"
+      :on-remove="handleRemove"
+      :on-preview="handleItem"
+      :multiple="multiple"
+      :before-upload="beforeUpload"
+      :file-list="fileList"
+      :show-file-list="!showLib"
+      :disabled="disabled"
+    >
+      <!-- <slot>
+        <el-button :disabled="disabled" type="primary" icon="el-icon-plus" size="mini">点击上传</el-button>
+      </slot> -->
+      <el-button
+        slot="trigger"
+        :disabled="disabled"
+        type="primary"
+        icon="el-icon-plus"
+        size="mini"
+        >点击上传</el-button
+      >
+      <slot name="templateBtn"> </slot>
+    </el-upload>
+  </div>
+</template>
+
+<script>
+  import { getFileList, getFile, removeFile } from '@/api/system/file/index.js';
+  import { uploadFileNew } from './api';
+  import { getImageUrl, getImagePath } from '@/utils/file';
+  export default {
+    props: {
+      value: {
+        type: [Array, String],
+        default: () => []
+      },
+      multiple: {
+        type: Boolean,
+        default: false
+      },
+      // 所属模块
+      module: {
+        type: String,
+        required: true
+      },
+      // 文档库
+      showLib: {
+        type: Boolean,
+        default: false
+      },
+      // 限制数量
+      limit: {
+        type: Number,
+        default: -1
+      },
+      // 限制大小 mb
+      size: {
+        type: Number,
+        default: 1000
+      },
+      disabled: {
+        default: false,
+        type: Boolean
+      }
+    },
+    data() {
+      return {
+        documentVisible: false,
+        selectItem: null,
+        loading: false,
+        documentForm: {
+          name: ''
+        },
+        columns: [
+          {
+            label: '序号',
+            type: 'index',
+            width: 55,
+            align: 'center'
+          },
+          {
+            label: '文档名称',
+            prop: 'name',
+            minWidth: '180',
+            showOverflowTooltip: true
+          },
+          {
+            label: '文档类型',
+            prop: 'type'
+          },
+          {
+            label: '系统'
+          },
+          {
+            label: '储存路径',
+            prop: 'storePath',
+            minWidth: '180',
+            showOverflowTooltip: true
+          },
+          {
+            label: '模块名',
+            prop: 'module'
+          },
+          {
+            label: '上传时间',
+            prop: 'createTime'
+          }
+        ]
+      };
+    },
+    computed: {
+      fileList: {
+        set(val) {
+          // console.log(val);
+          this.$emit(
+            'input',
+            val.map((item) => ({
+              ...item,
+              url: getImagePath(item.url)
+            }))
+          );
+        },
+        get() {
+          // console.log(this.value, 2);
+          if (!Array.isArray(this.value)) return [];
+          const arr =
+            (this.value &&
+              this.value.map((item) => ({
+                ...item,
+                url: getImageUrl(item.url)
+              }))) ||
+            [];
+          return arr;
+        }
+      }
+    },
+
+    methods: {
+      //点击查看图片
+      handleItem(file) {
+        getFile({ objectName: file.storePath }, file.name);
+      },
+      delFileList() {
+        this.$emit('input', []);
+      },
+      handleOpenLib() {
+        this.documentVisible = true;
+        this.$nextTick(() => {
+          this.reload();
+        });
+      },
+      //图文档勾选
+      submitDocument() {
+        this.$emit('input', [
+          { url: this.selectItem.storePath, ...this.selectItem }
+        ]);
+        this.documentVisible = false;
+      },
+      datasource({ page, limit }) {
+        return getFileList({
+          ...this.documentForm,
+          pageNum: page,
+          size: limit
+        });
+      },
+      reload() {
+        this.$refs.table.reload();
+      },
+      beforeRemove(file) {
+        if (file.id) {
+          return removeFile({
+            fileId: file.id
+          }).then(() => {
+            return true;
+          });
+        } else {
+          return true;
+        }
+      },
+      handleRemove(file, fileList) {
+        this.fileList = fileList;
+      },
+      beforeUpload(file) {
+        // if (file.size / 1024 / 1024 > this.size) {
+        //   this.$message.error(`大小不能超过 ${this.size}MB`);
+        //   return false;
+        // }
+
+        if (this.limit > 0 && this.fileList.length === this.limit) {
+          this.$message.error(`最多上传 ${this.limit}个文件`);
+          return false;
+        }
+        this.loading = true;
+        return uploadFileNew({
+          module: this.module,
+          multiPartFile: file
+        })
+          .then((res) => {
+            if (res.data) {
+              this.$emit('input', [
+                ...(this.value || []),
+                { ...file, url: res.data.storePath, ...res.data }
+              ]);
+            }
+            this.$emit('fileChange', res.data);
+            return res.data;
+          })
+          .finally(() => {
+            this.loading = false;
+          });
+      },
+      handlRequest() {
+        return Promise.resolve();
+      }
+      // onSuccess(response, file, fileList){
+      //   alert(1)
+      //    this.$emit('fileChange',file)
+      // },
+    }
+  };
+</script>
+
+<style lang="scss" scoped>
+  .upload-file {
+    display: flex;
+    justify-content: flex-start;
+    align-items: center;
+
+    .lib {
+      margin-left: 12px;
+    }
+
+    .imgs-box {
+      margin-left: 10px;
+      flex: 1;
+    }
+    .imgs-box .imgs-p {
+      height: 30px;
+      background: #f0f3f3;
+      line-height: 30px;
+      min-width: 480px;
+      margin-bottom: 5px;
+      padding: 0 10px;
+      display: flex;
+      justify-content: space-between;
+    }
+  }
+</style>

+ 172 - 0
src/components/addDoc/getCode.vue

@@ -0,0 +1,172 @@
+<!-- 用户编辑弹窗 -->
+<template>
+  <ele-modal
+    width="500px"
+    :visible.sync="showEditFlag"
+    :close-on-click-modal="false"
+    custom-class="ele-dialog-form"
+    append-to-body
+    @close="cancel"
+    title="申请编码"
+  >
+    <el-form ref="form" :model="form" :rules="rules" label-width="82px">
+      <el-row :gutter="15">
+        <el-col :span="24">
+          <el-form-item label="编码分类" prop="type">
+            <ele-tree-select
+              clearable
+              :data="list"
+              v-model="form.type"
+              placeholder="请选择"
+              default-expand-all
+              labelKey="name"
+              childrenKey="sonDirectoryList"
+              valueKey="id"
+              @change="typeChange"
+            />
+          </el-form-item>
+        </el-col>
+        <el-col :span="24">
+          <el-form-item label="编码方案" prop="type1">
+            <el-select
+              v-model="form.type1"
+              placeholder="请选择"
+              style="width: 100%"
+              @change="type1Change"
+            >
+              <el-option
+                v-for="item in options"
+                :key="item.id"
+                :label="item.name"
+                :value="item.id"
+              >
+              </el-option>
+            </el-select>
+          </el-form-item>
+        </el-col>
+        <el-col :span="24">
+          <el-form-item label="编码预览" prop="code">
+            <el-input v-model="form.code" disabled></el-input>
+          </el-form-item>
+        </el-col>
+      </el-row>
+    </el-form>
+    <headerTitle title="编码码段"></headerTitle>
+    <template v-slot:footer>
+      <el-button @click="cancel">取消</el-button>
+      <el-button type="primary" @click="save"> 确认 </el-button>
+    </template>
+  </ele-modal>
+</template>
+
+<script>
+  import { selectTreeList, listParentId, getCode } from './api';
+  import headerTitle from '@/components/header-title/index.vue';
+
+  export default {
+    data() {
+      return {
+        rules: {
+          type: [{ required: true, message: '请选择', trigger: 'blur' }],
+          type1: [{ required: true, message: '请选择', trigger: 'blur' }],
+          code: [{ required: true, message: '请申请', trigger: 'blur' }]
+        },
+        list: [],
+        options: [],
+        // 表单数据
+        form: {
+          type: '',
+          code: '',
+          type1: ''
+        },
+
+        showEditFlag: false
+      };
+    },
+    computed: {
+      // 是否开启响应式布局
+      styleResponsive() {
+        return this.$store.state.theme.styleResponsive;
+      }
+    },
+    components: {
+      headerTitle
+    },
+    created() {},
+    methods: {
+      async open() {
+        this.list = await selectTreeList();
+        this.setTree(this.list);
+        this.showEditFlag = true;
+      },
+      setTree(data) {
+        data.forEach((item) => {
+          item.sonDirectoryList = item.sonDirectoryList.filter(
+            (item) => item.type == 1
+          );
+          if (item.sonDirectoryList.length > 0) {
+            this.setTree(item.sonDirectoryList);
+          }
+        });
+      },
+      async typeChange(val) {
+        let data = await listParentId({
+          pageNum: 1,
+          size: 100,
+          parentId: val
+        });
+        this.options = data.list.filter((item) => item.type == 2);
+        this.form.type1 = '';
+      },
+      async type1Change(val) {
+        this.form.code = await getCode(val);
+        // let data = await pageSegment({
+        //   pageNum: 1,
+        //   size: 100,
+        //   businessCodeCategoryId: val
+        // });
+        // data.list.map((item) =>{
+        //   console.log(item,'dsds')
+        // });
+        // console.log(code, 'ds');
+        // this.options = data.list.map((item) => item.type == 2);
+      },
+      /* 保存编辑 */
+      save() {
+        this.$emit('success', this.form.code);
+        this.cancel();
+      },
+
+      cancel() {
+        this.form.type = '';
+        this.form.code = '';
+        this.showEditFlag = false;
+      }
+    }
+  };
+</script>
+<style scoped lang="scss">
+  .aaa {
+    width: 100%;
+
+    ::v-deep .upload-demo {
+      width: 100%;
+
+      .el-upload--text {
+        width: 100%;
+
+        button {
+          width: 100%;
+          background: #ffffff;
+          border: 1px solid #dbdbdb;
+          border-radius: 5px;
+        }
+      }
+
+      .el-upload-list {
+        transform: translate(10px, -39px);
+        position: absolute;
+      }
+    }
+  }
+</style>

+ 74 - 0
src/components/addDoc/index.vue

@@ -0,0 +1,74 @@
+<template>
+  <div>
+    <el-badge :value="value.length" class="item">
+      <el-button
+        icon="el-icon-plus"
+        v-if="type != 'view'"
+        type="primary"
+        @click="handleUpload"
+      >
+        上传</el-button
+      >
+      <el-button
+        icon="el-icon-view"
+        v-else
+        type="primary"
+        @click="handleUpload"
+      >
+        查看</el-button
+      >
+    </el-badge>
+
+    <file-upload @success="getFiles" ref="fileUploadRef"></file-upload>
+  </div>
+</template>
+
+<script>
+  import fileUpload from './main.vue';
+
+  export default {
+    name: 'index',
+    components: { fileUpload },
+    model: {
+      prop: 'value',
+      event: 'updateVal'
+    },
+    props: {
+      type: {
+        type: String,
+        default: ''
+      },
+      value: {
+        type: Array,
+        default: () => {
+          return [];
+        }
+      }
+    },
+    data() {
+      return {
+        selectVal: ''
+      };
+    },
+    watch: {
+      value: {
+        handler(newVal) {
+          console.log(newVal, '=======');
+          this.selectVal = newVal || [];
+        },
+        immediate: true
+      }
+    },
+    created() {},
+    methods: {
+      handleUpload() {
+        this.$refs.fileUploadRef.open(this.selectVal, this.type);
+      },
+      getFiles(val = []) {
+        this.$emit('updateVal', val);
+      }
+    }
+  };
+</script>
+
+<style scoped lang="scss"></style>

+ 214 - 0
src/components/addDoc/main.vue

@@ -0,0 +1,214 @@
+<template>
+  <ele-modal
+    width="60%"
+    :visible.sync="showEditFlag"
+    :close-on-click-modal="false"
+    custom-class="ele-dialog-form"
+    append-to-body
+    ref="Emodal"
+  >
+    <!-- 数据表格 -->
+    <ele-pro-table
+      ref="table"
+      :columns="columns"
+      :datasource="tableList"
+      tool-class="ele-toolbar-form"
+      :needPage="false"
+      row-key="id"
+    >
+      <template v-slot:toolbar v-if="type != 'view'">
+        <el-button type="primary" @click="fileEditOpen">本地上传</el-button>
+        <el-button type="primary" @click="fileShow = true">
+          关联文档库
+        </el-button>
+      </template>
+      <!-- 操作列 -->
+      <template v-slot:action="{ row }">
+        <el-link
+          type="primary"
+          :underline="false"
+          icon="el-icon-edit"
+          @click="browseOpen(row)"
+        >
+          浏览
+        </el-link>
+
+        <el-popconfirm
+          v-if="type != 'view'"
+          class="ele-action"
+          title="确定要删除吗?"
+          @confirm="remove(row)"
+        >
+          <template v-slot:reference>
+            <el-link type="danger" :underline="false" icon="el-icon-delete">
+              删除
+            </el-link>
+          </template>
+        </el-popconfirm>
+      </template>
+    </ele-pro-table>
+    <template v-slot:footer>
+      <el-button @click="showEditFlag = false">取消</el-button>
+      <el-button type="primary" @click="addFile" v-if="type != 'view'">
+        确认
+      </el-button>
+    </template>
+    <fileEdit ref="fileEditRef" @done="done"></fileEdit>
+    <ele-modal
+      width="80%"
+      :visible.sync="fileShow"
+      :close-on-click-modal="false"
+      custom-class="ele-dialog-form"
+      append-to-body
+    >
+      <doc_template
+        :disabledTableList="tableList"
+        ref="doc_templateRef"
+      ></doc_template>
+      <template v-slot:footer>
+        <el-button @click="fileShow = false">取消</el-button>
+        <el-button type="primary" @click="addTemplate"> 确认 </el-button>
+      </template>
+    </ele-modal>
+    <browse ref="browseRef"></browse>
+  </ele-modal>
+</template>
+
+<script>
+import doc_template from './doc_template.vue';
+import fileEdit from './file-edit.vue';
+import browse from './browse.vue';
+import { queryIds } from './api';
+
+export default {
+  components: { doc_template, fileEdit, browse },
+
+  data() {
+    return {
+      fileId: [],
+      fileShow: false,
+      showEditFlag: false,
+      tableList: [],
+      type: 'add',
+      columns: [
+        {
+          label: '编码',
+          prop: 'code',
+          width: 180,
+          align: 'center',
+          showOverflowTooltip: true
+        },
+        {
+          prop: 'name',
+          label: '文档名称',
+          align: 'center',
+          slot: 'name',
+          showOverflowTooltip: true,
+          minWidth: 200
+        },
+        {
+          prop: 'storagePath',
+          label: '文件名称',
+          align: 'center',
+
+          showOverflowTooltip: true,
+          minWidth: 200,
+          formatter: (_row, _column, cellValue) => {
+            return cellValue && cellValue[0]?.name;
+          }
+        },
+        {
+          prop: 'version',
+          label: '版本',
+          align: 'center',
+          showOverflowTooltip: true,
+          minWidth: 100
+        },
+
+        {
+          prop: 'createUserName',
+          label: '创建人',
+          align: 'center',
+          showOverflowTooltip: true,
+          minWidth: 100
+        },
+        {
+          prop: 'createTime',
+          label: '创建时间',
+          align: 'center',
+          showOverflowTooltip: true,
+          minWidth: 160
+        },
+
+        {
+          prop: 'sizeUnit',
+          label: '文档大小',
+          align: 'center',
+          showOverflowTooltip: true,
+          minWidth: 100
+        },
+
+        {
+          columnKey: 'action',
+          label: '操作',
+          width: 200,
+          align: 'center',
+          resizable: false,
+          slot: 'action',
+          showOverflowTooltip: true
+        }
+      ]
+    };
+  },
+  created() {},
+
+  methods: {
+    open(fileId, type) {
+      //查看详情:view 新增:add
+      this.showEditFlag = true;
+      this.fileId = fileId || [];
+      if (type) {
+        this.type = type;
+      }
+      this.init();
+    },
+    fileEditOpen() {
+      this.$refs.fileEditRef.open();
+    },
+    remove(row) {
+      this.tableList = this.tableList.filter((item) => item.code != row.code);
+      this.fileId = this.tableList.map((item) => item.id);
+    },
+    async init() {
+      if (this.fileId.length > 0) {
+        this.tableList = await queryIds({ ids: "'" + this.fileId + "'" });
+      } else {
+        this.tableList = [];
+      }
+    },
+    done(id) {
+      this.fileId.push(...id);
+      this.init();
+    },
+    browseOpen(row) {
+      this.$refs.browseRef.open(row);
+    },
+    addFile() {
+      this.$emit(
+        'success',
+        this.tableList.map((item) => item.id)
+      );
+      this.showEditFlag = false;
+    },
+    addTemplate() {
+      let list = this.$refs.doc_templateRef.getTableList();
+      this.fileShow = false;
+      if (list.length == 0) {
+        this.$message.error('请选择一条数据');
+        return;
+      }
+      this.tableList.push(...list);
+    }
+  }
+};
+</script>

+ 65 - 0
src/components/addDoc/util.js

@@ -0,0 +1,65 @@
+import store from '@/store';
+const userId = store.state.user.info.userId
+const userName = store.state.user.info.name
+export function isPower(data = {}, power, selection = []) {
+
+    if (power == 'add' && data.userAuthority.length == 0) { //文件夹默认开放新增权限
+        return true
+    }
+    if (!data?.id && selection.length == 0) {
+        return false
+
+    }
+    if (power == 'checkEnter' && data?.checkOutUserId != userId) { //检入特殊处理
+        return false
+    }
+    if (selection.length > 0) { //多选情况处理
+        let isPower = true
+        let userAuthorityS = []
+        let createUserIdS = selection.map(item => item.createUserId).filter(createUserId => createUserId == userId)
+        if (createUserIdS.length == selection.length || userName == 'admin') {
+            return true
+        }
+        selection.forEach(val => {
+            const powerObj = val.userAuthority.find(item => item.id == userId)
+            if (powerObj) {
+                userAuthorityS.push(powerObj)
+            }
+        })
+
+        if (userAuthorityS.length == 0) {
+            isPower = false
+        }
+        userAuthorityS.forEach(item => {
+            if (item[power] != '1') {
+                isPower = false
+            }
+        })
+        return isPower
+    }
+
+    if (data.createUserId == userId || userName == 'admin') { //创建人/admin所有权限
+        return true
+    }
+    if (!power) {
+        return false
+    }
+    const powerObj = data.userAuthority.find(item => item.id == userId)
+    if (powerObj) {
+
+        return powerObj[power] == '1'
+    }
+}
+
+export function setFolderList(data) { //递归过滤文件夹权限
+    data.forEach((item) => {
+        item['disabled'] = !isPower(item, 'add');
+        if (item.sonDirectoryList && item.sonDirectoryList.length > 0) {
+            setFolderList(item.sonDirectoryList);
+        }
+    });
+}
+//新迪预览工具支持的文件格式
+export function getFileType() {
+    return ['par', 'asm', 'psm', 'dft', 'sldprt', 'sldasm', 'ipt', 'iam', 'prt', '3dxml', 'CATPart', 'CATProduct', 'cgr', 'model', 'exp', 'session', 'x_t', 'xmt_txt', 'x_b', 'xmp_bin', 'xmp_txt', 'sat', 'sab', 'igs', 'iges', 'stp', 'step', 'jt', 'xcgm', '3dm', 'stl', 'obj', '3mf', 'fbx', 'vda', 'dxf', 'dwg', 'pdf', 'idf', 'idb', 'emn', 'brd']
+}

+ 1 - 1
src/views/cuttingPlan/components/plan-edit-dialog.vue

@@ -303,7 +303,7 @@
     getById
   } from '@/api/cuttingPlan/index';
   import ProductionVersion from '@/components/CreatePlan/ProductionVersion2.vue';
-  import fileUpload from '@/components/upload/fileUpload';
+  import fileUpload from '@/components/addDoc/index.vue';
   import timeDialog from './timeDialog';
   import dictMixins from '@/mixins/dictMixins';
   export default {

+ 1 - 1
src/views/cuttingPlan/components/producePlan.vue

@@ -304,7 +304,7 @@
     getById
   } from '@/api/materialPlan/index';
   import ProductionVersion from '@/components/CreatePlan/ProductionVersion2.vue';
-  import fileUpload from '@/components/upload/fileUpload';
+  import fileUpload from '@/components/addDoc/index.vue';
   import timeDialog from './timeDialog';
   import dictMixins from '@/mixins/dictMixins';
   export default {

+ 30 - 11
src/views/materialPlan/components/plan-edit-dialog.vue

@@ -220,7 +220,10 @@ import {
   getById
 } from '@/api/materialPlan/index';
 import ProductionVersion from '@/components/CreatePlan/ProductionVersion2.vue';
-import fileUpload from '@/components/upload/fileUpload';
+
+import { getCode } from '@/api/codeManagement';
+
+import fileUpload from '@/components/addDoc/index.vue';
 import timeDialog from './timeDialog.vue';
 import dictMixins from '@/mixins/dictMixins';
 export default {
@@ -577,6 +580,9 @@ export default {
 
       if (this.type == 'add') {
         this.formData.demandType = '1';
+        const name = await getCode('purchase_apply_plan_name');
+        console.log(name, 'name')
+        this.formData.name = name;
       }
 
       this.formData.orderType = 1;
@@ -600,9 +606,7 @@ export default {
         if (res.salesOrderList) {
           this.$refs.table.setData([...res.salesOrderList]);
           // 展开所有行
-          this.expandedRowKeys = this.$refs.table
-            .getData()
-            ?.map((item) => item.id);
+          this.expandedRowKeys = this.$refs.table.getData()?.map((item) => item.id).filter(id => id != null);
         }
 
         this.$nextTick(() => {
@@ -618,11 +622,20 @@ export default {
     },
     chooseOrder(list) {
       let salesOrderIds = [];
-      list.map((m) => {
+
+      const tableList = this.$refs.table.getData() || [];
+      const existingIds = tableList.map(item => item.id);
+
+      console.log(existingIds, '获取已存在的ID')
+
+      const list1 = list.filter(item => !existingIds.includes(item.id));
+      if (list1.length === 0) {
+        this.$message.warning('所选订单已存在');
+        return;
+      }
+
+      list1.forEach((m) => {
         salesOrderIds.push(m.id);
-        return {
-          ...m
-        };
       });
 
       if (salesOrderIds.length > 0) {
@@ -636,12 +649,18 @@ export default {
                 });
               }
             });
-            console.log(res, 'res')
-            this.$refs.table.setData([...this.tableData, ...res]);
+
+            const finalData = res.filter(item =>
+              !tableList.some(existing => existing.id === item.id)
+            );
+
+            console.log(finalData, 'finalData')
+
+            this.$refs.table.setData([...tableList, ...finalData]);
 
             this.$nextTick(() => {
+              this.expandedRowKeys = this.$refs.table.getData().map(item => item.id);
               this.$refs.table.toggleRowExpansionAll();
-              this.$forceUpdate();
             });
           }
         );

+ 25 - 5
src/views/materialPlan/components/produceOrder.vue

@@ -5,7 +5,8 @@
       <productionPlanSearch @search="reload" ref="searchRef" :statusOpt="statusOpt" :planType="planType"
         :activeName="activeName" />
       <!-- 数据表格 -->
-      <ele-pro-table ref="table" :columns="columns" :datasource="datasource" :selection.sync="selection" row-key="id">
+      <ele-pro-table ref="table" :initLoad="false" :columns="columns" :datasource="datasource"
+        :selection.sync="selection" row-key="id">
       </ele-pro-table>
     </el-card>
 
@@ -346,6 +347,7 @@ export default {
       }
 
       this.visible = true;
+      this.reload({ page: 1 });
     },
 
     /* 表格数据源 */
@@ -363,8 +365,9 @@ export default {
     /* 刷新表格 */
     reload(where) {
       this.$nextTick(() => {
-        this.$refs.table.reload({ page: 1, where });
-      });
+        if (this.$refs.table && this.$refs.table.reload)
+          this.$refs.table.reload({ page: 1, where: where });
+      })
     },
 
     handleClose() {
@@ -377,8 +380,25 @@ export default {
         this.$message.error('请至少选择一条数据');
         return;
       }
-      this.$emit('chooseOrder', this.selection);
-      this.handleClose();
+
+      const selectedIds = new Set(this.selection.map((item) => item.code));
+      const hasIds = this.tableData.some((item) =>
+        selectedIds.has(item.code)
+      );
+
+      if (hasIds) {
+        this.$confirm('您勾选了已存在的数据,是否继续?', '提示', {
+          type: 'warning'
+        })
+          .then(() => {
+            this.$emit('chooseOrder', this.selection);
+            this.handleClose();
+          })
+          .catch(() => { });
+      } else {
+        this.$emit('chooseOrder', this.selection);
+        this.handleClose();
+      }
     }
   }
 };

+ 34 - 19
src/views/materialPlan/components/producePlan.vue

@@ -30,7 +30,7 @@
     </el-form>
 
     <el-form :model="formData" ref="tableForm">
-      <ele-pro-table ref="table" :needPage="false" :columns="columns" row-key="id">
+      <ele-pro-table ref="table" :needPage="false" :columns="columns" row-key="id" :expanded-row-keys="expandedRowKeys">
         <template v-slot:toolbar>
           <el-button size="small" type="primary" icon="el-icon-plus" class="ele-btn-icon" @click="produceAdd"
             v-if="type != 'detail'">
@@ -79,7 +79,7 @@
               margin-left: 95px;
             " v-if="row.materialList.length > 0">
             <ele-pro-table :toolbar="false" toolsTheme="none" ref="table2" :need-page="false"
-              :datasource="row.materialList" :columns="columns2" :key="row.categoryId + '-' + $index"
+              :datasource="row.materialList" :columns="columns2" :key="row.sort + '-' + row.materialList.sort"
               @selection-change="handleSelectionChange">
               <template v-slot:sort="{ $index }">
                 {{ $index + 1 }}
@@ -225,9 +225,11 @@ import {
   getById
 } from '@/api/materialPlan/index';
 import ProductionVersion from '@/components/CreatePlan/ProductionVersion2.vue';
-import fileUpload from '@/components/upload/fileUpload';
+import fileUpload from '@/components/addDoc/index.vue';
 import timeDialog from './timeDialog';
 import dictMixins from '@/mixins/dictMixins';
+
+import { getCode } from '@/api/codeManagement';
 export default {
   components: {
     produceOrder,
@@ -574,6 +576,9 @@ export default {
 
       if (this.type == 'add') {
         this.formData.demandType = '1';
+        const name = await getCode('purchase_apply_plan_name');
+        // console.log(name, 'name')
+        this.formData.name = name;
       }
       this.formData.orderType = 2;
       this.visible = true;
@@ -596,9 +601,7 @@ export default {
         if (res.salesOrderList) {
           this.$refs.table.setData([...res.salesOrderList]);
           // 展开所有行
-          this.expandedRowKeys = this.$refs.table
-            .getData()
-            ?.map((item) => item.id);
+          this.expandedRowKeys = this.$refs.table.getData()?.map((item) => item.id).filter(id => id != null);
         }
 
         this.$nextTick(() => {
@@ -613,17 +616,26 @@ export default {
     },
     chooseOrder(list) {
       let planIds = [];
-      list.map((m) => {
+
+      const tableList = this.$refs.table.getData() || [];
+      const existingIds = tableList.map(item => item.id);
+
+      console.log(existingIds, '获取已存在的ID')
+
+      const list1 = list.filter(item => !existingIds.includes(item.id));
+      if (list1.length === 0) {
+        this.$message.warning('所选数据已存在');
+        return;
+      }
+
+      list1.forEach((m) => {
         planIds.push(m.id);
-        delete m.id;
-        return {
-          ...m
-        };
       });
 
       if (planIds.length > 0) {
-        listBomByPlanIdsOverride({ planIds: planIds }).then((res) => {
+        listBomByPlanIdsOverride({ planIds: planIds, demandType: this.formData.demandType }).then((res) => {
           res.forEach((m) => {
+            console.log(m, 'm');
             if (m.materialList.length > 0) {
               m.materialList.forEach((p) => {
                 p.detailId = m.id;
@@ -631,11 +643,16 @@ export default {
             }
           });
 
-          this.$refs.table.setData([...this.tableData, ...res]);
+          const finalData = res.filter(item =>
+            !tableList.some(existing => existing.id === item.id)
+          );
+          console.log(finalData, 'finalData')
+
+          this.$refs.table.setData([...tableList, ...finalData]);
 
           this.$nextTick(() => {
+            this.expandedRowKeys = this.$refs.table.getData().map(item => item.id);
             this.$refs.table.toggleRowExpansionAll();
-            this.$forceUpdate();
           });
         });
       }
@@ -657,7 +674,7 @@ export default {
           ...m
         };
       });
-
+      console.log(data, 'data');
       let tableList = [];
       tableList = this.$refs.table.getData();
 
@@ -706,7 +723,7 @@ export default {
     },
     changeProduct(data) {
       let param = {
-        salesOrderIds: [this.xsId],
+        planIds: [this.xsId],
         produceRoutingId: data.id
       };
 
@@ -717,15 +734,13 @@ export default {
         tableList
           .forEach((e) => {
             if (e.id == this.xsId) {
-              res.map((m) => {
+              e.materialList = res.map((m) => {
                 m.detailId = this.xsId;
                 return {
                   ...m
                 };
               });
 
-              e.materialList = res;
-
               this.$nextTick(() => {
                 this.$refs.table.setData([...tableList]);
                 this.$refs.table.toggleRowExpansionAll();

+ 0 - 8
src/views/materialPlan/components/saleOrderPop.vue

@@ -327,14 +327,6 @@ export default {
         this.handleClose();
       }
     }
-    // selected() {
-    //   if (!this.selection.length) {
-    //     this.$message.error('请至少选择一条数据');
-    //     return;
-    //   }
-    //   this.$emit('chooseOrder', this.selection);
-    //   this.handleClose();
-    // }
   }
 };
 </script>

+ 208 - 291
src/views/productionPlan/components/productionPlan-search.vue

@@ -1,66 +1,51 @@
 <!-- 搜索表单 -->
 <template>
-  <el-form
-    class="ele-form-search"
-    @keyup.enter.native="search"
-    @submit.native.prevent
-  >
+  <el-form 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="计划编号:">-->
-<!--          <el-input-->
-<!--            size="mini"-->
-<!--            clearable-->
-<!--            v-model="where.code"-->
-<!--            placeholder="请输入"-->
-<!--          />-->
-<!--        </el-form-item>-->
-<!--      </el-col>-->
-<!--      <el-col v-bind="styleResponsive ? { lg: 6, md: 12 } : { span: 6 }">-->
-<!--        <el-form-item label="产品编码:">-->
-<!--          <el-input-->
-<!--            size="mini"-->
-<!--            clearable-->
-<!--            v-model="where.productCode"-->
-<!--            placeholder="请输入"-->
-<!--          />-->
-<!--        </el-form-item>-->
-<!--      </el-col>-->
-<!--      <el-col v-bind="styleResponsive ? { lg: 6, md: 12 } : { span: 6 }">-->
-<!--        <el-form-item label="牌号:" label-width="80px">-->
-<!--          <el-input-->
-<!--            size="mini"-->
-<!--            clearable-->
-<!--            v-model="where.brandNo"-->
-<!--            placeholder="请输入"-->
-<!--          />-->
-<!--        </el-form-item>-->
-<!--      </el-col>-->
-<!--      <el-col v-bind="styleResponsive ? { lg: 6, md: 12 } : { span: 6 }">-->
-<!--        <el-form-item label="型号:" label-width="80px">-->
-<!--          <el-input-->
-<!--            size="mini"-->
-<!--            clearable-->
-<!--            v-model="where.model"-->
-<!--            placeholder="请输入"-->
-<!--          />-->
-<!--        </el-form-item>-->
-<!--      </el-col>-->
+      <!--      <el-col v-bind="styleResponsive ? { lg: 6, md: 12 } : { span: 6 }">-->
+      <!--        <el-form-item label="计划编号:">-->
+      <!--          <el-input-->
+      <!--            size="mini"-->
+      <!--            clearable-->
+      <!--            v-model="where.code"-->
+      <!--            placeholder="请输入"-->
+      <!--          />-->
+      <!--        </el-form-item>-->
+      <!--      </el-col>-->
+      <!--      <el-col v-bind="styleResponsive ? { lg: 6, md: 12 } : { span: 6 }">-->
+      <!--        <el-form-item label="产品编码:">-->
+      <!--          <el-input-->
+      <!--            size="mini"-->
+      <!--            clearable-->
+      <!--            v-model="where.productCode"-->
+      <!--            placeholder="请输入"-->
+      <!--          />-->
+      <!--        </el-form-item>-->
+      <!--      </el-col>-->
+      <!--      <el-col v-bind="styleResponsive ? { lg: 6, md: 12 } : { span: 6 }">-->
+      <!--        <el-form-item label="牌号:" label-width="80px">-->
+      <!--          <el-input-->
+      <!--            size="mini"-->
+      <!--            clearable-->
+      <!--            v-model="where.brandNo"-->
+      <!--            placeholder="请输入"-->
+      <!--          />-->
+      <!--        </el-form-item>-->
+      <!--      </el-col>-->
+      <!--      <el-col v-bind="styleResponsive ? { lg: 6, md: 12 } : { span: 6 }">-->
+      <!--        <el-form-item label="型号:" label-width="80px">-->
+      <!--          <el-input-->
+      <!--            size="mini"-->
+      <!--            clearable-->
+      <!--            v-model="where.model"-->
+      <!--            placeholder="请输入"-->
+      <!--          />-->
+      <!--        </el-form-item>-->
+      <!--      </el-col>-->
       <el-col v-bind="styleResponsive ? { lg: 3, md: 12 } : { span: 3 }">
         <el-form-item label="计划类型:" label-width="80px">
-          <el-select
-            size="mini"
-            clearable
-            v-model="where.planType"
-            placeholder="请选择"
-            class="w100"
-          >
-            <el-option
-              v-for="item in planType"
-              :label="item.label"
-              :value="item.value"
-              :key="item.value"
-            ></el-option>
+          <el-select size="mini" clearable v-model="where.planType" placeholder="请选择" class="w100">
+            <el-option v-for="item in planType" :label="item.label" :value="item.value" :key="item.value"></el-option>
           </el-select>
         </el-form-item>
       </el-col>
@@ -81,151 +66,110 @@
           </el-select>
         </el-form-item>
       </el-col> -->
-<!--      <el-col-->
-<!--        v-bind="styleResponsive ? { lg: 6, md: 12 } : { span: 6 }"-->
-<!--        v-if="activeName == 'second'"-->
-<!--      >-->
-<!--        <el-form-item label-width="150px">-->
-<!--          <template slot="label">-->
-<!--            <el-select-->
-<!--              size="mini"-->
-<!--              v-model="deliveryVal"-->
-<!--              @change="-->
-<!--                () => {-->
-<!--                  where.deliveryTime = [];-->
-<!--                  where.formingTime = [];-->
-<!--                }-->
-<!--              "-->
-<!--            >-->
-<!--              <el-option label="预测交货日期" value="deliveryTime"></el-option>-->
-<!--              <el-option label="实际交货日期" value="formingTime"></el-option>-->
-<!--            </el-select>-->
-<!--          </template>-->
-<!--          <el-date-picker-->
-<!--            size="mini"-->
-<!--            class="w100"-->
-<!--            v-model="where[deliveryVal]"-->
-<!--            type="daterange"-->
-<!--            range-separator="至"-->
-<!--            start-placeholder="开始日期"-->
-<!--            end-placeholder="结束日期"-->
-<!--            value-format="yyyy-MM-dd HH:mm:ss"-->
-<!--            :default-time="['00:00:00', '23:59:59']"-->
-<!--          >-->
-<!--          </el-date-picker>-->
-<!--        </el-form-item>-->
-<!--      </el-col>-->
+      <!--      <el-col-->
+      <!--        v-bind="styleResponsive ? { lg: 6, md: 12 } : { span: 6 }"-->
+      <!--        v-if="activeName == 'second'"-->
+      <!--      >-->
+      <!--        <el-form-item label-width="150px">-->
+      <!--          <template slot="label">-->
+      <!--            <el-select-->
+      <!--              size="mini"-->
+      <!--              v-model="deliveryVal"-->
+      <!--              @change="-->
+      <!--                () => {-->
+      <!--                  where.deliveryTime = [];-->
+      <!--                  where.formingTime = [];-->
+      <!--                }-->
+      <!--              "-->
+      <!--            >-->
+      <!--              <el-option label="预测交货日期" value="deliveryTime"></el-option>-->
+      <!--              <el-option label="实际交货日期" value="formingTime"></el-option>-->
+      <!--            </el-select>-->
+      <!--          </template>-->
+      <!--          <el-date-picker-->
+      <!--            size="mini"-->
+      <!--            class="w100"-->
+      <!--            v-model="where[deliveryVal]"-->
+      <!--            type="daterange"-->
+      <!--            range-separator="至"-->
+      <!--            start-placeholder="开始日期"-->
+      <!--            end-placeholder="结束日期"-->
+      <!--            value-format="yyyy-MM-dd HH:mm:ss"-->
+      <!--            :default-time="['00:00:00', '23:59:59']"-->
+      <!--          >-->
+      <!--          </el-date-picker>-->
+      <!--        </el-form-item>-->
+      <!--      </el-col>-->
       <el-col v-bind="styleResponsive ? { lg: 6, md: 12 } : { span: 6 }">
         <el-form-item label="" label-width="150px">
           <template slot="label">
-            <el-select
-              size="mini"
-              v-model="shapeVal"
-              @change="
-                () => {
-                  where.reqMoldTime = [];
-                  where.planFormingTime = [];
-                  where.formingTime = [];
-                }
-              "
-            >
+            <el-select size="mini" v-model="shapeVal" @change="
+              () => {
+                where.reqMoldTime = [];
+                where.planFormingTime = [];
+                where.formingTime = [];
+              }
+            ">
               <el-option label="要求完成日期" value="reqMoldTime"></el-option>
-              <el-option
-                label="计划交付日期"
-                value="planDeliveryTime"
-              ></el-option>
+              <el-option label="计划交付日期" value="planDeliveryTime"></el-option>
               <!-- <el-option label="实际生产日期" value="formingTime"></el-option> -->
             </el-select>
           </template>
-          <el-date-picker
-            size="mini"
-            class="w100"
-            v-model="where[shapeVal]"
-            type="daterange"
-            range-separator="至"
-            start-placeholder="开始日期"
-            end-placeholder="结束日期"
-            value-format="yyyy-MM-dd HH:mm:ss"
-            :default-time="['00:00:00', '23:59:59']"
-          >
+          <el-date-picker size="mini" class="w100" v-model="where[shapeVal]" type="daterange" range-separator="至"
+            start-placeholder="开始日期" end-placeholder="结束日期" value-format="yyyy-MM-dd HH:mm:ss"
+            :default-time="['00:00:00', '23:59:59']">
           </el-date-picker>
         </el-form-item>
       </el-col>
-<!--      <el-col-->
-<!--        v-bind="styleResponsive ? { lg: 9, md: 12 } : { span: 9 }"-->
-<!--        v-if="activeName == 'second'"-->
-<!--      >-->
-<!--        <el-form-item label="工单发布时间:" label-width="150px">-->
-<!--          <el-date-picker-->
-<!--            class="w100"-->
-<!--            size="mini"-->
-<!--            v-model="where.releaseTime"-->
-<!--            type="daterange"-->
-<!--            range-separator="至"-->
-<!--            start-placeholder="开始日期"-->
-<!--            end-placeholder="结束日期"-->
-<!--            value-format="yyyy-MM-dd HH:mm:ss"-->
-<!--            :default-time="['00:00:00', '23:59:59']"-->
-<!--          >-->
-<!--          </el-date-picker>-->
-<!--        </el-form-item>-->
-<!--      </el-col>-->
+      <!--      <el-col-->
+      <!--        v-bind="styleResponsive ? { lg: 9, md: 12 } : { span: 9 }"-->
+      <!--        v-if="activeName == 'second'"-->
+      <!--      >-->
+      <!--        <el-form-item label="工单发布时间:" label-width="150px">-->
+      <!--          <el-date-picker-->
+      <!--            class="w100"-->
+      <!--            size="mini"-->
+      <!--            v-model="where.releaseTime"-->
+      <!--            type="daterange"-->
+      <!--            range-separator="至"-->
+      <!--            start-placeholder="开始日期"-->
+      <!--            end-placeholder="结束日期"-->
+      <!--            value-format="yyyy-MM-dd HH:mm:ss"-->
+      <!--            :default-time="['00:00:00', '23:59:59']"-->
+      <!--          >-->
+      <!--          </el-date-picker>-->
+      <!--        </el-form-item>-->
+      <!--      </el-col>-->
 
-<!--      <el-col v-bind="styleResponsive ? { lg: 6, md: 6 } : { span: 6 }">-->
-<!--        <el-form-item label="组织机构:">-->
-<!--          <auth-selection-->
-<!--            size="mini"-->
-<!--            data-type="Array"-->
-<!--            v-model="where.deptIds"-->
-<!--          ></auth-selection>-->
-<!--        </el-form-item>-->
-<!--      </el-col>-->
+      <!--      <el-col v-bind="styleResponsive ? { lg: 6, md: 6 } : { span: 6 }">-->
+      <!--        <el-form-item label="组织机构:">-->
+      <!--          <auth-selection-->
+      <!--            size="mini"-->
+      <!--            data-type="Array"-->
+      <!--            v-model="where.deptIds"-->
+      <!--          ></auth-selection>-->
+      <!--        </el-form-item>-->
+      <!--      </el-col>-->
 
       <el-col v-bind="styleResponsive ? { lg: 3, md: 6 } : { span: 3 }">
         <el-form-item label-width="80px" label="加工方式:">
-          <el-select
-                  size="mini"
-                  clearable
-                  v-model="where.produceType"
-                  placeholder="请选择"
-                  class="w100"
-          >
-            <el-option
-                    v-for="item in productTypeList"
-                    :label="item.name"
-                    :value="item.code"
-                    :key="item.code"
-            ></el-option>
+          <el-select size="mini" clearable v-model="where.produceType" placeholder="请选择" class="w100">
+            <el-option v-for="item in productTypeList" :label="item.name" :value="item.code"
+              :key="item.code"></el-option>
           </el-select>
         </el-form-item>
       </el-col>
       <el-col v-bind="styleResponsive ? { lg: 3, md: 12 } : { span: 3 }">
         <el-form-item>
-          <el-input
-            size="mini"
-            clearable
-            v-model="where.searchInfo"
-            placeholder="请输入查询信息"
-          />
+          <el-input size="mini" clearable v-model="where.searchInfo" placeholder="请输入查询信息" />
         </el-form-item>
       </el-col>
       <el-col v-bind="styleResponsive ? { lg: 6, md: 6 } : { span: 6 }">
         <div class="ele-form-actions">
-          <el-button
-            type="primary"
-            icon="el-icon-search"
-            size="mini"
-            @click="search"
-          >
+          <el-button type="primary" icon="el-icon-search" size="mini" @click="search">
             查询
           </el-button>
-          <el-button
-            @click="reset"
-            icon="el-icon-refresh-left"
-            size="mini"
-            type="primary"
-            >重置</el-button
-          >
+          <el-button @click="reset" icon="el-icon-refresh-left" size="mini" type="primary">重置</el-button>
           <el-dropdown trigger="click">
             <span class="el-dropdown-link">
               展开<i class="el-icon-arrow-down el-icon--right"></i>
@@ -234,42 +178,22 @@
               <div class="searchExpend">
                 <el-row>
                   <el-form-item label="计划编号:" label-width="80px">
-                    <el-input
-                      size="mini"
-                      clearable
-                      v-model="where.code"
-                      placeholder="请输入"
-                    />
+                    <el-input size="mini" clearable v-model="where.code" placeholder="请输入" />
                   </el-form-item>
                 </el-row>
                 <el-row>
                   <el-form-item label="产品编码:" label-width="80px">
-                    <el-input
-                      size="mini"
-                      clearable
-                      v-model="where.productCode"
-                      placeholder="请输入"
-                    />
+                    <el-input size="mini" clearable v-model="where.productCode" placeholder="请输入" />
                   </el-form-item>
                 </el-row>
                 <el-row>
                   <el-form-item label="牌号:" label-width="80px">
-                    <el-input
-                      size="mini"
-                      clearable
-                      v-model="where.brandNo"
-                      placeholder="请输入"
-                    />
+                    <el-input size="mini" clearable v-model="where.brandNo" placeholder="请输入" />
                   </el-form-item>
                 </el-row>
                 <el-row>
                   <el-form-item label="型号:" label-width="80px">
-                    <el-input
-                      size="mini"
-                      clearable
-                      v-model="where.model"
-                      placeholder="请输入"
-                    />
+                    <el-input size="mini" clearable v-model="where.model" placeholder="请输入" />
                   </el-form-item>
                 </el-row>
                 <!-- <el-row v-if="activeName == 'second'">
@@ -305,17 +229,9 @@
                 </el-row> -->
                 <el-row v-if="activeName == 'second'">
                   <el-form-item label="工单发布时间:" label-width="150px">
-                    <el-date-picker
-                      class="w100"
-                      size="mini"
-                      v-model="where.releaseTime"
-                      type="daterange"
-                      range-separator="至"
-                      start-placeholder="开始日期"
-                      end-placeholder="结束日期"
-                      value-format="yyyy-MM-dd HH:mm:ss"
-                      :default-time="['00:00:00', '23:59:59']"
-                    >
+                    <el-date-picker class="w100" size="mini" v-model="where.releaseTime" type="daterange"
+                      range-separator="至" start-placeholder="开始日期" end-placeholder="结束日期"
+                      value-format="yyyy-MM-dd HH:mm:ss" :default-time="['00:00:00', '23:59:59']">
                     </el-date-picker>
                   </el-form-item>
                 </el-row>
@@ -329,88 +245,89 @@
 </template>
 
 <script>
-  export default {
-    props: ['activeName', 'statusOpt', 'planType'],
-    data() {
-      // 默认表单数据
-      const defaultWhere = {
-        code: '',
-        productCode: '',
-        status: '',
-        model: '',
-        brandNo: '',
-        planType: '',
-        deptIds: [],
-        releaseTime: [],
-        deliveryTime: [],
-        formingTime: [],
-        reqMoldTime: [],
-        // planFormingTime: [],
-        executeUserName: '',
-        searchInfo: '',
-      };
-      return {
-        // 表单数据
-        deliveryVal: 'deliveryTime',
-        shapeVal: 'reqMoldTime',
-        where: { ...defaultWhere },
-        treeData: [],
-        productTypeList: [
-          { code: 1, name: '加工(MBOM)' },
-          { code: 3, name: '装配(ABOM)' },
-        ],
-      };
-    },
-    computed: {
-      // 是否开启响应式布局
-      styleResponsive() {
-        return this.$store.state.theme.styleResponsive;
-      }
-    },
-    watch: {
-      activeName: {
-        handler() {
-          if (this.activeName) {
-            this.where.status = this.statusOpt[this.activeName][0].value;
-            this.reset();
-          }
-        },
-        immediate: true
-      }
-    },
-    created() {},
-    methods: {
-      /* 搜索 */
-      search() {
-        const where = { ...this.where };
-        for (const key in where) {
-          if (Array.isArray(where[key]) && key !== 'deptIds') {
-            where[`${key}End`] = where[key][1];
-            where[key] = where[key][0];
-          }
+export default {
+  props: ['activeName', 'statusOpt', 'planType'],
+  data() {
+    // 默认表单数据
+    const defaultWhere = {
+      code: '',
+      productCode: '',
+      status: '',
+      model: '',
+      brandNo: '',
+      planType: '',
+      deptIds: [],
+      releaseTime: [],
+      deliveryTime: [],
+      formingTime: [],
+      reqMoldTime: [],
+      // planFormingTime: [],
+      executeUserName: '',
+      searchInfo: '',
+    };
+    return {
+      // 表单数据
+      deliveryVal: 'deliveryTime',
+      shapeVal: 'reqMoldTime',
+      where: { ...defaultWhere },
+      treeData: [],
+      productTypeList: [
+        { code: 1, name: '加工(MBOM)' },
+        { code: 3, name: '装配(ABOM)' },
+      ],
+    };
+  },
+  computed: {
+    // 是否开启响应式布局
+    styleResponsive() {
+      return this.$store.state.theme.styleResponsive;
+    }
+  },
+  watch: {
+    activeName: {
+      handler() {
+        if (this.activeName) {
+          this.where.status = this.statusOpt[this.activeName][0].value;
+          this.reset();
         }
-
-        where.status = where.status.split(',');
-
-        this.$emit('search', where);
       },
-      /*  重置 */
-      reset() {
-        this.where = { ...this.defaultWhere };
-        this.where.status = this.statusOpt[this.activeName][0].value;
-        this.search();
+      immediate: true
+    }
+  },
+  created() { },
+  methods: {
+    /* 搜索 */
+    search() {
+      const where = { ...this.where };
+      for (const key in where) {
+        if (Array.isArray(where[key]) && key !== 'deptIds') {
+          where[`${key}End`] = where[key][1];
+          where[key] = where[key][0];
+        }
       }
+
+      where.status = where.status.split(',');
+      console.log(where.status, 'status');
+      this.$emit('search', where);
+    },
+    /*  重置 */
+    reset() {
+      this.where = { ...this.defaultWhere };
+      this.where.status = this.statusOpt[this.activeName][0].value;
+      this.search();
     }
-  };
+  }
+};
 </script>
 <style lang="scss" scoped>
-  .ele-form-actions {
-    display: flex;
-    align-items: center;
-    justify-content: flex-start;
-    padding-top: 4.5px;
-  }
-  .searchExpend{
-    padding: 20px 50px 0 30px;
-  }
+.ele-form-actions {
+  display: flex;
+  align-items: center;
+  justify-content: flex-start;
+  padding-top: 4.5px;
+}
+
+.searchExpend {
+  padding: 20px 50px 0 30px;
+}
 </style>

+ 1 - 1
vue.config.js

@@ -35,7 +35,7 @@ module.exports = {
         // target: 'http://192.168.1.103:18086',
         // target: 'http://192.168.1.158:18086',
         // target: 'http://192.168.158:18086',
-        target: 'http://192.168.1.125:18086',
+        target: 'http://192.168.1.158:18086',
         // target: 'http://192.168.1.158:18086',
 
         changeOrigin: true, // 只有这个值为true的情况下 才表示开启跨域