sen
2025-12-24 93eeec32dec3b3f00681185c1366e8ba07736892
ui/admin-ui3/src/views/cwgl/payableFeeManagement/index.vue
@@ -15,23 +15,26 @@
        <!-- <el-button type="danger" icon="Delete" :disabled="pageF.multiple" @click="handleDelete"
          v-hasPermi="['cwgl:payableFeeManagement:remove']">删除
        </el-button> -->
        <el-button type="success" :disabled="selectDisplay" v-hasPermi="['cwgl:payableFeeManagement:edit']"
          @click="handleBill">生成应付账单
        </el-button>
        <el-button type="warning" plain icon="Download" @click="handleExport"
          v-hasPermi="['cwgl:payableFeeManagement:export']">导出
        </el-button>
          <el-button type="warning" plain icon="Upload" @click="handleImport"
        <!-- <el-button type="warning" plain icon="Upload" @click="handleImport"
          v-hasPermi="['cwgl:payableFeeManagement:import']">导入
        </el-button>
        </el-button> -->
      </template>
      <template #menu="{ size, row, index }">
        <!-- <el-link class="link-btn" type="primary" :underline="false" plain :size="size" icon="View"
          @click="handleExamine(row)" v-hasPermi="['cwgl:receivableFeeManagement:view']"> 查看
        </el-link> -->
        <el-link class="link-btn" type="primary" :underline="false" plain :size="size" icon="el-icon-edit"
          @click="handleEdit(row)" v-hasPermi="['cwgl:payableFeeManagement:edit']"> 编辑
        <el-link class="link-btn" type="primary" :underline="false" plain :size="size" icon="View"
          @click="handleExamine(row)" v-hasPermi="['cwgl:payableFeeManagement:view']"> 查看
        </el-link>
        <el-link class="link-btn" type="primary" :underline="false" plain :size="size" @click="handleCancellation(row)"
          v-hasPermi="['cwgl:payableFeeManagement:invalid']"> 作废
        <el-link class="link-btn" type="primary" v-if="row.status == 0" :underline="false" plain :size="size"
          icon="el-icon-edit" @click="handleEdit(row)" v-hasPermi="['cwgl:payableFeeManagement:edit']"> 编辑
        </el-link>
        <el-link class="link-btn" type="primary" v-if="row.status == 0" :underline="false" plain :size="size"
          @click="handleCancellation(row)" v-hasPermi="['cwgl:payableFeeManagement:invalid']"> 作废
        </el-link>
        <el-button type="text" icon="View" @click="handleFlow(row)"
          v-hasPermi="['cwgl:payableFeeManagement:flow']">日志</el-button>
@@ -40,23 +43,29 @@
  </basicContainer>
  <FeeDetailModal ref="modalRef" :type="currentType" @submit="handleSave" />
  <OperationLogModal ref="logModalRef" />
    <XlsFileImport title="应付信息导入" uploadUrl="/asset/management/importData" templateUrl="asset/management/importTemplate"
      :open="pageF.importOpen" @submit="importSubmit" @cancel="pageF.importOpen = false" />
  <OperationLogModal ref="logModalRef" />
  <GenerateBillDialog ref="billDialogRef" @confirm="onBillConfirm" />
  <DetailModal ref="detailModalRef" />
  <XlsFileImport title="应收信息导入" uploadUrl="/asset/management/importData" templateUrl="asset/management/importTemplate"
    :open="pageF.importOpen" @submit="importSubmit" @cancel="pageF.importOpen = false" />
