Răsfoiți Sursa

feat: 收付款条件规则菜单

liujt 5 luni în urmă
părinte
comite
9df84b02df

+ 37 - 0
src/api/rulesManagement/paymentTerms/index.js

@@ -0,0 +1,37 @@
+import request from '@/utils/request';
+
+// 获取付款条件列表
+export function getTableList(data) {
+  return request({
+    url: '/api/paymentTerms/list',
+    method: 'post',
+    data
+  });
+}
+
+// 新增付款条件
+export function addPaymentTerms(data) {
+  return request({
+    url: '/api/paymentTerms',
+    method: 'post',
+    data
+  });
+}
+
+// 修改付款条件
+export function updatePaymentTerms(data) {
+  return request({
+    url: '/api/paymentTerms',
+    method: 'put',
+    data
+  });
+}
+
+// 删除付款条件
+export function deleteInformation(data) {
+  return request({
+    url: '/api/paymentTerms',
+    method: 'delete',
+    data
+  });
+}

+ 37 - 0
src/api/rulesManagement/receiveTerms/index.js

@@ -0,0 +1,37 @@
+import request from '@/utils/request';
+
+// 获取收款条件列表
+export function getTableList(data) {
+  return request({
+    url: '/api/receiveTerms/list',
+    method: 'post',
+    data
+  });
+}
+
+// 新增收款条件
+export function addReceiveTerms(data) {
+  return request({
+    url: '/api/receiveTerms',
+    method: 'post',
+    data
+  });
+}
+
+// 修改收款条件
+export function updateReceiveTerms(data) {
+  return request({
+    url: '/api/receiveTerms',
+    method: 'put',
+    data
+  });
+}
+
+// 删除收款条件
+export function deleteInformation(data) {
+  return request({
+    url: '/api/receiveTerms',
+    method: 'delete',
+    data
+  });
+}

+ 387 - 0
src/views/rulesManagement/paymentTerms/components/addDialog.vue

