002201 2 năm trước cách đây
mục cha
commit
0bc8dcf003

+ 1 - 0
package.json

@@ -7,6 +7,7 @@
   "scripts": {
     "dev": "vue-cli-service serve",
     "dev:highNode": "SET NODE_OPTIONS=--openssl-legacy-provider && vue-cli-service serve",
+    "build:highNode": "SET NODE_OPTIONS=--openssl-legacy-provider && vue-cli-service build",
     "build:prod": "vue-cli-service build",
     "build:stage": "vue-cli-service build --mode staging",
     "preview": "node build/index.js --preview",

+ 19 - 6
src/api/business/purchase/contract.js

@@ -8,7 +8,7 @@ export function LIST(params) {
   });
 }
 
-export function add(data) {
+export function ADD(data) {
   return request({
     url: "/pu/contract/add",
     method: "POST",
@@ -16,10 +16,10 @@ export function add(data) {
   });
 }
 
-export function edit(data) {
+export function EDIT(data) {
   return request({
     url: "/pu/contract/edit",
-    method: "POST",
+    method: "PUT",
     data: data,
   });
 }
@@ -27,7 +27,7 @@ export function edit(data) {
 export function REMOVE(data) {
   return request({
     url: `/pu/contract/${data}`,
-    method: "delete",
+    method: "DELETE",
   });
 }
 
@@ -38,14 +38,14 @@ export function ITEM(data) {
   });
 }
 
-export function generateCode() {
+export function CODE() {
   return request({
     url: "/pu/contract/generateNo",
     method: "GET",
   });
 }
 
-export function ITEMTABLELIST(params, name) {
+export function TABLELIST(params, name) {
   let url = "";
   if (name === "contractItemList") url = "/pu/contract/item/list";
   if (name === "contractClauseList") url = "/pu/contract/clause/list";
@@ -58,3 +58,16 @@ export function ITEMTABLELIST(params, name) {
     params: params,
   });
 }
+
+export function TABLEROMOVE(data, name) {
+  let url = "";
+  if (name === "contractItemList") url = "/pu/contract/item";
+  if (name === "contractClauseList") url = "/pu/contract/clause";
+  if (name === "contractExpenseList") url = "/pu/contract/expense";
+  if (name === "contractAgreementList") url = "/pu/contract/agreement";
+  if (name === "contractApplyOrgList") url = "/pu/contract/org";
+  return request({
+    url: `${url}/${data}`,
+    method: "DELETE",
+  });
+}

+ 1 - 0
src/components/FileUpload/index.vue

@@ -105,6 +105,7 @@ export default {
           let temp = 1;
           // 首先将值转为数组
           const list = Array.isArray(val) ? val : this.value.split(",");
+          console.log("list", list);
           // 然后将数组转为对象数组
           this.fileList = list.map((item) => {
             if (typeof item === "string") {

+ 22 - 0
src/components/popover-select/components/TAX_RATE_PARAM.js

@@ -0,0 +1,22 @@
+// 货位
+export default [
+  // 树
+  {
+    key: "id",
+    title: "ID",
+    type: "Input",
+    search: true,
+  },
+  {
+    key: "code",
+    title: "编码",
+    type: "Input",
+    search: true,
+  },
+  {
+    key: "name",
+    title: "货位",
+    type: "Input",
+    search: true,
+  },
+];

+ 22 - 0
src/components/popover-select/components/UNIT_PARAM.js

@@ -0,0 +1,22 @@
+// 货位
+export default [
+  // 树
+  {
+    key: "id",
+    title: "ID",
+    type: "Input",
+    search: true,
+  },
+  {
+    key: "code",
+    title: "编码",
+    type: "Input",
+    search: true,
+  },
+  {
+    key: "name",
+    title: "货位",
+    type: "Input",
+    search: true,
+  },
+];

+ 6 - 9
src/components/popover-select/index.vue

@@ -27,10 +27,6 @@ export default {
         return "code";
       },
     },
-    showKey: {
-      type: String,
-      default: "name",
-    },
     // 默认查询参数
     queryParams: {
       type: Object,
@@ -120,8 +116,8 @@ export default {
     },
   },
   methods: {
-    // show dialog
-    async show() {
+    // open dialog
+    async open() {
       this.visible = true;
       await this.resetList();
     },
@@ -173,7 +169,7 @@ export default {
     // row double click
     async rowDblclick(prop) {
       const { multiple } = this.$props;
-      if (!multiple) await this.confirm(prop);
+      if (!multiple) await this.confirm([prop]);
     },
     // selection change
     selectionChange(prop) {
@@ -236,7 +232,7 @@ export default {
         :disabled="disabled"
         slot="append"
         icon="el-icon-search"
-        @click="show()"
+        @click="open"
       ></el-button>
     </el-input>
     <el-dialog
@@ -246,6 +242,7 @@ export default {
       :close-on-click-modal="false"
       :close-on-press-escape="false"
       append-to-body
+      @close="hide"
     >
       <el-form
         v-loading="loading"
@@ -302,7 +299,7 @@ export default {
         </el-pagination>
       </el-form>
       <div style="margin-top: 20px; text-align: right">
-        <el-button :size="size" @click="visible = false"> 取 消 </el-button>
+        <el-button :size="size" @click="hide"> 取 消 </el-button>
         <el-button :size="size" @click="confirm(selectData)"> 确 定 </el-button>
       </div>
     </el-dialog>

+ 7 - 1
src/utils/init/index.js

@@ -12,7 +12,13 @@ export const initParams = (prop, key = "key", value = "value") =>
   Object.fromEntries(prop.map((item) => [item[key], item[value]]));
 // 初始化字典
 export const initDicts = (prop) =>
-  prop.filter((column) => column.referName).map((column) => column.referName);
+  Array.from(
+    new Set(
+      prop
+        .filter((column) => column.inputType === "Select")
+        .map((column) => column.referName)
+    )
+  );
 // 初始化校验
 export const initRules = (prop) => {
   const rules = {};

+ 181 - 165
src/views/purchase/contract/add/index.vue

@@ -1,12 +1,18 @@
 <script>
 import { Columns, TabColumns } from "../column";
-import { add, generateCode } from "@/api/business/purchase/contract";
+import { ADD, CODE } from "@/api/business/purchase/contract";
 import { initDicts, initRules, initParams } from "@/utils/init";
 
 export default {
   name: "AddDialog",
-  dicts: initDicts(Columns),
-
+  dicts: Array.from(
+    new Set([
+      ...initDicts(Columns),
+      ...initDicts(TabColumns.map((item) => item.tableColumns))
+        .flat()
+        .filter((cItem) => cItem.inputType === "Select"),
+    ])
+  ),
   components: {},
   data() {
     return {
@@ -38,106 +44,110 @@ export default {
     },
   },
   methods: {
-    beforeOpen() {
-      // console.log(this.$store.state.user);
-      // const { deptName, deptId, name, id, orgName, orgId } =
-      //   this.$store.state.user;
-      // this.params.puOrg = orgId;
-      // this.params.puOrgName = orgName;
-      // this.params.buyer = id;
-      // this.params.buyerName = name;
-      // this.params.puDept = deptId;
-      // this.params.puDeptName = deptName;
+    open() {
+      const {
+        deptId: puDept,
+        deptName: puDeptName,
+        id: buyer,
+        name: buyerName,
+        orgId: puOrg,
+        orgName: puOrgName,
+      } = this.$store.state.user;
+      this.params.puOrg = puOrg;
+      this.params.puOrgName = puOrgName;
+      this.params.buyer = buyer;
+      this.params.buyerName = buyerName;
+      this.params.puDept = puDept;
+      this.params.puDeptName = puDeptName;
       this.fetchCode();
+      this.visible = true;
     },
-    setVisible(prop) {
-      this.visible = prop;
+    hide() {
+      this.visible = false;
+      this.params = initParams(this.columns);
+      this.tabName = this.tabColumns[0].key;
     },
     async fetchCode() {
       try {
         this.loading = true;
-        this.params.code = await generateCode();
+        const code = await CODE();
+        this.params.code = code;
       } catch (err) {
         //
       } finally {
         this.loading = false;
       }
     },
-    addTableRow(prop) {
+    addRow(prop) {
       const arr = this.tabColumns.find(
         (element) => element.key === this.tabName
       ).tableColumns;
-      console.log("arr", arr);
-      prop.push(initParams(arr, "key", "value"));
+      prop.push(initParams(arr));
     },
-    delTableRow(prop, index) {
+    deleteRow(prop, index) {
       prop.splice(index, 1);
     },
-    // 取消
-    handleCancel() {
-      this.setVisible(false);
-      this.params = initParams(this.columns, "key", "value");
+    cancel() {
+      this.hide();
     },
-    // 保存
-    handleSava() {
-      this.setVisible(false);
+    sava() {
+      this.visible = false;
     },
-    // 保存并新增
-    async handleSubmit() {
-      console.log("this.params", this.params);
-      // return;
-      try {
-        const createById = this.params.buyer;
-        const createByName = this.params.buyerName;
-        const updateById = this.$store.state.user.id;
-        const updateByName = this.$store.state.user.name;
-        const { code, msg } = await add({
-          createById,
-          createByName,
-          updateById,
-          updateByName,
-          ...this.params,
-        });
-        if (code === 200) {
-          this.setVisible(false);
-          this.$emit("after-submit");
-          this.$notify.success({ title: msg });
+    submit(prop) {
+      this.$refs[prop].validate(async (valid) => {
+        if (valid) {
+          try {
+            const createById = this.params.buyer;
+            const createByName = this.params.buyerName;
+            const updateById = this.$store.state.user.id;
+            const updateByName = this.$store.state.user.name;
+            const { code, msg } = await ADD({
+              createById,
+              createByName,
+              updateById,
+              updateByName,
+              ...this.params,
+            });
+            if (code === 200) {
+              this.cancel();
+              this.$emit("submit-success");
+              this.$notify.success({ title: msg });
+            } else {
+              this.$notify.warning({ title: msg });
+            }
+          } catch (err) {
+            //
+          } finally {
+            // this.hide();
+          }
         } else {
-          this.$notify.warning({ title: msg });
+          console.log("error submit!!");
+          return false;
         }
-      } catch (err) {
-        //
-      } finally {
-        // this.setVisible(false);
-      }
-    },
-
-    handleHide(PROP) {
-      console.log(1233123123, PROP);
+      });
     },
   },
-  created() {
-    console.log("ADD CREATED");
-  },
+  created() {},
   mounted() {},
   destroyed() {},
 };
 </script>
 <template>
-  <el-dialog :visible.sync="visible" title="新增" @open="beforeOpen">
+  <el-dialog :visible.sync="visible" title="新增" fullscreen @close="hide">
     <el-form
+      ref="ruleForm"
       v-loading="loading"
       :size="size"
-      label-position="right"
-      label-width="135px"
-      :model="params"
       :rules="rules"
+      :model="params"
+      label-width="auto"
+      label-position="right"
     >
       <el-row>
         <el-col
           v-for="(column, index) in columns"
           :key="index"
-          :span="column.span || 12"
+          :span="column.span || 8"
         >
           <el-form-item :prop="column.key" :label="column.title">
             <el-input
@@ -188,7 +198,7 @@ export default {
               style="width: 100%"
             >
               <el-option
-                v-for="item in dict.type[column.optionsName]"
+                v-for="item in dict.type[column.referName]"
                 :key="item.value"
                 :label="item.label"
                 :value="item.value"
@@ -206,109 +216,115 @@ export default {
               style="width: 100%"
             >
             </el-date-picker>
-            <file-upload v-if="column.inputType === 'Upload'"></file-upload>
-            <!-- <el-upload
+            <file-upload
               v-if="column.inputType === 'Upload'"
-              drag
-              multiple
-              action="https://sy.derom.com/document-center/fastdfs/upload"
-              :disabled="column.disabled"
-              :file-list="params[column.key]"
-            >
-              <i class="el-icon-upload"></i>
-              <div class="el-upload__text">
-                将文件拖到此处,或<em>点击上传</em>
-              </div>
-            </el-upload> -->
+              v-model="params[column.key]"
+              :file-type="column.fileType"
+            ></file-upload>
           </el-form-item>
         </el-col>
       </el-row>
-
-      <el-tabs v-model="tabName" style="width: 100%">
-        <el-tab-pane
-          v-for="(column, index) in tabColumns"
-          :key="index"
-          :label="column.title"
-          :name="column.key"
-        >
-          <el-table :data="params[column.key]" style="width: 100%">
-            <el-table-column label="序号">
-              <template slot-scope="scope">
-                {{ scope.$index + 1 }}
-              </template>
-            </el-table-column>
-            <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">
-                <span v-if="!cColumn.type"> {{ scope.row[cColumn.key] }}</span>
-                <el-input
-                  v-if="cColumn.inputType === 'Input'"
-                  v-model="scope.row[cColumn.key]"
-                  :placeholder="cColumn.placeholder"
-                  :clearable="cColumn.clearable"
-                  :disabled="cColumn.disabled"
-                  :size="size"
-                  style="width: 100%"
-                ></el-input>
-                <dr-popover-select
-                  v-if="cColumn.inputType === 'InputDialog'"
-                  v-model="scope.row[cColumn.key]"
-                  :placeholder="cColumn.placeholder"
-                  :clearable="cColumn.clearable"
-                  :disabled="cColumn.disabled"
-                  :readonly="cColumn.readonly"
-                  :title="cColumn.title"
-                  :type="cColumn.referName"
-                  :data-mapping="cColumn.dataMapping"
-                  :source.sync="scope.row"
-                  :size="size"
-                  @hide="handleHide"
-                >
-                </dr-popover-select>
-                <el-input-number
-                  v-if="cColumn.inputType === 'InputNumber'"
-                  v-model="scope.row[cColumn.key]"
-                  :controls-position="cColumn.controlsPosition"
-                  :placeholder="cColumn.placeholder"
-                  :clearable="cColumn.clearable"
-                  :disabled="cColumn.disabled"
-                  :size="size"
-                  style="width: 100%"
-                ></el-input-number>
-              </template>
-            </el-table-column>
-            <el-table-column fixed="right" label="操作" width="120">
-              <template slot="header" slot-scope="scope">
-                <el-button :size="size" @click="addTableRow(params[tabName])">
-                  增 行
-                </el-button>
-              </template>
-              <template slot-scope="scope">
-                <el-button
-                  @click.native.prevent="
-                    delTableRow(params[tabName], scope.$index)
-                  "
-                  type="text"
-                  size="small"
-                >
-                  删行
-                </el-button>
-              </template>
-            </el-table-column>
-          </el-table>
-        </el-tab-pane>
-      </el-tabs>
+      <el-form-item label-width="0">
+        <el-tabs v-model="tabName" tab-position="left" style="width: 100%">
+          <el-tab-pane
+            v-for="(column, index) in tabColumns"
+            :key="index"
+            :label="column.title"
+            :name="column.key"
+          >
+            <el-table :data="params[column.key]" style="width: 100%">
+              <el-table-column label="序号">
+                <template slot-scope="scope">
+                  {{ scope.$index + 1 }}
+                </template>
+              </el-table-column>
+              <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-input
+                    v-if="cColumn.inputType === 'Input'"
+                    v-model="scope.row[cColumn.key]"
+                    :size="size"
+                    :disabled="cColumn.disabled"
+                    :clearable="cColumn.clearable"
+                    :placeholder="cColumn.placeholder"
+                    style="width: 100%"
+                  ></el-input>
+                  <dr-popover-select
+                    v-else-if="cColumn.inputType === 'PopoverSelect'"
+                    v-model="scope.row[cColumn.key]"
+                    :size="size"
+                    :title="cColumn.title"
+                    :source.sync="scope.row"
+                    :type="cColumn.referName"
+                    :disabled="cColumn.disabled"
+                    :readonly="cColumn.readonly"
+                    :clearable="cColumn.clearable"
+                    :placeholder="cColumn.placeholder"
+                    :data-mapping="cColumn.dataMapping"
+                  >
+                  </dr-popover-select>
+                  <el-input-number
+                    v-else-if="cColumn.inputType === 'InputNumber'"
+                    v-model="scope.row[cColumn.key]"
+                    :size="size"
+                    :disabled="cColumn.disabled"
+                    :clearable="cColumn.clearable"
+                    :placeholder="cColumn.placeholder"
+                    :controls-position="cColumn.controlsPosition"
+                    style="width: 100%"
+                  ></el-input-number>
+                  <el-select
+                    v-else-if="cColumn.inputType === 'Select'"
+                    v-model="scope.row[cColumn.key]"
+                    :disabled="cColumn.disabled"
+                    :clearable="cColumn.clearable"
+                    :placeholder="cColumn.placeholder"
+                    style="width: 100%"
+                  >
+                    <el-option
+                      v-for="item in dict.type[cColumn.referName]"
+                      :key="item.value"
+                      :label="item.label"
+                      :value="item.value"
+                    >
+                    </el-option>
+                  </el-select>
+                  <span v-else> {{ scope.row[cColumn.key] }}</span>
+                </template>
+              </el-table-column>
+              <el-table-column fixed="right" label="操作" width="120">
+                <template slot="header" slot-scope="scope">
+                  <el-button :size="size" @click="addRow(params[tabName])">
+                    增 行
+                  </el-button>
+                </template>
+                <template slot-scope="scope">
+                  <el-button
+                    @click.native.prevent="
+                      deleteRow(params[tabName], scope.$index)
+                    "
+                    type="text"
+                    size="small"
+                  >
+                    删行
+                  </el-button>
+                </template>
+              </el-table-column>
+            </el-table>
+          </el-tab-pane>
+        </el-tabs>
+      </el-form-item>
+      <el-form-item label-width="0" style="text-align: right">
+        <el-button :size="size" @click="cancel">取 消</el-button>
+        <el-button :size="size" @click="sava">保 存</el-button>
+        <el-button :size="size" @click="submit('ruleForm')"> 新 增 </el-button>
+      </el-form-item>
     </el-form>
-
-    <div slot="footer">
-      <el-button :size="size" @click="handleCancel">取 消</el-button>
-      <el-button :size="size" @click="handleSava">保 存</el-button>
-      <el-button :size="size" @click="handleSubmit"> 新 增 </el-button>
-    </div>
   </el-dialog>
 </template>

+ 57 - 44
src/views/purchase/contract/column.js

@@ -46,7 +46,7 @@ export const Columns = [
     title: "合同类型",
     inputType: "Select",
     require: true,
-    referName: "purchase_contract_contract_type",
+    referName: "sys_yes_no",
   },
   {
     key: "puMoneyYear",
@@ -70,7 +70,7 @@ export const Columns = [
     title: "供应商层级",
     inputType: "Select",
     require: true,
-    referName: "purchase_contract_supplier_tier",
+    referName: "sys_yes_no",
   },
   { key: "contractName", title: "合同名称", inputType: "Input", require: true },
   {
@@ -84,14 +84,14 @@ export const Columns = [
     title: "审批流程",
     inputType: "Select",
     require: true,
-    referName: "purchase_contract_approve_flow",
+    referName: "sys_yes_no",
   },
   {
     key: "consumableClass",
     title: "耗材类别",
     inputType: "Select",
     require: true,
-    referName: "purchase_contract_consumable_class",
+    referName: "sys_yes_no",
   },
   {
     key: "effectiveDate",
@@ -127,9 +127,9 @@ export const Columns = [
     key: "invoiceTax",
     title: "发票税率",
     inputType: "PopoverSelect",
-    referName: "ORG_PARAM",
+    referName: "TAX_RATE_PARAM",
     dataMapping: {
-      invoiceTax: "mattaxesname",
+      invoiceTax: "name",
     },
     require: true,
   },
@@ -138,7 +138,7 @@ export const Columns = [
     title: "紧急程度",
     inputType: "Select",
     require: true,
-    referName: "purchase_contract_emergency_degree",
+    referName: "sys_yes_no",
   },
   { key: "project", title: "项目医院", inputType: "Input", require: true },
   {
@@ -151,7 +151,7 @@ export const Columns = [
     key: "deliveryType",
     title: "交货方式",
     inputType: "Select",
-    referName: "purchase_contract_delivery_type",
+    referName: "sys_yes_no",
   },
   {
     key: "source",
@@ -180,7 +180,7 @@ export const Columns = [
     key: "freightMethods",
     title: "运费承担方式",
     inputType: "Select",
-    referName: "purchase_contract_freight_methods",
+    referName: "sys_yes_no",
   },
   {
     key: "signDate",
@@ -193,7 +193,7 @@ export const Columns = [
     title: "是否有指标",
     inputType: "Select",
     require: true,
-    referName: "purchase_contract_is_target",
+    referName: "sys_yes_no",
   },
   {
     key: "contractTarget",
@@ -215,7 +215,7 @@ export const Columns = [
     title: "是否有返利",
     inputType: "Select",
     require: true,
-    referName: "purchase_contract_is_rebate",
+    referName: "sys_yes_no",
   },
   {
     key: "rebatePolicy",
@@ -240,13 +240,26 @@ export const Columns = [
   },
   { key: "refusalReasons", title: "拒绝理由", inputType: "Input", span: 24 },
   { key: "enquiryCode", title: "询价单号", inputType: "Input" },
-  { key: "externalFile", title: "对外附件", inputType: "Upload", span: 24 },
-  { key: "puFile", title: "采购商盖章合同附件", inputType: "Upload", span: 24 },
+  {
+    key: "externalFile",
+    title: "对外附件",
+    inputType: "Upload",
+    span: 24,
+    fileType: ["pdf", "xls"],
+  },
+  {
+    key: "puFile",
+    title: "采购商盖章合同附件",
+    inputType: "Upload",
+    span: 24,
+    fileType: ["pdf", "xls"],
+  },
   {
     key: "supplierFile",
     title: "供应商盖章合同附件",
     inputType: "Upload",
     span: 24,
+    fileType: ["pdf", "xls"],
   },
   { key: "projectCode", title: "项目编号", inputType: "Input" },
   { key: "projectName", title: "项目名称", inputType: "Input" },
@@ -288,13 +301,9 @@ export const SearchColumns = [
 
 export const TabColumns = [
   {
-    show: {
-      contractType: [1, 2],
-    },
     title: "物料基本信息",
     key: "contractItemList",
     tableColumns: [
-      { title: "物料编码", key: "material", width: 200 },
       {
         title: "物料名称",
         key: "materialName",
@@ -306,27 +315,23 @@ export const TabColumns = [
           materialName: "name",
         },
       },
+      { title: "物料编码", key: "material", width: 200 },
       {
         title: "规格",
         key: "specification",
         width: 200,
-        referName: "MATERIAL_PARAM",
-        dataMapping: {
-          material: "code",
-          materialName: "name",
-        },
-      },
-      {
-        title: "品牌",
-        key: "brand",
-        inputType: "PopoverSelect",
-        width: 200,
-        referName: "MATERIAL_PARAM",
-        dataMapping: {
-          material: "code",
-          materialName: "name",
-        },
       },
+      // {
+      //   title: "品牌",
+      //   key: "brand",
+      //   inputType: "PopoverSelect",
+      //   width: 200,
+      //   referName: "MATERIAL_PARAM",
+      //   dataMapping: {
+      //     material: "code",
+      //     materialName: "name",
+      //   },
+      // },
       {
         title: "生产厂家",
         key: "manufacturer",
@@ -338,20 +343,18 @@ export const TabColumns = [
         key: "puUnit",
         inputType: "PopoverSelect",
         width: 200,
-        referName: "MATERIAL_PARAM",
+        referName: "UNIT_PARAM",
         dataMapping: {
-          material: "code",
-          materialName: "name",
+          puUnit: "name",
         },
       },
       {
         title: "税率%",
         key: "tax",
         inputType: "PopoverSelect",
-        referName: "MATERIAL_PARAM",
+        referName: "TAX_RATE_PARAM",
         dataMapping: {
-          material: "code",
-          materialName: "name",
+          tax: "name",
         },
 
         width: 200,
@@ -384,10 +387,10 @@ export const TabColumns = [
         key: "customerName",
         inputType: "PopoverSelect",
         width: 200,
-        referName: "SUPPLIER_PARAM",
+        referName: "CUSTOMER_PARAM",
         dataMapping: {
-          material: "code",
-          materialName: "name",
+          customer: "code",
+          customerName: "name",
         },
       },
       { title: "备注", key: "remark", inputType: "Input", width: 200 },
@@ -449,11 +452,21 @@ export const TabColumns = [
       {
         title: "结算方式",
         key: "paymentMeans",
-        inputType: "Input",
+        inputType: "PopoverSelect",
         width: 200,
+        referName: "BALATYPE_PARAM",
+        dataMapping: {
+          paymentMeans: "name",
+        },
       },
       { title: "备注", key: "remark", inputType: "Input", width: 200 },
-      { title: "需进度确认", key: "schedule", inputType: "Select", width: 200 },
+      {
+        title: "需进度确认",
+        key: "schedule",
+        inputType: "Select",
+        referName: "sys_yes_no",
+        width: 200,
+      },
     ],
   },
   {

+ 193 - 242
src/views/purchase/contract/edit/index.vue

@@ -1,63 +1,70 @@
 <script>
 import { Columns, TabColumns } from "../column";
-import { edit, item, itemTableList } from "@/api/business/purchase/contract";
-import { initColumns, initDicts, initRules, initParams } from "@/utils/init";
-
-const NewColumns = initColumns(Columns);
-const NewTabColumns = TabColumns.map((element) => ({
-  ...element,
-  tableColumns: initColumns(element.tableColumns),
-}));
+import {
+  EDIT,
+  ITEM,
+  TABLELIST,
+  TABLEROMOVE,
+} from "@/api/business/purchase/contract";
+import { initDicts, initRules, initParams } from "@/utils/init";
 
 export default {
-  name: "EditDrawer",
-  dicts: initDicts(NewColumns),
-  components: {},
+  name: "EditDialog",
+  dicts: Array.from(
+    new Set([
+      ...initDicts(Columns),
+      ...initDicts(TabColumns.map((item) => item.tableColumns))
+        .flat()
+        .filter((cItem) => cItem.inputType === "Select"),
+    ])
+  ),
   data() {
     return {
       size: "mini",
       visible: false,
       loading: false,
-      columns: NewColumns,
-      rules: initRules(NewColumns),
+      columns: Columns,
+      rules: initRules(Columns),
       params: {
-        ...initParams(NewColumns),
+        ...initParams(Columns),
         contractItemList: [],
         contractClauseList: [],
         contractExpenseList: [],
-        contractAgreementList: [],
         contractApplyOrgList: [],
+        contractAgreementList: [],
       },
-
-      tabColumns: NewTabColumns,
+      tabColumns: TabColumns,
       tabName: "contractItemList",
     };
   },
   computed: {},
   watch: {
     "params.contractType": function (newProp) {
-      this.tabColumns = NewTabColumns.filter((element) =>
+      this.tabColumns = TabColumns.filter((element) =>
         newProp === "1" ? element.key !== "contractItemList" : element
       );
       this.tabName = this.tabColumns[0].key;
     },
-    tabName: function (newProp) {
-      const { id } = this.params;
-      this.fetchTable(id, newProp);
-    },
   },
   methods: {
-    setVisible(prop) {
-      this.visible = prop;
+    open(prop) {
+      this.visible = true;
+      this.fetchItem(prop);
+    },
+    hide() {
+      this.visible = false;
+      this.params = initParams(Columns);
+      this.tabName = this.tabColumns[0].key;
     },
-    // 查询详细
     async fetchItem(prop) {
       try {
         this.loading = true;
-        const { code, msg, data } = await item(prop);
+        const { code, msg, data } = await ITEM(prop);
         if (code === 200) {
           this.params = data;
           this.$notify.success({ title: msg });
+          this.tabName = this.tabColumns[0].key;
+          this.fetchTable(this.params.code, this.tabName);
         } else {
           this.$notify.warning({ title: msg });
         }
@@ -67,11 +74,10 @@ export default {
         this.loading = false;
       }
     },
-    // 查询详情关联TABLE
     async fetchTable(prop, name) {
       try {
         this.loading = true;
-        const { code, msg, rows } = await itemTableList({ id: prop }, name);
+        const { code, msg, rows } = await TABLELIST({ contractId: prop }, name);
         if (code === 200) {
           this.params[name] = rows;
           this.$notify.success({ title: msg });
@@ -84,34 +90,35 @@ export default {
         this.loading = false;
       }
     },
-    // 新增行
-    addTableRow(prop) {
+    addRow(prop) {
       const arr = this.tabColumns.find(
-        (element) => element.key === this.tabName
+        (element) => element.key === prop
       ).tableColumns;
-      prop.push(initParams(arr, "key", "value"));
-    },
-    // 删除行
-    delTableRow(prop, index) {
-      prop.splice(index, 1);
-    },
-    // 取消
-    handleCancel() {
-      this.setVisible(false);
-      this.params = initParams(this.columns, "key", "value");
+      this.params[prop].push(initParams(arr));
     },
-    // 保存
-    handleSava() {
-      this.setVisible(false);
+    async deleteRow(prop, { row: { id }, $index }) {
+      try {
+        this.loading = true;
+        const { code, msg } = await TABLEROMOVE(id, prop);
+        if (code === 200) {
+          this.params[prop].splice($index, 1);
+          this.$notify.success({ title: msg });
+        } else {
+          this.$notify.warning({ title: msg });
+        }
+      } catch (err) {
+        //
+      } finally {
+        this.loading = false;
+      }
     },
-    // 保存并新增
-    async handleSubmit() {
+    async submit() {
       try {
         const createById = this.params.buyer;
         const createByName = this.params.buyerName;
         const updateById = this.$store.state.user.id;
         const updateByName = this.$store.state.user.name;
-        const { code, msg } = await edit({
+        const { code, msg } = await EDIT({
           createById,
           createByName,
           updateById,
@@ -119,8 +126,9 @@ export default {
           ...this.params,
         });
         if (code === 200) {
+          this.hide();
+          this.$emit("submit-success");
           this.$notify.success({ title: msg });
-          this.setVisible(false);
         } else {
           this.$notify.warning({ title: msg });
         }
@@ -131,183 +139,110 @@ export default {
       }
     },
   },
-  created() {
-    console.log("ADD CREATED");
-  },
+  created() {},
   mounted() {},
   destroyed() {},
 };
 </script>
 <template>
-  <el-drawer
-    direction="btt"
-    size="100%"
-    :with-header="false"
-    :visible.sync="visible"
-    @open="beforeOpen"
-    @close="$emit('close')"
-  >
+  <el-dialog :visible.sync="visible" title="编辑" fullscreen @close="hide">
     <el-form
+      ref="ruleForm"
       v-loading="loading"
       :size="size"
-      label-position="right"
-      label-width="135px"
-      :model="params"
       :rules="rules"
+      :model="params"
+      label-width="auto"
+      label-position="right"
     >
-      <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;
-          "
+      <el-row>
+        <el-col
+          v-for="(column, index) in columns"
+          :key="index"
+          :span="column.span || 8"
         >
-          <h3>编辑</h3>
-          <div style="text-align: right">
-            <el-button :size="size" @click="handleCancel">取 消</el-button>
-            <el-button :size="size" type="danger" @click="handleSava"
-              >更 新</el-button
+          <el-form-item :prop="column.key" :label="column.title">
+            <el-input
+              v-if="column.inputType === 'Input'"
+              v-model="params[column.key]"
+              :disabled="column.disabled"
+              :clearable="column.clearable"
+              :placeholder="column.placeholder"
+              style="width: 100%"
+            ></el-input>
+            <dr-popover-select
+              v-if="column.inputType === 'PopoverSelect'"
+              v-model="params[column.key]"
+              :source.sync="params"
+              :title="column.title"
+              :type="column.referName"
+              :disabled="column.disabled"
+              :readonly="column.readonly"
+              :clearable="column.clearable"
+              :placeholder="column.placeholder"
+              :data-mapping="column.dataMapping"
             >
-          </div>
-        </div>
-        <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>
-              <dr-popover-select
-                v-if="column.type === 'InputDialog'"
-                v-model="params[column.key]"
-                :source.sync="params"
-                :type="column.config.componentName"
-                :data-mapping="column.config.dataMapping"
-                :title="column.title"
-                :disabled="column.disabled"
-                :readonly="column.readonly"
-                :clearable="column.clearable"
-                :placeholder="column.placeholder"
-              >
-              </dr-popover-select>
-              <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-view"
-                    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://sy.derom.com/document-center/fastdfs/upload"
-                multiple
+            </dr-popover-select>
+            <el-input
+              v-if="column.inputType === 'Textarea'"
+              v-model="params[column.key]"
+              type="textarea"
+              :disabled="column.disabled"
+              :clearable="column.clearable"
+              :placeholder="column.placeholder"
+              style="width: 100%"
+            ></el-input>
+            <el-input-number
+              v-if="column.inputType === 'InputNumber'"
+              v-model="params[column.key]"
+              :disabled="column.disabled"
+              :clearable="column.clearable"
+              :placeholder="column.placeholder"
+              :controls-position="column.controlsPosition"
+              style="width: 100%"
+            ></el-input-number>
+            <el-select
+              v-if="column.inputType === 'Select'"
+              v-model="params[column.key]"
+              :disabled="column.disabled"
+              :clearable="column.clearable"
+              :placeholder="column.placeholder"
+              style="width: 100%"
+            >
+              <el-option
+                v-for="item in dict.type[column.referName]"
+                :key="item.value"
+                :label="item.label"
+                :value="item.value"
               >
-                <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" style="width: 100%">
+              </el-option>
+            </el-select>
+            <el-date-picker
+              v-if="column.inputType === 'DatePicker'"
+              v-model="params[column.key]"
+              :type="column.type"
+              :disabled="column.disabled"
+              :clearable="column.clearable"
+              :placeholder="column.placeholder"
+              :picker-options="column.pickerOptions"
+              style="width: 100%"
+            >
+            </el-date-picker>
+            <file-upload
+              v-if="column.inputType === 'Upload'"
+              v-model="params[column.key]"
+              :file-type="column.fileType"
+            ></file-upload>
+          </el-form-item>
+        </el-col>
+      </el-row>
+      <el-form-item label-width="0">
+        <el-tabs
+          v-model="tabName"
+          tab-position="left"
+          style="width: 100%"
+          @tab-click="fetchTable(params.code, tabName)"
+        >
           <el-tab-pane
             v-for="(column, index) in tabColumns"
             :key="index"
@@ -328,50 +263,67 @@ export default {
                 :width="cColumn.width"
               >
                 <template slot-scope="scope">
-                  <span v-if="!cColumn.type">
-                    {{ scope.row[cColumn.key] }}</span
-                  >
                   <el-input
-                    v-if="cColumn.type === 'Input'"
+                    v-if="cColumn.inputType === 'Input'"
                     v-model="scope.row[cColumn.key]"
-                    :placeholder="cColumn.placeholder"
-                    :clearable="cColumn.clearable"
-                    :disabled="cColumn.disabled"
                     :size="size"
+                    :disabled="cColumn.disabled"
+                    :clearable="cColumn.clearable"
+                    :placeholder="cColumn.placeholder"
                     style="width: 100%"
                   ></el-input>
                   <dr-popover-select
-                    v-if="cColumn.type === 'InputDialog'"
+                    v-else-if="cColumn.inputType === 'PopoverSelect'"
                     v-model="scope.row[cColumn.key]"
-                    :placeholder="cColumn.placeholder"
-                    :clearable="cColumn.clearable"
-                    :disabled="cColumn.disabled"
-                    :readonly="cColumn.readonly"
+                    :size="size"
                     :title="cColumn.title"
-                    :type="cColumn.config.componentName"
-                    :data-mapping="cColumn.config.dataMapping"
                     :source.sync="scope.row"
-                    :size="size"
+                    :type="cColumn.referName"
+                    :disabled="cColumn.disabled"
+                    :readonly="cColumn.readonly"
+                    :clearable="cColumn.clearable"
+                    :placeholder="cColumn.placeholder"
+                    :data-mapping="cColumn.dataMapping"
                   >
                   </dr-popover-select>
                   <el-input-number
-                    v-if="cColumn.type === 'InputNumber'"
+                    v-else-if="cColumn.inputType === 'InputNumber'"
                     v-model="scope.row[cColumn.key]"
-                    :controls-position="cColumn.config.controlsPosition"
-                    :placeholder="cColumn.placeholder"
-                    :clearable="cColumn.clearable"
-                    :disabled="cColumn.disabled"
                     :size="size"
+                    :disabled="cColumn.disabled"
+                    :clearable="cColumn.clearable"
+                    :placeholder="cColumn.placeholder"
+                    :controls-position="cColumn.controlsPosition"
                     style="width: 100%"
                   ></el-input-number>
+                  <el-select
+                    v-else-if="cColumn.inputType === 'Select'"
+                    v-model="scope.row[cColumn.key]"
+                    :disabled="cColumn.disabled"
+                    :clearable="cColumn.clearable"
+                    :placeholder="cColumn.placeholder"
+                    style="width: 100%"
+                  >
+                    <el-option
+                      v-for="item in dict.type[cColumn.referName]"
+                      :key="item.value"
+                      :label="item.label"
+                      :value="item.value"
+                    >
+                    </el-option>
+                  </el-select>
+                  <span v-else> {{ scope.row[cColumn.key] }}</span>
                 </template>
               </el-table-column>
               <el-table-column fixed="right" label="操作" width="120">
+                <template slot="header" slot-scope="scope">
+                  <el-button :size="size" @click="addRow(tabName)">
+                    增 行
+                  </el-button>
+                </template>
                 <template slot-scope="scope">
                   <el-button
-                    @click.native.prevent="
-                      delTableRow(params[tabName], scope.$index)
-                    "
+                    @click.native.prevent="deleteRow(tabName, scope)"
                     type="text"
                     size="small"
                   >
@@ -382,12 +334,11 @@ export default {
             </el-table>
           </el-tab-pane>
         </el-tabs>
-        <el-row style="position: absolute; top: 20px; right: 20px">
-          <el-button :size="size" @click="addTableRow(params[tabName])"
-            >增行</el-button
-          >
-        </el-row>
-      </el-card>
+      </el-form-item>
+      <el-form-item label-width="0" style="text-align: right">
+        <el-button :size="size" @click="hide">取 消</el-button>
+        <el-button :size="size" @click="submit('ruleForm')"> 更 新 </el-button>
+      </el-form-item>
     </el-form>
-  </el-drawer>
+  </el-dialog>
 </template>

+ 36 - 34
src/views/purchase/contract/index.vue

@@ -7,7 +7,7 @@ export default {
   components: {
     AddDialog: () => import("./add/index.vue"),
     SeeDialog: () => import("./see/index.vue"),
-    // EditDrawer: () => import("./edit/index.vue"),
+    EditDialog: () => import("./edit/index.vue"),
   },
   data() {
     return {
@@ -24,7 +24,7 @@ export default {
   },
   computed: {},
   created() {
-    this.handleQueryList(this.params, this.page);
+    this.queryList(this.params, this.page);
   },
   methods: {
     //
@@ -51,24 +51,24 @@ export default {
       }
     },
     // 查询操作
-    handleQueryList(prop, page) {
+    queryList(prop, page) {
       this.fetchList(prop, page);
     },
     // 重置操作
-    handleResetList(prop, page) {
+    resetList() {
       this.page = initPage();
       this.params = initParams(SearchColumns);
-      this.handleQueryList(prop, page);
+      this.queryList(this.params, this.page);
     },
     // 删除操作
-    async handleDeleteList(prop) {
+    async deleteList(prop) {
       try {
         this.loading = true;
         const { id } = prop;
         const { code, msg } = await REMOVE(id);
         if (code === 200) {
           this.$notify.success({ title: msg });
-          this.handleQueryList(this.params, this.page);
+          this.queryList(this.params, this.page);
         } else {
           this.$notify.warning({ title: msg });
         }
@@ -79,33 +79,31 @@ export default {
       }
     },
     // 页大小变
-    handleSizeChange(prop) {
+    sizeChange(prop) {
       this.page.pageSize = prop;
-      this.handleQueryList(this.params, this.page);
+      this.queryList(this.params, this.page);
     },
     // 当前页变
-    handleCurrentChange(prop) {
+    currentChange(prop) {
       this.page.pageNum = prop;
-      this.handleQueryList(this.params, this.page);
+      this.queryList(this.params, this.page);
     },
     // 打开新增drawer
-    handleOpenAddDrawer() {
-      const { setVisible } = this.$refs.AddDialog;
-      setVisible(true);
+    async openAddDialog() {
+      const { open } = this.$refs.AddDialog;
+      await open();
     },
     // 打开查看drawer
-    async handleOpenSeeDialog(prop) {
+    async openSeeDialog(prop) {
       const { id } = prop;
-      const { setVisible, fetchItem } = this.$refs.SeeDialog;
-      await setVisible(true);
-      await fetchItem(id);
+      const { open } = this.$refs.SeeDialog;
+      await open(id);
     },
     // 打开编辑drawer
-    async handleOpenEditDrawer(prop) {
+    async openEditDialog(prop) {
       const { id } = prop;
-      const { setVisible, fetchItem } = this.$refs.EditDrawerFef;
-      await setVisible(true);
-      await fetchItem(id);
+      const { open } = this.$refs.EditDialog;
+      await open(id);
     },
   },
 };
@@ -118,11 +116,8 @@ export default {
     :body-style="{ padding: 0 }"
   >
     <see-dialog ref="SeeDialog"></see-dialog>
-    <add-dialog
-      ref="AddDialog"
-      @after-submit="handleResetList(params, page)"
-    ></add-dialog>
-    <!-- <edit-drawer ref="EditDrawerFef" @close="handleResetList"></edit-drawer> -->
+    <add-dialog ref="AddDialog" @submit-success="resetList"></add-dialog>
+    <edit-dialog ref="EditDialog" @submit-success="resetList"></edit-dialog>
     <el-form
       :size="size"
       :model="params"
@@ -151,24 +146,24 @@ export default {
             circle
             :size="size"
             icon="el-icon-search"
-            @click="handleQueryList(params, page)"
+            @click="queryList(params, page)"
           ></el-button>
           <el-button
             circle
             :size="size"
             icon="el-icon-refresh"
-            @click="handleResetList(params, page)"
+            @click="resetList"
           ></el-button>
         </el-col>
       </el-row>
     </el-form>
     <el-row :gutter="24" style="padding: 0 20px">
       <el-col :span="6">
-        <el-button :size="size" @click="handleOpenAddDrawer"> 新 增 </el-button>
+        <el-button :size="size" @click="openAddDialog"> 新 增 </el-button>
       </el-col>
     </el-row>
     <el-table
-      @row-dblclick="handleOpenSeeDialog"
+      @row-dblclick="openSeeDialog"
       :data="tableData"
       :size="size"
       style="width: 100%; margin: 20px 0 0 0"
@@ -185,7 +180,14 @@ export default {
       <el-table-column fixed="right" label="操作" width="120">
         <template slot-scope="scope">
           <el-button
-            @click.native.prevent="handleDeleteList(scope.row)"
+            @click.native.prevent="openEditDialog(scope.row)"
+            type="text"
+            size="small"
+          >
+            编 辑
+          </el-button>
+          <el-button
+            @click.native.prevent="deleteList(scope.row)"
             type="text"
             size="small"
           >
@@ -195,8 +197,8 @@ export default {
       </el-table-column>
     </el-table>
     <el-pagination
-      @size-change="handleSizeChange"
-      @current-change="handleCurrentChange"
+      @size-change="sizeChange"
+      @current-change="currentChange"
       :total="page.total"
       :page-sizes="pageSizes"
       :page-size="page.pageSize"

+ 47 - 18
src/views/purchase/contract/see/index.vue

@@ -1,11 +1,18 @@
 <script>
 import { Columns, TabColumns } from "../column";
 import { initDicts, initParams } from "@/utils/init";
-import { ITEM, ITEMTABLELIST } from "@/api/business/purchase/contract";
+import { ITEM, TABLELIST } from "@/api/business/purchase/contract";
 
 export default {
   name: "SeeDialog",
-  dicts: initDicts(Columns),
+  dicts: Array.from(
+    new Set([
+      ...initDicts(Columns),
+      ...initDicts(TabColumns.map((item) => item.tableColumns))
+        .flat()
+        .filter((cItem) => cItem.inputType === "Select"),
+    ])
+  ),
   data() {
     return {
       size: "mini",
@@ -27,10 +34,15 @@ export default {
   computed: {},
   watch: {},
   methods: {
-    setVisible(prop) {
-      this.visible = prop;
+    open(prop) {
+      this.visible = true;
+      this.fetchItem(prop);
+    },
+    hide() {
+      this.visible = false;
+      this.params = initParams(Columns);
+      this.tabName = this.tabColumns[0].key;
     },
-    // 查询详细
     async fetchItem(prop) {
       try {
         this.loading = true;
@@ -38,7 +50,8 @@ export default {
         if (code === 200) {
           this.params = data;
           this.$notify.success({ title: msg });
-          this.fetchTable(this.params.id, this.tabName);
+          this.tabName = this.tabColumns[0].key;
+          this.fetchTable(this.params.code, this.tabName);
         } else {
           this.$notify.warning({ title: msg });
         }
@@ -48,11 +61,10 @@ export default {
         this.loading = false;
       }
     },
-    // 查询详情关联TABLE
     async fetchTable(prop, name) {
       try {
         this.loading = true;
-        const { code, msg, rows } = await ITEMTABLELIST({ id: prop }, name);
+        const { code, msg, rows } = await TABLELIST({ id: prop }, name);
         if (code === 200) {
           this.params[name] = rows;
           this.$notify.success({ title: msg });
@@ -65,17 +77,17 @@ export default {
         this.loading = false;
       }
     },
-    // 取消操作
-    handleCancel() {
-      this.setVisible(false);
-      this.params = initParams(Columns);
-      this.tabName = "contractItemList";
-    },
     // 编辑操作
     // handleOpenEditDrawer(prop) {
     //   this.setVisible(false);
     //   this.$parent.$parent.handleOpenEditDrawer(prop);
     // },
+    setFileList(prop) {
+      return prop.split(",").map((file) => ({
+        url: file,
+        name: file.split("/")[file.split("/").length - 1],
+      }));
+    },
   },
   created() {},
   mounted() {},
@@ -83,7 +95,7 @@ export default {
 };
 </script>
 <template>
-  <el-dialog :visible.sync="visible" title="明细" @close="handleCancel">
+  <el-dialog :visible.sync="visible" title="明细" @close="hide">
     <el-descriptions :column="2" border>
       <el-descriptions-item
         v-if="params[column.key]"
@@ -92,18 +104,35 @@ export default {
         :label="column.title"
       >
         <dict-tag
-          v-if="column.referName && column.inputType === 'Select'"
+          v-if="column.inputType === 'Select'"
           :size="size"
           :value="params[column.key]"
           :options="dict.type[column.referName]"
         />
+        <span v-else-if="column.inputType === 'Upload'">
+          <el-button
+            v-for="file in setFileList(params[column.key])"
+            :key="file.url"
+            type="text"
+            @click.stop="
+              download(
+                '/pu/contract/download/resource',
+                { resource: file.url },
+                file.name
+              )
+            "
+          >
+            {{ file.name }}
+          </el-button>
+        </span>
         <span v-else>{{ params[column.key] }}</span>
       </el-descriptions-item>
     </el-descriptions>
     <el-tabs
       v-model="tabName"
+      tab-position="left"
       style="width: 100%"
-      @tab-click="fetchTable(params.id, tabName)"
+      @tab-click="fetchTable(params.code, tabName)"
     >
       <el-tab-pane
         v-for="(column, index) in tabColumns"
@@ -122,7 +151,7 @@ export default {
           >
             <template slot-scope="scope">
               <dict-tag
-                v-if="cColumn.referName && cColumn.inputType === 'Select'"
+                v-if="cColumn.inputType === 'Select'"
                 :size="size"
                 :value="scope.row[cColumn.key]"
                 :options="dict.type[cColumn.referName]"

+ 46 - 12
src/views/purchase/task/index.vue

@@ -148,7 +148,11 @@ export default {
 </script>
 
 <template>
-  <el-card v-loading="loading" style="width: calc(100% - 24px); height: 100%; margin: 10px" :body-style="{ padding: 0 }">
+  <el-card
+    v-loading="loading"
+    style="width: calc(100% - 24px); height: 100%; margin: 10px"
+    :body-style="{ padding: 0 }"
+  >
     <see-dialog ref="SeeDialog"></see-dialog>
     <first-direct-dialog ref="FirstDirectDialog"></first-direct-dialog>
     <doc-return-dialog ref="DocReturnDialog"></doc-return-dialog>
@@ -255,7 +259,11 @@ export default {
         <el-button :size="size" @click="handleExport(params, page)">
           导 出
         </el-button>
-        <el-button :size="size" :disabled="selectData.length !== 1" @click="handleModifyBuyer(selectData[0])">
+        <el-button
+          :size="size"
+          :disabled="selectData.length !== 1"
+          @click="handleModifyBuyer(selectData[0])"
+        >
           转 派
         </el-button>
         <el-button
@@ -272,27 +280,53 @@ export default {
         >
           行关闭
         </el-button> -->
-        <el-button :size="size" :disabled="!selectData.length" @click="handleOpenFristDirectDrawer(selectData)">
+        <el-button
+          :size="size"
+          :disabled="!selectData.length"
+          @click="handleOpenFristDirectDrawer(selectData)"
+        >
           协议直采
         </el-button>
       </el-col>
     </el-row>
-    <el-table :data="tableData" size="mini" style="width: 100%; margin: 20px 0 0 0" @row-dblclick="handleOpenSeeDrawer"
-      @selection-change="handleSelectionChange">
+    <el-table
+      :data="tableData"
+      size="mini"
+      style="width: 100%; margin: 20px 0 0 0"
+      @row-dblclick="handleOpenSeeDrawer"
+      @selection-change="handleSelectionChange"
+    >
       <el-table-column fixed width="55" align="center" type="selection">
       </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
+        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">
-          <dict-tag v-if="column.referName" :size="size" :value="scope.row[column.key]"
-            :options="dict.type[column.referName]" />
+          <dict-tag
+            v-if="column.referName"
+            :size="size"
+            :value="scope.row[column.key]"
+            :options="dict.type[column.referName]"
+          />
           <span v-else>{{ scope.row[column.key] }}</span>
         </template>
       </el-table-column>
     </el-table>
-    <el-pagination @size-change="handleSizeChange" @current-change="handleCurrentChange" :total="page.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
+      @size-change="handleSizeChange"
+      @current-change="handleCurrentChange"
+      :total="page.total"
+      :page-sizes="pageSizes"
+      :page-size="page.pageSize"
+      :current-page="page.pageNum"
+      layout="total, prev, pager, next, sizes, jumper"
+      style="margin: 10px 20px"
+    >
     </el-pagination>
   </el-card>
 </template>

+ 2 - 2
vue.config.js

@@ -37,7 +37,7 @@ module.exports = {
       // detail: https://cli.vuejs.org/config/#devserver-proxy
       [process.env.VUE_APP_BASE_API]: {
         // target: `http://172.16.100.107:8080/drp-admin`, //测试
-        target: `http://test-sy.derom.com/drp-admin`, //测试
+        // target: `http://test-sy.derom.com/drp-admin`, //测试
         // target: `http://release-sy.derom.com/drp-admin`, //预发
         // target: `http://sy.derom.com/drp-admin`, //生产
         // target: `http://172.16.63.202:8000/drp-admin`, // D本地
@@ -45,7 +45,7 @@ module.exports = {
         // target: `http://172.16.13.152:8000/drp-admin`, //豪哥本地
         // target: `http://172.16.13.47:8000/drp-admin`, //石杨本地
         // target: `http://172.16.13.113:8000/drp-admin`, //DWT本地
-        // target: `http://172.16.13.77:8000/drp-admin`, //TQ本地
+        target: `http://172.16.13.77:8000/drp-admin`, //TQ本地
         changeOrigin: true,
         pathRewrite: {
           ["^" + process.env.VUE_APP_BASE_API]: "",