</template>
<script setup name="payableFeeManagement" lang="ts">
import { PayableFeeManagementI, addPayableFeeManagement, delPayableFeeManagement, exportPayableFeeManagement, getPayableFeeManagement, listPayableFeeManagement, updatePayableFeeManagement } from "@/api/cwgl/payableFeeManagement";
import {
  PayableFeeManagementI, addPayableFeeManagement, delPayableFeeManagement, exportPayableFeeManagement, getPayableFeeManagement, listPayableFeeManagement, updatePayableFeeManagement,
  payableFeeManagementVoid, getPayableFeeManagementStatistics, addpayableFeeManagementCreateBill
} from "@/api/cwgl/payableFeeManagement";
import useCurrentInstance from "@/utils/useCurrentInstance";
import { computed, reactive, ref, toRefs } from "vue";
import { PagesInterface, PageQueryInterface } from "@/utils/globalInterface";
import { usePagePlus } from "@/hooks/usePagePlus";
import { hasPermission } from "@/utils/permissionUtils";
import FeeDetailModal from '@/components/FeeDetailModal/index.vue';
import OperationLogModal from '@/components/OperationLogModal/index.vue';
import FeeDetailModal from '@/components/FeeDetailModal/index.vue';
import GenerateBillDialog from '@/components/GenerateBillDialog/index.vue';
import DetailModal from '@/components/DetailModal/index.vue';
import OperationLogModal from '@/components/OperationLogModal/index.vue';
import { listPayableFeeManagementLog } from "@/api/cwgl/payableFeeManagementLog";
const { proxy } = useCurrentInstance();
const crudRef = ref();
@@ -79,14 +88,19 @@
    currentPage: 1,
  },
  selectionList: [],
  selectDisplay: true,
})
const { queryParams, form, page, selectionList } = toRefs(data);
const { queryParams, form, page, selectionList, selectDisplay } = toRefs(data);
const option = ref({
  pageKey: 'PayableFeeManagement',
  rowKey: 'id',
  searchSpan: 5,
  addBtn: false,
  editBtn: false,
  viewBtn: false,
  delBtn: false,
  labelWidth: 150,
  searchLabelWidth: 120,
  addBtn: false,
  column: {
    // id: {
    //   label: 'ID1',
@@ -149,6 +163,23 @@
        }
      ],
    },
    payableAmountStr: {
      label: '应付金额',
      // label: '应付金额描述',
      minWidth: 150,
      search: true,
      formatter: (row) => {
        if (!row.payableAmountStr) return '-';
        // 将空格替换为换行符。如果后端返回的是 "0港币 2420人民币"
        // 我们将其转换为 "0港币\n2420人民币"
        return row.payableAmountStr.replace(/\s+/g, '\n');
      },
      styles: {
        whiteSpace: 'pre-wrap',
        lineHeight: '1.5'
      },
    },
    documentNo: {
      label: '单据编号',
      search: true,
@@ -161,14 +192,16 @@
        }
      ],
    },
    isInternalSettlement: {
      label: '是否内部结算',
      search: true,
      minWidth: 150,
      minWidth: 120,
      type: 'select', dataType: 'string', dicUrl: '/system/dict/data/type/sys_whether_type',
      rules: [
        {
          required: true,
          message: "是否内部结算不能为空", trigger: "blur"
          message: "单据类型不能为空", trigger: "change"
        }
      ],
    },