@@ -0,0 +1,387 @@
+<!-- 新增/编辑弹窗 -->
+<template>
+  <ele-modal
+    width="700px"
+    :visible="visible"
+    :append-to-body="true"
+    :close-on-click-modal="false"
+    custom-class="ele-dialog-form"
+    :title="isDetail ? '付款条件详情' : (isUpdate ? '修改付款条件' : '新增付款条件')"
+    @update:visible="updateVisible"
+  >
+    <el-form
+      ref="form"
+      :model="form"
+      :rules="rules"
+      label-width="140px"
+    >
+      <!-- 付款条件编码 -->
+      <el-form-item label="付款条件编码:" prop="code">
+        <el-input
+          v-model="form.code"
+          placeholder="FKTJ+年月日+3位数字"
+          :disabled="true"
+        />
+      </el-form-item>
+
+      <!-- 付款条件名称 -->
+      <el-form-item label="付款条件名称:" prop="name">
+        <el-input
+          clearable
+          v-model="form.name"
+          placeholder="请输入付款条件名称"
+          :disabled="isDetail"
+        />
+      </el-form-item>
+
+      <!-- 付款日计算日期 -->
+      <el-form-item label="付款日计算日期:" prop="calcDateType">
+        <el-select
+          v-model="form.calcDateType"
+          placeholder="请选择"
+          style="width: 100%"
+          :disabled="isDetail"
+        >
+          <el-option label="订单日期" :value="1" />
+          <el-option label="入库日期" :value="2" />
+          <el-option label="收票日期" :value="3" />
+          <el-option label="对账单日期" :value="4" />
+          <el-option label="应付单日期" :value="5" />
+        </el-select>
+      </el-form-item>
+
+      <!-- 付款日确定方式 -->
+      <el-form-item label="付款日确定方式:" prop="confirmType">
+        <el-select
+          v-model="form.confirmType"
+          placeholder="请选择"
+          style="width: 100%"
+          :disabled="isDetail"
+          @change="handleConfirmTypeChange"
+        >
+          <el-option label="交易日" :value="1" />
+          <el-option label="X天后" :value="2" />
+        </el-select>
+      </el-form-item>
+
+      <!-- 月数(X天后显示) -->
+      <el-form-item label="月数:" v-if="form.confirmType === 2">
+        <el-input-number
+          v-model="form.months"
+          :min="0"
+          :precision="0"
+          controls-position="right"
+          style="width: 100%"
+          :disabled="isDetail"
+        />
+      </el-form-item>
+
+      <!-- 天数(X天后显示) -->
+      <el-form-item label="天数:" v-if="form.confirmType === 2">
+        <el-input-number
+          v-model="form.days"
+          :min="0"
+          :precision="0"
+          controls-position="right"
+          style="width: 100%"
+          :disabled="isDetail"
+        />
+      </el-form-item>
+
+      <!-- 支付方式列表 -->
+      <el-form-item
+        v-for="(item, index) in form.paymentList"
+        :key="item.id"
+        :label="index === 0 ? '支付方式:' : ''"
+        :required="index === 0"
+        class="payment-method-item"
+      >
+        <div class="payment-method-row">
+          <el-input-number
+            v-model="item.ratio"
+            :min="0"
+            :max="100"
+            :precision="0"
+            controls-position="right"
+            class="payment-input"
+            placeholder="比例"
+            :disabled="isDetail"
+          />
+          <span class="payment-unit">%</span>
+          <el-input-number
+            v-model="item.months"
+            :min="0"
+            :precision="0"
+            controls-position="right"
+            class="payment-input"
+            placeholder="月数"
+            :disabled="isDetail"
+          />
+          <span class="payment-unit">月</span>
+          <el-select
+            v-model="item.type"
+            placeholder="请选择"
+            class="payment-select"
+            :disabled="isDetail"
+          >
+            <el-option label="现金" value="现金" />
+            <el-option label="电汇" value="电汇" />
+            <el-option label="银票" value="银票" />
+            <el-option label="商票" value="商票" />
+            <el-option label="三一金票" value="三一金票" />
+            <el-option label="信用证" value="信用证" />
+            <el-option label="银行承兑汇票" value="银行承兑汇票" />
+          </el-select>
+          <el-button
+            v-if="!isDetail && form.paymentList.length > 1 && index !== 0"
+            type="text"
+            icon="el-icon-remove-outline"
+            class="remove-payment-btn"
+            @click="removePaymentRow(index)"
+          />
+          <el-button
+            v-if="!isDetail && index === form.paymentList.length - 1"
+            type="text"
+            icon="el-icon-circle-plus-outline"
+            class="add-payment-btn"
+            @click="addPaymentRow"
+          />
+        </div>
+      </el-form-item>
+
+      <!-- 备注 -->
+      <el-form-item label="备注:" prop="remark">
+        <el-input
+          type="textarea"
+          :rows="3"
+          v-model="form.remark"
+          placeholder="请输入"
+          :disabled="isDetail"
+        />
+      </el-form-item>
+    </el-form>
+
+    <template v-slot:footer>
+      <template v-if="isDetail">
+        <el-button @click="updateVisible(false)">关闭</el-button>
+      </template>
+      <template v-else>
+        <el-button type="primary" :loading="loading" @click="save">
+          确定
+        </el-button>
+        <el-button @click="updateVisible(false)">取消</el-button>
+      </template>
+    </template>
+  </ele-modal>
+</template>
+
+<script>
+  import { addPaymentTerms, updatePaymentTerms } from '@/api/rulesManagement/paymentTerms';
+
+  let paymentId = 0;
+
+  export default {
+    data() {
+      return {
+        visible: false,
+        loading: false,
+        isUpdate: false,
+        isDetail: false,
+        form: {
+          id: null,
+          code: '',
+          name: '',
+          calcDateType: null,
+          confirmType: null,
+          months: 0,
+          days: 0,
+          paymentList: [],
+          remark: ''
+        },
+        rules: {
+          code: [{ required: true, message: '请输入付款条件编码', trigger: 'blur' }],
+          name: [{ required: true, message: '请输入付款条件名称', trigger: 'blur' }],
+          calcDateType: [{ required: true, message: '请选择付款日计算日期', trigger: 'change' }],
+          confirmType: [{ required: true, message: '请选择付款日确定方式', trigger: 'change' }]
+        }
+      };
+    },
+    methods: {
+      // 生成编码 FKTJ+年月日+3位数字
+      generateCode() {
+        const now = new Date();
+        const year = now.getFullYear();
+        const month = String(now.getMonth() + 1).padStart(2, '0');
+        const day = String(now.getDate()).padStart(2, '0');
+        const random = String(Math.floor(Math.random() * 900) + 100);
+        this.form.code = `FKTJ${year}${month}${day}${random}`;
+      },
+
+      open(type, row) {
+        this.visible = true;
+        this.isUpdate = type === 'edit';
+        this.isDetail = type === 'detail';
+        if ((this.isUpdate || this.isDetail) && row) {
+          this.form = {
+            ...row,
+            paymentList: this.parsePaymentMethod(row.paymentMethod)
+          };
+          if (!this.form.paymentList || this.form.paymentList.length === 0) {
+            this.form.paymentList = [this.createEmptyPayment()];
+          }
+        } else {
+          this.resetForm();
+          this.generateCode();
+        }
+        this.$nextTick(() => {
+          this.$refs.form && this.$refs.form.clearValidate();
+        });
+      },
+
+      resetForm() {
+        this.form = {
+          id: null,
+          code: '',
+          name: '',
+          calcDateType: 1,        // 默认:订单日期
+          confirmType: 1,         // 默认:交易日(隐藏月数、天数)
+          months: 0,
+          days: 0,
+          paymentList: [this.createEmptyPayment()], // 默认:100% 0月 现金
+          remark: ''
+        };
+      },
+
+      createEmptyPayment() {
+        return {
+          id: ++paymentId,
+          ratio: 100,
+          months: 0,
+          type: '现金'
+        };
+      },
+
+      // 解析支付方式字符串为数组
+      parsePaymentMethod(methodStr) {
+        if (!methodStr) return [this.createEmptyPayment()];
+        const parts = methodStr.split(',');
+        return parts.map(part => {
+          const match = part.trim().match(/(\d+)%\s*(\d+)月\s*(.+)/);
+          if (match) {
+            return {
+              id: ++paymentId,
+              ratio: parseInt(match[1]),
+              months: parseInt(match[2]),
+              type: match[3]
+            };
+          }
+          return null;
+        }).filter(Boolean);
+      },
+
+      // 付款日确定方式变化
+      handleConfirmTypeChange() {
+        if (this.form.confirmType === 1) {
+          this.form.months = 0;
+          this.form.days = 0;
+        }
+      },
+
+      // 添加支付方式行
+      addPaymentRow() {
+        this.form.paymentList.push(this.createEmptyPayment());
+      },
+
+      // 移除支付方式行
+      removePaymentRow(index) {
+        this.form.paymentList.splice(index, 1);
+      },
+
+      // 构建支付方式字符串
+      buildPaymentMethod() {
+        return this.form.paymentList
+          .map(item => `${item.ratio}% ${item.months}月 ${item.type}`)
+          .join(',');
+      },
+
+      // 构建确认方式描述
+      buildConfirmDesc() {
+        if (this.form.confirmType === 1) {
+          return '交易日';
+        }
+        const parts = [];
+        if (this.form.months > 0) parts.push(`月数:${this.form.months}`);
+        if (this.form.days > 0) parts.push(`天数:${this.form.days}`);
+        if (parts.length === 0) return '0月0天即交易日';
+        return parts.join(',');
+      },
+
+      save() {
+        this.$refs.form.validate((valid) => {
+          if (!valid) return;
+
+          // 校验支付方式比例总和
+          const totalRatio = this.form.paymentList.reduce((sum, item) => sum + item.ratio, 0);
+          if (totalRatio !== 100) {
+            this.$message.warning('支付比例总和必须等于100%');
+            return;
+          }
+
+          this.loading = true;
+
+          const data = {
+            ...this.form,
+            paymentMethod: this.buildPaymentMethod(),
+            confirmDesc: this.buildConfirmDesc()
+          };
+          delete data.paymentList;
+
+          const saveOrUpdate = this.isUpdate ? updatePaymentTerms : addPaymentTerms;
+          saveOrUpdate(data)
+            .then(() => {
+              this.loading = false;
+              this.$message.success(this.isUpdate ? '修改成功' : '新增成功');
+              this.updateVisible(false);
+              this.$emit('done');
+            })
+            .catch(() => {
+              this.loading = false;
+            });
+        });
+      },
+
+      updateVisible(value) {
+        this.visible = value;
+        if (!value) {
+          this.resetForm();
+        }
+      }
+    }
+  };
+</script>
+
+<style lang="scss" scoped>
+  .payment-method-row {
+    display: flex;
+    align-items: center;
+    gap: 8px;
+  }
+  .payment-input {
+    width: 100px;
+  }
+  .payment-unit {
+    color: #606266;
+    font-size: 14px;
+  }
+  .payment-select {
+    width: 120px;
+  }
+  .add-payment-btn,
+  .remove-payment-btn {
+    font-size: 18px;
+    padding: 0;
+  }
+  .remove-payment-btn {
+    color: #f56c6c;
+  }
+</style>

