Ver Fonte

Merge branch 'purchaseDev' of http://172.16.100.139/new-business/drp-web into purchaseDev

黄梓星 há 2 anos atrás
pai
commit
c25459d14e

+ 21 - 0
src/api/business/purchase/purchase-order.js

@@ -0,0 +1,21 @@
+import request from "@/utils/request";
+
+const list = (params) => {
+  return request({
+    url: "/pu/order",
+    method: "get",
+    params: params,
+  });
+}
+
+const orderlist = (params) => {
+  return request({
+    url: "/pu/order",
+    method: "post",
+    data: data,
+  });
+}
+
+export default {
+  orderlist,
+}

+ 6 - 5
src/views/purchase/purchase-contract/add/index.vue

@@ -46,11 +46,11 @@ export default {
     addTableRow(prop) {
       this.$notify.info({ message: prop });
       this.tabTableParams[prop].push(
-        arr2obj(
-          initTabColumns().find((element) => element.key === prop).tableColumns,
-          "key",
-          ""
-        )
+      arr2obj(
+        initTabColumns().find((element) => element.key === prop).tableColumns,
+        "key",
+        ""
+      )
       );
       console.log(this.tabTableParams);
     },
@@ -101,6 +101,7 @@ export default {
         console.log(this.currentComponent, source, this.tabTableParams);
       }
     },
