sen
2025-08-15 cf344c633ef8d85faba0c37e86d4373ed586f9e1
增加待入账业务
8个文件已修改
1个文件已添加
2524 ■■■■ 已修改文件
ui/admin-ui3/src/api/cwgl/estimatedReceivable.ts 28 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ui/admin-ui3/src/api/cwgl/estimatedReceivableBill.ts 47 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ui/admin-ui3/src/api/cwgl/pendingSettlementBusiness.ts 42 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ui/admin-ui3/src/components/flowLog/index.vue 177 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ui/admin-ui3/src/main.ts 4 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ui/admin-ui3/src/views/cwgl/dispatchOrder/index.vue 117 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ui/admin-ui3/src/views/cwgl/estimatedReceivable/index.vue 692 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ui/admin-ui3/src/views/cwgl/estimatedReceivableBill/index.vue 671 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ui/admin-ui3/src/views/cwgl/pendingSettlementBusiness/index.vue 746 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ui/admin-ui3/src/api/cwgl/estimatedReceivable.ts
@@ -65,3 +65,31 @@
        download('/cwgl/estimatedReceivable/export',query);
    })
}
/**
 * 确认
 */
export const getEstimatedReceivableConfirm:requestType = (id) => {
    return request({
        url: '/cwgl/estimatedReceivable/confirm/' + id,
        method:'get'
    })
}
/**
 * 取消
 */
export const getCwglEstimatedReceivableCancel:requestType = (id) => {
    return request({
        url: '/cwgl/estimatedReceivable/cancel/' + id,
        method:'get'
    })
}
/**
 * 作废
 */
export const getEstimatedReceivableInvalid:requestType = (id) => {
    return request({
        url: '/cwgl/estimatedReceivable/invalid/' + id,
        method:'get'
    })
}
ui/admin-ui3/src/api/cwgl/estimatedReceivableBill.ts
@@ -45,6 +45,13 @@
        data
    })
}
export const updateEstimatedReceivableBillNmae:requestType = (data) => {
    return request({
        url: '/cwgl/estimatedReceivableBill/name',
        method: 'put',
        data
    })
}
/**
 * 删除预估应收账单
@@ -55,7 +62,13 @@
        method: 'delete'
    })
}
/* 取消关联 */
export const cancelRelevancy:requestType = (id) => {
    return request({
        url: '/cwgl/estimatedReceivableBill/cancel/relevancy/' + id,
        method: 'get'
    })
}
/**
 * 导出预估应收账单
@@ -65,3 +78,35 @@
        download('/cwgl/estimatedReceivableBill/export',query);
    })
}
/**
 *
 */
export const estimatedReceivableBillSettlement:requestType = (data) => {
    return request({
        url: '/cwgl/estimatedReceivableBill/settlement',
        method: 'post',
        data
    })
}
/**
 * 新增预估应收管理日志
 */
export const addEstimatedReceivableLog:requestType = (data) => {
    return request({
        url: '/cwgl/estimatedReceivableLog',
        method: 'post',
        data
    })
}
/**
 * 查询预估应收账单日志列表
 */
export const listEstimatedReceivableBillLog:requestType = (query) => {
    return request({
        url: '/cwgl/estimatedReceivableBillLog/list',
        method:'get',
        params:query
    })
}
ui/admin-ui3/src/api/cwgl/pendingSettlementBusiness.ts
@@ -23,7 +23,49 @@
        method:'get'
    })
}
/* 待入账业务账单 */
export const getCwglPendingSettlementBusinessBillList:requestType = (query) => {
    return request({
        url: '/cwgl/pendingSettlementBusiness/bill/list',
        method:'get',
         params:query
    })
}
/* 确认未勾选账单 */
export const pendingSettlementBusinessCreateBillList:requestType = (query) => {
    return request({
        url: '/cwgl/pendingSettlementBusiness/create/bill/list',
        method:'get',
         params:query
    })
}
/* 确认勾选账单 */
export const cwglPendingSettlementBusinessCreateBill:requestType = (data,id) => {
    return request({
        url: '/cwgl/pendingSettlementBusiness/create/bill/'+ id,
        method: 'post',
        data
    })
}
/* 客户名称 */
export const getSelectCustomNam:requestType = () => {
    return request({
        url: '/cwgl/pendingSettlementBusiness/select/customName',
        method:'get'
    })
}
/**
 * 获取生成账单
 */
export const getPendingSettlementBusinessBill:requestType = (id) => {
    return request({
        url: '/cwgl/pendingSettlementBusiness/bill/' + id,
        method:'get'
    })
}
/**
 * 新增待入账业务
 */
ui/admin-ui3/src/components/flowLog/index.vue
New file
@@ -0,0 +1,177 @@
<script lang="ts" setup>
import { reactive, ref, toRefs, watch, nextTick } from "vue";
import { BaseEntityInterface, PageQueryInterface } from "@/utils/globalInterface";
import { usePagePlus } from "@/hooks/usePagePlus";
import { getToken } from "@/utils/auth";
// import { listDzInoutOrder } from "@/api/dz/dzInoutOrder";
import useCurrentInstance from "@/utils/useCurrentInstance"; import { ElTable, ElTableColumn } from 'element-plus'
const { proxy } = useCurrentInstance();
interface DzInoutOrderI extends BaseEntityInterface {
    id?: number,
    no?: string,
    sasStockNo?: string,
    entryNo?: string,
    bondInvtId?: number,
    bondInvtNo?: string,
    releaseId?: number,
    releaseNo?: string,
    areainOriactNo?: string,
    areainEtpsNo?: string,
    areainEtpsNm?: string,
    areainEtpsSccd?: string,
    masterCuscd?: string,
    stockTypecd?: string,
    businessTypecd?: string,
    rltSasStockNo?: string,
    dclEr?: string,
    dclEtpsNo?: string,
    dclEtpsNm?: string,
    dclEtpsSccd?: string,
    inputCode?: string,
    inputSccd?: string,
    inputName?: string,
    etpsPreentNo?: string,
    packageQty?: string,
    grossWt?: string,
    netWt?: string,
    packType?: string,
    eportReplaceMark?: number,
    mtpckEndprdType?: string,
    enterpriseName?: string,
    stockDate?: string,
    tradeType?: number,
    conveyanceId?: number,
    conveyanceNo?: string,
    conveyanceName?: string,
    enterId?: number,
    deleted?: number,
}
const props = defineProps({
    flowParams: Array,
    flowParamsShow: {
        type: Boolean,
        default: false
    },
    fileNameIshow: {
        type: Boolean,
        default: false
    },
})
console.log(props);
const { } =
    proxy.useDict();
const stockTypecdFormat = (row: any) => {
    return proxy.selectDictLabel(sy_dz_account_book_status.value, row.stockTypecd);
}
const data = reactive({
    orderSelection: <DzInoutOrderI[]>[],
    queryParams: <DzInoutOrderI & PageQueryInterface>{ pageNum: 1, pageSize: 10 },
    rules: {},
})
const { queryParams, rules, orderSelection } = toRefs(data);
const currentRow = ref()
const emit = defineEmits(['affirm'])
const {
    pageF, tableData, getList,
    handleQuery, resetQuery,
} = usePagePlus({
    title: '流程日志',
    queryParams: queryParams.value,
    // getListApi: listDzInoutOrder,
    resetQueryFunc: () => {
    },
})
const multipleTableRef = ref<InstanceType<typeof ElTable>>()
/**
 * 确定
 */
const affirmQuery = () => {
}
let newArray = ref<any>()
const openModel = () => {
    pageF.drawerOpen = true;
}
const closeModel = () => {
    pageF.drawerOpen = false;
}
// getList()
const download_qr_code = (row: string) => {
   downloadFile(row.fileName);
}
const baseURL = import.meta.env.VITE_APP_BASE_API
// 创建一个点击事件触发下载
function downloadFile(row: any) {
    // 文件下载地址
    const fileUrl = baseURL + "/common/download/resource?resource=" + encodeURI(row);
    // 设置请求头
    const headers = new Headers();
    headers.append('Authorization', 'Bearer ' + getToken()); // 设置授权头,替换YourAccessToken为实际的访问令牌
    // 发起 Fetch 请求
    fetch(fileUrl, {
        method: 'GET',
        headers: headers,
    })
        .then(response => response.blob())
        .then(blob => {
            // 创建一个虚拟的链接元素,模拟点击下载
            const link = document.createElement('a');
            link.href = window.URL.createObjectURL(blob);
            link.download = row; // 设置下载文件名,替换filename.ext为实际的文件名和扩展名
            document.body.appendChild(link);
            // 模拟点击
            link.click();
            // 移除虚拟链接元素
            document.body.removeChild(link);
        })
        .catch(error => console.error('下载失败:', error));
}
defineExpose({
    openModel,
})
</script>
<template>
    <el-dialog v-model="pageF.drawerOpen" title="流程日志" append-to-body width="1000px">
        <div class="app-container" style="padding-top: 0;">
            <el-table ref="multipleTableRef" :data="props.flowParams">
                <el-table-column align="center" label="处理时间" prop="createTime" />
                <el-table-column align="center" label="处理人员" prop="createBy" />
                <el-table-column align="center" label="附件下载" prop="fileName">
                    <template #default="scope">
                        <el-link v-if="scope.row.fileName" type="primary" :underline="false"
                            @click="download_qr_code(scope.row)">
                            {{scope.row.fileName}}
                        </el-link>
                        <span v-else>无附件</span>
                    </template>
                </el-table-column>
                <el-table-column align="center" label="节点描述" prop="operation" show-overflow-tooltip="true" />
            </el-table>
            <!-- <pagination style="position: relative;" v-show="pageF.total > 0" v-model:limit="queryParams.pageSize"
                v-model:page="queryParams.pageNum" :total="pageF.total" @pagination="getList" /> -->
        </div>
        <div class="dialog-footer" style="text-align: right">
            <el-button @click="closeModel">关闭</el-button>
        </div>
    </el-dialog>
