| | |
| | | <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" |
| | | > |
| | | <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:tmsDispatchOrder:export']" |
| | | >导出 |
| | | <el-button type="warning" plain icon="Download" @click="handleExport" |
| | | v-hasPermi="['tms:tmsDispatchOrder:export']">导出 |
| | | </el-button> |
| | | <el-button |
| | | type="primary" |
| | | icon="Promotion" |
| | | :disabled="pageF.multiple" |
| | | @click="handleYSGenerate" |
| | | v-hasPermi="['tms:tmsDispatchOrder:generate']" |
| | | >生成应收费用 |
| | | </el-button> |
| | | <el-button |
| | | type="success" |
| | | icon="Promotion" |
| | | :disabled="pageF.multiple" |
| | | @click="handleYFGenerate" |
| | | v-hasPermi="['tms:tmsDispatchOrder:generate']" |
| | | >生成应付费用 |
| | | </el-button> |
| | | <el-button type="primary" icon="Promotion" :disabled="pageF.multiple" @click="handleYSGenerate" |
| | | v-hasPermi="['tms:tmsDispatchOrder:generate']">生成应收费用 |
| | | </el-button> |
| | | <el-button type="success" icon="Promotion" :disabled="pageF.multiple" @click="handleYFGenerate" |
| | | v-hasPermi="['tms:tmsDispatchOrder:generate']">生成应付费用 |
| | | </el-button> |
| | | </template> |
| | | <template #menu-before="{row}"> |
| | | <el-link size="small" type="primary" v-if="[0,1,2,3].includes(row.status)" @click="handleClose(row)" class="link-btn" |
| | | v-hasPermi="['tms:tmsDispatchOrder:closeOrder']" |
| | | :underline="false" icon="el-icon-close">作废 |
| | | <template #menu-before="{ row }"> |
| | | <el-link size="small" type="primary" v-if="[0, 1, 2, 3].includes(row.status)" @click="handleClose(row)" |
| | | class="link-btn" v-hasPermi="['tms:tmsDispatchOrder:closeOrder']" :underline="false" icon="el-icon-close">作废 |
| | | </el-link> |
| | | <el-link size="small" type="primary" v-if="![0,1].includes(row.status)" @click="handleLogItinerary(row)" |
| | | v-hasPermi="['tms:tmsTrip:list']" |
| | | class="link-btn" :underline="false" icon="el-icon-view">查看行程 |
| | | <el-link size="small" type="primary" v-if="![0, 1].includes(row.status)" @click="handleLogItinerary(row)" |
| | | v-hasPermi="['tms:tmsTrip:list']" class="link-btn" :underline="false" icon="el-icon-view">查看行程 |
| | | </el-link> |
| | | <el-link size="small" type="primary" v-if="row.accountsReceivableStatus == 0" @click="handleAddFinance(row)" |
| | | class="link-btn" v-hasPermi="['tms:tmsFinanceDetail:add']" |
| | | :underline="false" icon="el-icon-edit-pen">费用登记 |
| | | class="link-btn" v-hasPermi="['tms:tmsFinanceDetail:add']" :underline="false" icon="el-icon-edit-pen">费用登记 |
| | | </el-link> |
| | | </template> |
| | | <template #menu="{row}"> |
| | | <template #menu="{ row }"> |
| | | <el-link size="small" type="primary" @click="handleLog(row)" class="link-btn" :underline="false" |
| | | icon="el-icon-tickets">日志 |
| | | icon="el-icon-tickets">日志 |
| | | </el-link> |
| | | </template> |
| | | |
| | | |
| | | <template #body> |
| | | <avue-tabs :option="tabsOption" |
| | | @change="handleChange"></avue-tabs> |
| | | <avue-tabs :option="tabsOption" @change="handleChange"></avue-tabs> |
| | | </template> |
| | | </avue-crud> |
| | | <el-dialog title="费用登记" v-model="pageF.open" class="avue-dialog avue-dialog--top" width="80%"> |
| | | <el-descriptions :column="3" border> |
| | | <el-descriptions-item label="调度单号">{{form.dispatchNo}}</el-descriptions-item> |
| | | <el-descriptions-item label="客户名称">{{form.customerName}}</el-descriptions-item> |
| | | <el-descriptions-item label="项目名称">{{form.projectName}}</el-descriptions-item> |
| | | <el-descriptions-item label="运输路线">{{form.transportLine}}</el-descriptions-item> |
| | | <el-descriptions-item label="车型">{{form.$actualVehicleType}}</el-descriptions-item> |
| | | <el-descriptions-item label="车牌">{{form.licensePlate}}</el-descriptions-item> |
| | | <el-descriptions-item label="调度单号">{{ form.dispatchNo }}</el-descriptions-item> |
| | | <el-descriptions-item label="客户名称">{{ form.customerName }}</el-descriptions-item> |
| | | <el-descriptions-item label="项目名称">{{ form.projectName }}</el-descriptions-item> |
| | | <el-descriptions-item label="运输路线">{{ form.transportLine }}</el-descriptions-item> |
| | | <el-descriptions-item label="车型">{{ form.$actualVehicleType }}</el-descriptions-item> |
| | | <el-descriptions-item label="车牌">{{ form.licensePlate }}</el-descriptions-item> |
| | | </el-descriptions> |
| | | <avue-tabs :option="tabsOption2" ref="tabsOption2Ref" |
| | | @change="handleChange2"></avue-tabs> |
| | | <avue-tabs :option="tabsOption2" ref="tabsOption2Ref" @change="handleChange2"></avue-tabs> |
| | | <div v-if="active === 'tab1'"> |
| | | <avue-crud |
| | | :option="itemsTableOption" ref="itemsTableRef" |
| | | :data="itemsTableData" |
| | | @selection-change="selectionChange2" |
| | | > |
| | | <template #count="{row}"> |
| | | <avue-crud :option="itemsTableOption" ref="itemsTableRef" :data="itemsTableData" |
| | | @selection-change="selectionChange2"> |
| | | <template #count="{ row }"> |
| | | <el-input-number v-model="row.count" @change="countChange(row)" placeholder="请输入计费数量" |
| | | :min="0"></el-input-number> |
| | | :min="0"></el-input-number> |
| | | </template> |
| | | <template #isYF="{row}"> |
| | | <el-checkbox v-model="row.isYF" |
| | | :true-value="1" |
| | | :false-value="0" |
| | | @change="(e:number) =>isYFChange(e, row)" ></el-checkbox> |
| | | <template #isYF="{ row }"> |
| | | <el-checkbox v-model="row.isYF" :true-value="1" :false-value="0" |
| | | @change="(e: number) => isYFChange(e, row)"></el-checkbox> |
| | | </template> |
| | | <template #remark="{row}"> |
| | | <el-input v-model="row.remark" placeholder="备注" ></el-input> |
| | | <template #remark="{ row }"> |
| | | <el-input v-model="row.remark" placeholder="备注"></el-input> |
| | | </template> |
| | | <template #expand="{row}"> |
| | | <template #expand="{ row }"> |
| | | <el-descriptions :column="3" border v-if="row.isYF == 1"> |
| | | <el-descriptions-item label="服务商"> |
| | | <el-select v-model="row.serviceProviderId" placeholder="请选择服务商" |
| | | @change="serviceProviderChange(row)" |
| | | :filterable="true"> |
| | | <el-option v-for="item in row.serviceProviderData" |
| | | :key="item.id" :label="item.serviceShortName" |
| | | :value="item.id"></el-option> |
| | | <el-select v-model="row.serviceProviderId" placeholder="请选择服务商" @change="serviceProviderChange(row)" |
| | | :filterable="true"> |
| | | <el-option v-for="item in row.serviceProviderData" :key="item.id" :label="item.serviceShortName" |
| | | :value="item.id"></el-option> |
| | | </el-select> |
| | | </el-descriptions-item> |
| | | <el-descriptions-item label="是否存在应付报价"> |
| | | <span :style="{color: row.isCZYF == 0? 'red': ''}">{{row.isCZYF == 0? '否': row.isCZYF == 1? '是': ''}}</span> |
| | | <span :style="{ color: row.isCZYF == 0 ? 'red' : '' }">{{ row.isCZYF == 0 ? '否' : row.isCZYF == 1 ? '是' |
| | | : |
| | | '' }}</span> |
| | | |
| | | </el-descriptions-item> |
| | | <el-descriptions-item label="计费金额"> |
| | | <el-input v-model="row.yfPrice" :min="1" |
| | | @change="yfPriceChange(row)" |
| | | type="number" placeholder="请输入金额"></el-input> |
| | | <el-input v-model="row.yfPrice" :min="1" @change="yfPriceChange(row)" type="number" |
| | | placeholder="请输入金额"></el-input> |
| | | </el-descriptions-item> |
| | | <el-descriptions-item label="币制"> |
| | | <el-radio-group v-model="row.yfCurrency" > |
| | | <el-radio |
| | | v-for="dict in sys_currency" |
| | | :key="dict.value" |
| | | :label="dict.value" |
| | | >{{ dict.label }}</el-radio> |
| | | <el-radio-group v-model="row.yfCurrency"> |
| | | <el-radio v-for="dict in sys_currency" :key="dict.value" :label="dict.value">{{ dict.label |
| | | }}</el-radio> |
| | | </el-radio-group> |
| | | </el-descriptions-item> |
| | | <el-descriptions-item label="计费数量"> |
| | | <el-input-number v-model="row.yfCount" @change="yfPriceChange(row)" placeholder="请输入计费数量" |
| | | :min="0"></el-input-number> |
| | | :min="0"></el-input-number> |
| | | |
| | | </el-descriptions-item> |
| | | <el-descriptions-item label="总金额">{{ row.yfSum }}</el-descriptions-item> |
| | |
| | | </div> |
| | | <div v-if="active === 'tab2'"> |
| | | <h2>实报实销费用</h2> |
| | | <avue-form v-model="boxForm" ref="boxFormRef" |
| | | :option="boxFormOption"> |
| | | <avue-form v-model="boxForm" ref="boxFormRef" :option="boxFormOption"> |
| | | <template #voucherUrl="{ row }"> |
| | | <el-upload class="upload-demo" ref="uploadRef" :limit="1" drag :action="urlApi + '/common/upload2'" multiple |
| | | :show-file-list="true" :on-success="(res) => handleUploadAfter(res, row)" |
| | | :on-exceed="(files) => handleExceed(files, row)"> |
| | | <el-icon class="el-icon--upload"><upload-filled /></el-icon> |
| | | <div class="el-upload__text"> |
| | | 点击或将图片拖拽到此区域上传 |
| | | </div> |
| | | |
| | | </avue-form> |
| | | <avue-crud |
| | | :option="boxTableOption" |
| | | :data="boxTableData" |
| | | > |
| | | <template #isYF="{row}"> |
| | | <el-checkbox v-model="row.isYF" |
| | | :true-value="1" |
| | | :false-value="0" |
| | | @change="(e:number) =>isYFChange(e, row)" ></el-checkbox> |
| | | </el-upload> |
| | | </template> |
| | | <template #yfServiceProviderId="{row}"> |
| | | <el-select v-model="row.yfServiceProviderIdType" placeholder="请选择服务商" |
| | | @change="(e:any)=>ysServiceProviderChange(e,row)" |
| | | :filterable="true"> |
| | | </avue-form> |
| | | <avue-crud :option="boxTableOption" :data="boxTableData" @selection-change="boxSelectionChange"> |
| | | <template #menu-left> |
| | | <el-button type="danger" plain icon="Delete" |
| | | :disabled="!(boxSelectionList.length === 1 && boxSelectionList[0]?.status === 0)" |
| | | @click="handleBatchBoxDel"> |
| | | 作废 |
| | | </el-button> |
| | | </template> |
| | | <template #isYF="{ row }"> |
| | | <el-checkbox v-model="row.isYF" :disabled="row.status == 1" :true-value="1" :false-value="0" |
| | | @change="(e: number) => isYFChange(e, row)"></el-checkbox> |
| | | </template> |
| | | <template #yfServiceProviderId="{ row }"> |
| | | <el-select :disabled="row.status == 1" v-model="row.yfServiceProviderIdType" placeholder="请选择服务商" |
| | | @change="(e: any) => ysServiceProviderChange(e, row)" :filterable="true"> |
| | | <el-option v-for="item in serviceProviderList" |
| | | :key="item.serviceProviderId + '_'+ item.serviceProviderType" :label="item.serviceProviderName" |
| | | :value="item.serviceProviderId + '_'+ item.serviceProviderType"></el-option> |
| | | :key="item.serviceProviderId + '_' + item.serviceProviderType" :label="item.serviceProviderName" |
| | | :value="item.serviceProviderId + '_' + item.serviceProviderType"></el-option> |
| | | </el-select> |
| | | </template> |
| | | <template #yfPrice="{row}"> |
| | | <el-input v-model="row.yfPrice" :min="1" |
| | | type="number" placeholder="请输入金额"></el-input> |
| | | <template #yfPrice="{ row }"> |
| | | <el-input :disabled="row.status == 1" v-model="row.yfPrice" :min="1" type="number" |
| | | placeholder="请输入金额"></el-input> |
| | | </template> |
| | | <template #yfCurrency="{row}"> |
| | | <el-radio-group v-model="row.yfCurrency" > |
| | | <el-radio |
| | | v-for="dict in sys_currency" |
| | | :key="dict.value" |
| | | :label="dict.value" |
| | | >{{ dict.label }}</el-radio> |
| | | </el-radio-group> |
| | | <template #yfCurrency="{ row }"> |
| | | <el-radio-group v-model="row.yfCurrency" :disabled="row.status == 1"> |
| | | <el-radio v-for="dict in sys_currency" :key="dict.value" :label="dict.value">{{ dict.label }}</el-radio> |
| | | </el-radio-group> |
| | | </template> |
| | | </avue-crud> |
| | | </div> |
| | | <template #footer> |
| | | <div class="dialog-footer"> |
| | | <el-button type="primary" |
| | | :loading="pageF.isUploading" @click="submitForm"> |
| | | <el-button type="primary" :loading="pageF.isUploading" @click="submitForm"> |
| | | {{ pageF.isUploading ? '提交中' : '确 定' }} |
| | | </el-button> |
| | | |
| | |
| | | |
| | | |
| | | <el-dialog :title="pageF.title" v-model="open" class="avue-dialog avue-dialog--top" width="80%"> |
| | | <avue-crud |
| | | :option="boxTableOption" ref="itemsTableRef" |
| | | :data="boxTableData" |
| | | > |
| | | <template #expand="{row}"> |
| | | <avue-crud v-if="optionType === 'ysGenerate'" |
| | | :option="boxItemTableOption" ref="itemsTableRef2" |
| | | :data="row.tmsReceivableFeeItems" |
| | | > |
| | | <avue-crud :option="boxTableOption" ref="itemsTableRef" :data="boxTableData"> |
| | | <template #expand="{ row }"> |
| | | <avue-crud v-if="optionType === 'ysGenerate'" :option="boxItemTableOption" ref="itemsTableRef2" |
| | | :data="row.tmsReceivableFeeItems"> |
| | | </avue-crud> |
| | | <avue-crud v-else |
| | | :option="boxItemTableOption" ref="itemsTableRef2" |
| | | :data="row.payableFeeItems" |
| | | > |
| | | <avue-crud v-else :option="boxItemTableOption" ref="itemsTableRef2" :data="row.payableFeeItems"> |
| | | </avue-crud> |
| | | |
| | | </template> |
| | | <template #receivableAmount="{row}"> |
| | | <div v-if="row.receivableAmountRMB > 0">{{row.receivableAmountRMB}}人民币</div> |
| | | <div v-if="row.receivableAmountHKD > 0">{{row.receivableAmountHKD}}港币</div> |
| | | <template #receivableAmount="{ row }"> |
| | | <div v-if="row.receivableAmountRMB > 0">{{ row.receivableAmountRMB }}人民币</div> |
| | | <div v-if="row.receivableAmountHKD > 0">{{ row.receivableAmountHKD }}港币</div> |
| | | |
| | | </template> |
| | | |
| | | <template #payableAmount="{row}"> |
| | | <div v-if="row.payableRmbAmount > 0">{{row.payableRmbAmount}}人民币</div> |
| | | <div v-if="row.payableHkbAmount > 0">{{row.payableHkbAmount}}港币</div> |
| | | <template #payableAmount="{ row }"> |
| | | <div v-if="row.payableRmbAmount > 0">{{ row.payableRmbAmount }}人民币</div> |
| | | <div v-if="row.payableHkbAmount > 0">{{ row.payableHkbAmount }}港币</div> |
| | | </template> |
| | | </avue-crud> |
| | | |
| | | |
| | | <template #footer> |
| | | <div class="dialog-footer"> |
| | | <el-button type="primary" v-if="optionType != 'view'" |
| | | :loading="pageF.isUploading" @click="submitGenerate"> |
| | | <el-button type="primary" v-if="optionType != 'view'" :loading="pageF.isUploading" @click="submitGenerate"> |
| | | {{ pageF.isUploading ? '提交中' : '确 定' }} |
| | | </el-button> |
| | | |
| | |
| | | |
| | | <el-dialog title="调度单作废" v-model="open5" class="avue-dialog avue-dialog--top" width="80%"> |
| | | <el-descriptions :column="3" border> |
| | | <el-descriptions-item label="调度单号">{{form.dispatchNo}}</el-descriptions-item> |
| | | <el-descriptions-item label="客户名称">{{form.customerName}}</el-descriptions-item> |
| | | <el-descriptions-item label="项目名称">{{form.projectName}}</el-descriptions-item> |
| | | <el-descriptions-item label="运输路线">{{form.transportLine}}</el-descriptions-item> |
| | | <el-descriptions-item label="车型">{{form.$actualVehicleType}}</el-descriptions-item> |
| | | <el-descriptions-item label="车牌">{{form.licensePlate}}</el-descriptions-item> |
| | | <el-descriptions-item label="调度单号">{{ form.dispatchNo }}</el-descriptions-item> |
| | | <el-descriptions-item label="客户名称">{{ form.customerName }}</el-descriptions-item> |
| | | <el-descriptions-item label="项目名称">{{ form.projectName }}</el-descriptions-item> |
| | | <el-descriptions-item label="运输路线">{{ form.transportLine }}</el-descriptions-item> |
| | | <el-descriptions-item label="车型">{{ form.$actualVehicleType }}</el-descriptions-item> |
| | | <el-descriptions-item label="车牌">{{ form.licensePlate }}</el-descriptions-item> |
| | | </el-descriptions> |
| | | |
| | | <avue-form v-model="boxForm" ref="boxFormRef" |
| | | :option="boxFormOption"> |
| | | <avue-form v-model="boxForm" ref="boxFormRef" :option="boxFormOption"> |
| | | |
| | | </avue-form> |
| | | <template #footer> |
| | | <div class="dialog-footer"> |
| | | <el-button type="primary" |
| | | :loading="pageF.isUploading" @click="submitForm5"> |
| | | <el-button type="primary" :loading="pageF.isUploading" @click="submitForm5"> |
| | | {{ pageF.isUploading ? '提交中' : '确 定' }} |
| | | </el-button> |
| | | |
| | |
| | | updateTmsDispatchOrder, |
| | | generateTmsDispatchOrder, initGenerate, initYSGenerate, |
| | | ysGenerateTmsDispatchOrder, initYFGenerate, yfGenerateTmsDispatchOrder, |
| | | getServiceProvider, checkCloseOrder, closeOrder |
| | | getServiceProvider, checkCloseOrder, closeOrder, tmsFinanceDetail |
| | | } from "@/api/tms/tmsDispatchOrder"; |
| | | import useCurrentInstance from "@/utils/useCurrentInstance"; |
| | | import {computed, onMounted, reactive, ref, toRefs, watch, getCurrentInstance, nextTick} from "vue"; |
| | | import {PagesInterface, PageQueryInterface} from "@/utils/globalInterface"; |
| | | import {usePagePlus} from "@/hooks/usePagePlus"; |
| | | import {hasPermission} from "@/utils/permissionUtils"; |
| | | import {ElMessage, ElMessageBox} from "element-plus"; |
| | | import {addTmsTrip, listTmsTrip} from "@/api/tms/tmsTrip"; |
| | | import {saveTmsFinanceDetail, listTmsFinanceDetail, updateTmsFinanceDetail} from "@/api/tms/tmsFinanceDetail"; |
| | | import {listTmsQuoteItem} from "@/api/tms/tmsQuotePlanItem"; |
| | | import {getDicts} from "@/api/system/dict/data"; |
| | | import {listTmsServiceProvider} from "@/api/tms/tmsServiceProvider"; |
| | | import {listTmsCustomsServiceProvider} from "@/api/tms/tmsCustomsServiceProvider"; |
| | | import {listTmsLoadingServiceProvider} from "@/api/tms/tmsLoadingServiceProvider"; |
| | | import {selectPaymentTmsQuotePlan} from "@/api/tms/tmsQuotePlan"; |
| | | import {addTmsQuoteFee, listTmsQuoteFee, pushTmsQuoteFee} from "@/api/tms/tmsQuoteFee"; |
| | | import { computed, onMounted, reactive, ref, toRefs, watch, getCurrentInstance, nextTick } from "vue"; |
| | | import { PagesInterface, PageQueryInterface } from "@/utils/globalInterface"; |
| | | import { usePagePlus } from "@/hooks/usePagePlus"; |
| | | import { hasPermission } from "@/utils/permissionUtils"; |
| | | import { ElMessage, ElMessageBox } from "element-plus"; |
| | | import { addTmsTrip, listTmsTrip } from "@/api/tms/tmsTrip"; |
| | | import { saveTmsFinanceDetail, listTmsFinanceDetail, updateTmsFinanceDetail } from "@/api/tms/tmsFinanceDetail"; |
| | | import { listTmsQuoteItem } from "@/api/tms/tmsQuotePlanItem"; |
| | | import { getDicts } from "@/api/system/dict/data"; |
| | | import { listTmsServiceProvider } from "@/api/tms/tmsServiceProvider"; |
| | | import { listTmsCustomsServiceProvider } from "@/api/tms/tmsCustomsServiceProvider"; |
| | | import { listTmsLoadingServiceProvider } from "@/api/tms/tmsLoadingServiceProvider"; |
| | | import { selectPaymentTmsQuotePlan } from "@/api/tms/tmsQuotePlan"; |
| | | import { addTmsQuoteFee, listTmsQuoteFee, pushTmsQuoteFee } from "@/api/tms/tmsQuoteFee"; |
| | | import { status } from "nprogress"; |
| | | |
| | | |
| | | |
| | | const {appContext} = getCurrentInstance(); |
| | | const { appContext } = getCurrentInstance(); |
| | | |
| | | const {proxy} = useCurrentInstance(); |
| | | const { proxy } = useCurrentInstance(); |
| | | const crudRef = ref(); |
| | | const boxFormRef = ref(); |
| | | |
| | | const {sys_quotation_items,sys_unit,sys_currency} = |
| | | proxy.useDict("sys_quotation_items","sys_unit","sys_currency"); |
| | | const { sys_quotation_items, sys_unit, sys_currency } = |
| | | proxy.useDict("sys_quotation_items", "sys_unit", "sys_currency"); |
| | | const permissionList = (key: any, row: any, index: any) => { |
| | | if (key == 'addBtn') { |
| | | return hasPermission(["tms:tmsDispatchOrder:add"]) |
| | |
| | | }; |
| | | const data = reactive({ |
| | | form: <TmsDispatchOrderI>{}, |
| | | selectionList2: <any>[], |
| | | boxSelectionList: <any>[], |
| | | queryParams: <TmsDispatchOrderI & PageQueryInterface>{}, |
| | | page: <PagesInterface>{ |
| | | pageSize: 10, |
| | |
| | | open: false, |
| | | open2: false, |
| | | goodsTableData: <any>[], |
| | | selectionList2: <any>[], |
| | | goodsForm: <any>{}, |
| | | open3: false, |
| | | actualForm: <any>{}, |
| | | isCustoms:<any> -1, |
| | | isCustoms: <any>-1, |
| | | isLoad: -1, |
| | | active: 'tab1', |
| | | quotationItems:[], |
| | | quotationItems: [], |
| | | serviceProviderList: <any>[], |
| | | open5:false, |
| | | open5: false, |
| | | }) |
| | | const { |
| | | queryParams, form, page, selectionList, |
| | | boxTableData, optionType,open,open5, |
| | | boxFormOption, boxForm, boxTableOption,boxItemTableOption,selectionList2,isCustoms,isLoad,active,quotationItems,serviceProviderList |
| | | boxTableData, optionType, open, open5, boxSelectionList, |
| | | boxFormOption, boxForm, boxTableOption, boxItemTableOption, selectionList2, isCustoms, isLoad, active, quotationItems, serviceProviderList |
| | | } = toRefs(data); |
| | | const option = ref({ |
| | | pageKey: 'TmsDispatchOrder', |
| | |
| | | ], |
| | | }, |
| | | isUrgent: { |
| | | label: '是否紧急',value: '1', |
| | | label: '是否紧急', value: '1', |
| | | display: true, |
| | | type: 'radio', dicUrl: '/system/dict/data/type/sys_number_is', dataType: 'string', |
| | | rules: [ |
| | |
| | | message: "是否是自营车队不能为空", trigger: "change" |
| | | } |
| | | ], |
| | | change: ({value}: any) => { |
| | | change: ({ value }: any) => { |
| | | console.log(value) |
| | | option.value.group.forEach((item: any) => { |
| | | if (item.prop == 'pcxx') { |
| | |
| | | |
| | | }, |
| | | }, |
| | | commissionModel:{ |
| | | commissionModel: { |
| | | label: '提成模式', |
| | | display: true, type: 'radio', dicUrl: '/system/dict/data/type/commission_model', dataType: 'string', |
| | | rules: [ |
| | |
| | | column: { |
| | | |
| | | dispatchNo: { |
| | | label: '调度单号', minWidth: 120, |
| | | label: '调度单号', minWidth: 140, |
| | | display: false, |
| | | search: true, |
| | | }, |
| | | customerName: { |
| | | label: '客户', |
| | | display: false, minWidth: 120, |
| | | display: false, minWidth: 200, |
| | | search: true, |
| | | overHidden: true |
| | | }, |
| | | |
| | | projectName: { |
| | | label: '项目名称', |
| | | display: false, minWidth: 120, |
| | | display: false, minWidth: 150, |
| | | search: true, |
| | | overHidden: true |
| | | }, |
| | | contractName: { |
| | | label: '关联合同名称', minWidth: 120, |
| | | label: '关联合同名称', minWidth: 160, |
| | | display: false, |
| | | search: true, |
| | | overHidden: true |
| | | }, |
| | | orderType: { |
| | | label: '订单类型', |
| | |
| | | |
| | | shipperName: { |
| | | label: '装货点名称', |
| | | display: false, minWidth: 120, |
| | | display: false, minWidth: 160, |
| | | search: true, |
| | | overHidden: true |
| | | }, |
| | | receiverName: { |
| | | label: '卸货点名称', minWidth: 120, |
| | | label: '卸货点名称', minWidth: 160, |
| | | display: false, |
| | | search: true, |
| | | overHidden: true |
| | | }, |
| | | // accountsReceivableStatus: { |
| | | // label: '应收费用生成状态', minWidth: 160, |
| | |
| | | inStatusList: { |
| | | label: '状态', minWidth: 150, |
| | | type: 'select', dataType: 'string', dicUrl: '/system/dict/data/type/tms_dispatch_order_status', |
| | | display: false,multiple:true, |
| | | display: false, multiple: true, |
| | | hide: true, |
| | | search: true, |
| | | |
| | |
| | | }, |
| | | updateTimeRange: { |
| | | label: '更新时间', display: false, search: true, searchRange: true, type: 'date', |
| | | format: 'YYYY-MM-DD', hide: true, searchSpan: 5, |
| | | format: 'YYYY-MM-DD', hide: true, searchSpan: 6, |
| | | valueFormat: 'YYYY-MM-DD', |
| | | }, |
| | | confirmTimeRange: { |
| | | label: '确认时间', display: false, search: true, searchRange: true, type: 'date', |
| | | format: 'YYYY-MM-DD', hide: true, searchSpan: 5, |
| | | format: 'YYYY-MM-DD', hide: true, searchSpan: 6, |
| | | valueFormat: 'YYYY-MM-DD', |
| | | }, |
| | | okTimeRange: { |
| | | label: '完成时间', display: false, search: true, searchRange: true, type: 'date', |
| | | format: 'YYYY-MM-DD', hide: true, searchSpan: 5, |
| | | format: 'YYYY-MM-DD', hide: true, searchSpan: 6, |
| | | valueFormat: 'YYYY-MM-DD', |
| | | }, |
| | | orderTimeRange: { |
| | | label: '下单时间', display: false, search: true, searchRange: true, type: 'date', |
| | | format: 'YYYY-MM-DD', hide: true, searchSpan: 5, |
| | | format: 'YYYY-MM-DD', hide: true, searchSpan: 6, |
| | | valueFormat: 'YYYY-MM-DD', |
| | | }, |
| | | |
| | |
| | | }) |
| | | const tabsOption2 = ref({ |
| | | column: [ |
| | | { |
| | | { |
| | | label: '报价费用登记', |
| | | prop: 'tab1', |
| | | name: 'tab1', |
| | | name: 'tab1', |
| | | |
| | | }, |
| | | { |
| | | label: '实报实销费用登记', |
| | | prop: 'tab2', |
| | | label: '实报实销费用登记', |
| | | prop: 'tab2', |
| | | name: 'tab2', |
| | | }] |
| | | }] |
| | | }) |
| | | const itineraryTableOption = ref({ |
| | | menu: false, |
| | |
| | | display: true, |
| | | }, |
| | | voucherUrl: { |
| | | label: '行程凭证', |
| | | label: '行程凭证3', |
| | | display: true, |
| | | span: 24, dataType: 'string', |
| | | type: 'upload', |
| | |
| | | display: true, |
| | | accept: 'string', dataType: 'string', |
| | | type: 'upload', |
| | | action: '/common/upload2', |
| | | |
| | | // action: '/common/upload2', |
| | | slot: true, |
| | | }, |
| | | remark: { |
| | | label: '备注',span:24, |
| | | label: '备注', span: 24, |
| | | display: true, |
| | | type: 'textarea', |
| | | |
| | |
| | | const financeTableOption = ref({ |
| | | menu: false, |
| | | addBtn: false, |
| | | header: false, selection: false, |
| | | header: true, |
| | | selection: true, |
| | | title: '历史垫付费用', |
| | | column: { |
| | | dataSource: { |
| | |
| | | label: '金额', |
| | | display: true, |
| | | }, |
| | | currency: { |
| | | label: '币制', |
| | | display: true, |
| | | type: 'radio', dataType: 'string', dicUrl: '/system/dict/data/type/sys_currency', |
| | | rules: [ |
| | | { |
| | | required: true, |
| | | message: "币制不能为空", trigger: "change" |
| | | } |
| | | ], |
| | | }, |
| | | feeVoucherUrl: { |
| | | label: '费用凭证', |
| | | display: true, |
| | |
| | | label: '备注', |
| | | display: true, |
| | | }, |
| | | isYF:{ |
| | | isYF: { |
| | | label: '是否应付费用', |
| | | display: true, |
| | | type: 'radio', dicUrl: '/system/dict/data/type/sys_number_is', dataType: 'string', |
| | | |
| | | }, |
| | | yfServiceProviderId:{ |
| | | yfServiceProviderId: { |
| | | label: '服务商', |
| | | display: true, |
| | | type: 'select', |
| | | |
| | | }, |
| | | yfPrice:{ |
| | | yfPrice: { |
| | | label: '应付金额', |
| | | display: true, |
| | | }, |
| | | yfCurrency:{ |
| | | yfCurrency: { |
| | | label: '应付币制', |
| | | display: true, |
| | | |
| | | } |
| | | |
| | | }, |
| | | status: { |
| | | label: '状态', |
| | | display: true, |
| | | type: 'select', dicUrl: '/system/dict/data/type/sys_cancel_word', dataType: 'string', |
| | | }, |
| | | } |
| | | }) |
| | | |
| | | const itemsTableOption = ref({ |
| | | pageKey: 'itemsTable', |
| | | rowKey: 'rowKey', |
| | | header: false,expand:true, |
| | | header: false, expand: true, |
| | | addBtn: false, menu: false, |
| | | column: { |
| | | feeType: { |
| | |
| | | const YSGenerateTableOption = ref({ |
| | | menu: false, |
| | | add: false, |
| | | header:false, |
| | | header: false, |
| | | selection: false, |
| | | expand:true, |
| | | defaultExpandAll:true, |
| | | rowKey:'id', |
| | | column:{ |
| | | dispatchNo:{ |
| | | expand: true, |
| | | defaultExpandAll: true, |
| | | rowKey: 'id', |
| | | column: { |
| | | dispatchNo: { |
| | | label: '调度单号', |
| | | }, |
| | | customerName:{ |
| | | customerName: { |
| | | label: '客户名称', |
| | | }, |
| | | shipperName:{ |
| | | shipperName: { |
| | | label: '装货地', |
| | | }, |
| | | receiverName:{ |
| | | receiverName: { |
| | | label: '卸货地', |
| | | }, |
| | | transportLine:{ |
| | | transportLine: { |
| | | label: '运输路线', |
| | | }, |
| | | actualVehicleType:{ |
| | | actualVehicleType: { |
| | | label: '车型', |
| | | display: true, type: 'select', dicUrl: '/system/dict/data/type/vehicle_type', dataType: 'string', |
| | | |
| | | },licensePlate:{ |
| | | }, licensePlate: { |
| | | label: '车牌', |
| | | }, |
| | | receivableAmount:{ |
| | | receivableAmount: { |
| | | label: '应收费用', |
| | | } |
| | | } |
| | |
| | | const YSGenerateItemTableOption = ref({ |
| | | menu: false, |
| | | add: false, |
| | | header:false, |
| | | header: false, |
| | | selection: false, |
| | | rowKey:'rowKey', |
| | | rowKey: 'rowKey', |
| | | |
| | | column:{ |
| | | feeType:{ |
| | | column: { |
| | | feeType: { |
| | | label: '费用类型', |
| | | type: 'radio', dataType: 'string', dicUrl: '/system/dict/data/type/receivable_fee_type', |
| | | |
| | | }, |
| | | feeName:{ |
| | | feeName: { |
| | | label: '费用名称', |
| | | }, |
| | | registerTime:{ |
| | | registerTime: { |
| | | label: '登记时间', |
| | | }, |
| | | registerAmount:{ |
| | | registerAmount: { |
| | | label: '登记金额', |
| | | }, |
| | | currency:{ |
| | | currency: { |
| | | label: '币制', |
| | | type: 'radio', dataType: 'string', dicUrl: '/system/dict/data/type/sys_currency', |
| | | |
| | |
| | | const YFGenerateTableOption = ref({ |
| | | menu: false, |
| | | add: false, |
| | | header:false, |
| | | header: false, |
| | | selection: false, |
| | | expand:true, |
| | | defaultExpandAll:true, |
| | | rowKey:'id', |
| | | column:{ |
| | | dispatchNo:{ |
| | | expand: true, |
| | | defaultExpandAll: true, |
| | | rowKey: 'id', |
| | | column: { |
| | | dispatchNo: { |
| | | label: '调度单号', |
| | | }, |
| | | serviceProviderType:{ |
| | | serviceProviderType: { |
| | | label: '服务商类型', |
| | | type: 'radio', dicUrl: '/system/dict/data/type/provider_type', dataType: 'string', |
| | | }, |
| | | serviceProviderName:{ |
| | | serviceProviderName: { |
| | | label: '服务商名稱', |
| | | }, |
| | | // transportLine:{ |
| | |
| | | // },licensePlate:{ |
| | | // label: '车牌', |
| | | // }, |
| | | payableAmount:{ |
| | | payableAmount: { |
| | | label: '应付费用', |
| | | } |
| | | } |
| | |
| | | const YFGenerateItemTableOption = ref({ |
| | | menu: false, |
| | | add: false, |
| | | header:false, |
| | | header: false, |
| | | selection: false, |
| | | rowKey:'rowKey', |
| | | rowKey: 'rowKey', |
| | | |
| | | column:{ |
| | | feeType:{ |
| | | column: { |
| | | feeType: { |
| | | label: '费用类型', |
| | | type: 'radio', dataType: 'string', dicUrl: '/system/dict/data/type/receivable_fee_type', |
| | | |
| | | }, |
| | | feeName:{ |
| | | feeName: { |
| | | label: '费用名称', |
| | | }, |
| | | registerTime:{ |
| | | registerTime: { |
| | | label: '登记时间', |
| | | }, |
| | | registerAmount:{ |
| | | registerAmount: { |
| | | label: '登记金额', |
| | | }, |
| | | currency:{ |
| | | currency: { |
| | | label: '币制', |
| | | type: 'radio', dataType: 'string', dicUrl: '/system/dict/data/type/sys_currency', |
| | | |
| | |
| | | menuBtn: false, |
| | | labelWidth: 120, |
| | | column: { |
| | | closeWhy:{ |
| | | label: '作废原因',span:24, |
| | | closeWhy: { |
| | | label: '作废原因', span: 24, |
| | | type: 'radio', dataType: 'string', dicUrl: '/system/dict/data/type/close_why', |
| | | rules: [ |
| | | { |
| | |
| | | } |
| | | ], |
| | | }, |
| | | closeWhyRemark:{ |
| | | closeWhyRemark: { |
| | | label: '作废原因说明', |
| | | type: 'textarea', |
| | | span:24, |
| | | span: 24, |
| | | }, |
| | | } |
| | | }) |
| | |
| | | }, |
| | | handleSelectionChangeFunc: (selection: any) => { |
| | | selectionList.value = selection; |
| | | if (selection.length > 0){ |
| | | if (selection.length > 0) { |
| | | isCustoms.value = selection[0].isCustoms; |
| | | isLoad.value = selection[0].isLoad ; |
| | | }else{ |
| | | isLoad.value = selection[0].isLoad; |
| | | } else { |
| | | isCustoms.value = -1; |
| | | isLoad.value = -1; |
| | | } |
| | |
| | | isLoad.value = isLoad.value == 0 && !pageF.single ? 0 : -1; |
| | | console.log(pageF.single) |
| | | }, |
| | | |
| | | |
| | | getBeginListFunc: (params = {}) => { |
| | | queryParams.value = proxy.addDateRangeNew(queryParams.value, queryParams.value?.createTimeRange, 'createTime') || {}; |
| | | queryParams.value = proxy.addDateRangeNew(queryParams.value, queryParams.value?.updateTimeRange, 'updateTime') || {}; |
| | | queryParams.value = proxy.addDateRangeNew(queryParams.value, queryParams.value?.confirmTimeRange, 'confirmTime') || {}; |
| | | queryParams.value = proxy.addDateRangeNew(queryParams.value, queryParams.value?.okTimeRange, 'okTime') || {}; |
| | | return params; |
| | | }, |
| | | // 1. 使用浅拷贝,不影响原始查询对象 |
| | | // 关键点:从原始 queryParams.value 取值,确保分页时依然能拿到数组 |
| | | let newParams = { ...queryParams.value, ...params }; |
| | | |
| | | // 2. 定义日期字段映射 (数组名 : 接口需要的前缀) |
| | | const dateMap = { |
| | | createTimeRange: 'createTime', |
| | | updateTimeRange: 'updateTime', |
| | | confirmTimeRange: 'confirmTime', |
| | | okTimeRange: 'okTime', |
| | | }; |
| | | |
| | | // 3. 遍历处理日期 |
| | | Object.keys(dateMap).forEach(arrayKey => { |
| | | const prefix = dateMap[arrayKey]; |
| | | const range = newParams[arrayKey]; |
| | | |
| | | if (Array.isArray(range) && range.length === 2) { |
| | | // 赋值接口需要的 Begin 和 End |
| | | newParams[`${prefix}Begin`] = range[0]; |
| | | newParams[`${prefix}End`] = range[1]; |
| | | } |
| | | |
| | | // 只在给接口的参数中删除数组,不影响页面显示的 queryParams |
| | | delete newParams[arrayKey]; |
| | | }); |
| | | |
| | | // 4. 清洗参数:过滤空值 |
| | | const finalParams = {}; |
| | | Object.keys(newParams).forEach(key => { |
| | | const val = newParams[key]; |
| | | if (val !== '' && val !== null && val !== undefined) { |
| | | finalParams[key] = val; |
| | | } |
| | | }); |
| | | |
| | | console.log('发送给接口的最终参数:', finalParams); |
| | | |
| | | // 【核心修改】:直接返回,不要赋值给 queryParams.value |
| | | return finalParams; |
| | | }, |
| | | |
| | | }) |
| | | |
| | |
| | | |
| | | const submitForm = () => { |
| | | if (active.value === 'tab1') { |
| | | console.log() |
| | | pushTmsQuoteFee({ |
| | | ...form.value, |
| | | quoteFeeItems: selectionList2.value |
| | | }).then(res=>{ |
| | | }).then(res => { |
| | | ElMessage({ |
| | | message: "操作成功!", |
| | | type: 'success' |
| | |
| | | }) |
| | | |
| | | |
| | | }else{ |
| | | } else { |
| | | if (Array.isArray(boxForm.value.feeVoucherUrl)) { |
| | | boxForm.value.feeVoucherUrl = boxForm.value.feeVoucherUrl.toString(); |
| | | } |
| | | |
| | | boxForm.value.rowItems = boxTableData.value; |
| | | saveTmsFinanceDetail(boxForm.value).then(res => { |
| | | ElMessage({ |
| | |
| | | type: 'success' |
| | | }) |
| | | boxFormRef.value?.resetFields(); |
| | | uploadRef.value?.clearFiles(); |
| | | getTab2Data(); |
| | | }) |
| | | } |
| | |
| | | const handleLogItinerary = (row: any) => { |
| | | optionType.value = 'view'; |
| | | boxTableOption.value = itineraryTableOption.value; |
| | | listTmsTrip({dispatchOrderId: row.id, pageNum: 1, pageSize: 999}).then(res => { |
| | | listTmsTrip({ dispatchOrderId: row.id, pageNum: 1, pageSize: 999 }).then(res => { |
| | | boxTableData.value = res.rows || []; |
| | | open.value = true; |
| | | open.value = true; |
| | | pageF.title = '查看行程'; |
| | | boxFormOption.value.title = ''; |
| | | }) |
| | |
| | | boxTableOption.value = financeTableOption.value; |
| | | form.value = row; |
| | | handleChange2(tabsOption2.value.column[0]); |
| | | nextTick(()=>{ |
| | | nextTick(() => { |
| | | tabsOption2Ref.value.active = "0"; |
| | | |
| | | }) |
| | | } |
| | | |
| | | |
| | | const getTab1Data = async () =>{ |
| | | const quotePlanItemRes2 = await listTmsQuoteItem({quotePlanId: form.value.quotePlanId, pageNum: 1, pageSize: 999}); |
| | | const getTab1Data = async () => { |
| | | const quotePlanItemRes2 = await listTmsQuoteItem({ quotePlanId: form.value.quotePlanId, pageNum: 1, pageSize: 999 }); |
| | | let list = quotePlanItemRes2.rows || []; |
| | | let quotePlanItemRes = await getDicts("sys_quotation_items"); |
| | | console.log(quotePlanItemRes) |
| | | let quotePlanItemRes = await getDicts("sys_quotation_items"); |
| | | let items = quotePlanItemRes.data || []; |
| | | let res = await listTmsQuoteFee({dispatchId: form.value.id, pageNum: 1, pageSize: 999}); |
| | | let rowsData = res.rows || []; |
| | | let res = await listTmsQuoteFee({ dispatchId: form.value.id, pageNum: 1, pageSize: 999 }); |
| | | let rowsData = res.rows || []; |
| | | selectionList2.value = [] |
| | | itemsTableRef.value?.clearSelection(); |
| | | itemsTableData.value = items.map( (item: any) => { |
| | | itemsTableData.value = items.map((item: any) => { |
| | | let find2 = list.find((ele: any) => { |
| | | return item.dictValue == ele.free |
| | | }); |
| | |
| | | unit: '次', |
| | | |
| | | ...item, |
| | | freeName:item.dictLabel, |
| | | freeName: item.dictLabel, |
| | | feeType: item.dictLabel, |
| | | rowKey: item.dictCode, |
| | | free: item.dictValue, |
| | | ...find, |
| | | ...find2, |
| | | price: find.price||0, |
| | | currency: find.currency|| 'RMB', |
| | | sum: find.sum|| 0, |
| | | price: find.price || 0, |
| | | currency: find.currency || 'RMB', |
| | | sum: find.sum || 0, |
| | | }; |
| | | selectionList2.value.push(aRow); |
| | | return aRow |
| | | } else { |
| | | return { |
| | | ...item, |
| | | freeName:item.dictLabel, |
| | | freeName: item.dictLabel, |
| | | rowKey: item.dictCode, |
| | | feeType: item.dictLabel, |
| | | price: 0, |
| | |
| | | } |
| | | |
| | | |
| | | const getTab2Data = async () =>{ |
| | | const getTab2Data = async () => { |
| | | let serviceProvider = await getServiceProvider(form.value.id); |
| | | serviceProviderList.value = serviceProvider.data || []; |
| | | listTmsFinanceDetail({ |
| | |
| | | |
| | | |
| | | const getQuotationItems = async () => { |
| | | let res = await getDicts("sys_quotation_items"); |
| | | let res = await getDicts("sys_quotation_items"); |
| | | quotationItems.value = res.data || []; |
| | | } |
| | | getQuotationItems(); |
| | |
| | | |
| | | |
| | | |
| | | const handleChange = (column:any) => { |
| | | let accountsReceivableStatus :number | undefined= undefined; |
| | | let accountsPayableStatus :number | undefined= undefined; |
| | | if (column.prop === 'tab1'){ |
| | | const handleChange = (column: any) => { |
| | | let accountsReceivableStatus: number | undefined = undefined; |
| | | let accountsPayableStatus: number | undefined = undefined; |
| | | if (column.prop === 'tab1') { |
| | | accountsReceivableStatus = 0 |
| | | |
| | | }else if (column.prop === 'tab2'){ |
| | | } else if (column.prop === 'tab2') { |
| | | accountsPayableStatus = 0; |
| | | }else if (column.prop === 'tab3'){ |
| | | } else if (column.prop === 'tab3') { |
| | | queryParams.value.inStatusList = [5]; |
| | | } |
| | | page.value.currentPage = 1; |
| | |
| | | onLoad(page.value) |
| | | } |
| | | |
| | | const handleChange2 = (column:any)=>{ |
| | | active.value = column.prop; |
| | | if (column.prop === 'tab1'){ |
| | | getTab1Data() |
| | | }else if (column.prop === 'tab2'){ |
| | | getTab2Data() |
| | | } |
| | | const handleChange2 = (column: any) => { |
| | | active.value = column.prop; |
| | | if (column.prop === 'tab1') { |
| | | getTab1Data() |
| | | } else if (column.prop === 'tab2') { |
| | | getTab2Data() |
| | | } |
| | | } |
| | | |
| | | const isYFChange =async (value:number,row:any) => { |
| | | if (value == 1){ |
| | | let find:any = quotationItems.value.find((item:any) => item.dictLabel === row.feeType); |
| | | if (find){ |
| | | console.log(find,"find") |
| | | let opt = find.remark; |
| | | const isYFChange = async (value: number, row: any) => { |
| | | if (value == 1) { |
| | | let find: any = quotationItems.value.find((item: any) => item.dictLabel === row.feeType); |
| | | if (find) { |
| | | let opt = find.remark; |
| | | row.serviceProviderType = opt; |
| | | if (opt == 0){ |
| | | let res = await listTmsServiceProvider({pageSize:999,pageNum:1}) |
| | | row.serviceProviderData = res.rows|| []; |
| | | if (opt == 0) { |
| | | let res = await listTmsServiceProvider({ pageSize: 999, pageNum: 1 }) |
| | | row.serviceProviderData = res.rows || []; |
| | | |
| | | // 车辆运营商 |
| | | let serviceProviderId = form.value.vehicleProviderId || row.serviceProviderId; |
| | | if (!serviceProviderId){ |
| | | if (!serviceProviderId) { |
| | | ElMessage.warning("找不到该费用的车辆服务商"); |
| | | }else{ |
| | | } else { |
| | | row.serviceProviderId = serviceProviderId; |
| | | } |
| | | |
| | | }else if (opt == 1){ |
| | | let res = await listTmsCustomsServiceProvider({pageSize:999,pageNum:1}) |
| | | row.serviceProviderData = res.rows|| []; |
| | | } else if (opt == 1) { |
| | | let res = await listTmsCustomsServiceProvider({ pageSize: 999, pageNum: 1 }) |
| | | row.serviceProviderData = res.rows || []; |
| | | let serviceProviderId = form.value.customsServiceProviderId || row.serviceProviderId; |
| | | if (!serviceProviderId){ |
| | | if (!serviceProviderId) { |
| | | ElMessage.warning("找不到该费用的报关服务商"); |
| | | }else{ |
| | | } else { |
| | | row.serviceProviderId = serviceProviderId; |
| | | |
| | | } |
| | | |
| | | }else if (opt == 2){ |
| | | let res = await listTmsLoadingServiceProvider({pageSize:999,pageNum:1}) |
| | | row.serviceProviderData = res.rows|| []; |
| | | } else if (opt == 2) { |
| | | let res = await listTmsLoadingServiceProvider({ pageSize: 999, pageNum: 1 }) |
| | | row.serviceProviderData = res.rows || []; |
| | | let serviceProviderId = form.value.loadingServiceProviderId || row.serviceProviderId; |
| | | if (!serviceProviderId){ |
| | | if (!serviceProviderId) { |
| | | ElMessage.warning("找不到该费用的装货服务商"); |
| | | }else{ |
| | | } else { |
| | | row.serviceProviderId = serviceProviderId; |
| | | |
| | | } |
| | | } |
| | | |
| | | if (row.serviceProviderType){ |
| | | if (row.serviceProviderType) { |
| | | serviceProviderChange(row); |
| | | } |
| | | |
| | |
| | | } |
| | | } |
| | | |
| | | itemsTableRef.value?.toggleRowExpansion(row,value == 1) |
| | | itemsTableRef.value?.toggleRowExpansion(row, value == 1) |
| | | |
| | | |
| | | |
| | |
| | | |
| | | } |
| | | |
| | | const serviceProviderChange = (row:any) => { |
| | | selectPaymentTmsQuotePlan({providerId:row.serviceProviderId,providerType:row.serviceProviderType,free:row.free}).then(res=>{ |
| | | let resData = res.data || {}; |
| | | if (Object.keys(resData).length > 0){ |
| | | row.yfCurrency =resData.currency ; |
| | | row.yfId =resData.id ; |
| | | row.yfPrice =resData.price ; |
| | | row.yfCurrency =resData.currency ; |
| | | row.yfCurrency =resData.currency ; |
| | | row.isCZYF = 1 ; |
| | | }else{ |
| | | row.isCZYF = 0 ; |
| | | const serviceProviderChange = (row: any) => { |
| | | selectPaymentTmsQuotePlan({ providerId: row.serviceProviderId, providerType: row.serviceProviderType, free: row.free }).then(res => { |
| | | let resData = res.data || {}; |
| | | if (Object.keys(resData).length > 0) { |
| | | row.yfCurrency = resData.currency; |
| | | row.yfId = resData.id; |
| | | row.yfPrice = resData.price; |
| | | row.yfCurrency = resData.currency; |
| | | row.yfCurrency = resData.currency; |
| | | row.isCZYF = 1; |
| | | } else { |
| | | row.isCZYF = 0; |
| | | } |
| | | }) |
| | | } |
| | | |
| | | const yfPriceChange = (row:any)=>{ |
| | | const yfPriceChange = (row: any) => { |
| | | let yfCount = row.yfCount || 0; |
| | | let yfPrice = row.yfPrice || 0; |
| | | row.yfSum = Number(yfPrice) * Number(yfCount); |
| | |
| | | let ids = selectionList.value.map((item: any) => item.id); |
| | | initYSGenerate(ids).then(res => { |
| | | boxTableData.value = res.data || []; |
| | | boxTableData.value.forEach((item:any) => { |
| | | boxTableData.value.forEach((item: any) => { |
| | | let items = item.tmsReceivableFeeItems || []; |
| | | let receivableAmountRMB = items.filter( (cItem:any) => cItem.currency == 'RMB').reduce( (pre:any,cur:any) => { |
| | | let receivableAmountRMB = items.filter((cItem: any) => cItem.currency == 'RMB').reduce((pre: any, cur: any) => { |
| | | return pre + Number(cur.registerAmount) |
| | | },0); |
| | | let receivableAmountHKD = items.filter( (cItem:any) => cItem.currency == 'HKD').reduce( (pre:any,cur:any) => { |
| | | }, 0); |
| | | let receivableAmountHKD = items.filter((cItem: any) => cItem.currency == 'HKD').reduce((pre: any, cur: any) => { |
| | | return pre + Number(cur.registerAmount) |
| | | },0); |
| | | console.log(receivableAmountRMB,receivableAmountHKD) |
| | | }, 0); |
| | | item.receivableAmountRMB = receivableAmountRMB; |
| | | item.receivableAmountHKD = receivableAmountHKD; |
| | | |
| | |
| | | /** |
| | | * 生成应付费用 |
| | | */ |
| | | const handleYFGenerate = () =>{ |
| | | const handleYFGenerate = () => { |
| | | let ids = selectionList.value.map((item: any) => item.id); |
| | | initYFGenerate(ids).then(res => { |
| | | boxTableData.value = res.data || []; |
| | |
| | | const submitGenerate = () => { |
| | | pageF.isUploading = true; |
| | | let ids = selectionList.value.map((item: any) => item.id); |
| | | if (optionType.value == 'ysGenerate'){ |
| | | if (optionType.value == 'ysGenerate') { |
| | | ysGenerateTmsDispatchOrder(ids).then(res => { |
| | | pageF.isUploading = false; |
| | | ElMessage({ |
| | |
| | | }).finally(() => { |
| | | pageF.isUploading = false; |
| | | }) |
| | | }else if (optionType.value == 'yfGenerate'){ |
| | | } else if (optionType.value == 'yfGenerate') { |
| | | yfGenerateTmsDispatchOrder(ids).then(res => { |
| | | pageF.isUploading = false; |
| | | ElMessage({ |
| | |
| | | |
| | | } |
| | | |
| | | const ysServiceProviderChange = (e:any,row:any) => { |
| | | let active = serviceProviderList.value.find((item:any) => item.serviceProviderId + '_'+ item.serviceProviderType == e) |
| | | const ysServiceProviderChange = (e: any, row: any) => { |
| | | let active = serviceProviderList.value.find((item: any) => item.serviceProviderId + '_' + item.serviceProviderType == e) |
| | | row.yfServiceProviderId = active.serviceProviderId; |
| | | row.yfServiceProviderName = active.serviceProviderName; |
| | | row.yfServiceProviderType = active.serviceProviderType; |
| | | } |
| | | const handleClose = (row:any) => { |
| | | const handleClose = (row: any) => { |
| | | |
| | | if (row.status == 2 && row.isfk == 1){ |
| | | checkCloseOrder(row.id).then(res=>{ |
| | | if (row.status == 2 && row.isfk == 1) { |
| | | checkCloseOrder(row.id).then(res => { |
| | | open5.value = true; |
| | | form.value = row; |
| | | boxFormOption.value = closeOption.value; |
| | | }); |
| | | }else{ |
| | | } else { |
| | | open5.value = true; |
| | | form.value = row; |
| | | boxFormOption.value = closeOption.value; |
| | | |
| | | } |
| | | } |
| | | const submitForm5 = () =>{ |
| | | boxFormRef.value.validate((valid: boolean,done:any) => { |
| | | console.log(valid) |
| | | if(valid){ |
| | | const submitForm5 = () => { |
| | | boxFormRef.value.validate((valid: boolean, done: any) => { |
| | | if (valid) { |
| | | boxForm.value.id = form.value.id; |
| | | closeOrder(boxForm.value).then(res=>{ |
| | | closeOrder(boxForm.value).then(res => { |
| | | ElMessage.success('操作成功'); |
| | | open5.value = false; |
| | | done(); |
| | | onLoad(page.value) |
| | | }).catch(err=>{ |
| | | }).catch(err => { |
| | | done(); |
| | | }) |
| | | } |
| | | }) |
| | | } |
| | | const uploadRef = ref<any>() |
| | | const urlApi = ref(import.meta.env.VITE_APP_BASE_API) |
| | | // 在 script 部分修改 handleUploadAfter 函数 |
| | | const handleUploadAfter = (res: any, row: any) => { |
| | | if (res.code === 200) { |
| | | // 确保 res.data.url 存在 |
| | | const url = res.data?.url || res.url; |
| | | if (url) { |
| | | boxForm.value.feeVoucherUrl = url |
| | | } else { |
| | | ElMessage.error('未获取到上传文件 URL'); |
| | | } |
| | | } else { |
| | | ElMessage.error(res.msg || '上传失败'); |
| | | } |
| | | }; |
| | | |
| | | // 同时修改 handleExceed 函数 |
| | | const handleExceed = (files: any, row: any) => { |
| | | if (!row) { |
| | | ElMessage.error('行数据为空'); |
| | | return; |
| | | } |
| | | |
| | | uploadRef.value?.clearFiles(); |
| | | const file = files[0]; |
| | | uploadRef.value?.handleStart(file); |
| | | uploadRef.value?.submit(); |
| | | }; |
| | | |
| | | const boxSelectionChange = (selection: any[]) => { |
| | | boxSelectionList.value = selection; |
| | | } |
| | | /** |
| | | * 批量作废费用明细 |
| | | */ |
| | | const handleBatchBoxDel = () => { |
| | | if (boxSelectionList.value.length === 0) { |
| | | ElMessage.warning('请选择要作废的费用明细'); |
| | | return; |
| | | } |
| | | |
| | | ElMessageBox.confirm(`确认要作废选中的 ${boxSelectionList.value.length} 条费用明细吗?`, '警告', { |
| | | confirmButtonText: '确定', |
| | | cancelButtonText: '取消', |
| | | type: 'warning' |
| | | }).then(() => { |
| | | // 从 boxTableData 中移除选中的项 |
| | | // const ids = boxSelectionList.value.map((item: any) => item.id).join(','); |
| | | let data = { |
| | | id: boxSelectionList.value[0].id, |
| | | status: 1 |
| | | } |
| | | tmsFinanceDetail(data).then(res => { |
| | | ElMessage.success('作废成功'); |
| | | getTab2Data(); // 刷新数据 |
| | | }).catch(err => { |
| | | ElMessage.error('作废失败'); |
| | | }); |
| | | // ElMessage.success('作废成功'); |
| | | // boxSelectionList.value = []; // 清空选择 |
| | | }).catch(() => { |
| | | // 取消操作 |
| | | }); |
| | | } |
| | | </script> |