+
     updateParams(prop) {
       const {
         config: { dataMapping },

+ 7 - 0
src/views/purchase/purchase-order/add/column.js

@@ -0,0 +1,7 @@
+const columns = [];
+
+export const initColumns = () => columns;
+
+const tabColumns = [];
+
+export const initTabColumns = () => tabColumns;

+ 234 - 0
src/views/purchase/purchase-order/add/index.vue

@@ -0,0 +1,234 @@
+<script>
+import { add } from "@/api/business/purchase/purchase-contract";
+import { arr2obj } from "@/utils/data-transform";
+import {
+  initDicts,
+  initRules,
+  initParams,
+  initComponents,
+} from "@/utils/init-something";
+import { initColumns, initTabColumns } from "./column";
+
+export default {
+  name: "AddPurchaseContractDrawer",
+  components: initComponents(initColumns()),
+  dicts: initDicts(initColumns()),
+  data() {
+    return {
+      visible: false,
+      columns: initColumns(),
+      rules: initRules(initColumns()),
+      params: initParams(initColumns()),
+      tabColumns: initTabColumns(),
+      tabName: "PuContractItem",
+      tabTableParams: {
+        PuContractItem: [],
+        PuContractClause: [],
+        PuContractExpense: [],
+        PuContractAgreement: [],
+        PuContractApplyOrg: [],
+      },
+      currentComponent: { name: "", title: "", value: "", row: {}, source: {} },
+    };
+  },
+  computed: {},
+  watch: {},
+  methods: {
+    beforeOpen() {
+      const { deptName, nickName, orgName } = this.$store.state.user;
+      this.params.puOrg = orgName;
+      this.params.buyer = nickName;
+      this.params.puDept = deptName;
+    },
+    setVisible(prop) {
+      this.visible = prop;
+    },
+    addTableRow(prop) {
+      this.$notify.info({ message: prop });
+      this.tabTableParams[prop].push(
+        arr2obj(
+          initTabColumns().find((element) => element.key === prop).tableColumns,
+          "key",
+          ""
+        )
+      );
+      console.log(this.tabTableParams);
+    },
+    cancel() {
+      this.setVisible(false);
+      this.params = arr2obj(this.columns, "key", "value");
+    },
+    sava() {
+      this.setVisible(false);
+    },
+    async submitSava() {
+      console.log(this.params);
+      return;
+    },
+    //
+    openAsyncInputDialog(prop, source, type) {
+      try {
+        const {
+          key,
+          title,
+          config: { componentName },
+        } = prop;
+        this.currentComponent.row = prop;
+        this.currentComponent.title = title;
+        this.currentComponent.name = componentName;
+        this.currentComponent.source = source;
+        if (type === "change") {
+          this.currentComponent.value = this.params[key];
+        }
+        if (type === "click") {
+          this.currentComponent.value = "";
+        }
+        this.$nextTick(() => {
+          const { setVisible } = this.$refs[componentName];
+          setVisible(true);
+        });
+      } catch (err) {
+        this.$notify.error({ title: "error", message: err });
+      } finally {
+        console.log(this.currentComponent, source, this.tabTableParams);
+      }
+    },
+
+    updateParams(prop) {
+      const {
+        config: { dataMapping },
+      } = this.currentComponent.row;
+      for (let key in dataMapping) {
+        this.currentComponent.source[key] = prop[dataMapping[key]];
+      }
+    },
+  },
+  created() {
+    // console.log("this,", initComponents(initColumns()));
+  },
+  mounted() { },
+  destroyed() { },
+};
+</script>
+<template>
+  <el-drawer direction="btt" size="100%" :with-header="false" :visible.sync="visible" @open="beforeOpen">
+    <el-form size="mini" label-position="right" label-width="135px" :model="params" :rules="rules">
+      <el-card :body-style="{
+        padding: '20px',
+        display: 'flex',
+        'flex-wrap': 'wrap',
+      }" style="margin: 10px">
+        <div slot="header" style="
+            display: flex;
+            justify-content: space-between;
+            align-items: center;
+          ">
+          <h3>新增</h3>
+          <div style="text-align: right">
+            <el-button size="mini" @click="cancel">取消</el-button>
+            <el-button size="mini" type="danger" @click="sava">保存</el-button>
+            <el-button size="mini" type="info" @click="submitSava">
+              保存并新增
+            </el-button>
+          </div>
+        </div>
+        <component v-if="currentComponent.name" :is="currentComponent.name" :ref="currentComponent.name"
+          :title="currentComponent.title" :value="currentComponent.value" @confirm="updateParams"></component>
+        <el-row>
+          <el-col v-for="(column, index) in columns" :key="index" :span="column.span || 6">
+            <el-form-item :prop="column.key" :label="column.title">
+              <el-input v-if="column.type === 'Input'" v-model="params[column.key]" :placeholder="column.placeholder"
+                :clearable="column.clearable" :disabled="column.disabled" style="width: 100%"></el-input>
+              <el-input v-if="column.type === 'InputDialog'" v-model="params[column.key]"
+                :placeholder="column.placeholder" :clearable="column.clearable" :disabled="column.disabled"
+                style="width: 100%" @blur="openAsyncInputDialog(column, params, 'change')"
+                @change="openAsyncInputDialog(column, params, 'change')">
+                <template #suffix>
+                  <el-icon class="el-icon-s-operation" style="cursor: pointer" @click.native.stop="
+                    openAsyncInputDialog(column, params, 'change')
+                    "></el-icon>
+                </template>
+              </el-input>
+              <el-input v-if="column.type === 'Textarea'" v-model="params[column.key]" type="textarea"
+                :placeholder="column.placeholder" :clearable="column.clearable" :disabled="column.disabled"
+                style="width: 100%"></el-input>
+              <el-input-number v-if="column.type === 'InputNumber'" v-model="params[column.key]"
+                :controls-position="column.config.controlsPosition" :placeholder="column.placeholder"
+                :clearable="column.clearable" :disabled="column.disabled" style="width: 100%"></el-input-number>
+              <el-select v-if="column.type === 'Select'" v-model="params[column.key]" :placeholder="column.placeholder"
+                :clearable="column.clearable" :disabled="column.disabled" style="width: 100%">
+                <el-option v-for="item in dict.type[column.config.optionsName]" :key="item.value" :label="item.label"
+                  :value="item.value">
+                </el-option>
+              </el-select>
+              <el-select v-if="column.type === 'TagSelect'" v-model="params[column.key]" multiple clearable collapse-tags
+                :placeholder="column.placeholder" :clearable="column.clearable" :disabled="column.disabled"
+                style="width: 100%">
+                <template #prefix>
+                  <el-icon class="el-icon-s-operation" style="cursor: pointer" @click.stop="$message.info(234)"></el-icon>
+                </template>
+                <el-option v-for="item in options" :key="item.value" :label="item.label" :value="item.value">
+                </el-option>
+              </el-select>
+              <el-date-picker v-if="column.type === 'DatePicker'" v-model="params[column.key]" :type="column.config.type"
+                :placeholder="column.placeholder" :clearable="column.clearable" :disabled="column.disabled"
+                :picker-options="column.pickerOptions" style="width: 100%">
+              </el-date-picker>
+              <el-upload v-if="column.type === 'Upload'" :file-list="params[column.key]" :disabled="column.disabled" drag
+                action="https://jsonplaceholder.typicode.com/posts/" multiple>
+                <i class="el-icon-upload"></i>
+                <div class="el-upload__text">
+                  将文件拖到此处,或<em>点击上传</em>
+                </div>
+                <div class="el-upload__tip" slot="tip">
+                  只能上传jpg/png文件,且不超过500kb
+                </div>
+              </el-upload>
+            </el-form-item>
+          </el-col>
+        </el-row>
+      </el-card>
+      <el-card :body-style="{
+        padding: '20px',
+        display: 'flex',
+        'flex-wrap': 'wrap',
+        position: 'relative',
+      }" style="margin: 10px">
+        <el-tabs v-model="tabName" @tab-click="handleClick" style="width: 100%">
+          <el-tab-pane v-for="(column, index) in tabColumns" :key="index" :label="column.title" :name="column.key">
+            <el-table :data="tabTableParams[column.key]" style="width: 100%">
+              <el-table-column v-for="(cColumn, cIndex) in column.tableColumns" :key="cIndex" :prop="cColumn.key"
+                :label="cColumn.title" :width="cColumn.width">
+                <template slot-scope="scope">
+                  <el-tag v-if="cColumn.key === 'index'">
+                    {{ scope.$index + 1 }}
+                  </el-tag>
+                  <el-input v-if="cColumn.type === 'Input'" v-model="scope.row[cColumn.key]"
+                    :placeholder="cColumn.placeholder" :clearable="cColumn.clearable" :disabled="cColumn.disabled"
+                    size="mini" style="width: 100%"></el-input>
+                  <el-input-number v-if="cColumn.type === 'InputNumber'" v-model="scope.row[cColumn.key]"
+                    :controls-position="cColumn.config.controlsPosition" :placeholder="cColumn.placeholder"
+                    :clearable="cColumn.clearable" :disabled="cColumn.disabled" size="mini"
+                    style="width: 100%"></el-input-number>
+                  <el-input v-if="cColumn.type === 'InputDialog'" v-model="scope.row[cColumn.key]"
+                    :placeholder="cColumn.placeholder" :clearable="cColumn.clearable" :disabled="cColumn.disabled"
+                    size="mini" style="width: 100%" @blur="openAsyncInputDialog(cColumn, scope.row, 'change')"
+                    @change="openAsyncInputDialog(cColumn, scope.row, 'change')">
+                    <template #suffix>
+                      <el-icon class="el-icon-s-operation" style="cursor: pointer" @click.native.stop="
+                        openAsyncInputDialog(cColumn, scope.row, 'click')
+                        "></el-icon>
+                    </template>
+                  </el-input>
+                </template>
+              </el-table-column>
+            </el-table>
+          </el-tab-pane>
+        </el-tabs>
+        <el-row style="position: absolute; top: 20px; right: 20px">
+          <el-button size="mini" @click="addTableRow(tabName)">增行</el-button>
+        </el-row>
+      </el-card>
+    </el-form>
+  </el-drawer>
+</template>