@@ -207,6 +240,19 @@
        }
      ],
    },
    businessTimeArray: {
      label: '业务发生时间',
      minWidth: 150,
      search: true,
      searchRange: true,
      addDisplay: false,  // 新增时不显示
      editDisplay: false, // 修改时不显示
      type: 'daterange',
      startPlaceholder: '开始日期',
      endPlaceholder: '结束日期',
      valueFormat: 'YYYY-MM-DD',
      hide: true
    },
    payableConfirmTime: {
      label: '应付确认时间',
      minWidth: 150,
@@ -218,17 +264,30 @@
        }
      ],
    },
    payableAmount: {
      label: '应付金额',
    payableConfirmTimeArray: {
      label: '应付确认时间',
      minWidth: 150,
      rules: [
        {
          required: true,
          message: "应付金额不能为空", trigger: "blur"
        }
      ],
      search: true,
      searchRange: true,
      addDisplay: false,  // 新增时不显示
      editDisplay: false, // 修改时不显示
      type: 'daterange',
      startPlaceholder: '开始日期',
      endPlaceholder: '结束日期',
      valueFormat: 'YYYY-MM-DD',
      hide: true
    },
    // payableAmount: {
    //   label: '应付金额',
    //   minWidth: 150,
    //   rules: [
    //     {
    //       required: true,
    //       message: "应付金额不能为空", trigger: "blur"
    //     }
    //   ],
    // },
    // remark: {
    //   label: '备注',
@@ -243,6 +302,18 @@
      minWidth: 150,
    },
    createdTimeArray: {
      label: '创建时间',
      search: true,
      searchRange: true,
      addDisplay: false,  // 新增时不显示
      editDisplay: false, // 修改时不显示
      type: 'daterange',
      startPlaceholder: '开始日期',
      endPlaceholder: '结束日期',
      valueFormat: 'YYYY-MM-DD',
      hide: true
    },
    updateBy: {
      label: '更新人',
      minWidth: 150,
@@ -253,10 +324,24 @@
      minWidth: 150,
    },
    updateTimeArray: {
      label: '更新时间',
      search: true,
      searchRange: true,
      addDisplay: false,  // 新增时不显示
      editDisplay: false, // 修改时不显示
      type: 'daterange',
      startPlaceholder: '开始日期',
      endPlaceholder: '结束日期',
      valueFormat: 'YYYY-MM-DD',
      hide: true
    },
    status: {
      search: true,
      label: '状态',
      minWidth: 150,
      fixed: 'right',
      minWidth: 120,
      type: 'select', dataType: 'string', dicUrl: '/system/dict/data/type/sys_charge',
    },
    // deleted: {
    //   label: '删除标记(0:正常;1:删除)',
@@ -280,9 +365,46 @@
    handleUpdateFunc: () => {
      crudRef.value.rowEdit(selectionList.value[0]);
    },
    handleSelectionChangeFunc: (selection: any) => {
      // 假设你要对比的字段名是 customerFullName   isInternalSettlement internalSettlementUnit
      // 1. 数组长度必须大于 0
      if (selection && selection.length > 0) {
        // 取出第一项作为对比基准
        const firstItem = selection[0];
        // 2. 检查每一项是否都与第一项的三个关键字段完全一致
        const isAllMatch = selection.every(item =>
          item.internalSettlementUnit === firstItem.internalSettlementUnit &&
          item.supplierName === firstItem.supplierName &&
          item.status == 0
        );
        // 如果全部匹配,selectDisplay 为 false,否则为 true
        selectDisplay.value = !isAllMatch;
      } else {
        // 3. 如果数组为空,根据你的逻辑通常返回 true (即不显示或禁用)
        selectDisplay.value = true;
      }
      selectionList.value = selection;
    },
    getBeginListFunc: (params = {}) => {
      // 创建新参数对象
      let newParams = { ...params };
      newParams = proxy.addDateRangeNew(newParams, newParams?.createdTimeArray, 'createTime') || [];
      newParams = proxy.addDateRangeNew(newParams, newParams?.updateTimeArray, 'updateTime') || [];
      newParams = proxy.addDateRangeNew(newParams, newParams?.businessTimeArray, 'businessTime') || [];
      newParams = proxy.addDateRangeNew(newParams, newParams?.payableConfirmTimeArray, 'payableConfirmTime') || [];
      delete newParams.createdTimeArray;
      delete newParams.updateTimeArray;
      delete newParams.businessTimeArray;
      delete newParams.payableConfirmTimeArray;
      queryParams.value = newParams;
      return newParams;
    }
  })
