sen
2026-03-31 cc41746818af3b619167947ecb4401ccdfbec2d8
ui/admin-ui3/src/views/tms/tmsArBill/index.vue
@@ -1,63 +1,49 @@
<template>
  <basicContainer>
    <avue-crud
        :option="option"
        :table-loading="pageF.loading"
        :data="tableData"
        :page="page"
        :permission="permissionList"
        :before-open="beforeOpen"
        v-model="form" v-model:search="queryParams"
        ref="crudRef"
        @row-update="rowUpdate"
        @row-save="rowSave"
        @refresh-change="refreshChange"
        @row-del="rowDel"
        @search-change="searchChange"
        @search-reset="searchReset"
        @selection-change="selectionChange"
        @current-change="currentChange"
        @size-change="sizeChange"
        @on-load="onLoad"
    >
<!--      <template #menu-left>-->
<!--        <el-button-->
<!--            type="success"-->
<!--            icon="Edit"-->
<!--            :disabled="pageF.single"-->
<!--            v-hasPermi="['tms:tmsArBill:edit']"-->
<!--            @click="handleUpdate">修改-->
<!--        </el-button>-->
<!--        <el-button-->
<!--            type="danger"-->
<!--            icon="Delete"-->
<!--            :disabled="pageF.multiple"-->
<!--            @click="handleDelete"-->
<!--            v-hasPermi="['tms:tmsArBill:remove']"-->
<!--        >删除-->
<!--        </el-button>-->
<!--        <el-button-->
<!--            type="warning"-->
<!--            plain-->
<!--            icon="Download"-->
<!--            @click="handleExport"-->
<!--            v-hasPermi="['tms:tmsArBill:export']"-->
<!--        >导出-->
<!--        </el-button>-->
<!--      </template>-->
      <template #menu="{row}">
        <el-link size="small" type="primary" v-if="row.status != 2"
                 @click="handleJs(row)" class="link-btn" :underline="false"
                 icon="el-icon-tickets">结算
    <avue-crud :option="option" :table-loading="pageF.loading" :data="tableData" :page="page"
      :permission="permissionList" :before-open="beforeOpen" v-model="form" v-model:search="queryParams" ref="crudRef"
      @row-update="rowUpdate" @row-save="rowSave" @refresh-change="refreshChange" @row-del="rowDel"
      @search-change="searchChange" @search-reset="searchReset" @selection-change="selectionChange"
      @current-change="currentChange" @size-change="sizeChange" @on-load="onLoad">
      <template #menu-left>
        <el-button type="warning" plain icon="Download" @click="handleExport" v-hasPermi="['tms:tmsArBill:export']">导出
        </el-button>
      </template>
      <!--      <template #menu-left>-->
      <!--        <el-button-->
      <!--            type="success"-->
      <!--            icon="Edit"-->
      <!--            :disabled="pageF.single"-->
      <!--            v-hasPermi="['tms:tmsArBill:edit']"-->
      <!--            @click="handleUpdate">修改-->
      <!--        </el-button>-->
      <!--        <el-button-->
      <!--            type="danger"-->
      <!--            icon="Delete"-->
      <!--            :disabled="pageF.multiple"-->
      <!--            @click="handleDelete"-->
      <!--            v-hasPermi="['tms:tmsArBill:remove']"-->
      <!--        >删除-->
      <!--        </el-button>-->
      <!--        <el-button-->
      <!--            type="warning"-->
      <!--            plain-->
      <!--            icon="Download"-->
      <!--            @click="handleExport"-->
      <!--            v-hasPermi="['tms:tmsArBill:export']"-->
      <!--        >导出-->
      <!--        </el-button>-->
      <!--      </template>-->
      <template #menu="{ row }">
        <el-link size="small" type="primary" v-if="row.status != 2" @click="handleJs(row)" class="link-btn"
          underline="never" icon="el-icon-tickets">结算
        </el-link>
        <el-link size="small" type="primary"
                           @click="handleEdit(row)" class="link-btn" :underline="false"
                           icon="el-icon-edit">修改
      </el-link>
        <el-link size="small" type="primary"
                           @click="handleLog(row)" class="link-btn" :underline="false"
                           icon="el-icon-tickets">日志
      </el-link>
        <el-link size="small" type="primary" @click="handleEdit(row)" class="link-btn" underline="never"
          icon="el-icon-edit">修改
        </el-link>
        <el-link size="small" type="primary" @click="handleLog(row)" class="link-btn" underline="never"
          icon="el-icon-tickets">日志
        </el-link>
      </template>
    </avue-crud>