+ 386 - 0
src/views/purchase/purchase-order/direct-sourcing.vue

@@ -0,0 +1,386 @@
+<script>
+export default {
+  name: "DirectSourcing",
+  components: {},
+  data() {
+    const tableColumns = [
+      { title: "价格来源", key: "a" },
+      { title: "供应商", key: "b" },
+      { title: "采购组织", key: "c" },
+      { title: "客户", key: "d" },
+      { title: "价格类型", key: "e" },
+      { title: "配送价", key: "f" },
+      { title: "币种", key: "g" },
+      { title: "价格有效期", key: "h" },
+      { title: "税率", key: "i" },
+      { title: "协议单价", key: "j" },
+      {
+        title: "未执行量",
+        key: "k",
+        edit: true,
+        editConfig: { type: "InputNumber", controlsPosition: "right" },
+      },
+      {
+        title: "采购量",
+        key: "l",
+        edit: true,
+        editConfig: { type: "InputNumber", controlsPosition: "right" },
+      },
+      {
+        title: "计划到货",
+        key: "m",
+        edit: true,
+        editConfig: { type: "DatePicker", showType: "date" },
+      },
+      {
+        title: "期望到货",
+        key: "n",
+        edit: true,
+        editConfig: { type: "DatePicker", showType: "date" },
+      },
+      {
+        title: "备注",
+        key: "o",
+        edit: true,
+        editConfig: { type: "Textarea" },
+      },
+    ];
+    const initTableColumns = () => tableColumns;
+    return {
+      tableColumns: initTableColumns(),
+      data: [
+        {
+          a: 1,
+          b: 1,
+          c: 1,
+          d: 1,
+          e: 1,
+          f: 1,
+          g: 1,
+          h: 1,
+          i: 1,
+          j: 1,
+          k: 1,
+          l: 1,
+          m: 1,
+          n: 1,
+          o: 1,
+        },
+        {
+          a: 1,
+          b: 1,
+          c: 1,
+          d: 1,
+          e: 1,
+          f: 1,
+          g: 1,
+          h: 1,
+          i: 1,
+          j: 1,
+          k: 1,
+          l: 1,
+          m: 1,
+          n: 1,
+          o: 1,
+        },
+        {
+          a: 1,
+          b: 1,
+          c: 1,
+          d: 1,
+          e: 1,
+          f: 1,
+          g: 1,
+          h: 1,
+          i: 1,
+          j: 1,
+          k: 1,
+          l: 1,
+          m: 1,
+          n: 1,
+          o: 1,
+        },
+        {
+          a: 1,
+          b: 1,
+          c: 1,
+          d: 1,
+          e: 1,
+          f: 1,
+          g: 1,
+          h: 1,
+          i: 1,
+          j: 1,
+          k: 1,
+          l: 1,
+          m: 1,
+          n: 1,
+          o: 1,
+        },
+        {
+          a: 1,
+          b: 1,
+          c: 1,
+          d: 1,
+          e: 1,
+          f: 1,
+          g: 1,
+          h: 1,
+          i: 1,
+          j: 1,
+          k: 1,
+          l: 1,
+          m: 1,
+          n: 1,
+          o: 1,
+        },
+        {
+          a: 1,
+          b: 1,
+          c: 1,
+          d: 1,
+          e: 1,
+          f: 1,
+          g: 1,
+          h: 1,
+          i: 1,
+          j: 1,
+          k: 1,
+          l: 1,
+          m: 1,
+          n: 1,
+          o: 1,
+        },
+        {
+          a: 1,
+          b: 1,
+          c: 1,
+          d: 1,
+          e: 1,
+          f: 1,
+          g: 1,
+          h: 1,
+          i: 1,
+          j: 1,
+          k: 1,
+          l: 1,
+          m: 1,
+          n: 1,
+          o: 1,
+        },
+        {
+          a: 1,
+          b: 1,
+          c: 1,
+          d: 1,
+          e: 1,
+          f: 1,
+          g: 1,
+          h: 1,
+          i: 1,
+          j: 1,
+          k: 1,
+          l: 1,
+          m: 1,
+          n: 1,
+          o: 1,
+        },
+        {
+          a: 1,
+          b: 1,
+          c: 1,
+          d: 1,
+          e: 1,
+          f: 1,
+          g: 1,
+          h: 1,
+          i: 1,
+          j: 1,
+          k: 1,
+          l: 1,
+          m: 1,
+          n: 1,
+          o: 1,
+        },
+        {
+          a: 1,
+          b: 1,
+          c: 1,
+          d: 1,
+          e: 1,
+          f: 1,
+          g: 1,
+          h: 1,
+          i: 1,
+          j: 1,
+          k: 1,
+          l: 1,
+          m: 1,
+          n: 1,
+          o: 1,
+        },
+        {
+          a: 1,
+          b: 1,
+          c: 1,
+          d: 1,
+          e: 1,
+          f: 1,
+          g: 1,
+          h: 1,
+          i: 1,
+          j: 1,
+          k: 1,
+          l: 1,
+          m: 1,
+          n: 1,
+          o: 1,
+        },
+        {
+          a: 1,
+          b: 1,
+          c: 1,
+          d: 1,
+          e: 1,
+          f: 1,
+          g: 1,
+          h: 1,
+          i: 1,
+          j: 1,
+          k: 1,
+          l: 1,
+          m: 1,
+          n: 1,
+          o: 1,
+        },
+        {
+          a: 1,
+          b: 1,
+          c: 1,
+          d: 1,
+          e: 1,
+          f: 1,
+          g: 1,
+          h: 1,
+          i: 1,
+          j: 1,
+          k: 1,
+          l: 1,
+          m: 1,
+          n: 1,
+          o: 1,
+        },
+        {
+          a: 1,
+          b: 1,
+          c: 1,
+          d: 1,
+          e: 1,
+          f: 1,
+          g: 1,
+          h: 1,
+          i: 1,
+          j: 1,
+          k: 1,
+          l: 1,
+          m: 1,
+          n: 1,
+          o: 1,
+        },
+        {
+          a: 1,
+          b: 1,
+          c: 1,
+          d: 1,
+          e: 1,
+          f: 1,
+          g: 1,
+          h: 1,
+          i: 1,
+          j: 1,
+          k: 1,
+          l: 1,
+          m: 1,
+          n: 1,
+          o: 1,
+        },
+      ],
+      page: { pageNum: 1, pageSize: 25 },
+      total: 0,
+      pageSizes: [25, 50, 100],
+    };
+  },
+  computed: {},
+  watch: {
+    data: {
+      handler: function (n) {
+        console.log(n);
+      },
+      deep: true,
+    },
+  },
+  methods: {},
+  created() {},
+  mounted() {},
+  destroyed() {},
+};
+</script>
+
+<template>
+  <div class="directSourcing" style="height: 50vh">
+    <el-table :data="data" height="calc(50vh)" style="width: 100%">
+      <el-table-column
+        v-for="(column, index) in tableColumns"
+        :key="index"
+        :prop="column.key"
+        :label="column.title"
+        :width="column.width || 180"
+        :show-overflow-tooltip="column.showOverflowTooltip || true"
+      >
+        <template slot-scope="scope">
+          <el-input-number
+            v-if="column.edit && column.editConfig.type === 'InputNumber'"
+            v-model="scope.row[column.key]"
+            :controls-position="column.editConfig.controlsPosition"
+            :min="column.editConfig.min"
+            :max="column.editConfig.max"
+            :size="column.editConfig.size || 'mini'"
+            :placeholder="column.editConfig.placeholder"
+            style="width: 90%"
+          ></el-input-number>
+          <el-date-picker
+            v-else-if="column.edit && column.editConfig.type === 'DatePicker'"
+            v-model="scope.row[column.key]"
+            :type="column.editConfig.showType"
+            :picker-options="column.editConfig.pickerOptions"
+            :size="column.editConfig.size || 'mini'"
+            :placeholder="column.editConfig.placeholder"
+            style="width: 90%"
+          ></el-date-picker>
+          <el-input
+            v-else-if="column.edit && column.editConfig.type === 'Textarea'"
+            v-model="scope.row[column.key]"
+            type="textarea"
+            :autosize="column.editConfig.autosize || true"
+            :size="column.editConfig.size || 'mini'"
+            style="width: 90%"
+          ></el-input>
+          <span v-else>{{ scope.row[column.key] }}</span>
+        </template>
+      </el-table-column>
+    </el-table>
+    <el-pagination
+      @size-change="handleSizeChange"
+      @current-change="handleCurrentChange"
+      :total="total"
+      :page-sizes="pageSizes"
+      :page-size="page.pageSize"
+      :current-page="page.pageNum"
+      hide-on-single-page
+      layout="total, prev, pager, next, sizes, jumper"
+    >
+    </el-pagination>
+  </div>
+</template>
+
+<style scoped></style>