</template>
<style scoped></style>
ui/admin-ui3/src/main.ts
@@ -27,11 +27,15 @@
import DictTag from "/src/components/DictTag/index.vue";
import FileUpload from "/src/components/FileUpload/index.vue";
import basicContainer from '/src/components/basic-container/main.vue';
import flowLog from './components/flowLog/index.vue';
import SvgIcon from "/src/components/SvgIcon/index.vue";
app.component("DictTag", DictTag);
app.component('FileUpload', FileUpload);
app.component('basicContainer', basicContainer)
app.component('flowLog', flowLog)
app.component('svg-icon', SvgIcon)
ui/admin-ui3/src/views/cwgl/dispatchOrder/index.vue
@@ -111,6 +111,8 @@
  delBtn: false,
  viewBtn: false,
  selection: false,
  searchSpan: 5,
  searchLabelWidth: 100,
  column: {
    dispatchNo: {
      fixed: 'left',
@@ -146,63 +148,63 @@
    vehiclePlateId: {
      label: '车板号', width: 120,
    },
    mainDriverName: {
      label: '主驾驶员', width: 120,
    },
    assistantDriverName: {
      label: '副驾驶员', width: 120,
    },
    pointNum: {
      label: '提送货点数', width: 120,
    },
    quantity: {
      label: '件数', width: 120,
    },
    actualDepartureTime: {
      label: '实际出发时间', width: 180,
    },
    actualDepartureTimeRange: {
      label: '实际出发时间', display: false, search: true, searchRange: true, type: 'date',
      format: 'YYYY-MM-DD', hide: true, searchSpan: 6, searchLabelWidth: 110,
      valueFormat: 'YYYY-MM-DD',
    },
    requiredArrivalTime: {
      label: '要求到达时间', width: 180,
    },
    requiredArrivalTimeRange: {
      label: '要求到达时间', display: false, search: true, searchRange: true, type: 'date',
      format: 'YYYY-MM-DD', hide: true, searchSpan: 6, searchLabelWidth: 110,
      valueFormat: 'YYYY-MM-DD',
    },
    actualArrivalTime: {
      label: '实际到达时间', width: 180,
    },
    actualArrivalTimeRange: {
      label: '要求到达时间', display: false, search: true, searchRange: true, type: 'date',
      format: 'YYYY-MM-DD', hide: true, searchSpan: 6, searchLabelWidth: 110,
      valueFormat: 'YYYY-MM-DD',
    },
    beReturn: {
      label: '是否回程', dataType: 'string', width: 100,
      type: 'select', dicUrl: '/system/dict/data/type/dispatch_order_status',
    },
    dispatchQuantity: {
      label: '实发件数', width: 100,
    },
    dispatchWeight: {
      label: '实发重量', width: 100,
    },
    dispatchVolume: {
      label: '实发体积(立方)', width: 160,
    },
    status: {
      label: '状态', search: true, dataType: 'string', width: 100,
      type: 'select', dicUrl: '/system/dict/data/type/dispatch_order_status',
    },
    remark: {
      label: '备注', width: 120,
      type: 'textarea', minRows: 3, maxRows: 5,
    },
    // mainDriverName: {
    //   label: '主驾驶员', width: 120,
    // },
    // assistantDriverName: {
    //   label: '副驾驶员', width: 120,
    // },
    // pointNum: {
    //   label: '提送货点数', width: 120,
    // },
    // quantity: {
    //   label: '件数', width: 120,
    // },
    // actualDepartureTime: {
    //   label: '实际出发时间', width: 180,
    // },
    // actualDepartureTimeRange: {
    //   label: '实际出发时间', display: false, search: true, searchRange: true, type: 'date',
    //   format: 'YYYY-MM-DD', hide: true, searchSpan: 5, searchLabelWidth: 120,
    //   valueFormat: 'YYYY-MM-DD',
    // },
    // requiredArrivalTime: {
    //   label: '要求到达时间', width: 180,
    // },
    // requiredArrivalTimeRange: {
    //   label: '要求到达时间', display: false, search: true, searchRange: true, type: 'date',
    //   format: 'YYYY-MM-DD', hide: true, searchSpan: 5, searchLabelWidth: 120,
    //   valueFormat: 'YYYY-MM-DD',
    // },
    // actualArrivalTime: {
    //   label: '实际到达时间', width: 180,
    // },
    // actualArrivalTimeRange: {
    //   label: '要求到达时间', display: false, search: true, searchRange: true, type: 'date',
    //   format: 'YYYY-MM-DD', hide: true, searchSpan: 5, searchLabelWidth: 120,
    //   valueFormat: 'YYYY-MM-DD',
    // },
    // beReturn: {
    //   label: '是否回程', dataType: 'string', width: 100,
    //   type: 'select', dicUrl: '/system/dict/data/type/dispatch_order_status',
    // },
    // dispatchQuantity: {
    //   label: '实发件数', width: 100,
    // },
    // dispatchWeight: {
    //   label: '实发重量', width: 100,
    // },
    // dispatchVolume: {
    //   label: '实发体积(立方)', width: 160,
    // },
    // status: {
    //   label: '状态', search: true, dataType: 'string', width: 100,
    //   type: 'select', dicUrl: '/system/dict/data/type/dispatch_order_status',
    // },
    // remark: {
    //   label: '备注', width: 120,
    //   type: 'textarea', minRows: 3, maxRows: 5,
    // },
    // createBy: {
    //   label: '创建人',
    // },
@@ -288,6 +290,7 @@
      type: 'select',
      dicUrl: '/system/dict/data/type/sys_whether_type',
    },
  }
})
ui/admin-ui3/src/views/cwgl/estimatedReceivable/index.vue
@@ -1,189 +1,551 @@
<template>
  <basicContainer >
    <avue-crud
        :option="option"
        :table-loading="pageF.loading"
        :data="tableData"
        :page="page"
        :permission="permissionList"
        :before-open="beforeOpen"
        v-model="form"
        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"
    >
  <basicContainer>
    <avue-crud :option="option" v-model:search="queryParams" :table-loading="pageF.loading" :data="tableData"
      :page="page" :permission="permissionList" :before-open="beforeOpen" v-model="form" 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 #dispatchNo-form="{ row, size, }">
        <div style="cursor: pointer;">
          <el-input v-model="form.dispatchNo" @click="handleFormSearch" readonly placeholder="请输入调度单号">
            <template #append>
              <el-button icon="Search" style="cursor: pointer;" @click="handleFormSearch"></el-button>
            </template>
          </el-input>
        </div>
      </template>
      <template #menu-left>
        <el-button
            type="success"
            icon="Edit"
            :disabled="pageF.single"
            v-hasPermi="['cwgl:estimatedReceivable:edit']"
            @click="handleUpdate">修改
        <el-button type="success" icon="Edit" :disabled="pageF.single" v-hasPermi="['cwgl:estimatedReceivable:edit']"
          @click="handleUpdate">修改
        </el-button>
        <el-button
            type="danger"
            icon="Delete"
            :disabled="pageF.multiple"
            @click="handleDelete"
            v-hasPermi="['cwgl:estimatedReceivable:remove']"
        >删除
        <el-button type="danger" icon="Delete" :disabled="pageF.multiple" @click="handleDelete"
          v-hasPermi="['cwgl:estimatedReceivable:remove']">删除
        </el-button>
        <el-button
            type="warning"
            plain
            icon="Download"
            @click="handleExport"
            v-hasPermi="['cwgl:estimatedReceivable:export']"
        >导出
        <el-button type="warning" plain icon="Download" @click="handleExport"
          v-hasPermi="['cwgl:estimatedReceivable:export']">导出
        </el-button>
      </template>
      <template #menu="{ size, row, index }">
        <el-link class="link-btn" type="primary" v-if="row.isConfirmed == 1" :underline="false" plain :size="size"
          @click="handleCancel(row)" v-hasPermi="['cwgl:estimatedReceivable:cancel']"> 取消确认
        </el-link>
        <el-link class="link-btn" type="primary" v-if="row.isConfirmed == 0" :underline="false" plain
          @click="handleAffirm(row)" v-hasPermi="['cwgl:estimatedReceivable:confirm']"> 确认
        </el-link>
        <el-link class="link-btn" type="primary" v-if="row.isConfirmed == 1" :underline="false" plain
          @click="handleInvalid(row)" v-hasPermi="['cwgl:estimatedReceivable:invalid']"> 作废
        </el-link>
        <el-link class="link-btn" type="primary" :underline="false" plain @click="handleFlow(row)"
          v-hasPermi="['cwgl:estimatedReceivable:flog']"> 日志
        </el-link>
      </template>
    </avue-crud>
  </basicContainer>
  <el-dialog v-model="dialog.visible" :title="dialog.title" width="1200px">
    <!-- <el-form ref="storagesTransferRef" :model="newForm" :rules="rules" label-width="120px">
      <el-row :gutter="20">
        <el-col :span="8">
          <el-form-item label="调度单号" prop="dispatchNo">
            <el-input v-model="newForm.dispatchNo" placeholder="请输入调度单号" />
          </el-form-item>
        </el-col>
        <el-col :span="8">
          <el-form-item label="客户名称" prop="customerName">
            <el-input v-model="newForm.customerName" placeholder="请输入客户名称" />
          </el-form-item>
        </el-col>
        <el-col :span="8">
          <el-form-item label="项目名称" prop="projectName">
            <el-input v-model="newForm.projectName" placeholder="请输入项目名称" />
          </el-form-item>
        </el-col>
        <el-col :span="8">
          <el-form-item label="下单日期" prop="createdTime">
            <el-date-picker v-model="newForm.createdTime" type="date"  valueFormat="YYYY-MM-DD"  placeholder="请选择下单日期"/>
          </el-form-item>
        </el-col>
        <el-col :span="8">
          <el-form-item>
            <el-button type="primary" icon="Search" @click="newGetList">搜索</el-button>
            <el-button icon="Refresh" @click="resetQuery">重置</el-button>
          </el-form-item>
        </el-col>
      </el-row>
    </el-form>
    <el-table :data="newTableData" @selection-change="handleSelectionChange" border ref="newTableRef"
      @row-click="handleRowClick">
      <el-table-column type="selection" width="55" align="center" />
      <el-table-column fixed label="调度单号" align="center" prop="dispatchNo" show-overflow-tooltip />
      <el-table-column label="客户名称" align="center" prop="customerName" show-overflow-tooltip />
      <el-table-column label="项目名称" align="center" prop="projectName" show-overflow-tooltip />
      <el-table-column label="下单日期" align="center" prop="createdTime" show-overflow-tooltip />
    </el-table> -->
    <avue-crud :option="newOption" :data="newTableData" v-model:search="newForm" :page="newPageF"
      :table-loading="itemTableLoading2" @search-change="newSearchChange" ref="newTableRef"
      @selection-change="newSelectionChange" @search-reset="newRsetChange"
      @current-change="handleAttachmentCurrentChange" @size-change="handleAttachmentSizeChange" @on-load="newOnLoad">
    </avue-crud>
    <template #footer>
      <div class="dialog-footer">
        <el-button type="primary" @click="submitForm">确 定</el-button>
        <el-button @click="cancel">取 消</el-button>
      </div>
    </template>
  </el-dialog>
  <flowLog ref="flowLogIshow" :flowParams="flowParams" ></flowLog>