@@ -65,28 +51,48 @@
    <el-dialog :title="pageF.title" v-model="pageF.open" class="avue-dialog avue-dialog--top" width="80%">
      <avue-form v-if="opt == 'js'"  v-model="boxForm" ref="boxFormRef"
                  :option="boxFormOption">
      <avue-form v-if="opt == 'js'" v-model="boxForm" ref="boxFormRef" :option="boxFormOption">
        <template #settleAmount>
          <avue-input-number :min="0" :max="form.actualSettlementAmount" v-model="boxForm.settleAmount"
            placeholder="请输入结算金额"></avue-input-number>
        </template>
      </avue-form>
      <el-descriptions :column="3" title="账单基本信息"  border>
        <el-descriptions-item label="账单系统编号">{{form.systemNo}}</el-descriptions-item>
      <el-descriptions :column="3" title="账单基本信息" border>
        <el-descriptions-item label="账单系统编号">{{ form.systemNo }}</el-descriptions-item>
        <el-descriptions-item label="账单名称">
          <div v-if="opt === 'edit'">
            <el-input v-model="form.billName" placeholder="请输入账单名称" />
          </div>
          <div v-else>{{form.billName}}</div>
          <div v-else>{{ form.billName }}</div>
        </el-descriptions-item>
        <el-descriptions-item label="客户名称">{{form.customerName}}</el-descriptions-item>
        <el-descriptions-item label="应结算金额">{{form.settleAmount}}</el-descriptions-item>
        <el-descriptions-item label="已结算金额" v-if="opt == 'js'">{{form.settledAmount}}</el-descriptions-item>
        <el-descriptions-item label="待结算金额" v-if="opt == 'js'">{{Number(form.settleAmount) - Number(form.settledAmount)}}</el-descriptions-item>
        <el-descriptions-item label="客户名称">{{ form.customerName }}</el-descriptions-item>
        <el-descriptions-item label="应结算金额">{{ form.settleAmount }}</el-descriptions-item>
        <el-descriptions-item label="减免金额">
          <div v-if="opt === 'edit'">
            <el-input-number :min="0" :max="form.settleAmount" v-model="form.deductionAmount" placeholder="请输入减免金额"
              @change="deductionAmountChange" />
          </div>
          <div v-else>{{ form.deductionAmount }}</div>
        </el-descriptions-item>
        <el-descriptions-item label="实际结算金额" v-if="opt == 'edit'">{{ form.actualSettlementAmount }}</el-descriptions-item>
        <el-descriptions-item label="减免原因" v-if="opt == 'edit'">
          <div v-if="opt === 'edit'">
            <el-input v-model="form.reasonReduction" placeholder="请输入减免原因" />
          </div>
          <div v-else>{{ form.reasonReduction }}</div>
        </el-descriptions-item>
        <el-descriptions-item label="已结算金额" v-if="opt == 'js'">{{ form.settledAmount }}</el-descriptions-item>
        <el-descriptions-item label="待结算金额" v-if="opt == 'js'">{{ Number(form.settleAmount) -
          Number(form.settledAmount)}}</el-descriptions-item>
      </el-descriptions>
      <h3>关联明细</h3>
      <avue-crud
          :option="YSGenerateTableOption" ref="itemsTableRef"
          :data="form.items"
      >
      <avue-crud :option="YSGenerateTableOption" ref="itemsTableRef" :data="form.items">
        <template #menu="{ row }">
          <el-link size="small" type="primary" @click="handleCancel(row)" class="link-btn" :underline="false"
            icon="el-icon-close">取消关联
          </el-link>
        </template>
      </avue-crud>