+ 55 - 0
src/views/rulesManagement/paymentTerms/components/searchForm.vue

@@ -0,0 +1,55 @@
+<!-- 搜索表单 -->
+<template>
+  <seekPage :seekList="seekList" :formLength="3" @search="search"></seekPage>
+</template>
+
+<script>
+  export default {
+    data() {
+      return {};
+    },
+    computed: {
+      seekList() {
+        return [
+          {
+            label: '关键词:',
+            value: 'searchName',
+            type: 'input',
+            placeholder: '编码、名称、型号、规格'
+          },
+          {
+            label: '下拉检索:',
+            value: 'searchType',
+            type: 'select',
+            placeholder: '请选择',
+            planList: [
+              { value: 1, label: '选项一' },
+              { value: 2, label: '选项二' },
+              { value: 3, label: '选项三' }
+            ]
+          },
+          {
+            label: '关键词:',
+            value: 'searchName2',
+            type: 'input',
+            placeholder: '编码、名称、型号、规格'
+          },
+          {
+            label: '创建时间:',
+            value: 'createTime',
+            type: 'date',
+            dateType: 'daterange',
+            placeholder: '',
+            width: 380,
+            valueAr: ['createTimeStart', 'createTimeEnd']
+          }
+        ];
+      }
+    },
+    methods: {
+      search(e) {
+        this.$emit('search', { ...e });
+      }
+    }
+  };
+</script>