const modalRef = ref(null);
@@ -298,11 +420,11 @@
const handleEdit = (row) => {
  currentType.value = 'payable';
  addIshorw.value = false;
  // getReceivableFeeManagement(row.id).then((res) => {
  //   if (res.code === 200) {
  //     modalRef.value.open(res.data);
  //   }
  // });
  getPayableFeeManagement(row.id).then((res) => {
    if (res.code === 200) {
      modalRef.value.open(res.data);
    }
  });
};
/* 新增编辑 */
@@ -310,24 +432,24 @@
  if (addIshorw.value) {
    data.payableFeeDetailList = payableFeeDetailList;
    data.status = '0';
    // addReceivableFeeManagement(data).then((res) => {
    //   if (res.code === 200) {
    //     proxy.$message.success(res.msg);
    //     onLoad(page.value);
    //     modalRef.value.canceleClick();
    addPayableFeeManagement(data).then((res) => {
      if (res.code === 200) {
        proxy.$message.success(res.msg);
        onLoad(page.value);
        modalRef.value.canceleClick();
    //   }
    // })
      }
    })
  } else {
    data.payableFeeDetailList = payableFeeDetailList;
    // updateReceivableFeeManagement(data).then((res) => {
    //   if (res.code === 200) {
    //     proxy.$message.success(res.msg);
    //     onLoad(page.value);
    //     modalRef.value.canceleClick();
    updatePayableFeeManagement(data).then((res) => {
      if (res.code === 200) {
        proxy.$message.success(res.msg);
        onLoad(page.value);
        modalRef.value.canceleClick();
    //   }
    // })
      }
    })
  }
};
/* 导入 */
@@ -346,24 +468,71 @@
    cancelButtonText: '取消',
    type: 'warning'
  }).then(() => {
    // delReceivableFeeManagement(row.id).then((res) => {
    //   if (res.code === 200) {
    //     proxy.$message.success(res.msg);
    //     onLoad(page.value);
    //   }
    // });
    payableFeeManagementVoid(row.id).then((res) => {
      if (res.code === 200) {
        proxy.$message.success(res.msg);
        onLoad(page.value);
      }
    });
  })
};
const detailModalRef = ref(null);
const handleExamine = (row) => {
  getPayableFeeManagement(row.id).then((res) => {
    if (res.code === 200) {
      detailModalRef.value.open(res.data, 'payable');
    }
  });
};
/* 日志 */
const logModalRef = ref(null);
const handleFlow = (row: any) => {
// 这里可以从 row 中直接获取日志,或者调用后端接口查询
  // 示例模拟数据
  const mockLogs = [
    { createBy: 'admin', createTime: '2025-12-19 10:00:00', type: 'add', description: '创建应收单据' },
    { createBy: '财务专员01', createTime: '2025-12-19 14:30:00', type: 'edit', description: '修改应收金额为 1000.00' }
  ];
  logModalRef.value.open(mockLogs);
  listPayableFeeManagementLog({ payableFeeId: row.id }).then((res) => {
    if (res.code == 200) {
      logModalRef.value.open(res.rows, 'receivable');
    }
  });
}
/*  */
const billDialogRef = ref(null);
const handleBill = () => {
  const ids = selectionList.value.map(item => item.id).join(',');
  getPayableFeeManagementStatistics(ids).then((res) => {
    if (res.code === 200) {
      // 打开弹窗并传入数据
      billDialogRef.value.open(res.data, selectionList.value, 'payable');
    }
  });
};
const onBillConfirm = (statisticsData, obj: any) => {
  const payload = {
    billType: obj.billType,
    billName: obj.billName,
    statisticsData: statisticsData,
    customerName: selectionList.value[0].customerName,
    isInternalSettlement: selectionList.value[0].isInternalSettlement,
    internalSettlementUnit: selectionList.value[0].internalSettlementUnit,
    supplierName: selectionList.value[0].supplierName,
  };
  addpayableFeeManagementCreateBill(payload).then((res) => {
    if (res.code === 200) {
      proxy.$message.success(res.msg);
      billDialogRef.value.cancel();
      onLoad(page.value);
    }
  });
};
</script>
<style scoped>
/* 确保 el-table 能够识别换行符 */
:deep(.el-table .cell) {
  white-space: pre-wrap !important;
  word-break: break-all;
}
</style>