+ 261 - 0
src/views/purchase/purchase-order/index.vue

@@ -0,0 +1,261 @@
+<!-- 采购订单修订—— 列表 -->
+<script>
+import orderApi from "@/api/business/purchase/purchase-order";
+import AddPurchaseContractDrawer from "./add/index.vue";
+import SeePurchaseContractDrawer from "./see-purchase-order.vue";
+// import DirectSourcingTable from "./direct-sourcing.vue";
+export default {
+  name: "PuchaseTask",
+  components: {
+    AddPurchaseContractDrawer,
+    SeePurchaseContractDrawer,
+    // DirectSourcingTable,
+  },
+  data() {
+    const arr2Obj = function (data, keyName, valueName) {
+      return Object.fromEntries(
+        data.map((item) => [item[keyName], item[valueName]])
+      );
+    };
+    const searchColumns = [
+      { title: "合同名称", key: "contractName", type: "Input" },
+    ];
+    const initSearchColumns = () => searchColumns;
+    const initSearchParams = () => arr2Obj(initSearchColumns(), "key", "value");
+    const tableColumns = [
+      // { key: "id", title: "主键" },
+      { key: "puOrg", title: "采购组织" },
+      { key: "billType", title: "订单类型" },
+      { key: "code", title: "订单编号" },
+      { key: "billDate", title: "订单日期" },
+      { key: "supplier", title: "供应商" },
+      // { key: "supplierName", title: "供应商名称" },
+      // { key: "paymentAgreement", title: "付款协议" },
+      // { key: "currency", title: "币种" },
+      { key: "currencyName", title: "币种名称" },
+      // { key: "buyer", title: "采购员" },
+      { key: "buyerName", title: "采购员" },
+      // { key: "puDept", title: "采购部门" },
+      { key: "puDeptName", title: "采购部门名称" },
+      // { key: "customer", title: "收货客户" },
+      { key: "customerName", title: "收货客户名称" },
+      // { key: "isDeliver", title: "是否发货" },
+      // { key: "isArrival", title: "到货超期" },
+      { key: "isBack", title: "退货" },
+      // { key: "freezeCause", title: "冻结原因" },
+      { key: "qty", title: "总数量" },
+      { key: "money", title: "总数量" },
+      { key: "status", title: "单据状态" },
+      // { key: "isMarketing", title: "已协同生成销售订单" },
+      // { key: "isMarketingSource", title: "由销售订单协同生成" },
+      // { key: "personal", title: "人员" },
+      { key: "personalName", title: "人员名称" },
+      // { key: "isSendSrm", title: "是否同步SRM" },
+      { key: "isInvoice", title: "发票标识" },
+      { key: "rebateMoney", title: "订单使用返利金额" },
+      { key: "deductionMoney", title: "订单抵扣余款金额" },
+      // { key: "warehouse", title: "WMS入库仓库" },
+      { key: "warehouseName", title: "WMS入库仓库名称" },
+      // { key: "goodsAllocation", title: "货位" },
+      { key: "goodsAllocationName", title: "货位名称" },
+      // { key: "customerDept", title: "客户部门" },
+      { key: "customerDeptName", title: "客户部门名称" },
+      // { key: "supplierContacts", title: "供应商业务联系人" },
+      { key: "supplierContactsName", title: "供应商业务联系人名称" },
+      { key: "isUrgency", title: "紧急程度" },
+      // { key: "agent", title: "代理人" },
+      { key: "agentName", title: "代理人名称" },
+      { key: "isClose", title: "最终关闭" },
+      { key: "applyPaymentMoney", title: "累计付款申请金额" },
+      { key: "paymentMoney", title: "累计付款金额" },
+      { key: "invoiceMoney", title: "发票金额" },
+      { key: "createByName", title: "创建人名称" },
+      { key: "approver", title: "审批人" },
+      { key: "approverFinishTime", title: "审批时间" },
+      { key: "marketingCode", title: "销售订单号" },
+      // { key: "supplierPersonal", title: "供应商业务员" },
+      // { key: "supplierPersonalName", title: "供应商业务员名称" },
+      // { key: "tenantId", title: "租户号" },
+      // { key: "revision", title: "乐观锁" },
+      // { key: "updateByName", title: "更新人名称" },
+      // { key: "delFlag", title: "删除标记" },
+      // { key: "flowId", title: "OA流程ID" },
+      // { key: "approveTime", title: "提交时间" }
+      { key: "createTime", title: "制单日期/创建时间" },
+      { key: "remark", title: "备注" },
+      { key: "updateTime", title: "最后修改时间" }
+    ];
+    const initTableColumns = () => tableColumns;
+    return {
+      loading: false,
+      isSimpleSearch: true,
+      searchColumns: initSearchColumns(),
+      searchParams: {
+        isAsc: "desc",
+        reasonable: "",
+        orderByColumn: "",
+        ...initSearchParams(),
+      },
+      tableColumns: initTableColumns(),
+      tableData: [{ puOrg: 1 }],
+      page: { pageNum: 1, pageSize: 25 },
+      total: 0,
+      pageSizes: [25, 50, 100],
+    };
+  },
+  computed: {
+    showSearchColumns() {
+      return this.isSimpleSearch
+        ? this.searchColumns.slice(0, 4)
+        : this.searchColumns;
+    },
+  },
+  //   watch: {
+  //     $route: {
+  //       handler: function (route) {
+  //         this.redirect = route.query && route.query.redirect;
+  //       },
+  //       immediate: true,
+  //     },
+  //   },
+  created() {
+    // this.fetchTaskList();
+    console.log("Vue", this);
+  },
+  methods: {
+    async fetchTaskList() {
+      this.loading = true;
+      try {
+        const { code, msg, rows, total } = await orderApi.orderlist({
+          ...this.page,
+          ...this.searchParams,
+        });
+        if (code === 200) {
+          this.total = total;
+          this.tableData = rows;
+          this.$notify.success({ title: msg });
+        } else {
+          this.$notify.warning({ title: msg });
+        }
+      } catch (err) {
+        this.$notify.error({ title: "error", message: err });
+      } finally {
+        this.loading = false;
+      }
+    },
+    handleSearchChange() {
+      this.isSimpleSearch = !this.isSimpleSearch;
+      this.$notify.info({
+        title: this.isSimpleSearch ? "Simple Search" : "All Search",
+      });
+    },
+    handleSizeChange() { },
+    handleCurrentChange() { },
+    handleOpenAddDrawer() {
+      const { setVisible } = this.$refs.addDrawerFef;
+      setVisible(true);
+      setTimeout(() => {
+        this.$notify.info("Open Add Drawer");
+      }, 250);
+    },
+    handleOpenSeeDrawer() {
+      const { setVisible } = this.$refs.seeDrawerFef;
+      setVisible(true);
+      setTimeout(() => {
+        this.$notify.info("Open See Drawer");
+      }, 250);
+    },
+  },
+};
+</script>
+
+<template>
+  <el-card v-loading="loading" style="width: calc(100% - 24px); height: 100%; margin: 10px" :body-style="{ padding: 0 }">
+    <AddPurchaseContractDrawer ref="addDrawerFef"></AddPurchaseContractDrawer>
+    <SeePurchaseContractDrawer ref="seeDrawerFef"></SeePurchaseContractDrawer>
+
+    <el-form size="mini" label-position="right" label-width="85px" :model="searchParams" style="padding: 20px 0 0 0">
+      <el-row :gutter="24">
+        <el-col :span="20">
+          <el-row :gutter="20">
+            <el-col v-for="column in showSearchColumns" :key="column.title" :xl="6" :lg="6" :md="8" :sm="12" :xs="24">
+              <el-form-item :prop="column.key" :label="column.title">
+                <el-input v-model="searchParams[column.key]" :placeholder="column.placeholder"></el-input>
+              </el-form-item>
+            </el-col>
+          </el-row>
+        </el-col>
+        <el-col :span="3" :offset="1" style="text-align: right; padding-right: 40px">
+          <el-button type="primary" size="mini">搜索</el-button>
+          <el-button size="mini">重置</el-button>
+        </el-col>
+      </el-row>
+    </el-form>
+
+    <el-divider>
+      <i :class="isSimpleSearch ? 'el-icon-arrow-down' : 'el-icon-arrow-up'" style="cursor: pointer"
+        @click="handleSearchChange"></i>
+    </el-divider>
+
+    <el-row :gutter="24" style="padding: 0 20px">
+      <!-- <el-col :span="6">123</el-col> -->
+      <el-col :span="24" style="text-align: right;margin: 0 10px 0 0">
+        <el-button-group style="margin-left: 10px">
+          <el-button size="mini" type="danger" @click="handleOpenAddDrawer">新增</el-button>
+          <!-- <el-button size="mini">修改</el-button>    双击行实现-->
+          <!-- <el-button size="mini">删除</el-button> -->
+          <el-button size="mini">复制</el-button>
+          <el-button size="mini">提交</el-button>
+        </el-button-group>
+
+        <el-button-group style="margin-left: 10px">
+          <el-button size="mini">修订</el-button>
+          <el-button size="mini">退回</el-button>
+        </el-button-group>
+
+        <el-button-group style="margin-left: 10px">
+          <el-button size="mini">采购退货</el-button>
+          <el-button size="mini">整单关闭</el-button>
+          <el-button size="mini">附件管理</el-button>
+          <el-button size="mini">单据追溯</el-button>
+        </el-button-group>
+      </el-col>
+    </el-row>
+
+    <el-table @row-dblclick="handleOpenSeeDrawer" :data="tableData" size="mini" style="width: 100%; margin: 20px 0 0 0">
+      <el-table-column type="index" width="50" label="序号"></el-table-column>
+      <el-table-column v-for="(column, index) in tableColumns" :key="index" :prop="column.key" :label="column.title"
+        :width="column.width || 180" :show-overflow-tooltip="column.showOverflowTooltip || true">
+      </el-table-column>
+      <el-table-column fixed="right" label="操作" width="120">
+        <template slot-scope="scope">
+          <el-button @click="handleOpenSeeDrawer(scope.row)" type="text" size="small">查看</el-button>
+          <el-button type="text" size="small">编辑</el-button>
+          <el-button type="text" size="small">删除</el-button>
+        </template>
+      </el-table-column>
+
+    </el-table>
+    <el-pagination @size-change="handleSizeChange" @current-change="handleCurrentChange" :total="total"
+      :page-sizes="pageSizes" :page-size="page.pageSize" :current-page="page.pageNum" hide-on-single-page
+      layout="total, prev, pager, next, sizes, jumper">
+    </el-pagination>
+
+    <!-- <el-card :body-style="{
+      padding: '20px',
+      display: 'flex',
+      'flex-wrap': 'wrap',
+    }" style="margin: 10px">
+      <el-tabs v-model="tabName" @tab-click="handleClick" style="width: 100%">
+        <el-tab-pane v-for="(column, index) in tabColumns" :key="index" :label="column.title" :name="column.key">
+          <el-table :data="tabTableDatas[column.key]" style="width: 100%">
+            <el-table-column v-for="(cColumn, cIndex) in column.tableColumns" :key="cIndex" :prop="cColumn.key"
+              :label="cColumn.title">
+            </el-table-column>
+          </el-table>
+        </el-tab-pane>
+      </el-tabs>
+    </el-card> -->
+
+  </el-card>
+</template>