+ 227 - 0
src/views/rulesManagement/paymentTerms/index.vue

@@ -0,0 +1,227 @@
+<template>
+  <div class="ele-body">
+    <el-card shadow="never" v-loading="loading">
+      <div class="ele-border-lighter form-content" v-loading="loading">
+        <search-form @search="reload"> </search-form>
+
+        <!-- 数据表格 -->
+        <ele-pro-table
+          ref="table"
+          :columns="columns"
+          :datasource="datasource"
+          height="calc(100vh - 375px)"
+          full-height="calc(100vh - 116px)"
+          tool-class="ele-toolbar-form"
+          :selection.sync="selection"
+          :page-size="20"
+          @columns-change="handleColumnChange"
+          :cache-key="cacheKeyUrl"
+        >
+          <!-- 表头工具栏 -->
+          <template v-slot:toolbar>
+            <el-button
+              size="small"
+              type="primary"
+              icon="el-icon-plus"
+              class="ele-btn-icon"
+              @click="openEdit('add', {})"
+            >
+              新增
+            </el-button>
+          </template>
+
+          <!-- 操作列 -->
+          <template v-slot:action="{ row }">
+            <el-link
+              type="primary"
+              :underline="false"
+              icon="el-icon-view"
+              @click="openDetail(row)"
+            >
+              详情
+            </el-link>
+            <el-link
+              type="primary"
+              :underline="false"
+              icon="el-icon-edit"
+              @click="openEdit('edit', row)"
+            >
+              修改
+            </el-link>
+            <el-popconfirm
+              class="ele-action"
+              title="确定要删除此信息吗?"
+              @confirm="remove([row.id])"
+            >
+              <template v-slot:reference>
+                <el-link type="danger" :underline="false" icon="el-icon-delete">
+                  删除
+                </el-link>
+              </template>
+            </el-popconfirm>
+          </template>
+        </ele-pro-table>
+      </div>
+    </el-card>
+
+    <add-dialog ref="addDialogRef" @done="reload"></add-dialog>
+  </div>
+</template>
+
+<script>
+  import searchForm from './components/searchForm.vue';
+  import addDialog from './components/addDialog.vue';
+  import tabMixins from '@/mixins/tableColumnsMixin';
+  import {
+    getTableList,
+    deleteInformation
+  } from '@/api/rulesManagement/paymentTerms';
+
+  export default {
+    mixins: [tabMixins],
+    components: {
+      searchForm,
+      addDialog
+    },
+    data() {
+      return {
+        selection: [],
+        loading: false,
+        columns: [
+          {
+            width: 45,
+            type: 'selection',
+            columnKey: 'selection',
+            align: 'center'
+          },
+          {
+            columnKey: 'index',
+            label: '序号',
+            type: 'index',
+            width: 55,
+            align: 'center',
+            showOverflowTooltip: true,
+            fixed: 'left'
+          },
+          {
+            prop: 'code',
+            label: '编码',
+            align: 'center',
+            sortable: true,
+            showOverflowTooltip: true,
+            minWidth: 160
+          },
+          {
+            prop: 'name',
+            label: '付款条件名称',
+            align: 'center',
+            showOverflowTooltip: true,
+            minWidth: 160
+          },
+          {
+            prop: 'calcDateType',
+            label: '付款日计算日期',
+            align: 'center',
+            showOverflowTooltip: true,
+            minWidth: 160,
+            formatter: (row) => {
+              const map = {
+                1: '订单日期',
+                2: '入库日期',
+                3: '收票日期',
+                4: '对账单日期',
+                5: '应付单日期'
+              };
+              return map[row.calcDateType] || '';
+            }
+          },
+          {
+            prop: 'paymentMethod',
+            label: '支付方式',
+            align: 'center',
+            showOverflowTooltip: true,
+            minWidth: 180
+          },
+          {
+            prop: 'confirmType',
+            label: '付款日确认方式',
+            align: 'center',
+            showOverflowTooltip: true,
+            minWidth: 140,
+            formatter: (row) => {
+              const map = {
+                1: '交易日',
+                2: 'X天后'
+              };
+              return map[row.confirmType] || '';
+            }
+          },
+          {
+            prop: 'confirmDesc',
+            label: '付款日确认方式描述',
+            align: 'center',
+            showOverflowTooltip: true,
+            minWidth: 180
+          },
+          {
+            prop: 'createUserName',
+            label: '创建人',
+            align: 'center',
+            showOverflowTooltip: true,
+            minWidth: 120
+          },
+          {
+            columnKey: 'action',
+            label: '操作',
+            width: 170,
+            align: 'center',
+            resizable: false,
+            slot: 'action',
+            showOverflowTooltip: true,
+            fixed: 'right'
+          }
+        ],
+        cacheKeyUrl: 'eos-paymentTerms-list'
+      };
+    },
+    methods: {
+      /* 表格数据源 */
+      datasource({ page, limit, where }) {
+        return getTableList({
+          pageNum: page,
+          size: limit,
+          ...where
+        });
+      },
+
+      /* 刷新表格 */
+      reload(where) {
+        this.$refs.table.reload({ page: 1, where });
+      },
+
+      // 新增编辑
+      openEdit(type, row) {
+        this.$refs.addDialogRef.open(type, row);
+      },
+
+      // 查看详情
+      openDetail(row) {
+        this.$refs.addDialogRef.open('detail', row);
+      },
+
+      // 删除
+      remove(delData) {
+        deleteInformation(delData).then(() => {
+          this.$message.success('删除成功!');
+          this.reload();
+        });
+      }
+    }
+  };
+</script>
+
+<style lang="scss" scoped>
+  :deep(.el-link--inner) {
+    margin-left: 0px !important;
+  }
+</style>