</template>
<script setup name="estimatedReceivable" lang="ts">
  import {EstimatedReceivableI,addEstimatedReceivable, delEstimatedReceivable, exportEstimatedReceivable, getEstimatedReceivable, listEstimatedReceivable, updateEstimatedReceivable} from "@/api/cwgl/estimatedReceivable";
  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 {
  EstimatedReceivableI, addEstimatedReceivable, delEstimatedReceivable, exportEstimatedReceivable, getEstimatedReceivable, listEstimatedReceivable, updateEstimatedReceivable,
  getEstimatedReceivableConfirm, getCwglEstimatedReceivableCancel, getEstimatedReceivableInvalid
} from "@/api/cwgl/estimatedReceivable";
  import { listEstimatedReceivableLog} from "@/api/cwgl/estimatedReceivableLog";
  import {listEstimatedReceivableBillLog} from "@/api/cwgl/estimatedReceivableBillLog";
import {
  listPendingSettlementBusiness,
} from "@/api/cwgl/pendingSettlementBusiness";
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 { ElMessage, ElMessageBox } from "element-plus";
  const { proxy } = useCurrentInstance();
  const crudRef = ref();
const { proxy } = useCurrentInstance();
const crudRef = ref();
  const permissionList = computed(()=>{
    return {
      addBtn: hasPermission(["cwgl:estimatedReceivable:add"]),
      delBtn: hasPermission(["cwgl:estimatedReceivable:remove"]),
      editBtn: hasPermission(["cwgl:estimatedReceivable:edit"]),
      viewBtn: hasPermission(["cwgl:estimatedReceivable:query"]),
    }
  })