+ 406 - 0
src/views/purchase/purchase-order/see-purchase-order.vue

@@ -0,0 +1,406 @@
+<!-- 采购订单修订—— 查看 -->
+<script>
+export default {
+  name: "SeePurchaseContractDrawer",
+  data() {
+    const arr2Obj = function (data, keyName, valueName) {
+      return Object.fromEntries(
+        data.map((item) => [item[keyName], item[valueName]])
+      );
+    };
+    const columns = [
+      { key: "puOrg", title: "采购组织", type: "TagSelect", require: true },
+      { key: "code", title: "合同编码", type: "Input" },
+      { key: "contractName", title: "合同名称", type: "Input", require: true },
+      { key: "supplier", title: "供应商", type: "TagSelect", require: true },
+      { key: "contractType", title: "合同类型", type: "Select", require: true },
+      { key: "puDept", title: "采购部门", type: "TagSelect", require: true },
+      { key: "buyer", title: "采购员", type: "TagSelect" },
+      { key: "source", title: "合同来源", type: "Select" },
+      {
+        key: "signDate",
+        title: "合同签订日期",
+        type: "DatePicker",
+        require: true,
+      },
+      {
+        key: "effectiveDate",
+        title: "合同生效日期",
+        type: "DatePicker",
+        require: true,
+      },
+      { key: "endDate", title: "合同终止日期", type: "DatePicker" },
+      { key: "externalContract", title: "外部合同号", type: "Input" },
+      { key: "refusalReasons", title: "拒绝理由", type: "Input" },
+      { key: "enquiryCode", title: "询价单号", type: "Input" },
+      { key: "externalFile", title: "对外附件", type: "Upload", span: 24 },
+      { key: "puFile", title: "采购商盖章合同附件", type: "Upload", span: 24 },
+      {
+        key: "supplierFile",
+        title: "供应商盖章合同附件",
+        type: "Upload",
+        span: 24,
+      },
+      { key: "projectName", title: "项目名称", type: "TagSelect" },
+      { key: "projectCode", title: "项目编号", type: "Input" },
+      { key: "area", title: "区域", type: "Input" },
+      { key: "consigneePhone", title: "收货人联系方式", type: "Input" },
+      { key: "paymentAgreement", title: "付款协议", type: "TagSelect" },
+      { key: "currency", title: "币种", type: "TagSelect", require: true },
+      { key: "taxPrice", title: "价税合计", type: "InputNumber" },
+      { key: "guaranteePeriod", title: "质保期", type: "Input" },
+
+      // { key: "lastPuMoney", title: "上年度采购额" },
+      // { key: "buyerName", title: "采购员名称" },
+      // { key: "supplierName", title: "供应商名称" },
+      // { key: "puMoneyYear", title: "本年度采购额" },
+      // { key: "puDeptName", title: "采购部门名称" },
+      // { key: "supplierTier", title: "供应商层级" },
+      // { key: "grossRateAverage", title: "平均毛利率" },
+      // { key: "approveFlow", title: "审批流程" },
+      // { key: "consumableClass", title: "耗材类别" },
+      // { key: "brandGrossRate", title: "同类品牌及毛利率" },
+      // { key: "contractFormat", title: "合同格式" },
+      // { key: "productName", title: "产品类别&名称" },
+      // { key: "invoiceTax", title: "发票税率" },
+      // { key: "emergencyDegree", title: "紧急程度" },
+      // { key: "project", title: "项目医院" },
+      // { key: "deliveryType", title: "交货方式" },
+      // { key: "contractPartyc", title: "合同丙方" },
+      // { key: "contractPartycName", title: "合同丙方名称" },
+      // { key: "guaranteePeriodEnd", title: "质保期限" },
+      // { key: "freightMethods", title: "运费承担方式" },
+      // { key: "isTarget", title: "是否有指标" },
+      // { key: "contractTarget", title: "合同指标" },
+      // { key: "exemptionPostageCondtion", title: "包邮条件" },
+      // { key: "isRebate", title: "是否有返利" },
+      // { key: "rebatePolicy", title: "返利政策" },
+      // { key: "rollbackPolicy", title: "退换货政策" },
+      // { key: "contractContent", title: "合同主要内容" },
+      // { key: "currencyName", title: "币种名称" },
+      // { key: "tenantId", title: "租户号" },
+      // { key: "revision", title: "乐观锁" },
+      // { key: "createByName", title: "创建人" },
+      // { key: "updateByName", title: "创建人名称" },
+      // { key: "delFlag", title: "删除标记" },
+    ];
+    const initColumns = () =>
+      columns.map((column) => {
+        const clearable = column.clearable || true;
+        if (column.type === "InputNumber") {
+          return {
+            ...column,
+            clearable,
+            config: { controlsPosition: "right" },
+          };
+        }
+        if (column.type === "DatePicker") {
+          return {
+            ...column,
+            clearable,
+            config: { type: "date" },
+          };
+        }
+        return {
+          ...column,
+          clearable,
+        };
+      });
+    const initParams = () => arr2Obj(initColumns(), "key", "value");
+    const tabColumns = [
+      {
+        title: "物料基本信息",
+        key: "first",
+        tableColumns: [
+          { title: "序号", key: "" },
+          { title: "赠品", key: "" },
+          { title: "物料编码", key: "" },
+          { title: "物料名称", key: "" },
+          { title: "规格", key: "" },
+          { title: "生产厂家", key: "" },
+          { title: "收货客户", key: "" },
+          { title: "品牌", key: "" },
+          { title: "采购数量", key: "" },
+          { title: "采购单位", key: "" },
+          { title: "计价数量", key: "" },
+          { title: "税率%", key: "" },
+          { title: "含税单价", key: "" },
+          { title: "含税金额合计", key: "" },
+          { title: "价格有效期(起)", key: "" },
+          { title: "计划到货日期", key: "" },
+          { title: "来源类型", key: "" },
+          { title: "来源单号", key: "" },
+          { title: "需求单号", key: "" },
+          { title: "备注", key: "" },
+        ],
+      },
+      {
+        title: "合同条款",
+        key: "second",
+        tableColumns: [
+          { title: "序号", key: "" },
+          { title: "条款编码", key: "" },
+          { title: "条款名称", key: "" },
+          { title: "条款内容", key: "" },
+          { title: "变量序号", key: "" },
+          { title: "变量内容", key: "" },
+          { title: "备注", key: "" },
+        ],
+      },
+      {
+        title: "合同费用",
+        key: "third",
+        tableColumns: [
+          { title: "序号", key: "" },
+          { title: "费用编码", key: "" },
+          { title: "费用名称", key: "" },
+          { title: "费用金额", key: "" },
+          { title: "备注", key: "" },
+        ],
+      },
+      {
+        title: "付款协议信息",
+        key: "fourth",
+        tableColumns: [
+          { title: "序号", key: "" },
+          { title: "付款阶段", key: "" },
+          { title: "是否预付款", key: "" },
+          { title: "是否质保金", key: "" },
+          { title: "结算方式", key: "" },
+          { title: "付款起点", key: "" },
+          { title: "付款金额", key: "" },
+          { title: "付款比例%", key: "" },
+          { title: "账期天数", key: "" },
+          { title: "备注", key: "" },
+        ],
+      },
+      {
+        title: "合同执行组织范围",
+        key: "fifth",
+        tableColumns: [
+          { title: "序号", key: "" },
+          { title: "组织名称", key: "" },
+          { title: "组织编码", key: "" },
+        ],
+      },
+    ];
+    const initTabColumns = () => tabColumns;
+    return {
+      visible: false,
+      columns: initColumns(),
+      params: initParams(),
+      options: [
+        {
+          value: "选项1",
+          label: "黄金糕",
+        },
+        {
+          value: "选项2",
+          label: "双皮奶",
+        },
+        {
+          value: "选项3",
+          label: "蚵仔煎",
+        },
+        {
+          value: "选项4",
+          label: "龙须面",
+        },
+        {
+          value: "选项5",
+          label: "北京烤鸭",
+        },
+      ],
+      tabColumns: initTabColumns(),
+      tabName: "first",
+      tabTableDatas: {
+        first: [],
+        second: [],
+        third: [],
+        fourth: [],
+        fifth: [],
+      },
+    };
+  },
+  computed: {},
+  watch: {},
+  methods: {
+    setVisible(prop) {
+      this.visible = prop;
+    },
+  },
+  created() {
+    console.log(this.params, this.columns);
+  },
+  mounted() {},
+  destroyed() {},
+};
+</script>
+<template>
+  <el-drawer
+    title="我是标题"
+    direction="btt"
+    size="100%"
+    :with-header="false"
+    :visible.sync="visible"
+    :before-close="handleClose"
+  >
+    <el-card
+      :body-style="{
+        padding: '20px',
+        display: 'flex',
+        'flex-wrap': 'wrap',
+      }"
+      style="margin: 10px"
+    >
+      <div
+        slot="header"
+        style="
+          display: flex;
+          justify-content: space-between;
+          align-items: center;
+        "
+      >
+        <h3>查看</h3>
+        <div style="text-align: right">
+          <el-button size="mini" @click="setVisible(false)">取消</el-button>
+          <el-button size="mini" type="info" @click="setVisible(false)"
+            >保存并新增</el-button
+          >
+          <el-button size="mini" type="danger" @click="setVisible(false)"
+            >保存</el-button
+          >
+        </div>
+      </div>
+      <el-row>
+        <el-form
+          size="mini"
+          label-position="right"
+          label-width="150px"
+          :model="params"
+        >
+          <el-col
+            v-for="(column, index) in columns"
+            :key="index"
+            :span="column.span || 8"
+          >
+            <el-form-item
+              :prop="column.key"
+              :label="column.title"
+              :required="column.required"
+            >
+              <el-input
+                v-if="column.type === 'Input'"
+                v-model="params[column.key]"
+                :placeholder="column.placeholder"
+                :clearable="column.clearable"
+                style="width: 90%"
+              ></el-input>
+              <el-input-number
+                v-if="column.type === 'InputNumber'"
+                v-model="params[column.key]"
+                :controls-position="column.config.controlsPosition"
+                :placeholder="column.placeholder"
+                :clearable="column.clearable"
+                style="width: 90%"
+              ></el-input-number>
+              <el-select
+                v-if="column.type === 'Select'"
+                v-model="params[column.key]"
+                :placeholder="column.placeholder"
+                :clearable="column.clearable"
+                style="width: 90%"
+              >
+                <el-option
+                  v-for="item in options"
+                  :key="item.value"
+                  :label="item.label"
+                  :value="item.value"
+                >
+                </el-option>
+              </el-select>
+              <el-select
+                v-if="column.type === 'TagSelect'"
+                v-model="params[column.key]"
+                multiple
+                clearable
+                collapse-tags
+                :placeholder="column.placeholder"
+                :clearable="column.clearable"
+                style="width: 90%"
+              >
+                <template #prefix>
+                  <el-icon
+                    class="el-icon-s-operation"
+                    style="cursor: pointer"
+                    @click.stop="$message.info(234)"
+                  ></el-icon>
+                </template>
+                <el-option
+                  v-for="item in options"
+                  :key="item.value"
+                  :label="item.label"
+                  :value="item.value"
+                >
+                </el-option>
+              </el-select>
+              <el-date-picker
+                v-if="column.type === 'DatePicker'"
+                v-model="params[column.key]"
+                :type="column.config.type"
+                :placeholder="column.placeholder"
+                :clearable="column.clearable"
+                :picker-options="column.pickerOptions"
+                style="width: 90%"
+              >
+              </el-date-picker>
+              <el-upload
+                v-if="column.type === 'Upload'"
+                :file-list="params[column.key]"
+                drag
+                action="https://jsonplaceholder.typicode.com/posts/"
+                multiple
+              >
+                <i class="el-icon-upload"></i>
+                <div class="el-upload__text">
+                  将文件拖到此处,或<em>点击上传</em>
+                </div>
+                <div class="el-upload__tip" slot="tip">
+                  只能上传jpg/png文件,且不超过500kb
+                </div>
+              </el-upload>
+            </el-form-item>
+          </el-col>
+        </el-form>
+      </el-row>
+    </el-card>
+    
+    <el-card
+      :body-style="{
+        padding: '20px',
+        display: 'flex',
+        'flex-wrap': 'wrap',
+      }"
+      style="margin: 10px"
+    >
+      <el-tabs v-model="tabName" @tab-click="handleClick" style="width: 100%">
+        <el-tab-pane
+          v-for="(column, index) in tabColumns"
+          :key="index"
+          :label="column.title"
+          :name="column.key"
+        >
+          <el-table :data="tabTableDatas[column.key]" style="width: 100%">
+            <el-table-column
+              v-for="(cColumn, cIndex) in column.tableColumns"
+              :key="cIndex"
+              :prop="cColumn.key"
+              :label="cColumn.title"
+            >
+            </el-table-column>
+          </el-table>
+        </el-tab-pane>
+      </el-tabs>
+    </el-card>
+  </el-drawer>
+</template>