+ 387 - 0
src/views/rulesManagement/receiveTerms/components/addDialog.vue

@@ -0,0 +1,387 @@
+<!-- 新增/编辑弹窗 -->
+<template>
+  <ele-modal
+    width="700px"
+    :visible="visible"
+    :append-to-body="true"
+    :close-on-click-modal="false"
+    custom-class="ele-dialog-form"
+    :title="isDetail ? '收款条件详情' : (isUpdate ? '修改收款条件' : '新增收款条件')"
+    @update:visible="updateVisible"
+  >
+    <el-form
+      ref="form"
+      :model="form"
+      :rules="rules"
+      label-width="140px"
+    >
+      <!-- 收款条件编码 -->
+      <el-form-item label="收款条件编码:" prop="code">
+        <el-input
+          v-model="form.code"
+          placeholder="SKTJ+年月日+3位数字"
+          :disabled="true"
+        />
+      </el-form-item>
+
+      <!-- 收款条件名称 -->
+      <el-form-item label="收款条件名称:" prop="name">
+        <el-input
+          clearable
+          v-model="form.name"
+          placeholder="请输入收款条件名称"
+          :disabled="isDetail"
+        />
+      </el-form-item>
+
+      <!-- 收款日计算日期 -->
+      <el-form-item label="收款日计算日期:" prop="calcDateType">
+        <el-select
+          v-model="form.calcDateType"
+          placeholder="请选择"
+          style="width: 100%"
+          :disabled="isDetail"
+        >
+          <el-option label="订单日期" :value="1" />
+          <el-option label="出库日期" :value="2" />
+          <el-option label="应收单日期" :value="3" />
+          <el-option label="开票日期" :value="4" />
+          <el-option label="对账单日期" :value="5" />
+        </el-select>
+      </el-form-item>
+
+      <!-- 收款日确定方式 -->
+      <el-form-item label="收款日确定方式:" prop="confirmType">
+        <el-select
+          v-model="form.confirmType"
+          placeholder="请选择"
+          style="width: 100%"
+          :disabled="isDetail"
+          @change="handleConfirmTypeChange"
+        >
+          <el-option label="交易日" :value="1" />
+          <el-option label="X天后" :value="2" />
+        </el-select>
+      </el-form-item>
+
+      <!-- 月数(X天后显示) -->
+      <el-form-item label="月数:" v-if="form.confirmType === 2">
+        <el-input-number
+          v-model="form.months"
+          :min="0"
+          :precision="0"
+          controls-position="right"
+          style="width: 100%"
+          :disabled="isDetail"
+        />
+      </el-form-item>
+
+      <!-- 天数(X天后显示) -->
+      <el-form-item label="天数:" v-if="form.confirmType === 2">
+        <el-input-number
+          v-model="form.days"
+          :min="0"
+          :precision="0"
+          controls-position="right"
+          style="width: 100%"
+          :disabled="isDetail"
+        />
+      </el-form-item>
+
+      <!-- 支付方式列表 -->
+      <el-form-item
+        v-for="(item, index) in form.paymentList"
+        :key="item.id"
+        :label="index === 0 ? '支付方式:' : ''"
+        :required="index === 0"
+        class="payment-method-item"
+      >
+        <div class="payment-method-row">
+          <el-input-number
+            v-model="item.ratio"
+            :min="0"
+            :max="100"
+            :precision="0"
+            controls-position="right"
+            class="payment-input"
+            placeholder="比例"
+            :disabled="isDetail"
+          />
+          <span class="payment-unit">%</span>
+          <el-input-number
+            v-model="item.months"
+            :min="0"
+            :precision="0"
+            controls-position="right"
+            class="payment-input"
+            placeholder="月数"
+            :disabled="isDetail"
+          />
+          <span class="payment-unit">月</span>
+          <el-select
+            v-model="item.type"
+            placeholder="请选择"
+            class="payment-select"
+            :disabled="isDetail"
+          >
+            <el-option label="现金" value="现金" />
+            <el-option label="电汇" value="电汇" />
+            <el-option label="银票" value="银票" />
+            <el-option label="商票" value="商票" />
+            <el-option label="三一金票" value="三一金票" />
+            <el-option label="信用证" value="信用证" />
+            <el-option label="银行承兑汇票" value="银行承兑汇票" />
+          </el-select>
+          <el-button
+            v-if="!isDetail && index === form.paymentList.length - 1"
+            type="text"
+            icon="el-icon-circle-plus-outline"
+            class="add-payment-btn"
+            @click="addPaymentRow"
+          />
+          <el-button
+            v-if="!isDetail && form.paymentList.length > 1 && index !== 0"
+            type="text"
+            icon="el-icon-remove-outline"
+            class="remove-payment-btn"
+            @click="removePaymentRow(index)"
+          />
+        </div>
+      </el-form-item>
+
+      <!-- 备注 -->
+      <el-form-item label="备注:" prop="remark">
+        <el-input
+          type="textarea"
+          :rows="3"
+          v-model="form.remark"
+          placeholder="请输入"
+          :disabled="isDetail"
+        />
+      </el-form-item>
+    </el-form>
+
+    <template v-slot:footer>
+      <template v-if="isDetail">
+        <el-button @click="updateVisible(false)">关闭</el-button>
+      </template>
+      <template v-else>
+        <el-button type="primary" :loading="loading" @click="save">
+          确定
+        </el-button>
+        <el-button @click="updateVisible(false)">取消</el-button>
+      </template>
+    </template>
+  </ele-modal>
+</template>
+
+<script>
+  import { addReceiveTerms, updateReceiveTerms } from '@/api/rulesManagement/receiveTerms';
+
+  let paymentId = 0;
+
+  export default {
+    data() {
+      return {
+        visible: false,
+        loading: false,
+        isUpdate: false,
+        isDetail: false,
+        form: {
+          id: null,
+          code: '',
+          name: '',
+          calcDateType: null,
+          confirmType: null,
+          months: 0,
+          days: 0,
+          paymentList: [],
+          remark: ''
+        },
+        rules: {
+          code: [{ required: true, message: '请输入收款条件编码', trigger: 'blur' }],
+          name: [{ required: true, message: '请输入收款条件名称', trigger: 'blur' }],
+          calcDateType: [{ required: true, message: '请选择收款日计算日期', trigger: 'change' }],
+          confirmType: [{ required: true, message: '请选择收款日确定方式', trigger: 'change' }]
+        }
+      };
+    },
+    methods: {
+      // 生成编码 SKTJ+年月日+3位数字
+      generateCode() {
+        const now = new Date();
+        const year = now.getFullYear();
+        const month = String(now.getMonth() + 1).padStart(2, '0');
+        const day = String(now.getDate()).padStart(2, '0');
+        const random = String(Math.floor(Math.random() * 900) + 100);
+        this.form.code = `SKTJ${year}${month}${day}${random}`;
+      },
+
+      open(type, row) {
+        this.visible = true;
+        this.isUpdate = type === 'edit';
+        this.isDetail = type === 'detail';
+        if ((this.isUpdate || this.isDetail) && row) {
+          this.form = {
+            ...row,
+            paymentList: this.parsePaymentMethod(row.paymentMethod)
+          };
+          if (!this.form.paymentList || this.form.paymentList.length === 0) {
+            this.form.paymentList = [this.createEmptyPayment()];
+          }
+        } else {
+          this.resetForm();
+          this.generateCode();
+        }
+        this.$nextTick(() => {
+          this.$refs.form && this.$refs.form.clearValidate();
+        });
+      },
+
+      resetForm() {
+        this.form = {
+          id: null,
+          code: '',
+          name: '',
+          calcDateType: 1,        // 默认:订单日期
+          confirmType: 1,         // 默认:交易日(隐藏月数、天数)
+          months: 0,
+          days: 0,
+          paymentList: [this.createEmptyPayment()], // 默认:100% 0月 现金
+          remark: ''
+        };
+      },
+
+      createEmptyPayment() {
+        return {
+          id: ++paymentId,
+          ratio: 100,
+          months: 0,
+          type: '现金'
+        };
+      },
+
+      // 解析支付方式字符串为数组
+      parsePaymentMethod(methodStr) {
+        if (!methodStr) return [this.createEmptyPayment()];
+        const parts = methodStr.split(',');
+        return parts.map(part => {
+          const match = part.trim().match(/(\d+)%\s*(\d+)月\s*(.+)/);
+          if (match) {
+            return {
+              id: ++paymentId,
+              ratio: parseInt(match[1]),
+              months: parseInt(match[2]),
+              type: match[3]
+            };
+          }
+          return null;
+        }).filter(Boolean);
+      },
+
+      // 收款日确定方式变化
+      handleConfirmTypeChange() {
+        if (this.form.confirmType === 1) {
+          this.form.months = 0;
+          this.form.days = 0;
+        }
+      },
+
+      // 添加支付方式行
+      addPaymentRow() {
+        this.form.paymentList.push(this.createEmptyPayment());
+      },
+
+      // 移除支付方式行
+      removePaymentRow(index) {
+        this.form.paymentList.splice(index, 1);
+      },
+
+      // 构建支付方式字符串
+      buildPaymentMethod() {
+        return this.form.paymentList
+          .map(item => `${item.ratio}% ${item.months}月 ${item.type}`)
+          .join(',');
+      },
+
+      // 构建确认方式描述
+      buildConfirmDesc() {
+        if (this.form.confirmType === 1) {
+          return '交易日';
+        }
+        const parts = [];
+        if (this.form.months > 0) parts.push(`月数:${this.form.months}`);
+        if (this.form.days > 0) parts.push(`天数:${this.form.days}`);
+        if (parts.length === 0) return '0月0天即交易日';
+        return parts.join(',');
+      },
+
+      save() {
+        this.$refs.form.validate((valid) => {
+          if (!valid) return;
+
+          // 校验支付方式比例总和
+          const totalRatio = this.form.paymentList.reduce((sum, item) => sum + item.ratio, 0);
+          if (totalRatio !== 100) {
+            this.$message.warning('支付比例总和必须等于100%');
+            return;
+          }
+
+          this.loading = true;
+
+          const data = {
+            ...this.form,
+            paymentMethod: this.buildPaymentMethod(),
+            confirmDesc: this.buildConfirmDesc()
+          };
+          delete data.paymentList;
+
+          const saveOrUpdate = this.isUpdate ? updateReceiveTerms : addReceiveTerms;
+          saveOrUpdate(data)
+            .then(() => {
+              this.loading = false;
+              this.$message.success(this.isUpdate ? '修改成功' : '新增成功');
+              this.updateVisible(false);
+              this.$emit('done');
+            })
+            .catch(() => {
+              this.loading = false;
+            });
+        });
+      },
+
+      updateVisible(value) {
+        this.visible = value;
+        if (!value) {
+          this.resetForm();
+        }
+      }
+    }
+  };
+</script>
+
+<style lang="scss" scoped>
+  .payment-method-row {
+    display: flex;
+    align-items: center;
+    gap: 8px;
+  }
+  .payment-input {
+    width: 100px;
+  }
+  .payment-unit {
+    color: #606266;
+    font-size: 14px;
+  }
+  .payment-select {
+    width: 120px;
+  }
+  .add-payment-btn,
+  .remove-payment-btn {
+    font-size: 18px;
+    padding: 0;
+  }
+  .remove-payment-btn {
+    color: #f56c6c;
+  }
+</style>

