sen
1 天以前 7ed2a032d0724e68aec8af940f2ce0023a9f0eb7
ui/admin-ui3/src/views/tms/tmsArBill/index.vue
@@ -1,63 +1,63 @@
<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" v-if="row.pushStatus == 3 || row.pushStatus == 4|| row.pushStatus == 0"
          @click="handleManualPush(row)" class="link-btn" underline="never" icon="el-icon-upload">手动推送
        </el-link>
        <el-link size="small" type="primary" @click="handleDerive(row)" class="link-btn" underline="never"
          icon="Download">导出
        </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" v-if="[0, 2].includes(row.status)" @click="handleClose(row)"
            class="link-btn" v-hasPermi="['tms:tmsArBill:closeOrder']" underline="never" icon="el-icon-close">
            作废
          </el-link>
        <el-link size="small" type="primary" @click="handleLog(row)" class="link-btn" underline="never"
          icon="el-icon-tickets">日志
        </el-link>
         <el-link size="small" type="primary" @click="handleFlow(row)" class="link-btn" underline="never"
          icon="el-icon-document">
          审核日志
        </el-link>
      </template>
    </avue-crud>
@@ -65,43 +65,49 @@
    <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>
          <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="客户名称">{{ 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" />
            <el-input-number :min="0" :max="form.settleAmount" v-model="form.deductionAmount" placeholder="请输入减免金额"
              @change="deductionAmountChange" />
          </div>
          <div v-else>{{form.deductionAmount}}</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'">{{ 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>
          <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>
@@ -116,23 +122,21 @@
    </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>
  </basicContainer>
      <flowLogA ref="flowLogIshow" :isShow="false" title="审核日志" :flowParams="flowParams"></flowLogA>
</template>
<script setup name="tmsArBill" lang="ts">
@@ -143,16 +147,20 @@
  exportTmsArBill,
  getTmsArBill,
  listTmsArBill,
  updateTmsArBill
  updateTmsArBill, cancelArBill,
  exportArBillFormat,manualPushTmsArBill,listReceivableAuditLog,tmsArBillCancelPush
} 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";
import { download } from "@/utils/request";
const {proxy} = useCurrentInstance();
const { proxy } = useCurrentInstance();
const crudRef = ref();
const permissionList = computed(() => {
@@ -174,10 +182,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',
@@ -198,50 +206,52 @@
      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: 220,
      editDisplay: true,
      viewDisplay: true,
      hide: false,
      search: true,
      showOverflowTooltip: true
    },
    customerName: {
      label: '客户名称',
      addDisplay: true,minWidth:200,
      addDisplay: true, minWidth: 220,
      editDisplay: true,
      viewDisplay: true,
      hide: false,
      search: true,
      showOverflowTooltip: true
    },
    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,
      addDisplay: true, minWidth: 120,
      editDisplay: true,
      viewDisplay: true,
      hide: false,
    },
    actualSettlementAmount: {
      label: '实际结算金额',
      addDisplay: true,minWidth:120,
      addDisplay: true, minWidth: 120,
      editDisplay: true,
      viewDisplay: true,
      hide: false,
@@ -249,28 +259,41 @@
    settledAmount: {
      label: '已结算金额',
      addDisplay: true,
      editDisplay: true,minWidth:120,
      editDisplay: true, minWidth: 120,
      viewDisplay: true,
      hide: false,
    },
    pushTime: {
      label: '推送时间', display: false, search: true, searchRange: true, type: 'date',
      format: 'YYYY-MM-DD', hide: false, searchSpan: 6, minWidth: 150,
      valueFormat: 'YYYY-MM-DD',
    },
    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,
      search: true,
      fixed: 'right'
    },
    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',
      hide: false,
      search: true,
      fixed: 'right'
    },
    pushStatus: {
      label: '推送状态',
      minWidth: 120,
      type: 'radio', dataType: 'string', dicUrl: '/system/dict/data/type/sys_push_status',
      hide: false,
      search: true,
      fixed: 'right'
    }
  }
})
@@ -288,9 +311,9 @@
  onLoad,
  currentChange,
  sizeChange,
  handleDelete,
  // handleDelete,
  handleExport,
  handleUpdate,
  // handleUpdate,
  refreshChange
} = usePagePlus({
  form: form,
@@ -300,7 +323,7 @@
  page: page.value,
  getListApi: listTmsArBill,
  getDetailApi: getTmsArBill,
  exportApi: exportTmsArBill,
  exportApi: exportArBillFormat,
  deleteApi: delTmsArBill,
  addApi: addTmsArBill,
  updateApi: updateTmsArBill,
@@ -311,29 +334,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: '币制',
    }
  }
@@ -373,21 +398,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'
@@ -396,7 +421,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('修改成功');
@@ -404,8 +429,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;
@@ -418,40 +443,40 @@
    }
  })
}
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 = '结算日志';
  })
@@ -459,8 +484,74 @@
const deductionAmountChange = (e:any) => {
  form.value.actualSettlementAmount =(Number(form.value.settleAmount) || 0) -( Number(form.value.deductionAmount) || 0);
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'
    })
  });
}
const handleDerive = (row: any) => {
  // 构造下载参数,通常需要传入当前行的 ID 或相关查询条件
  const downloadParams = {
    id: row.id, // 假设后台需要通过账单ID导出
    // 如果有其他搜索条件,也可以合并进去
  };
  download('tms/tmsArBill/exportArBillFormat', downloadParams);
};
const handleManualPush = (row: any) => {
  ElMessageBox.confirm(`确定要将账单【${row.billName}】手动推送到财务系统吗?`, '系统提示', {
    confirmButtonText: '确定',
    cancelButtonText: '取消',
    type: 'info'
  }).then(() => {
    // 调用推送接口
    return manualPushTmsArBill(row.id);
  }).then((res) => {
    proxy.$message.success(res.msg);
    onLoad(page.value); // 刷新列表
  }).catch(() => {
    // 取消操作
  });
}
const flowLogIshow = ref()
const flowParams = ref([])
const handleFlow = (row: any) => {
  let data = {
    headId: row.id,
  }
  listReceivableAuditLog(data).then((res) => {
    flowParams.value = res.rows
    flowLogIshow.value.openModel()
  })
}
const handleClose = (row: any) => {
  ElMessageBox.confirm("是否对应收账单" + row.systemNo + "进行作废?", '系统提示', {
    confirmButtonText: '确定',
    cancelButtonText: '取消',
    type: 'warning'
  }).then(() => {
    return tmsArBillCancelPush(row.id);
  }).then(() => {
    onLoad(page.value);
    ElMessage({
      message: "操作成功!",
      type: 'success'
    })
  });
}
</script>