@@ -101,19 +107,16 @@
    </el-dialog>
    <el-dialog :title="pageF.title" v-model="open2" class="avue-dialog avue-dialog--top" width="80%">
      <avue-crud
          :option="logTableOption" ref="itemsTableRef2"
          :data="logTable"
      >
      <avue-crud :option="logTableOption" ref="itemsTableRef2" :data="logTable">
      </avue-crud>
    <template #footer>
      <div class="dialog-footer">
        <el-button @click="open2 = false">取 消</el-button>
      </div>
    </template>
      <template #footer>
        <div class="dialog-footer">
          <el-button @click="open2 = false">取 消</el-button>
        </div>
      </template>
    </el-dialog>
@@ -128,16 +131,18 @@
  exportTmsArBill,
  getTmsArBill,
  listTmsArBill,
  updateTmsArBill
  updateTmsArBill, cancelArBill
} from "@/api/tms/tmsArBill";
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 {addTmsArSettlement, listTmsArSettlement} from "@/api/tms/tmsArSettlement";
import { computed, reactive, ref, toRefs } from "vue";
import { PagesInterface, PageQueryInterface } from "@/utils/globalInterface";
import { usePagePlus } from "@/hooks/usePagePlus";
import { hasPermission } from "@/utils/permissionUtils";
import { addTmsArSettlement, listTmsArSettlement } from "@/api/tms/tmsArSettlement";
import { ElMessage, ElMessageBox } from "element-plus";
import { confirmFinance } from "@/api/tms/tmsFinance";
const {proxy} = useCurrentInstance();
const { proxy } = useCurrentInstance();
const crudRef = ref();
const permissionList = computed(() => {
@@ -159,10 +164,10 @@
  },
  selectionList: [],
  opt: '',
  boxForm:<any> {},
  boxForm: <any>{},
  open2: false
})
const {queryParams, form, page, selectionList,opt,boxForm,open2} = toRefs(data);
const { queryParams, form, page, selectionList, opt, boxForm, open2 } = toRefs(data);
const option = ref({
  pageKey: 'TmsArBill',
  rowKey: 'id',
@@ -183,13 +188,13 @@
      label: '系统编号',
      addDisplay: true,
      editDisplay: true,
      viewDisplay: true,minWidth:150,
      viewDisplay: true, minWidth: 150,
      hide: false,
      search: true,
    },
    billName: {
      label: '账单名称',
      addDisplay: true,minWidth:200,
      addDisplay: true, minWidth: 200,
      editDisplay: true,
      viewDisplay: true,
      hide: false,
@@ -197,7 +202,7 @@
    },
    customerName: {
      label: '客户名称',
      addDisplay: true,minWidth:200,
      addDisplay: true, minWidth: 200,
      editDisplay: true,
      viewDisplay: true,
      hide: false,
@@ -205,14 +210,28 @@
    },
    dispatchCount: {
      label: '调度单数量',
      addDisplay: true,minWidth:120,
      addDisplay: true, minWidth: 120,
      editDisplay: true,
      viewDisplay: true,
      hide: false,
    },
    settleAmount: {
      label: '应结算金额',
      addDisplay: true,minWidth:120,
      addDisplay: true, minWidth: 120,
      editDisplay: true,
      viewDisplay: true,
      hide: false,
    },
    deductionAmount: {
      label: '减免金额',
      addDisplay: true, minWidth: 120,
      editDisplay: true,
      viewDisplay: true,
      hide: false,
    },
    actualSettlementAmount: {
      label: '实际结算金额',
      addDisplay: true, minWidth: 120,
      editDisplay: true,
      viewDisplay: true,
      hide: false,
@@ -220,14 +239,14 @@
    settledAmount: {
      label: '已结算金额',
      addDisplay: true,
      editDisplay: true,minWidth:120,
      editDisplay: true, minWidth: 120,
      viewDisplay: true,
      hide: false,
    },
    invoiceStatus: {
      label: '开票状态',
      addDisplay: true,
      editDisplay: true,minWidth:120,
      editDisplay: true, minWidth: 120,
      type: 'radio', dataType: 'string', dicUrl: '/system/dict/data/type/invoice_status',
      hide: false,
@@ -235,7 +254,7 @@
    },
    status: {
      label: '状态',
      addDisplay: true,minWidth:120,
      addDisplay: true, minWidth: 120,
      editDisplay: true,
      viewDisplay: true,
      type: 'radio', dataType: 'string', dicUrl: '/system/dict/data/type/ar_bill_status',
@@ -259,9 +278,9 @@
  onLoad,
  currentChange,
  sizeChange,
  handleDelete,
  // handleDelete,
  handleExport,
  handleUpdate,
  // handleUpdate,
  refreshChange
} = usePagePlus({
  form: form,
@@ -282,29 +301,31 @@
    selectionList.value = selection;
  }
})
const YSGenerateTableOption= ref({
  menu: false,
const YSGenerateTableOption = ref({
  menu: true,
  add: false,
  header:false,
  header: false,
  selection: false,
  rowKey:'id',
  rowKey: 'id',
  editBtn: false,
  viewBtn: false,
  delBtn: false,
  column: {
  column:{
    projectName:{
    projectName: {
      label: '项目名称',
    },
    dispatchNo:{
    dispatchNo: {
      label: '调度单号',
    },
    orderTime:{
    orderTime: {
      label: '下单时间',
    },
    estimateAmount:{
    estimateAmount: {
      label: '预估应收金额',
    },
    currency:{
    currency: {
      label: '币制',
    }
  }
@@ -344,21 +365,21 @@
})
const boxFormRef = ref();
const handleJs = (row:any) => {
const handleJs = (row: any) => {
  form.value.items = [];
  getTmsArBill(row.id).then((res:any) => {
    form.value = res.data ||[];
  getTmsArBill(row.id).then((res: any) => {
    form.value = res.data || [];
    pageF.open = true;
    pageF.title = '应收账单结算';
    boxForm.value = {}
    opt.value = 'js'
  })
}
const handleEdit = (row:any) => {
const handleEdit = (row: any) => {
  form.value.items = [];
  getTmsArBill(row.id).then((res:any) => {
    form.value = res.data ||[];
  getTmsArBill(row.id).then((res: any) => {
    form.value = res.data || [];
    pageF.open = true;
    pageF.title = '应收账单修改';
    opt.value = 'edit'
@@ -367,7 +388,7 @@
const editSubmit = () => {
  pageF.isUploading = true;
  updateTmsArBill(form.value).then(res=>{
  updateTmsArBill(form.value).then(res => {
    pageF.isUploading = false;
    pageF.open = false;
    proxy.$message.success('修改成功');
@@ -375,8 +396,8 @@
  })
}
const jsSubmit = () => {
  boxFormRef.value.validate((callback:any,done:any)=>{
    if( callback){
  boxFormRef.value.validate((callback: any, done: any) => {
    if (callback) {
      boxForm.value.billId = form.value.id;
      addTmsArSettlement(boxForm.value).then((res) => {
        pageF.open = false;
@@ -389,44 +410,65 @@
    }
  })
}
const logTableOption= ref({
const logTableOption = ref({
  menu: false,
  add: false,
  header:false,
  header: false,
  selection: false,
  rowKey:'id',
  rowKey: 'id',
  column:{
  column: {
    settleAmount:{
    settleAmount: {
      label: '结算金额',
    },
    createBy:{
    createBy: {
      label: '处理人员',
    },
    attachment:{
    attachment: {
      label: '附件下载',
      dataType: 'string',
      type: 'img'
    },
    remark:{
    remark: {
      label: '备注',
    },
    createTime:{
    createTime: {
      label: '提交时间',
    },
  }
})
const logTable = ref<any>()
const handleLog = (row:any)=>{
  listTmsArSettlement({billId:row.id}).then(res=>{
    logTable.value =  res.rows||[];
const handleLog = (row: any) => {
  listTmsArSettlement({ billId: row.id }).then(res => {
    logTable.value = res.rows || [];
    open2.value = true;
    pageF.title = '结算日志';
  })
}
const deductionAmountChange = (e: any) => {
  form.value.actualSettlementAmount = (Number(form.value.settleAmount) || 0) - (Number(form.value.deductionAmount) || 0);
}
const handleCancel = (row: any) => {
  ElMessageBox.confirm("是否对调度单号" + row.dispatchNo + "的应收费用取消关联?", '系统提示', {
    confirmButtonText: '确定',
    cancelButtonText: '取消',
    type: 'warning'
  }).then(() => {
    return cancelArBill(row.id);
  }).then(() => {
    onLoad(page.value);
    ElMessage({
      message: "操作成功!",
      type: 'success'
    })
  });
}
</script>