+ 55 - 0
src/views/rulesManagement/receiveTerms/components/searchForm.vue

@@ -0,0 +1,55 @@
+<!-- 搜索表单 -->
+<template>
+  <seekPage :seekList="seekList" :formLength="3" @search="search"></seekPage>
+</template>
+
+<script>
+  export default {
+    data() {
+      return {};
+    },
+    computed: {
+      seekList() {
+        return [
+          {
+            label: '关键词:',
+            value: 'searchName',
+            type: 'input',
+            placeholder: '编码、名称、型号、规格'
+          },
+          {
+            label: '下拉检索:',
+            value: 'searchType',
+            type: 'select',
+            placeholder: '请选择',
+            planList: [
+              { value: 1, label: '选项一' },
+              { value: 2, label: '选项二' },
+              { value: 3, label: '选项三' }
+            ]
+          },
+          {
+            label: '关键词:',
+            value: 'searchName2',
+            type: 'input',
+            placeholder: '编码、名称、型号、规格'
+          },
+          {
+            label: '创建时间:',
+            value: 'createTime',
+            type: 'date',
+            dateType: 'daterange',
+            placeholder: '',
+            width: 380,
+            valueAr: ['createTimeStart', 'createTimeEnd']
+          }
+        ];
+      }
+    },
+    methods: {
+      search(e) {
+        this.$emit('search', { ...e });
+      }
+    }
+  };
+</script>