const permissionList = computed(() => {
  return {
    addBtn: hasPermission(["cwgl:estimatedReceivable:add"]),
    delBtn: hasPermission(["cwgl:estimatedReceivable:remove"]),
    editBtn: hasPermission(["cwgl:estimatedReceivable:edit"]),
    viewBtn: hasPermission(["cwgl:estimatedReceivable:query"]),
  }
})
  const data = reactive({
    form:<EstimatedReceivableI>{},
    queryParams:<EstimatedReceivableI&PageQueryInterface>{},
    page: <PagesInterface>{
      pageSize: 10,
      total: 0,
      currentPage: 1,
const data = reactive({
  form: <EstimatedReceivableI>{},
  newTableData: [],
  newForm: <EstimatedReceivableI>{
    pageNum: 1,
    pageSize: 10
  },
  queryParams: <EstimatedReceivableI & PageQueryInterface>{},
  page: <PagesInterface>{
    pageSize: 10,
    total: 0,
    currentPage: 1,
  },
  selectionList: [],
  newSelectionList: [],
  itemTableLoading1: false,
  itemTableLoading2: false,
})
const { queryParams, form, page, selectionList, newForm, newTableData, newSelectionList, itemTableLoading1, itemTableLoading2 } = toRefs(data);
const option = ref({
  pageKey: 'EstimatedReceivable',
  rowKey: 'id',
  searchSpan: 5,
  editDisplay: false,
  addBtn: true,
  editBtn: true,
  delBtn: false,
  viewBtn: false,
  searchLabelWidth: 100,
  labelWidth: 120,
  column: {
    // id: {
    //   label: 'ID',
    // },
    feeSystemNo: {
      label: '费用系统编号',
      rules: [
        {
          required: true,
          message: "费用系统编号不能为空", trigger: "blur"
        }
      ],
      search: true,
      addDisplay: false,
      editDisplay: false,
    },
    selectionList:[],
  })
  const {queryParams,form,page,selectionList} = toRefs(data);
  const option = ref({
    pageKey: 'EstimatedReceivable',
    rowKey: 'id',
    column: {
                                id: {
          label: 'ID',
                            },
                                feeSystemNo: {
          label: '费用系统编号',
                                rules: [
              {
                required: true,
                message: "费用系统编号不能为空", trigger: "blur" }
            ],                  },
                                dispatchNo: {
          label: '调度单号',
                                rules: [
              {
                required: true,
                message: "调度单号不能为空", trigger: "blur" }
            ],                  },
                                customerName: {
          label: '客户名称',
                                rules: [
              {
                required: true,
                message: "客户名称不能为空", trigger: "blur" }
            ],                  },
                                projectName: {
          label: '项目名称',
                            },
                                orderDate: {
          label: '下单日期',
                            },
                                feeName: {
          label: '费用名称',
                                rules: [
              {
                required: true,
                message: "费用名称不能为空", trigger: "blur" }
            ],                  },
                                estimatedAmount: {
          label: '预估费用金额',
                            },
                                currency: {
          label: '币制',
                            },
                                relatedBillName: {
          label: '关联账单名称',
                            },
                                relatedBillStatus: {
          label: '关联账单状态',
                            },
                                isConfirmed: {
          label: '是否确认(0:未确认;1:已确认)',
                            },
                                confirmBy: {
          label: '确认人',
                            },
                                confirmTime: {
          label: '确认时间',
                            },
                                remark: {
          label: '备注',
                      type: 'textarea', minRows: 3, maxRows: 5,
                            },
                                createBy: {
          label: '创建人',
                            },
                                updateBy: {
          label: '更新人',
                            },
                                createTime: {
          label: '创建时间',
                            },
                                updateTime: {
          label: '更新时间',
                            },
                                deleted: {
          label: '删除标记(0:正常;1:删除)',
                            },
          }
  })
    dispatchNo: {
      label: '调度单号',
      rules: [
        {
          required: true,
          message: "调度单号不能为空", trigger: "blur"
        }
      ],
      search: true,
    },
    customerName: {
      label: '客户名称',
      rules: [
        {
          required: true,
          message: "客户名称不能为空", trigger: "blur"
        }
      ],
      search: true,
      disabled: true,
    },
    projectName: {
      label: '项目名称',
      search: true,
      disabled: true,
    },
    orderDate: {
      label: '下单日期',
      search: true,
      type: 'datetime',  // 改为 datetime 类型
      format: 'YYYY-MM-DD HH:mm:ss',
      valueFormat: 'YYYY-MM-DD HH:mm:ss',
    },
    feeName: {
      label: '费用名称',
      rules: [
        {
          required: true,
          message: "费用名称不能为空", trigger: "blur"
        }
      ],
      search: true,
    },
  const { tableData,pageF,rowSave,rowUpdate,rowDel,beforeOpen,searchChange,
    searchReset,selectionChange,onLoad,currentChange,sizeChange,handleDelete,handleExport,handleUpdate,refreshChange} = usePagePlus({
    form:form,
    option:option,
    queryParams:queryParams,
    idKey:'id',
    page:page.value,
    getListApi:listEstimatedReceivable,
    getDetailApi:getEstimatedReceivable,
    exportApi:exportEstimatedReceivable,
    deleteApi:delEstimatedReceivable,
    addApi:addEstimatedReceivable,
    updateApi:updateEstimatedReceivable,
    handleUpdateFunc:()=>{
    estimatedAmount: {
      label: '费用金额',
      rules: [
        {
          required: true,
          message: "费用金额不能为空", trigger: "blur"
        }
      ],
    },
    currency: {
      label: '币制',
      disabled: true,
    },
    relatedBillName: {
      label: '关联账单名称',
    },
    relatedBillStatus: {
      label: '关联账单状态',
      search: true,
      dataType: 'string',
      type: 'select',
      dicUrl: '/system/dict/data/type/sys_related_status',
      //    formatter: (row, value) => {
      // // 自定义格式化逻辑(如果需要)
      //   return value;
      //  }
    },
    isConfirmed: {
      label: '是否确认',
      dataType: 'string',
      search: true,
      type: 'select',
      dicUrl: '/system/dict/data/type/sys_affirm_status',
    },
    remark: {
      label: '备注',
      type: 'textarea', minRows: 3, maxRows: 5,
    },
    // confirmBy: {
    //   label: '确认人',
    // },
    // confirmTime: {
    //   label: '确认时间',
    // },
    // createBy: {
    //   label: '创建人',
    // },
    // updateBy: {
    //   label: '更新人',
    // },
    // createTime: {
    //   label: '创建时间',
    // },
    // updateTime: {
    //   label: '更新时间',
    // },
    // deleted: {
    //   label: '删除标记(0:正常;1:删除)',
    // },
  }
})
const newOption = ref({
  pageKey: 'PendingSettlementBusiness',
  rowKey: 'id',
  searchSpan: 5,
  selectionType: 'single',
  selectType: 'radio',
  editDisplay: false,
  addBtn: false,
  editBtn: false,
  menu: false,
  delBtn: false,
  viewBtn: false,
  searchLabelWidth: 100,
  labelWidth: 120,
  indexLabel: '序号',
  column: {
    dispatchNo: {
      label: '调度单号',
      search: true,
    },
    customerName: {
      label: '客户名称',
      search: true,
    },
    projectName: {
      label: '项目名称',
      search: true,
    },
    createdTime: {
      label: '下单日期',
      search: true,
      type: 'date',
      format: 'YYYY-MM-DD',
      valueFormat: 'YYYY-MM-DD',
    }
  }
})
const { tableData, pageF, rowSave, rowUpdate, rowDel, beforeOpen, searchChange,
  searchReset, selectionChange, onLoad, currentChange, sizeChange, handleDelete, handleExport, handleUpdate, refreshChange } = usePagePlus({
    form: form,
    option: option,
    queryParams: queryParams,
    idKey: 'id',
    page: page.value,
    getListApi: listEstimatedReceivable,
    getDetailApi: getEstimatedReceivable,
    exportApi: exportEstimatedReceivable,
    deleteApi: delEstimatedReceivable,
    addApi: addEstimatedReceivable,
    updateApi: updateEstimatedReceivable,
    handleUpdateFunc: () => {
      crudRef.value.rowEdit(selectionList.value[0]);
    },
    handleSelectionChangeFunc:(selection:any)=>{
    handleSelectionChangeFunc: (selection: any) => {
      selectionList.value = selection;
    }
  })
const dialog = reactive({
  visible: false,
  title: '',
})
const newPageF = ref<PagesInterface>({
  total: 0,
  pageSize: 10
})
const storagesTransferRef = ref<FormInstance>()
const handleFormSearch = () => {
  listPendingSettlementBusiness(newForm.value).then((res) => {
    if (res.code === 200) {
      dialog.visible = true;
      dialog.title = '选择调度单号';
      newTableData.value = res.rows || [];
      newPageF.value.total = res.total || 0;
      console.log(newPageF.value.totale);
    }
  })
}
const newGetList = () => {
  console.log(newForm.value);
  listPendingSettlementBusiness(newForm.value).then((res) => {
    if (res.code === 200) {
      newTableData.value = res.rows || [];
      newPageF.value.total = res.total || 0;
    }
  })
}
const newTableRef = ref();
const newSelectionChange = (selection: any) => {
  // 只保留最后一个选中的项
  if (selection.length > 1) {
    const nowVal = selection.shift();
    // newTableRef.value.clearSelection([]);
    newTableRef.value.toggleRowSelection(nowVal, false);
  } else {
    console.log("newSelectionChange", selection);
    newSelectionList.value = selection
  }
}
const resetQuery = () => {
  newForm.value = {
    pageNum: 1,
    pageSize: 10
  }
  listPendingSettlementBusiness(newForm.value).then((res) => {
    if (res.code === 200) {
      newTableData.value = res.rows || [];
      newPageF.value.total = res.total || 0;
    }
  })
}
const submitForm = () => {
  if (newSelectionList.value.length === 0) {
    proxy.$modal.msgWarning("请选择调度单号");
    return;
  }
  const selectedDispatchNo = newSelectionList.value[0]
  // option.value.column = selectedDispatchNo;
  // 将选中行的数据赋值给表单
  form.value.dispatchNo = selectedDispatchNo.dispatchNo;
  form.value.customerName = selectedDispatchNo.customerName;
  form.value.projectName = selectedDispatchNo.projectName;
  form.value.currency = '人民币';
  dialog.visible = false;
}
/*  */
// 处理附件分页页码变化
const handleAttachmentCurrentChange = (currentPage: number) => {
  newForm.value.pageNum = currentPage;
  getEstimatedReceivableCancel();
}
// 处理附件分页大小变化
const handleAttachmentSizeChange = (pageSize: number) => {
  newForm.value.pageSize = pageSize;
  getEstimatedReceivableCancel();
}
const newOnLoad = () => {
  getEstimatedReceivableCancel()
}
// 加载附件数据的函数
const loadAttachmentData = () => {
  itemTableLoading2.value = true;
  listPendingSettlementBusiness(newForm.value).then((res) => {
    if (res.code === 200) {
      dialog.visible = true;
      dialog.title = '选择调度单号';
      newTableData.value = res.rows || [];
      newPageF.value.total = res.total || 0;
    }
    itemTableLoading2.value = false;
  })
}
const getEstimatedReceivableCancel = () => {
  itemTableLoading2.value = true;
  listPendingSettlementBusiness(newForm.value).then((res) => {
    if (res.code === 200) {
      newTableData.value = res.rows || [];
      newPageF.value.total = res.total || 0;
    }
    itemTableLoading2.value = false;
  })
}
const newSearchChange = (params, done) => {
  itemTableLoading2.value = true;
  listPendingSettlementBusiness(newForm.value).then((res) => {
    if (res.code === 200) {
      done()
      newTableData.value = res.rows || [];
      newPageF.value.total = res.total || 0;
    }
    itemTableLoading2.value = false;
  })
}
const newRsetChange = (done) => {
  getEstimatedReceivableCancel()
}
// 附件表格加载事件
const attachmentChange = () => {
  // loadAttachmentData();
}
/*  */
const cancel = () => {
  dialog.visible = false;
  newForm.value = {
    pageNum: 1,
    pageSize: 10
  }
  newTableData.value = [];
}
const handleCancel = (row: any) => {
  proxy.$modal.confirm(`是否取消确认该调度单号 :${row.dispatchNo}?`).then(function () {
    return getCwglEstimatedReceivableCancel(row.id);
  }).then((res) => {
    if (res.code == 200) {
      console.log(res);
      onLoad(page.value);
      proxy.$modal.msgSuccess(res.msg);
    }
  })
}
const handleAffirm = (row: any) => {
  proxy.$modal.confirm(`是否确认该调度单号 :${row.dispatchNo}?`).then(function () {
    return getEstimatedReceivableConfirm(row.id);
  }).then((res) => {
    onLoad(page.value);
    proxy.$modal.msgSuccess(res.msg);
  })
}
const handleInvalid = (row: any) => {
  proxy.$modal.confirm(`是否作废该调度单号 :${row.dispatchNo}?`).then(function () {
    return getEstimatedReceivableInvalid(row.id);
  }).then((res) => {
    onLoad(page.value);
    proxy.$modal.msgSuccess(res.msg);
  })
}
const flowLogIshow = ref()
const flowParams = ref([])
const handleFlow = (row: string) => {
  let data = {
    estimatedId: row.id,
  }
  listEstimatedReceivableLog(data).then((res) => {
    flowParams.value = res.rows
    flowLogIshow.value.openModel()
  })
}
</script>
ui/admin-ui3/src/views/cwgl/estimatedReceivableBill/index.vue
@@ -1,174 +1,541 @@
<template>
  <basicContainer >
    <avue-crud
        :option="option"
        :table-loading="pageF.loading"
        :data="tableData"
        :page="page"
        :permission="permissionList"
        :before-open="beforeOpen"
        v-model="form"
        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"
    >
  <basicContainer>
    <avue-crud :option="option" :table-loading="pageF.loading" :data="tableData" :page="page"
      :permission="permissionList" :before-open="beforeOpen" v-model="form" 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="['cwgl:estimatedReceivableBill:edit']"
            @click="handleUpdate">修改
        <!-- <el-button type="success" icon="Edit" :disabled="pageF.single"
          v-hasPermi="['cwgl:estimatedReceivableBill:edit']" @click="handleUpdate">修改
        </el-button> -->
        <!-- <el-button type="danger" icon="Delete" :disabled="pageF.multiple" @click="handleDelete"
          v-hasPermi="['cwgl:estimatedReceivableBill:remove']">删除
        </el-button>
        <el-button
            type="danger"
            icon="Delete"
            :disabled="pageF.multiple"
            @click="handleDelete"
            v-hasPermi="['cwgl:estimatedReceivableBill:remove']"
        >删除
        </el-button>
        <el-button
            type="warning"
            plain
            icon="Download"
            @click="handleExport"
            v-hasPermi="['cwgl:estimatedReceivableBill:export']"
        >导出
        </el-button>
        <el-button type="warning" plain icon="Download" @click="handleExport"
          v-hasPermi="['cwgl:estimatedReceivableBill:export']">导出
        </el-button> -->
      </template>
      <template #billSystemNo="{ size, row, index }">
        <el-link class="link-btn" type="primary" :underline="false" plain @click="handleBillSystemNo(row)">
          {{ row.billSystemNo }}
        </el-link>
      </template>
      <template #menu="{ size, row, index }">
        <el-link class="link-btn" type="primary" v-if="[0, 1].includes(row.status)" :underline="false" plain
          @click="handleclose(row)" v-hasPermi="['cwgl:estimatedReceivableBill:confirm']"> 结算
        </el-link>
        <el-link class="link-btn" type="primary" v-if="[0].includes(row.status)" :underline="false" plain
          @click="handleAmend(row)" v-hasPermi="['cwgl:estimatedReceivableBill:invalid']"> 修改
        </el-link>
        <el-link class="link-btn" type="primary" :underline="false" plain @click="handleFlow(row)"
          v-hasPermi="['cwgl:estimatedReceivableBill:flog']"> 日志
        </el-link>
      </template>
    </avue-crud>
  </basicContainer>
  <el-dialog v-model="dialog.visible" :title="dialog.title" width="1200px">
    <el-form ref="newFormRef" v-if="!dispIshow && noIshow" :model="newForm" :rules="rules" label-width="120px">
      <el-row :gutter="20">
        <el-col :span="12">
          <el-form-item label="本次结算金额" prop="settlementAmount">
            <el-input v-model="newForm.settlementAmount" placeholder="请输入本次结算金额" />
          </el-form-item>
        </el-col>
        <el-col :span="12">
          <el-form-item label="备注" prop="remark">
            <el-input v-model="newForm.remark" :rows="2" type="textarea" placeholder="请输入备注" />
          </el-form-item>
        </el-col>
        <el-col :span="12">
          <el-form-item label="附件" prop="attachment">
            <FileUpload v-model="newForm.attachment" :isShowTip="false"
              :fileType="['pdf', 'bmp', 'gif', 'jpg', 'jpeg', 'png']"></FileUpload>
            &nbsp;支持文件类型: pdf,bmp,gif,jpg,jpeg,png'
          </el-form-item>
        </el-col>
      </el-row>
    </el-form>
    <div v-if="!dispIshow && noIshow" style="text-align: center;margin-top: 20px;">
      <el-button @click="cancel">取 消</el-button>
      <el-button type="primary" @click="submitForm">确 定</el-button>
    </div>
    <h2 style="margin: 15px;font-size: 15px;">
      账单基本信息
    </h2>
    <el-form ref="storagesTransferRef" :model="newObjForm" label-width="120px">
      <el-descriptions class="margin-top" title="" :column="3" border>
        <el-descriptions-item label="账单系统编号" align="center">
          {{ importForm.billSystemNo }}
        </el-descriptions-item>
        <el-descriptions-item label="账单名称" align="center">
          <el-input v-if="dispIshow" v-model="importForm.billName" placeholder="请输入账单名称" />
          <span v-if="!dispIshow"> {{ importForm.billName }}</span>
        </el-descriptions-item>
        <el-descriptions-item label="客户名称" align="center">
          {{ importForm.customerName }}
        </el-descriptions-item>
        <el-descriptions-item label="应结算金额" align="center">
          {{ importForm.totalAmount }}
        </el-descriptions-item>
        <el-descriptions-item v-if="!dispIshow" label="已结算金额" align="center">
          {{ importForm.settledAmount }}
        </el-descriptions-item>
        <el-descriptions-item v-if="!dispIshow" label="待结算金额" align="center">
          <span v-if="importForm.totalAmount == 0">0</span>
          <span v-else>{{ (importForm.totalAmount - importForm.settledAmount).toFixed(2) }}</span>
        </el-descriptions-item>
        <el-descriptions-item v-if="dispIshow" label="" align="center">
        </el-descriptions-item>
        <el-descriptions-item v-if="dispIshow" label="" align="center">
        </el-descriptions-item>
      </el-descriptions>
    </el-form>
    <div v-if="dispIshow" style="text-align: center;margin-top: 20px;">
      <el-button @click="cancel">取 消</el-button>
      <el-button type="primary" @click="submitFormTow">确 定</el-button>
    </div>
    <h2 style="margin: 15px;font-size: 15px;">
      关联明细
    </h2>
    <avue-crud :option="newOption" :data="newTableData" v-model:search="newFormData" :page="newPageF"
      :table-loading="itemTableLoading2" @search-change="newSearchChange" ref="newTableRef"
      @search-reset="newRsetChange" @current-change="handleAttachmentCurrentChange"
      @size-change="handleAttachmentSizeChange" @on-load="newOnLoad">
      <template #menu="{ size, row, index }">
        <el-link class="link-btn" type="primary" :underline="false" plain @click="handleRelevance(row)"
          v-hasPermi="['cwgl:estimatedReceivableBill:relevancy']"> 取消关联
        </el-link>
      </template>
    </avue-crud>
    <div v-if="!noIshow" style="text-align: right;margin-top: 20px;">
      <el-button @click="cancel">取 消</el-button>
    </div>
  </el-dialog>
  <flowLog ref="flowLogIshow" :fileNameIshow="true" :flowParams="flowParams"></flowLog>
</template>
<script setup name="estimatedReceivableBill" lang="ts">
  import {EstimatedReceivableBillI,addEstimatedReceivableBill, delEstimatedReceivableBill, exportEstimatedReceivableBill, getEstimatedReceivableBill, listEstimatedReceivableBill, updateEstimatedReceivableBill} from "@/api/cwgl/estimatedReceivableBill";
  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 {
  EstimatedReceivableBillI, addEstimatedReceivableBill, delEstimatedReceivableBill, exportEstimatedReceivableBill, getEstimatedReceivableBill, listEstimatedReceivableBill, updateEstimatedReceivableBill,
  estimatedReceivableBillSettlement, addEstimatedReceivableLog, cancelRelevancy, listEstimatedReceivableBillLog, updateEstimatedReceivableBillNmae
} from "@/api/cwgl/estimatedReceivableBill";
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 {
  getPendingSettlementBusiness, listPendingSettlementBusiness
} from "@/api/cwgl/pendingSettlementBusiness";
const { proxy } = useCurrentInstance();
const crudRef = ref();
  const { proxy } = useCurrentInstance();
  const crudRef = ref();
const permissionList = computed(() => {
  return {
    addBtn: hasPermission(["cwgl:estimatedReceivableBill:add"]),
    delBtn: hasPermission(["cwgl:estimatedReceivableBill:remove"]),
    editBtn: hasPermission(["cwgl:estimatedReceivableBill:edit"]),
    viewBtn: hasPermission(["cwgl:estimatedReceivableBill:query"]),
  }
})
const dispIshow = ref(false)
const data = reactive({
  form: <EstimatedReceivableBillI>{},
  queryParams: <EstimatedReceivableBillI & PageQueryInterface>{},
  page: <PagesInterface>{
    pageSize: 10,
    total: 0,
    currentPage: 1,
  },
  selectionList: [],
  newForm: <EstimatedReceivableI>{
    pageNum: 1,
    pageSize: 10
  },
  importForm: {},
  newTableData: [],
  newFormData: {
    pageNum: 1,
    pageSize: 10
  },
  itemTableLoading2: false,
  rules: {
    settlementAmount: [
      { required: true, message: '请输入本次结算金额', trigger: 'blur' }
    ],
  const permissionList = computed(()=>{
    return {
      addBtn: hasPermission(["cwgl:estimatedReceivableBill:add"]),
      delBtn: hasPermission(["cwgl:estimatedReceivableBill:remove"]),
      editBtn: hasPermission(["cwgl:estimatedReceivableBill:edit"]),
      viewBtn: hasPermission(["cwgl:estimatedReceivableBill:query"]),
    }
  })
  },
})
const { queryParams, form, page, selectionList, newForm, importForm, newTableData, itemTableLoading2, newFormData, rules } = toRefs(data);
const option = ref({
  pageKey: 'EstimatedReceivableBill',
  rowKey: 'id',
  const data = reactive({
    form:<EstimatedReceivableBillI>{},
    queryParams:<EstimatedReceivableBillI&PageQueryInterface>{},
    page: <PagesInterface>{
      pageSize: 10,
      total: 0,
      currentPage: 1,
  searchSpan: 5,
  editDisplay: false,
  addBtn: false,
  editBtn: false,
  delBtn: false,
  viewBtn: false,
  searchLabelWidth: 100,
  labelWidth: 120,
  column: {
    // id: {
    //   label: 'ID',
    // },
    billSystemNo: {
      label: '账单系统编号',
      search: true,
      rules: [
        {
          required: true,
          message: "账单系统编号不能为空", trigger: "blur"
        }
      ],
    },
    selectionList:[],
  })
  const {queryParams,form,page,selectionList} = toRefs(data);
  const option = ref({
    pageKey: 'EstimatedReceivableBill',
    rowKey: 'id',
    column: {
                                id: {
          label: 'ID',
                            },
                                billSystemNo: {
          label: '账单系统编号',
                                rules: [
              {
                required: true,
                message: "账单系统编号不能为空", trigger: "blur" }
            ],                  },
                                billName: {
          label: '账单名称',
                                rules: [
              {
                required: true,
                message: "账单名称不能为空", trigger: "blur" }
            ],                  },
                                customerName: {
          label: '客户名称',
                                rules: [
              {
                required: true,
                message: "客户名称不能为空", trigger: "blur" }
            ],                  },
                                dispatchCount: {
          label: '调度单数量',
                            },
                                totalAmount: {
          label: '应结算金额',
                            },
                                settledAmount: {
          label: '已结算金额',
                            },
                                invoiceStatus: {
          label: '开票状态',
                            },
                                attachment: {
          label: '附件地址',
                      type: 'textarea', minRows: 3, maxRows: 5,
                            },
                                status: {
          label: '状态',
                            },
                                remark: {
          label: '备注',
                      type: 'textarea', minRows: 3, maxRows: 5,
                            },
                                createBy: {
          label: '创建人',
                            },
                                confirmTime: {
          label: '确认时间',
                            },
                                createTime: {
          label: '创建时间',
                            },
                                updateTime: {
          label: '更新时间',
                            },
                                deleted: {
          label: '删除标记(0:正常;1:删除)',
                            },
          }
  })
    billName: {
      label: '账单名称',
      rules: [
        {
          required: true,
          message: "账单名称不能为空", trigger: "blur"
        }
      ],
    },
    customerName: {
      label: '客户名称',
      rules: [
        {
          required: true,
          message: "客户名称不能为空", trigger: "blur"
        }
      ],
      search: true,
    },
  const { tableData,pageF,rowSave,rowUpdate,rowDel,beforeOpen,searchChange,
    searchReset,selectionChange,onLoad,currentChange,sizeChange,handleDelete,handleExport,handleUpdate,refreshChange} = usePagePlus({
    form:form,
    option:option,
    queryParams:queryParams,
    idKey:'id',
    page:page.value,
    getListApi:listEstimatedReceivableBill,
    getDetailApi:getEstimatedReceivableBill,
    exportApi:exportEstimatedReceivableBill,
    deleteApi:delEstimatedReceivableBill,
    addApi:addEstimatedReceivableBill,
    updateApi:updateEstimatedReceivableBill,
    handleUpdateFunc:()=>{
    dispatchCount: {
      label: '调度单数量',
    },
    totalAmount: {
      label: '应结算金额',
    },
    settledAmount: {
      label: '已结算金额',
    },
    invoiceStatus: {
      label: '开票状态',
      search: true,
      dataType: 'string',
      type: 'select',
      dicUrl: '/system/dict/data/type/sys_ticket_status',
    },
    // attachment: {
    //   label: '附件地址',
    //   type: 'textarea', minRows: 3, maxRows: 5,
    // },
    status: {
      label: '状态',
      search: true,
      dataType: 'string',
      type: 'select',
      dicUrl: '/system/dict/data/type/sys_final_statement_status',
    },
    // remark: {
    //   label: '备注',
    //   type: 'textarea', minRows: 3, maxRows: 5,
    // },
    // createBy: {
    //   label: '创建人',
    // },
    // confirmTime: {
    //   label: '确认时间',
    // },
    // createTime: {
    //   label: '创建时间',
    // },
    // updateTime: {
    //   label: '更新时间',
    // },
    // deleted: {
    //   label: '删除标记(0:正常;1:删除)',
    // },
  }
})
const newOption = ref({
  pageKey: 'PendingSettlementBusiness',
  rowKey: 'id',
  searchSpan: 5,
  selectionType: 'single',
  selectType: 'radio',
  editDisplay: false,
  addBtn: false,
  editBtn: false,
  selection: false,
  delBtn: false,
  menu: false,
  viewBtn: false,
  header: false,
  // searchLabelWidth: 100,
  // labelWidth: 120,
  column: {
    projectName: {
      label: '项目名称1',
    },
    dispatchNo: {
      label: '调度单号',
    },
    createdTime: {
      label: '下单时间',
    },
    estimatedTotalIncome: {
      label: '预估应收金额',
    },
    currency: {
      label: '币制',
    },
    // customerName: {
    //   label: '客户名称',
    //   search: true,
    // },
  }
})
const { tableData, pageF, rowSave, rowUpdate, rowDel, beforeOpen, searchChange,
  searchReset, selectionChange, onLoad, currentChange, sizeChange, handleDelete, handleExport, handleUpdate, refreshChange } = usePagePlus({
    form: form,
    option: option,
    queryParams: queryParams,
    idKey: 'id',
    page: page.value,
    getListApi: listEstimatedReceivableBill,
    getDetailApi: getEstimatedReceivableBill,
    exportApi: exportEstimatedReceivableBill,
    deleteApi: delEstimatedReceivableBill,
    addApi: addEstimatedReceivableBill,
    updateApi: updateEstimatedReceivableBill,
    handleUpdateFunc: () => {
      crudRef.value.rowEdit(selectionList.value[0]);
    },
    handleSelectionChangeFunc:(selection:any)=>{
    handleSelectionChangeFunc: (selection: any) => {
      selectionList.value = selection;
    }
  })
const dialog = reactive({
  visible: false,
  title: '',
})
const newTableRef = ref();
const handleclose = (row) => {
  newFormData.value.billId = row.id;
  dispIshow.value = false;
  newOption.value.menu = false;
  noIshow.value = true;
  listPendingSettlementBusiness({ billId: row.id }).then((res) => {
    if (res.code === 200) {
      newForm.value.id = row.id;
      importForm.value = row;
      dialog.visible = true;
      newPageF.value.total = res.total || 0;
      newTableData.value = res.rows || [];
      newTableData.value.map(item => {
        item.currency = '人民币';
      });
      newTableRef.value.refreshTable();
      dialog.title = '应收账单结算';
    }
  })
  // crudRef.value.close();
}
const handleAmend = (row) => {
  newFormData.value.billId = row.id;
  dispIshow.value = true;
  newOption.value.menu = true;
  listPendingSettlementBusiness({ billId: row.id }).then((res) => {
    if (res.code === 200) {
      newForm.value.id = row.id;
      importForm.value = row;
      dialog.visible = true;
      newPageF.value.total = res.total || 0;
      newTableData.value = res.rows || [];
      newTableData.value.map(item => {
        item.currency = '人民币';
      });
      newTableRef.value.refreshTable();
      dialog.title = '应收账单修改';
    }
  })
}
const noIshow = ref(false)
const handleBillSystemNo = (row) => {
  newFormData.value.billId = row.id;
  dispIshow.value = false;
  noIshow.value = false;
  newOption.value.menu = false;
  listPendingSettlementBusiness({ billId: row.id }).then((res) => {
    if (res.code === 200) {
      importForm.value = row;
      dialog.visible = true;
      dialog.title = '账单详情';
      newPageF.value.total = res.total || 0;
      newTableData.value = res.rows || [];
      newTableData.value.map(item => {
        item.currency = '人民币';
      });
      newTableRef.value.refreshTable();
    }
  })
}
const newFormRef = ref();
const submitForm = () => {
  newFormRef.value!.validate(valid => {
    if (valid) {
      let data = {
        billId: newForm.value.id,
        fileName: newForm.value.attachment
      }
      addEstimatedReceivableLog(data).then((res1) => {
        if (res1.code === 200) {
          estimatedReceivableBillSettlement(newForm.value).then((res) => {
            if (res.code === 200) {
              proxy.$message.success('操作成功');
              dialog.visible = false;
              newForm.value = {};
            }
          })
        }
      })
    }
  });
}
const submitFormTow = () => {
  proxy.$modal.confirm(`是否确认修改账单名称?`).then(function () {
    return updateEstimatedReceivableBillNmae(newForm.value);
  }).then((res) => {
    proxy.$modal.msgSuccess(res.msg);
  })
}
const storagesTransferRef = ref();
const cancel = () => {
  newForm.value = {};
  dialog.visible = false;
  proxy.resetForm(storagesTransferRef.value)
}
const newPageF = ref<PagesInterface>({
  total: 0,
  pageSize: 10
})
const newSearchChange = (params, done) => {
  // itemTableLoading2.value = true;
  // listPendingSettlementBusiness(newForm.value).then((res) => {
  //   if (res.code === 200) {
  //     done()
  //     newTableData.value = res.rows || [];
  //     newPageF.value.total = res.total || 0;
  //   }
  //   itemTableLoading2.value = false;
  // })
}
const newRsetChange = (done) => {
  getEstimatedReceivableCancel()
}
// 处理附件分页页码变化
const handleAttachmentCurrentChange = (currentPage: number) => {
  newFormData.value.pageNum = currentPage;
  getEstimatedReceivableCancel();
}
// 处理附件分页大小变化
const handleAttachmentSizeChange = (pageSize: number) => {
  newFormData.value.pageSize = pageSize;
  getEstimatedReceivableCancel();
}
const newOnLoad = (newPageF) => {
  getEstimatedReceivableCancel(newPageF);
}
const getEstimatedReceivableCancel = () => {
  itemTableLoading2.value = true;
  listPendingSettlementBusiness(newFormData.value).then((res) => {
    if (res.code === 200) {
      newTableData.value = res.rows || [];
      newTableData.value.map(item => {
        item.currency = '人民币';
      });
      newTableRef.value.refreshTable();
      newPageF.value.total = res.total || 0;
    }
    itemTableLoading2.value = false;
  })
}
const handleRelevance = (row) => {
  proxy.$modal.confirm(`是否取消关联成功该调度号 :${row.dispatchNo}?`).then(function () {
    return cancelRelevancy(row.id);
  }).then((res) => {
    newOnLoad(newPageF.value);
    proxy.$modal.msgSuccess(res.msg);
  })
}
const flowLogIshow = ref()
const flowParams = ref([])
const handleFlow = (row: string) => {
  let data = {
    estimatedId: row.id,
  }
  listEstimatedReceivableBillLog(data).then((res) => {
    flowParams.value = res.rows
    flowLogIshow.value.openModel()
  })
}
</script>
<style scoped>
::v-deep .el-descriptions__body .el-descriptions__table.is-bordered .el-descriptions__cell {
  border: var(--el-descriptions-table-border);
  padding: 8px 11px;
  width: 200px;
}
</style>
ui/admin-ui3/src/views/cwgl/pendingSettlementBusiness/index.vue
@@ -1,268 +1,526 @@
<template>
  <basicContainer >
    <avue-crud
        :option="option"
        :table-loading="pageF.loading"
        :data="tableData"
        :page="page"
        :permission="permissionList"
        :before-open="beforeOpen"
        v-model="form"
        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"
    >
  <basicContainer>
    <avue-crud :option="option" v-model:search="queryParams" :table-loading="pageF.loading" :data="tableData"
      :page="page" :permission="permissionList" :before-open="beforeOpen" v-model="form" 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="['cwgl:pendingSettlementBusiness:edit']"
            @click="handleUpdate">修改
        <el-button type="success" :disabled="generateDisabled" @click="handleGenerate"
          v-hasPermi="['cwgl:pendingSettlementBusiness:add']">生成账单
        </el-button>
        <el-button
            type="danger"
            icon="Delete"
            :disabled="pageF.multiple"
            @click="handleDelete"
            v-hasPermi="['cwgl:pendingSettlementBusiness:remove']"
        >删除
        <!-- <el-button type="success" icon="Edit" :disabled="pageF.single"
          v-hasPermi="['cwgl:pendingSettlementBusiness:edit']" @click="handleUpdate">修改
        </el-button> -->
        <!-- <el-button type="danger" icon="Delete" :disabled="pageF.multiple" @click="handleDelete"
          v-hasPermi="['cwgl:pendingSettlementBusiness:remove']">删除
        </el-button> -->
        <el-button type="warning" plain icon="Download" @click="handleExport"
          v-hasPermi="['cwgl:pendingSettlementBusiness:export']">导出
        </el-button>
        <el-button
            type="warning"
            plain
            icon="Download"
            @click="handleExport"
            v-hasPermi="['cwgl:pendingSettlementBusiness:export']"
        >导出
        </el-button>
      </template>
      <template #menu="{ size, row, index }">
        <el-link class="link-btn" type="primary" :underline="false" plain :size="size" @click="handleFy(row)"
          v-hasPermi="['cwgl:pendingSettlementBusiness:query']"> 费用明细
        </el-link>
      </template>
    </avue-crud>
    <el-dialog v-model="dialog.visible" :title="dialog.title" width="1000px">
      <el-form ref="storagesTransferRef" :model="form" :rules="rules" label-width="120px">
        <el-row :gutter="20">
          <el-col :span="12">
            <el-form-item label="账单名称" prop="billName">
              <el-input v-model="form.billName" placeholder="请输入账单名称" />
            </el-form-item>
          </el-col>
          <el-col :span="12">
            <el-form-item label="客户名称" prop="customerName">
              <el-input v-model="form.customerName" disabled placeholder="请输入客户名称" />
            </el-form-item>
          </el-col>
          <el-col :span="12">
            <el-form-item label="调度单数量" prop="count">
              <el-input-number v-model="form.count" disabled :min="0" />
            </el-form-item>
          </el-col>
          <el-col :span="12">
            <el-form-item label="结算金额" prop="price">
              <el-input-number v-model="form.price" disabled :min="0" />
            </el-form-item>
          </el-col>
        </el-row>
      </el-form>
      <template #footer>
        <div class="dialog-footer">
          <el-button type="primary" @click="submitForm">确 定</el-button>
          <el-button @click="cancel">取 消</el-button>
        </div>
      </template>
    </el-dialog>
    <el-dialog v-model="dialog.detail" :title="dialog.title" width="1000px">
      <el-tabs v-model="activeName" class="demo-tabs" @tab-click="handleClick">
        <el-tab-pane label="成本" name="first"></el-tab-pane>
        <el-tab-pane label="收入" name="second"></el-tab-pane>
      </el-tabs>
      <el-table :data="tableDataList" show-summary :summary-method="getSummaries" style="width: 100%">
        <el-table-column prop="feeName" label="费用名称" />
        <el-table-column prop="estimatedAmount" label="费用金额" />
        <el-table-column prop="currency" label="费用币制" />
      </el-table>
      <template #footer>
        <div class="dialog-footer">
          <el-button @click="cancel">取 消</el-button>
        </div>
      </template>
    </el-dialog>
  </basicContainer>
</template>
<script setup name="pendingSettlementBusiness" lang="ts">
  import {PendingSettlementBusinessI,addPendingSettlementBusiness, delPendingSettlementBusiness, exportPendingSettlementBusiness, getPendingSettlementBusiness, listPendingSettlementBusiness, updatePendingSettlementBusiness} from "@/api/cwgl/pendingSettlementBusiness";
  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 {
  PendingSettlementBusinessI, addPendingSettlementBusiness, delPendingSettlementBusiness, exportPendingSettlementBusiness, getPendingSettlementBusiness, listPendingSettlementBusiness, updatePendingSettlementBusiness,
  getPendingSettlementBusinessBill, getCwglPendingSettlementBusinessBillList, getSelectCustomNam, cwglPendingSettlementBusinessCreateBill, pendingSettlementBusinessCreateBillList
} from "@/api/cwgl/pendingSettlementBusiness";
import { listEstimatedReceivable } from "@/api/cwgl/estimatedReceivable";
  const { proxy } = useCurrentInstance();
  const crudRef = ref();
  const permissionList = computed(()=>{
    return {
      addBtn: hasPermission(["cwgl:pendingSettlementBusiness:add"]),
      delBtn: hasPermission(["cwgl:pendingSettlementBusiness:remove"]),
      editBtn: hasPermission(["cwgl:pendingSettlementBusiness:edit"]),
      viewBtn: hasPermission(["cwgl:pendingSettlementBusiness:query"]),
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";
const { proxy } = useCurrentInstance();
const crudRef = ref();
const permissionList = computed(() => {
  return {
    addBtn: hasPermission(["cwgl:pendingSettlementBusiness:add"]),
    delBtn: hasPermission(["cwgl:pendingSettlementBusiness:remove"]),
    editBtn: hasPermission(["cwgl:pendingSettlementBusiness:edit"]),
    viewBtn: hasPermission(["cwgl:pendingSettlementBusiness:query"]),
    generate: hasPermission(["cwgl:pendingSettlementBusiness:generate"]),
  }
})
const data = reactive({
  form: <PendingSettlementBusinessI & any>{
    billName: '',
    customerNa: '',
    count: 0,
    price: 0
  },
  selectCustomName: [],
  queryParams: <PendingSettlementBusinessI & PageQueryInterface>{},
  page: <PagesInterface>{
    pageSize: 10,
    total: 0,
    currentPage: 1,
  },
  selectionList: [],
  tableDataList: [],
  rules: {
    billName: [
      { required: true, message: '账单名称不能为空', trigger: 'blur' }
    ],
  },
  generateDisabled: false, // 控制生成账单按钮的禁用状态
})
const { queryParams, form, page, selectionList, generateDisabled, rules, tableDataList,
  selectCustomName
} = toRefs(data);
const getSelectCustomName = () => {
  getSelectCustomNam().then((res) => {
    if (res.code === 200) {
      // selectCustomName.value = res.data;
      selectCustomName.value = res.data.map(item => ({
        dictLabel: item,
        dictValue: item
      }));
      option.value.column.customerName.dicData = selectCustomName.value || [];
    }
  })
  const data = reactive({
    form:<PendingSettlementBusinessI>{},
    queryParams:<PendingSettlementBusinessI&PageQueryInterface>{},
    page: <PagesInterface>{
      pageSize: 10,
      total: 0,
      currentPage: 1,
}
getSelectCustomName()
const option = ref({
  pageKey: 'PendingSettlementBusiness',
  rowKey: 'id',
  addBtn: false,
  generateDisabled: true,
  editBtn: false,
  delBtn: false,
  viewBtn: false,
  selection: true,
  generate: false,
  searchSpan: 5,
  searchLabelWidth: 100,
  column: {
    // id: {
    //   label: 'ID',
    // },
    projectName: {
      fixed: 'left',
      label: '项目名称', search: true,
    },
    selectionList:[],
  })
  const {queryParams,form,page,selectionList} = toRefs(data);
  const option = ref({
    pageKey: 'PendingSettlementBusiness',
    rowKey: 'id',
    column: {
                                id: {
          label: 'ID',
                            },
                                bookingNo: {
          label: '客户订单号',
                            },
                                customerId: {
          label: '客户id',
                            },
                                carrierId: {
          label: '承运商id',
                            },
                                projectName: {
          label: '项目名称',
                            },
                                dispatchNo: {
          label: '调度单号',
                                rules: [
              {
                required: true,
                message: "调度单号不能为空", trigger: "blur" }
            ],                  },
                                createdTime: {
          label: '下单时间',
                            },
                                transportMode: {
          label: '运输方式',
                            },
                                productId: {
          label: '服务产品',
                            },
                                customerName: {
          label: '客户名称',
                            },
                                operationMode: {
          label: '运营模式',
                            },
                                carrierName: {
          label: '承运商',
                            },
                                departureLocation: {
          label: '出发地',
                            },
                                arrivalLocation: {
          label: '目的地',
                            },
                                vehicleId: {
          label: '运输工具ID',
                            },
                                licensePlateNumber: {
          label: '车牌',
                            },
                                vehicleType: {
          label: '车型',
                            },
                                mainDriver: {
          label: '主驾驶员',
                            },
                                assistantDriver: {
          label: '副驾驶员',
                            },
                                pointNum: {
          label: '提送货点数',
                            },
                                businessContact: {
          label: '业务联系人',
                            },
                                estimatedTotalIncome: {
          label: '预估总收入',
                            },
                                estimatedTotalCost: {
          label: '预估总成本',
                            },
                                estimatedProfit: {
          label: '预估利润',
                            },
                                electronicLock: {
          label: '电子锁',
                            },
                                reWeighingWeight: {
          label: '复磅重量',
                            },
                                quantity: {
          label: '件数',
                            },
                                actualDepartureTime: {
          label: '实际出发时间',
                            },
                                requiredArrivalTime: {
          label: '要求到达时间',
                            },
                                actualArrivalTime: {
          label: '实际到达时间',
                            },
                                beReturn: {
          label: '是否回程',
                            },
                                dispatchQuantity: {
          label: '实发件数',
                            },
                                dispatchWeight: {
          label: '实发重量',
                            },
                                dispatchVolume: {
          label: '实发体积(立方)',
                            },
                                emptyMileage: {
          label: '空载里程',
                            },
                                emptyFuel: {
          label: '空载油耗',
                            },
                                heavyMileage: {
          label: '重载里程',
                            },
                                heavyFuel: {
          label: '重载油耗',
                            },
                                beScheduled: {
          label: '是否按班次',
                            },
                                trackingNo: {
          label: '快递单号',
                            },
                                sealNo: {
          label: '铅封号',
                            },
                                scheduleNo: {
          label: '班次号',
                            },
                                transportStatus: {
          label: '运输状态',
                            },
                                estimatedBillId: {
          label: '预估账单ID',
                            },
                                settlementBillId: {
          label: '结算账单ID',
                            },
                                settlementStatus: {
          label: '结算状态',
                            },
                                createTime: {
          label: '创建时间',
                                rules: [
              {
                required: true,
                message: "创建时间不能为空", trigger: "blur" }
            ],                  },
                                updateTime: {
          label: '更新时间',
                                rules: [
              {
                required: true,
                message: "更新时间不能为空", trigger: "blur" }
            ]                  },
          }
  })
    dispatchNo: {
      label: '调度单号',
      search: true,
      rules: [
        {
          required: true,
          message: "调度单号不能为空", trigger: "blur"
        }
      ],
    },
    customerName: {
      label: '客户名称',
      search: true,
      type: 'select',           // 设置为下拉框类型
      dicData: [], // 使用 selectCustomName 作为数据源
      disabled: false  // 根据需要设置是否禁用
    },
    licensePlateNumber: {
      label: '车牌', search: true, hide: true,
    },
    vehicleType: {
      label: '车型', search: true, hide: true,
    },
    createdTime: {
      label: '下单时间',
      display: false,
      search: true,
      type: 'date',
      format: 'YYYY-MM-DD',
      searchSpan: 5, minWidth: 100,
      valueFormat: 'YYYY-MM-DD',
    },
    operationMode: {
      label: '运营模式',
    },
    createTime: {
      label: '创建时间', display: false, hide: true, type: 'date',
      format: 'YYYY-MM-DD', searchSpan: 5, minWidth: 100, searchLabelWidth: 110,
      valueFormat: 'YYYY-MM-DD',
    },
    // bookingNo: {
    //   label: '客户订单号', showOverflowTooltip: true,
    // },
  const { tableData,pageF,rowSave,rowUpdate,rowDel,beforeOpen,searchChange,
    searchReset,selectionChange,onLoad,currentChange,sizeChange,handleDelete,handleExport,handleUpdate,refreshChange} = usePagePlus({
    form:form,
    option:option,
    queryParams:queryParams,
    idKey:'id',
    page:page.value,
    getListApi:listPendingSettlementBusiness,
    getDetailApi:getPendingSettlementBusiness,
    exportApi:exportPendingSettlementBusiness,
    deleteApi:delPendingSettlementBusiness,
    addApi:addPendingSettlementBusiness,
    updateApi:updatePendingSettlementBusiness,
    handleUpdateFunc:()=>{
    // customerId: {
    //   label: '客户id',
    // },
    // carrierId: {
    //   label: '承运商id',
    // },
    // createdTime: {
    //   label: '下单时间',
    // },
    transportMode: {
      label: '运输方式', hide: true,
    },
    productId: {
      label: '服务产品', hide: true,
    },
    carrierName: {
      label: '承运商',
    },
    departureLocation: {
      label: '出发地',
    },
    arrivalLocation: {
      label: '目的地',
    },
    isCreate: {
      label: '是否已入账', dataType: 'string', search: true,
      type: 'select',
      dicUrl: '/system/dict/data/type/sys_whether_type',
    },
    // vehicleId: {
    //   label: '运输工具ID',hide: true,
    // },
    // mainDriver: {
    //   label: '主驾驶员',hide: true,
    // },
    // assistantDriver: {
    //   label: '副驾驶员',hide: true,
    // },
    // pointNum: {
    //   label: '提送货点数',hide: true,
    // },
    // businessContact: {
    //   label: '业务联系人',hide: true,
    // },
    // estimatedTotalIncome: {
    //   label: '预估总收入',
    // },
    // estimatedTotalCost: {
    //   label: '预估总成本',
    // },
    // estimatedProfit: {
    //   label: '预估利润',
    // },
    // electronicLock: {
    //   label: '电子锁',
    // },
    // reWeighingWeight: {
    //   label: '复磅重量',
    // },
    // quantity: {
    //   label: '件数',
    // },
    // actualDepartureTime: {
    //   label: '实际出发时间',
    // },
    // requiredArrivalTime: {
    //   label: '要求到达时间',
    // },
    // actualArrivalTime: {
    //   label: '实际到达时间',
    // },
    // beReturn: {
    //   label: '是否回程',
    // },
    // dispatchQuantity: {
    //   label: '实发件数',
    // },
    // dispatchWeight: {
    //   label: '实发重量',
    // },
    // dispatchVolume: {
    //   label: '实发体积(立方)',
    // },
    // emptyMileage: {
    //   label: '空载里程',
    // },
    // emptyFuel: {
    //   label: '空载油耗',
    // },
    // heavyMileage: {
    //   label: '重载里程',
    // },
    // heavyFuel: {
    //   label: '重载油耗',
    // },
    // beScheduled: {
    //   label: '是否按班次',
    // },
    // trackingNo: {
    //   label: '快递单号',
    // },
    // sealNo: {
    //   label: '铅封号',
    // },
    // scheduleNo: {
    //   label: '班次号',
    // },
    // transportStatus: {
    //   label: '运输状态',
    // },
    // estimatedBillId: {
    //   label: '预估账单ID',
    // },
    // settlementBillId: {
    //   label: '结算账单ID',
    // },
    // settlementStatus: {
    //   label: '结算状态',
    // },
    // updateTime: {
    //   label: '更新时间',
    //   rules: [
    //     {
    //       required: true,
    //       message: "更新时间不能为空", trigger: "blur"
    //     }
    //   ]
    // },
  }
})
const { tableData, pageF, rowSave, rowUpdate, rowDel, beforeOpen, searchChange,
  searchReset, selectionChange, onLoad, currentChange, sizeChange, handleDelete, handleExport, handleUpdate, refreshChange } = usePagePlus({
    form: form,
    option: option,
    queryParams: queryParams,
    idKey: 'id',
    page: page.value,
    getListApi: listPendingSettlementBusiness,
    getDetailApi: getPendingSettlementBusiness,
    exportApi: exportPendingSettlementBusiness,
    deleteApi: delPendingSettlementBusiness,
    addApi: addPendingSettlementBusiness,
    updateApi: updatePendingSettlementBusiness,
    handleUpdateFunc: () => {
      crudRef.value.rowEdit(selectionList.value[0]);
    },
    handleSelectionChangeFunc:(selection:any)=>{
    handleSelectionChangeFunc: (selection: any) => {
      if (selection.every((item: any) => item.isCreate == '0')) {
        generateDisabled.value = false;
      } else {
        generateDisabled.value = true;
        if (selection.length > 0) {
          proxy.$message.warning('请选择未入账的记录');
        }
      }
      selectionList.value = selection;
      selectionList.value = selection;
    }
  })
const dialog = reactive({
  visible: false,
  detail: false,
  title: '',
})
const selectedIds = ref<string>('');
const handleGenerate = () => {
  form.value = {};
  dialog.title = '生成账单';
  if (selectionList.value.length > 0) {
    selectedIds.value = selectionList.value.map(item => item.id).join(',');
  }
  if (selectionList.value.length === 0) {
    if (queryParams.value.customerName == '') {
      proxy.$message.warning('请选择客户名称');
      return;
    }
    getCwglPendingSettlementBusinessBillList({ customerName: queryParams.value.customerName }).then((res) => {
      if (res.code === 200) {
        form.value = res.data;
        // option.value.generate = true;
        dialog.visible = true;
      }
    })
  } else {
    getPendingSettlementBusinessBill(selectedIds.value).then((res) => {
      if (res.code === 200) {
        form.value = res.data;
        // option.value.generate = true;
        dialog.visible = true;
      }
    })
  }
}
const storagesTransferRef = ref<FormInstance>()
const submitForm = () => {
  storagesTransferRef.value!.validate(valid => {
    if (valid) {
      if (selectionList.value.length == 0) {
        pendingSettlementBusinessCreateBillList(form.value).then((res) => {
          if (res.code === 200) {
            proxy.$message.success(res.msg);
            dialog.visible = false;
            onLoad(page.value)
          }
        });
      } else {
        cwglPendingSettlementBusinessCreateBill(form.value, selectedIds.value).then((res) => {
          if (res.code === 200) {
            proxy.$message.success(res.msg);
            dialog.visible = false;
            onLoad(page.value)
          }
        });
      }
    }
  })
}
const cancel = () => {
  form.value = {};
  dialog.visible = false;
  dialog.detail = false;
  proxy.resetForm(storagesTransferRef.value)
  option.value.generate = false;
}
const activeName = ref('first')
const dispatchNo = ref('');
const handleClick = (tab: TabsPaneContext, event: Event) => {
  if (tab.props.name == 'first') {
    getListVable(dispatchNo.value, 0);
  } else if (tab.props.name == 'second') {
    getListVable(dispatchNo.value, 1);
  }
}
const handleFy = (row: any) => {
  dispatchNo.value = row.dispatchNo;
  if (activeName.value == 'first') {
    listEstimatedReceivable({ dispatchNo: row.dispatchNo, feeType: 0 }).then((res) => {
      if (res.code === 200) {
        dialog.detail = true;
        tableDataList.value = res.rows || [];
      }
    })
  } else if (activeName.value == 'second') {
    // 这里可以添加查询收入相关的逻辑
    listEstimatedReceivable({ dispatchNo: row.dispatchNo, feeType: 1 }).then((res) => {
      if (res.code === 200) {
        dialog.detail = true;
        tableDataList.value = res.rows || [];
      }
    })
  }
}
const getListVable = (dispatchNo, feeType) => {
  listEstimatedReceivable({ dispatchNo: dispatchNo, feeType: feeType }).then((res) => {
    if (res.code === 200) {
      tableDataList.value = res.rows || [];
    }
  })
}
// 添加合计方法
const getSummaries = (param) => {
  const { columns, data } = param;
  const sums = [];
  columns.forEach((column, index) => {
    if (index === 0) {
      sums[index] = '合计';
      return;
    }
    if (column.property === 'estimatedAmount') {
      const values = data.map(item => Number(item.estimatedAmount));
      if (!values.every(value => Number.isNaN(value))) {
        sums[index] = values.reduce((prev, curr) => {
          const value = Number(curr);
          if (!Number.isNaN(value)) {
            return prev + curr;
          } else {
            return prev;
          }
        }, 0);
        sums[index] = sums[index].toFixed(2);
      } else {
        sums[index] = 'N/A';
      }
    } else {
      sums[index] = '';
    }
  });
  return sums;
}
</script>