<template>
|
<basicContainer>
|
<avue-crud
|
:option="option"
|
:table-loading="pageF.loading"
|
:data="tableData"
|
:page="page"
|
:permission="permissionList"
|
:before-open="beforeOpen"
|
v-model="form" v-model:search="queryParams"
|
ref="crudRef"
|
@row-update="rowUpdate"
|
@row-save="rowSave"
|
@refresh-change="refreshChange"
|
@row-del="rowDel"
|
@search-change="searchChange"
|
@search-reset="searchReset"
|
@selection-change="selectionChange"
|
@current-change="currentChange"
|
@size-change="sizeChange"
|
@on-load="onLoad"
|
>
|
<template #menu-left>
|
<el-button
|
type="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>
|
</template>
|
<template #menu-before="{row}">
|
|
<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">费用登记
|
</el-link>
|
</template>
|
<template #menu="{row}">
|
<el-link size="small" type="primary" @click="handleLog(row)" class="link-btn" :underline="false"
|
icon="el-icon-tickets">日志
|
</el-link>
|
</template>
|
|
|
<template #body>
|
<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>
|
<avue-tabs :option="tabsOption2"
|
@change="handleChange2"></avue-tabs>
|
<div v-if="active === 'tab1'">
|
<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>
|
</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>
|
<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>
|
</el-descriptions-item>
|
<el-descriptions-item label="是否存在应付报价">
|
<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-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>
|
</el-descriptions-item>
|
<el-descriptions-item label="计费数量">
|
<el-input-number v-model="row.yfCount" @change="yfPriceChange(row)" placeholder="请输入计费数量"
|
:min="0"></el-input-number>
|
|
</el-descriptions-item>
|
<el-descriptions-item label="总金额">{{ row.yfSum }}</el-descriptions-item>
|
</el-descriptions>
|
</template>
|
</avue-crud>
|
</div>
|
<div v-if="active === 'tab2'">
|
<h2>实报实销费用</h2>
|
<avue-form v-model="boxForm" ref="boxFormRef"
|
:option="boxFormOption">
|
|
</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>
|
</template>
|
<template #yfServiceProviderId="{row}">
|
<el-select 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>
|
</el-select>
|
</template>
|
<template #yfPrice="{row}">
|
<el-input 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>
|
</avue-crud>
|
</div>
|
<template #footer>
|
<div class="dialog-footer">
|
<el-button type="primary"
|
:loading="pageF.isUploading" @click="submitForm">
|
{{ pageF.isUploading ? '提交中' : '确 定' }}
|
</el-button>
|
|
<el-button @click="cancelBox">取 消</el-button>
|
</div>
|
</template>
|
</el-dialog>
|
|
|
|
|
<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
|
:option="boxItemTableOption" ref="itemsTableRef2"
|
:data="row.tmsReceivableFeeItems"
|
>
|
</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>
|
</avue-crud>
|
|
|
<template #footer>
|
<div class="dialog-footer">
|
<el-button type="primary"
|
:loading="pageF.isUploading" @click="submitGenerate">
|
{{ pageF.isUploading ? '提交中' : '确 定' }}
|
</el-button>
|
|
<el-button @click="open = false">取 消</el-button>
|
</div>
|
</template>
|
</el-dialog>
|
|
|
|
</basicContainer>
|
</template>
|
|
<script setup name="tmsDispatchOrder" lang="ts">
|
import {
|
TmsDispatchOrderI,
|
addTmsDispatchOrder,
|
delTmsDispatchOrder,
|
exportTmsDispatchOrder,
|
getTmsDispatchOrder,
|
costListTmsDispatchOrder,
|
updateTmsDispatchOrder,
|
generateTmsDispatchOrder, initGenerate, initYSGenerate,
|
ysGenerateTmsDispatchOrder, initYFGenerate,yfGenerateTmsDispatchOrder,
|
getServiceProvider
|
} 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 {an} from "vue-router/dist/router-CWoNjPRp";
|
|
|
const {appContext} = getCurrentInstance();
|
|
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 permissionList = (key: any, row: any, index: any) => {
|
if (key == 'addBtn') {
|
return hasPermission(["tms:tmsDispatchOrder:add"])
|
} else if (key == 'delBtn') {
|
return hasPermission(["tms:tmsDispatchOrder:remove"]) && row?.status == 0
|
} else if (key == 'editBtn') {
|
return hasPermission(["tms:tmsDispatchOrder:edit"]) && [0, 1].includes(row?.status)
|
} else if (key == 'viewBtn') {
|
return hasPermission(["tms:tmsDispatchOrder:query"])
|
} else {
|
return true;
|
}
|
};
|
const data = reactive({
|
form: <TmsDispatchOrderI>{},
|
queryParams: <TmsDispatchOrderI & PageQueryInterface>{},
|
page: <PagesInterface>{
|
pageSize: 10,
|
total: 0,
|
currentPage: 1,
|
},
|
selectionList: [],
|
optionType: '',
|
boxTableData: <any>[],
|
boxForm: <any>{},
|
boxFormOption: <any>{},
|
boxTableOption: <any>{},
|
boxItemTableOption: <any>{},
|
title: '',
|
open: false,
|
open2: false,
|
goodsTableData: <any>[],
|
selectionList2: <any>[],
|
goodsForm: <any>{},
|
open3: false,
|
actualForm: <any>{},
|
isCustoms:<any> -1,
|
isLoad: -1,
|
active: 'tab1',
|
quotationItems:[],
|
serviceProviderList: <any>[]
|
})
|
const {
|
queryParams, form, page, selectionList,
|
boxTableData, optionType,open,
|
boxFormOption, boxForm, boxTableOption,boxItemTableOption,selectionList2,isCustoms,isLoad,active,quotationItems,serviceProviderList
|
} = toRefs(data);
|
const option = ref({
|
pageKey: 'TmsDispatchOrder',
|
rowKey: 'id',
|
labelWidth: 130,
|
searchSpan: 6,
|
searchLabelWidth: 150,
|
menuWidth: 300,
|
height: 530,
|
addBtn: false,
|
editBtn: false,
|
delBtn: false,
|
group: [
|
{
|
label: '基本信息',
|
prop: 'jbxx',
|
column: {
|
|
transportLine: {
|
label: '运输线路', span: 24,
|
display: true,
|
},
|
customerName: {
|
label: '客户名称',
|
display: true, disabled: true
|
},
|
projectName: {
|
label: '关联项目',
|
display: true, disabled: true
|
},
|
// customerCode: {
|
// label: '客户编码',
|
// display: true,disabled:true
|
// },
|
contractName: {
|
label: '关联合同',
|
display: true, disabled: true
|
},
|
requiredVehicleTypes: {
|
label: '下单车型', disabled: true,
|
display: true, type: 'select', dicUrl: '/system/dict/data/type/vehicle_type', dataType: 'string',
|
rules: [
|
{
|
required: true,
|
message: "下单车型不能为空", trigger: "blur"
|
}
|
],
|
},
|
orderType: {
|
label: '订单类型',
|
display: true,
|
type: 'select', dataType: 'string',
|
dicUrl: '/system/dict/data/type/order_type',
|
rules: [
|
{
|
required: true,
|
message: "订单类型不能为空", trigger: "change"
|
}
|
]
|
},
|
isCustoms: {
|
label: '委托报关',
|
display: true,
|
type: 'radio', dicUrl: '/system/dict/data/type/sys_number_is', dataType: 'string',
|
rules: [
|
{
|
required: true,
|
message: "委托报关不能为空", trigger: "blur"
|
}
|
],
|
},
|
isLoad: {
|
label: '委托装卸',
|
display: true,
|
type: 'radio', dicUrl: '/system/dict/data/type/sys_number_is', dataType: 'string',
|
rules: [
|
{
|
required: true,
|
message: "委托装卸不能为空", trigger: "blur"
|
}
|
],
|
},
|
isUrgent: {
|
label: '是否紧急',value: '1',
|
display: true,
|
type: 'radio', dicUrl: '/system/dict/data/type/sys_number_is', dataType: 'string',
|
rules: [
|
{
|
required: true,
|
message: "是否紧急不能为空", trigger: "blur"
|
}
|
],
|
},
|
|
orderTime: {
|
label: '下单时间',
|
type: 'datetime', // 改为 datetime 类型
|
format: 'YYYY-MM-DD HH:mm:ss',
|
valueFormat: 'YYYY-MM-DD HH:mm:ss',
|
display: true,
|
},
|
latestDeparture: {
|
label: '要求最晚出发时间',
|
type: 'datetime', // 改为 datetime 类型
|
format: 'YYYY-MM-DD HH:mm:ss', labelWidth: 150,
|
valueFormat: 'YYYY-MM-DD HH:mm:ss',
|
display: true,
|
rules: [
|
{
|
required: true,
|
message: "要求最晚出发时间不能为空", trigger: "blur"
|
}
|
],
|
},
|
latestArrival: {
|
label: '要求最晚到达时间', labelWidth: 150,
|
type: 'datetime', // 改为 datetime 类型
|
format: 'YYYY-MM-DD HH:mm:ss',
|
valueFormat: 'YYYY-MM-DD HH:mm:ss',
|
display: true,
|
rules: [
|
{
|
required: true,
|
message: "要求最晚到达时间不能为空", trigger: "blur"
|
}
|
],
|
},
|
|
|
}
|
},
|
{
|
label: '派车信息',
|
prop: 'pcxx',
|
column: {
|
operationMode: {
|
label: '是否是自营车队', value: 0,
|
type: 'radio', dataType: 'string', dicUrl: '/system/dict/data/type/sys_number_is',
|
rules: [
|
{
|
required: true,
|
message: "是否是自营车队不能为空", trigger: "change"
|
}
|
],
|
change: ({value}: any) => {
|
console.log(value)
|
option.value.group.forEach((item: any) => {
|
if (item.prop == 'pcxx') {
|
item.column.commissionModel.display = value != 1;
|
item.column.vehicleProviderName.display = value == 1;
|
item.column.containerNo.display = value == 1;
|
item.column.shelfCode.display = value == 1;
|
// item.column.vehicleProviderId.rules.forEach((cItem: any) => {
|
// cItem.required = value == 1;
|
// });
|
}
|
})
|
|
},
|
},
|
commissionModel:{
|
label: '提成模式',
|
display: true, type: 'radio', dicUrl: '/system/dict/data/type/commission_model', dataType: 'string',
|
rules: [
|
{
|
required: true,
|
message: "提成模式不能为空", trigger: "change"
|
}
|
],
|
},
|
vehicleProviderName: {
|
label: '车辆服务商',
|
display: true,
|
rules: [
|
{
|
required: true,
|
message: "车辆服务商不能为空", trigger: "change"
|
}
|
],
|
|
},
|
mainDriverName: {
|
label: '主驾驶员',
|
display: true, dataType: 'string',
|
rules: [
|
{
|
required: true,
|
message: "主驾驶员不能为空", trigger: "change"
|
}
|
],
|
|
},
|
assistantDriverName: {
|
label: '副驾驶员',
|
display: true, dataType: 'string',
|
|
},
|
licensePlate: {
|
label: '车牌号', dataType: 'string',
|
display: true,
|
},
|
actualVehicleType: {
|
label: '派出车型',
|
display: true, type: 'select', dicUrl: '/system/dict/data/type/vehicle_type', dataType: 'string',
|
},
|
shipperName: {
|
label: '装货点', dataType: 'string',
|
display: true,
|
},
|
shipperRegionLabel: {
|
label: '装货点行政区域',
|
display: true, disabled: true
|
|
},
|
shipperAddress: {
|
label: '装货点详细地址',
|
display: true, disabled: true
|
},
|
shipperMobile: {
|
label: '装货点联系方式',
|
display: true, disabled: true
|
},
|
receiverName: {
|
label: '卸货点',
|
display: true, dataType: 'string',
|
},
|
receiverRegionLabel: {
|
label: '卸货点行政区域',
|
display: true, disabled: true
|
},
|
receiverAddress: {
|
label: '卸货点详细地址',
|
display: true, disabled: true
|
},
|
receiverMobile: {
|
label: '卸货点联系方式',
|
display: true, disabled: true
|
},
|
containerNo: {
|
label: '集装箱号',
|
display: true,
|
},
|
shelfCode: {
|
label: '托板号',
|
display: true,
|
},
|
remark: {
|
label: '备注', span: 24,
|
type: 'textarea', minRows: 3, maxRows: 5,
|
display: true,
|
},
|
},
|
},
|
|
|
],
|
column: {
|
|
dispatchNo: {
|
label: '调度单号', minWidth: 120,
|
display: false,
|
search: true,
|
},
|
customerName: {
|
label: '客户',
|
display: false, minWidth: 120,
|
search: true,
|
},
|
|
projectName: {
|
label: '项目名称',
|
display: false, minWidth: 120,
|
search: true,
|
},
|
contractName: {
|
label: '关联合同名称', minWidth: 120,
|
display: false,
|
search: true,
|
},
|
orderType: {
|
label: '订单类型',
|
display: false,
|
search: true, minWidth: 120,
|
type: 'select', dataType: 'string',
|
dicUrl: '/system/dict/data/type/order_type',
|
},
|
transportLine: {
|
label: '运输线路',
|
display: false,
|
search: true, minWidth: 180, overHidden: true
|
},
|
|
|
vehicleProviderName: {
|
label: '车辆服务商名称', minWidth: 150,
|
display: false,
|
search: true,
|
},
|
|
loadingServiceProviderName: {
|
label: '装货服务商名称', minWidth: 150,
|
display: false,
|
search: true,
|
},
|
customsServiceProviderName: {
|
label: '报关服务商名称', minWidth: 150,
|
display: false,
|
search: true,
|
},
|
isUrgent: {
|
label: '是否紧急否',
|
display: false, minWidth: 100,
|
search: true,
|
type: 'select', dicUrl: '/system/dict/data/type/sys_number_is', dataType: 'string',
|
|
},
|
mainDriverName: {
|
label: '主驾驶员',
|
display: false, minWidth: 120,
|
search: true,
|
},
|
|
// requiredVehicleTypes: {
|
// label: '要求运输工具类型',
|
// display: false,
|
// search: true,
|
// },
|
actualVehicleType: {
|
label: '实际运输工具类型', minWidth: 130,
|
display: false,
|
search: true,
|
type: 'select', dicUrl: '/system/dict/data/type/vehicle_type', dataType: 'string',
|
|
},
|
|
licensePlate: {
|
label: '车牌号', minWidth: 120,
|
display: false,
|
search: true,
|
},
|
|
shipperName: {
|
label: '装货点名称',
|
display: false, minWidth: 120,
|
search: true,
|
},
|
receiverName: {
|
label: '卸货点名称', minWidth: 120,
|
display: false,
|
search: true,
|
},
|
// accountsReceivableStatus: {
|
// label: '应收费用生成状态', minWidth: 160,
|
// display: false,
|
// hide: false,
|
// search: true,
|
// type: 'select', dataType: 'string', dicUrl: '/system/dict/data/type/accounts_status',
|
//
|
// },
|
// accountsPayableStatus: {
|
// label: '应付费用生成状态', minWidth: 160,
|
// display: false,
|
// hide: false,
|
// search: true,
|
// type: 'select', dataType: 'string', dicUrl: '/system/dict/data/type/accounts_status',
|
//
|
// },
|
|
status: {
|
label: '状态', minWidth: 150,
|
type: 'select', dataType: 'string', dicUrl: '/system/dict/data/type/tms_dispatch_order_status',
|
display: false,
|
hide: false, fixed: 'right',
|
search: false,
|
rules: [
|
{
|
required: true,
|
message: "状态不能为空", trigger: "change"
|
}
|
],
|
},
|
inStatusList: {
|
label: '状态', minWidth: 150,
|
type: 'select', dataType: 'string', dicUrl: '/system/dict/data/type/tms_dispatch_order_status',
|
display: false,multiple:true,
|
hide: true,
|
search: true,
|
|
},
|
confirmTime: {
|
label: '确认时间', minWidth: 180,
|
display: false,
|
hide: false,
|
search: false,
|
},
|
orderTime: {
|
label: '下单时间', minWidth: 180,
|
display: false,
|
hide: false,
|
search: false,
|
},
|
updateBy: {
|
label: '更新人', minWidth: 150,
|
addDisplay: false,
|
editDisplay: false,
|
viewDisplay: false,
|
hide: false,
|
search: false,
|
},
|
updateTime: {
|
label: '更新时间', minWidth: 180,
|
addDisplay: false,
|
editDisplay: false,
|
viewDisplay: false,
|
hide: false,
|
search: false,
|
},
|
updateTimeRange: {
|
label: '更新时间', display: false, search: true, searchRange: true, type: 'date',
|
format: 'YYYY-MM-DD', hide: true, searchSpan: 5,
|
valueFormat: 'YYYY-MM-DD',
|
},
|
confirmTimeRange: {
|
label: '确认时间', display: false, search: true, searchRange: true, type: 'date',
|
format: 'YYYY-MM-DD', hide: true, searchSpan: 5,
|
valueFormat: 'YYYY-MM-DD',
|
},
|
okTimeRange: {
|
label: '完成时间', display: false, search: true, searchRange: true, type: 'date',
|
format: 'YYYY-MM-DD', hide: true, searchSpan: 5,
|
valueFormat: 'YYYY-MM-DD',
|
},
|
orderTimeRange: {
|
label: '下单时间', display: false, search: true, searchRange: true, type: 'date',
|
format: 'YYYY-MM-DD', hide: true, searchSpan: 5,
|
valueFormat: 'YYYY-MM-DD',
|
},
|
|
}
|
})
|
|
const tabsOption = ref({
|
column: [{
|
label: '全部',
|
prop: 'all',
|
}, {
|
label: '待生成应收',
|
prop: 'tab1',
|
}, {
|
label: '待生成应付',
|
prop: 'tab2',
|
}]
|
})
|
const tabsOption2 = ref({
|
column: [
|
{
|
label: '报价费用登记',
|
prop: 'tab1',
|
name: 'tab1',
|
|
},
|
{
|
label: '实报实销费用登记',
|
prop: 'tab2',
|
name: 'tab2',
|
}]
|
})
|
const itineraryTableOption = ref({
|
menu: false,
|
addBtn: false,
|
header: false, selection: false,
|
title: '历史行程',
|
column: {
|
dataSource: {
|
label: '数据来源',
|
display: false,
|
type: 'select', dataType: 'string', dicUrl: '/system/dict/data/type/data_source',
|
|
},
|
driverName: {
|
label: '主驾驶员名称',
|
display: true, disabled: true,
|
},
|
vehicleNumber: {
|
label: '车牌号码',
|
display: true, disabled: true,
|
|
},
|
tripType: {
|
label: '行程类型',
|
display: true,
|
type: 'select', dataType: 'string', dicUrl: '/system/dict/data/type/trip_type',
|
|
},
|
tripTime: {
|
label: '时间',
|
type: 'date', valueFormat: 'YYYY-MM-DD',
|
display: true,
|
},
|
odometer: {
|
label: '仪表里程',
|
display: true,
|
},
|
address: {
|
label: '具体地址',
|
display: true,
|
},
|
voucherUrl: {
|
label: '行程凭证',
|
display: true,
|
span: 24, dataType: 'string',
|
type: 'upload',
|
action: '/common/upload2',
|
|
},
|
|
}
|
})
|
|
const financeOption = ref({
|
menuBtn: false,
|
labelWidth: 120,
|
column: {
|
feeType: {
|
label: '费用类型',
|
display: true,
|
type: 'select', dataType: 'string', dicUrl: '/system/dict/data/type/fee_type',
|
rules: [
|
{
|
required: true,
|
message: "费用类型不能为空", trigger: "change"
|
}
|
],
|
},
|
actualFeeAmount: {
|
label: '费用金额',
|
type: 'number',
|
display: true,
|
rules: [
|
{
|
required: true,
|
message: "费用金额不能为空", trigger: "change"
|
}
|
],
|
},
|
currency: {
|
label: '币制',
|
display: true,
|
type: 'radio', dataType: 'string', dicUrl: '/system/dict/data/type/sys_currency',
|
rules: [
|
{
|
required: true,
|
message: "币制不能为空", trigger: "change"
|
}
|
],
|
},
|
voucherUrl: {
|
label: '行程凭证',
|
display: true,
|
span: 24,
|
accept: 'string', dataType: 'string',
|
type: 'upload',
|
action: '/common/upload2',
|
|
},
|
dataSource: {
|
label: '数据来源',
|
display: false,
|
value: 0
|
},
|
}
|
})
|
|
const financeTableOption = ref({
|
menu: false,
|
addBtn: false,
|
header: false, selection: false,
|
title: '历史垫付费用',
|
column: {
|
dataSource: {
|
label: '数据来源',
|
display: false,
|
type: 'select', dataType: 'string', dicUrl: '/system/dict/data/type/data_source',
|
|
},
|
createBy: {
|
label: '添加人',
|
display: true, disabled: true,
|
},
|
feeCreateTime: {
|
label: '上传时间',
|
display: true, disabled: true,
|
|
},
|
feeType: {
|
label: '费用类型',
|
display: true,
|
type: 'select', dataType: 'string', dicUrl: '/system/dict/data/type/fee_type',
|
|
},
|
actualFeeAmount: {
|
label: '金额',
|
display: true,
|
},
|
feeVoucherUrl: {
|
label: '费用凭证',
|
display: true,
|
span: 24,
|
accept: 'string', dataType: 'object',
|
type: 'upload',
|
action: '/common/upload2',
|
|
},
|
isYF:{
|
label: '是否应付费用',
|
display: true,
|
type: 'radio', dicUrl: '/system/dict/data/type/sys_number_is', dataType: 'string',
|
|
},
|
yfServiceProviderId:{
|
label: '服务商',
|
display: true,
|
type: 'select',
|
|
},
|
yfPrice:{
|
label: '应付金额',
|
display: true,
|
},
|
yfCurrency:{
|
label: '应付币制',
|
display: true,
|
|
}
|
|
}
|
})
|
|
const itemsTableOption = ref({
|
pageKey: 'itemsTable',
|
rowKey: 'rowKey',
|
header: false,expand:true,
|
addBtn: false, menu: false,
|
column: {
|
feeType: {
|
label: '费用名称',
|
},
|
unit: {
|
label: '计量单位',
|
},
|
price: {
|
label: '计费金额',
|
},
|
currency: {
|
label: '币制',
|
},
|
count: {
|
label: '计费数量', minWidth: 130,
|
},
|
sum: {
|
label: '总金额',
|
},
|
isYF: {
|
label: '是否应付费用',
|
}
|
}
|
})
|
|
|
const YSGenerateTableOption = ref({
|
menu: false,
|
add: false,
|
header:false,
|
selection: false,
|
expand:true,
|
defaultExpandAll:true,
|
rowKey:'id',
|
column:{
|
dispatchNo:{
|
label: '调度单号',
|
},
|
customerName:{
|
label: '客户名称',
|
},
|
shipperName:{
|
label: '装货地',
|
},
|
receiverName:{
|
label: '卸货地',
|
},
|
transportLine:{
|
label: '运输路线',
|
},
|
actualVehicleType:{
|
label: '车型',
|
display: true, type: 'select', dicUrl: '/system/dict/data/type/vehicle_type', dataType: 'string',
|
|
},licensePlate:{
|
label: '车牌',
|
},
|
receivableAmount:{
|
label: '应收费用',
|
}
|
}
|
})
|
const YSGenerateItemTableOption = ref({
|
menu: false,
|
add: false,
|
header:false,
|
selection: false,
|
rowKey:'rowKey',
|
|
column:{
|
feeType:{
|
label: '费用类型',
|
type: 'radio', dataType: 'string', dicUrl: '/system/dict/data/type/receivable_fee_type',
|
|
},
|
feeName:{
|
label: '费用名称',
|
},
|
registerTime:{
|
label: '登记时间',
|
},
|
registerAmount:{
|
label: '登记金额',
|
},
|
currency:{
|
label: '币制',
|
type: 'radio', dataType: 'string', dicUrl: '/system/dict/data/type/sys_currency',
|
|
}
|
}
|
})
|
|
|
const YFGenerateTableOption = ref({
|
menu: false,
|
add: false,
|
header:false,
|
selection: false,
|
expand:true,
|
defaultExpandAll:true,
|
rowKey:'id',
|
column:{
|
dispatchNo:{
|
label: '调度单号',
|
},
|
|
transportLine:{
|
label: '运输路线',
|
},
|
actualVehicleType:{
|
label: '车型',
|
display: true, type: 'select', dicUrl: '/system/dict/data/type/vehicle_type', dataType: 'string',
|
|
},licensePlate:{
|
label: '车牌',
|
},
|
receivableAmount:{
|
label: '应付费用',
|
}
|
}
|
})
|
const YFGenerateItemTableOption = ref({
|
menu: false,
|
add: false,
|
header:false,
|
selection: false,
|
rowKey:'rowKey',
|
|
column:{
|
feeType:{
|
label: '费用类型',
|
type: 'radio', dataType: 'string', dicUrl: '/system/dict/data/type/receivable_fee_type',
|
|
},
|
feeName:{
|
label: '费用名称',
|
},
|
registerTime:{
|
label: '登记时间',
|
},
|
registerAmount:{
|
label: '登记金额',
|
},
|
currency:{
|
label: '币制',
|
type: 'radio', dataType: 'string', dicUrl: '/system/dict/data/type/sys_currency',
|
|
}
|
}
|
})
|
|
|
|
|
|
|
const itemsTableData = ref<any>([])
|
const itemsTableRef = ref();
|
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: costListTmsDispatchOrder,
|
getDetailApi: getTmsDispatchOrder,
|
exportApi: exportTmsDispatchOrder,
|
deleteApi: delTmsDispatchOrder,
|
addApi: addTmsDispatchOrder,
|
updateApi: updateTmsDispatchOrder,
|
handleUpdateFunc: () => {
|
crudRef.value.rowEdit(selectionList.value[0]);
|
},
|
handleSelectionChangeFunc: (selection: any) => {
|
selectionList.value = selection;
|
if (selection.length > 0){
|
isCustoms.value = selection[0].isCustoms;
|
isLoad.value = selection[0].isLoad ;
|
}else{
|
isCustoms.value = -1;
|
isLoad.value = -1;
|
}
|
isCustoms.value = isCustoms.value == 0 && !pageF.single ? 0 : -1;
|
isLoad.value = isLoad.value == 0 && !pageF.single ? 0 : -1;
|
console.log(pageF.single)
|
},
|
getBeginListFunc: () => {
|
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') || {};
|
},
|
|
})
|
|
|
|
|
|
|
const cancelBox = () => {
|
if (optionType.value === 'addItinerary' || optionType.value === 'addFinance') {
|
boxForm.value = {};
|
boxFormRef.value?.resetFields();
|
}
|
pageF.open = false;
|
}
|
|
const submitForm = () => {
|
if (active.value === 'tab1') {
|
console.log()
|
pushTmsQuoteFee({
|
...form.value,
|
quoteFeeItems: selectionList2.value
|
}).then(res=>{
|
ElMessage({
|
message: "操作成功!",
|
type: 'success'
|
})
|
getTab1Data();
|
})
|
|
|
}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({
|
message: "操作成功!",
|
type: 'success'
|
})
|
boxFormRef.value?.resetFields();
|
getTab2Data();
|
})
|
}
|
|
|
}
|
|
|
const handleLog = (row: any) => {
|
|
}
|
const handleLogItinerary = (row: any) => {
|
optionType.value = 'view';
|
boxTableOption.value = itineraryTableOption.value;
|
listTmsTrip({dispatchOrderId: row.id, pageNum: 1, pageSize: 999}).then(res => {
|
boxTableData.value = res.rows || [];
|
open.value = true;
|
pageF.title = '查看行程';
|
boxFormOption.value.title = '';
|
})
|
}
|
|
const handleAddFinance = async (row: any) => {
|
pageF.open = true;
|
pageF.title = '费用登记';
|
optionType.value = 'addFinance';
|
boxFormOption.value = financeOption.value;
|
boxTableOption.value = financeTableOption.value;
|
form.value = row;
|
await getTab1Data();
|
|
}
|
|
|
const getTab1Data = async () =>{
|
const quotePlanItemRes = await listTmsQuoteItem({quotePlanId: form.value.quotePlanId, pageNum: 1, pageSize: 999});
|
let items = quotePlanItemRes.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) => {
|
let find = rowsData.find((ele: any) => {
|
return item.free == ele.free
|
});
|
if (find) {
|
let aRow = {
|
...item,
|
feeType: item.freeName,
|
rowKey: item.id,
|
...find,
|
};
|
selectionList2.value.push(aRow);
|
return aRow
|
} else {
|
return {
|
...item,
|
rowKey: item.id,
|
feeType: item.freeName,
|
unit: item.unit,
|
price: item.price,
|
currency: item.currency,
|
count: 0,
|
sum: 0,
|
}
|
}
|
})
|
await nextTick(() => {
|
for (const item of selectionList2.value) {
|
isYFChange(item.isYF, item);
|
}
|
itemsTableRef.value?.toggleSelection(selectionList2.value);
|
})
|
|
|
}
|
|
|
const getTab2Data = async () =>{
|
let serviceProvider = await getServiceProvider(form.value.id);
|
serviceProviderList.value = serviceProvider.data || [];
|
listTmsFinanceDetail({
|
dispatchOrderId: form.value.id, financeType: 2,
|
pageNum: 1, pageSize: 999
|
}).then(async res => {
|
boxTableData.value = res.rows || [];
|
|
boxForm.value = {
|
dispatchOrderId: form.value.id,
|
dataSource: 0,
|
financeType: 2,
|
}
|
})
|
}
|
|
|
|
|
|
|
|
const getQuotationItems = async () => {
|
let res = await getDicts("sys_quotation_items");
|
quotationItems.value = res.data || [];
|
}
|
getQuotationItems();
|
|
const countChange = (row: any) => {
|
row.sum = Number(row.price) * Number(row.count);
|
}
|
|
const selectionChange2 = (selection?: any[]) => {
|
selectionList2.value = selection;
|
}
|
|
|
|
|
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'){
|
accountsPayableStatus = 0;
|
}
|
page.value.currentPage = 1;
|
queryParams.value.accountsReceivableStatus = accountsReceivableStatus;
|
queryParams.value.accountsPayableStatus = accountsPayableStatus;
|
onLoad(page.value)
|
}
|
|
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;
|
row.serviceProviderType = opt;
|
if (opt == 0){
|
let res = await listTmsServiceProvider({pageSize:999,pageNum:1})
|
row.serviceProviderData = res.rows|| [];
|
|
// 车辆运营商
|
let serviceProviderId = form.value.vehicleProviderId || row.serviceProviderId;
|
if (!serviceProviderId){
|
ElMessage.warning("找不到该费用的车辆服务商");
|
}else{
|
row.serviceProviderId = serviceProviderId;
|
}
|
|
}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){
|
ElMessage.warning("找不到该费用的报关服务商");
|
}else{
|
row.serviceProviderId = serviceProviderId;
|
|
}
|
|
}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){
|
ElMessage.warning("找不到该费用的装货服务商");
|
}else{
|
row.serviceProviderId = serviceProviderId;
|
|
}
|
}
|
|
if (row.serviceProviderType){
|
serviceProviderChange(row);
|
}
|
|
|
}
|
}
|
|
itemsTableRef.value?.toggleRowExpansion(row,value == 1)
|
|
|
|
// serviceProviderData
|
|
|
}
|
|
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)=>{
|
let yfCount = row.yfCount || 0;
|
let yfPrice = row.yfPrice || 0;
|
row.yfSum = Number(yfPrice) * Number(yfCount);
|
}
|
/**
|
* 生成应收费用
|
*/
|
const handleYSGenerate = () => {
|
let ids = selectionList.value.map((item: any) => item.id);
|
initYSGenerate(ids).then(res => {
|
boxTableData.value = res.data || [];
|
boxTableData.value.forEach((item:any) => {
|
let items = item.tmsReceivableFeeItems || [];
|
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) => {
|
return pre + Number(cur.registerAmount)
|
},0);
|
console.log(receivableAmountRMB,receivableAmountHKD)
|
item.receivableAmountRMB = receivableAmountRMB;
|
item.receivableAmountHKD = receivableAmountHKD;
|
|
})
|
optionType.value = 'ysGenerate';
|
open.value = true;
|
pageF.title = '生成应收费用';
|
boxTableOption.value = YSGenerateTableOption.value;
|
boxItemTableOption.value = YSGenerateItemTableOption.value;
|
})
|
}
|
/**
|
* 生成应付费用
|
*/
|
const handleYFGenerate = () =>{
|
let ids = selectionList.value.map((item: any) => item.id);
|
initYFGenerate(ids).then(res => {
|
boxTableData.value = res.data || [];
|
boxTableData.value.forEach((item:any) => {
|
let items = item.tmsReceivableFeeItems || [];
|
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) => {
|
return pre + Number(cur.registerAmount)
|
},0);
|
console.log(receivableAmountRMB,receivableAmountHKD)
|
item.receivableAmountRMB = receivableAmountRMB;
|
item.receivableAmountHKD = receivableAmountHKD;
|
|
})
|
optionType.value = 'yfGenerate';
|
open.value = true;
|
pageF.title = '生成应付费用';
|
boxTableOption.value = YFGenerateTableOption.value;
|
boxItemTableOption.value = YFGenerateItemTableOption.value;
|
})
|
}
|
|
const submitGenerate = () => {
|
pageF.isUploading = true;
|
let ids = selectionList.value.map((item: any) => item.id);
|
if (optionType.value == 'ysGenerate'){
|
ysGenerateTmsDispatchOrder(ids).then(res => {
|
pageF.isUploading = false;
|
ElMessage({
|
message: "生成成功!",
|
type: 'success'
|
})
|
open.value = false;
|
onLoad(page.value);
|
}).finally(() => {
|
pageF.isUploading = false;
|
})
|
}else if (optionType.value == 'yfGenerate'){
|
yfGenerateTmsDispatchOrder(ids).then(res => {
|
pageF.isUploading = false;
|
ElMessage({
|
message: "生成成功!",
|
type: 'success'
|
})
|
open.value = false;
|
onLoad(page.value);
|
}).finally(() => {
|
pageF.isUploading = false;
|
})
|
}
|
|
|
}
|
|
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;
|
}
|
|
|
</script>
|