+ 227 - 0
src/views/rulesManagement/receiveTerms/index.vue

@@ -0,0 +1,227 @@
+<template>
+  <div class="ele-body">
+    <el-card shadow="never" v-loading="loading">
+      <div class="ele-border-lighter form-content" v-loading="loading">
+        <search-form @search="reload"> </search-form>
+
+        <!-- 数据表格 -->
+        <ele-pro-table
+          ref="table"
+          :columns="columns"
+          :datasource="datasource"
+          height="calc(100vh - 375px)"
+          full-height="calc(100vh - 116px)"
+          tool-class="ele-toolbar-form"
+          :selection.sync="selection"
+          :page-size="20"
+          @columns-change="handleColumnChange"
+          :cache-key="cacheKeyUrl"
+        >
+          <!-- 表头工具栏 -->
+          <template v-slot:toolbar>
+            <el-button
+              size="small"
+              type="primary"
+              icon="el-icon-plus"
+              class="ele-btn-icon"
+              @click="openEdit('add', {})"
+            >
+              新增
+            </el-button>
+          </template>
+
+          <!-- 操作列 -->
+          <template v-slot:action="{ row }">
+            <el-link
+              type="primary"
+              :underline="false"
+              icon="el-icon-view"
+              @click="openDetail(row)"
+            >
+              详情
+            </el-link>
+            <el-link
+              type="primary"
+              :underline="false"
+              icon="el-icon-edit"
+              @click="openEdit('edit', row)"
+            >
+              修改
+            </el-link>
+            <el-popconfirm
+              class="ele-action"
+              title="确定要删除此信息吗?"
+              @confirm="remove([row.id])"
+            >
+              <template v-slot:reference>
+                <el-link type="danger" :underline="false" icon="el-icon-delete">
+                  删除
+                </el-link>
+              </template>
+            </el-popconfirm>
+          </template>
+        </ele-pro-table>
+      </div>
+    </el-card>
+
+    <add-dialog ref="addDialogRef" @done="reload"></add-dialog>
+  </div>
+</template>
+
+<script>
+  import searchForm from './components/searchForm.vue';
+  import addDialog from './components/addDialog.vue';
+  import tabMixins from '@/mixins/tableColumnsMixin';
+  import {
+    getTableList,
+    deleteInformation
+  } from '@/api/rulesManagement/receiveTerms';
+
+  export default {
+    mixins: [tabMixins],
+    components: {
+      searchForm,
+      addDialog
+    },
+    data() {
+      return {
+        selection: [],
+        loading: false,
+        columns: [
+          {
+            width: 45,
+            type: 'selection',
+            columnKey: 'selection',
+            align: 'center'
+          },
+          {
+            columnKey: 'index',
+            label: '序号',
+            type: 'index',
+            width: 55,
+            align: 'center',
+            showOverflowTooltip: true,
+            fixed: 'left'
+          },
+          {
+            prop: 'code',
+            label: '编码',
+            align: 'center',
+            sortable: true,
+            showOverflowTooltip: true,
+            minWidth: 160
+          },
+          {
+            prop: 'name',
+            label: '收款条件名称',
+            align: 'center',
+            showOverflowTooltip: true,
+            minWidth: 160
+          },
+          {
+            prop: 'calcDateType',
+            label: '收款日计算日期',
+            align: 'center',
+            showOverflowTooltip: true,
+            minWidth: 160,
+            formatter: (row) => {
+              const map = {
+                1: '订单日期',
+                2: '出库日期',
+                3: '应收单日期',
+                4: '开票日期',
+                5: '对账单日期'
+              };
+              return map[row.calcDateType] || '';
+            }
+          },
+          {
+            prop: 'paymentMethod',
+            label: '支付方式',
+            align: 'center',
+            showOverflowTooltip: true,
+            minWidth: 140
+          },
+          {
+            prop: 'confirmType',
+            label: '收款日确认方式',
+            align: 'center',
+            showOverflowTooltip: true,
+            minWidth: 140,
+            formatter: (row) => {
+              const map = {
+                1: '交易日',
+                2: 'X天后'
+              };
+              return map[row.confirmType] || '';
+            }
+          },
+          {
+            prop: 'confirmDesc',
+            label: '收款日确认方式描述',
+            align: 'center',
+            showOverflowTooltip: true,
+            minWidth: 180
+          },
+          {
+            prop: 'createUserName',
+            label: '创建人',
+            align: 'center',
+            showOverflowTooltip: true,
+            minWidth: 120
+          },
+          {
+            columnKey: 'action',
+            label: '操作',
+            width: 170,
+            align: 'center',
+            resizable: false,
+            slot: 'action',
+            showOverflowTooltip: true,
+            fixed: 'right'
+          }
+        ],
+        cacheKeyUrl: 'eos-receiveTerms-list'
+      };
+    },
+    methods: {
+      /* 表格数据源 */
+      datasource({ page, limit, where, order }) {
+        return getTableList({
+          pageNum: page,
+          size: limit,
+          ...where
+        });
+      },
+
+      /* 刷新表格 */
+      reload(where) {
+        this.$refs.table.reload({ page: 1, where });
+      },
+
+      // 新增编辑
+      openEdit(type, row) {
+        this.$refs.addDialogRef.open(type, row);
+      },
+
+      // 查看详情
+      openDetail(row) {
+        this.$refs.addDialogRef.open('detail', row);
+      },
+
+      // 删除
+      remove(delData) {
+        deleteInformation(delData).then(() => {
+          this.$message.success('删除成功!');
+          this.reload();
+        });
+      }
+    }
+  };
+</script>
+
+<style lang="scss" scoped>
+  :deep(.el-link--inner) {
+    margin-left: 0px !important;
+  }
+</style>