| | |
| | | <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="success"--> |
| | |
| | | <!-- v-hasPermi="['tms:tmsDispatchOrder:remove']"--> |
| | | <!-- >删除--> |
| | | <!-- </el-button>--> |
| | | <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="info" |
| | | icon="Upload" |
| | | @click="handleImport" |
| | | <el-button type="info" icon="Upload" @click="handleImport" |
| | | v-hasPermi="['tms:tmsDispatchOrder:import']">导入</el-button> |
| | | <el-button type="info" plain icon="Document" @click="handleImportLog">导入日志</el-button> |
| | | <!-- <el-button--> |
| | | <!-- type="success"--> |
| | | <!-- icon="Promotion"--> |
| | |
| | | <!-- v-hasPermi="['tms:tmsDispatchOrder:generate']"--> |
| | | <!-- >生成应收应付费用--> |
| | | <!-- </el-button>--> |
| | | <el-button |
| | | type="warning" |
| | | icon="Female" |
| | | :disabled="pageF.single" |
| | | @click="handleDropHook" |
| | | v-hasPermi="['tms:tmsDispatchOrder:dropHook']" |
| | | >甩挂 |
| | | <el-button type="warning" icon="Female" :disabled="pageF.single" @click="handleDropHook" |
| | | v-hasPermi="['tms:tmsDispatchOrder:dropHook']">甩挂 |
| | | </el-button> |
| | | <el-button |
| | | type="primary" |
| | | icon="Male" |
| | | :disabled="pageF.single" |
| | | @click="handleConnectHang" |
| | | v-hasPermi="['tms:tmsDispatchOrder:connectHang']" |
| | | >接挂 |
| | | <el-button type="primary" icon="Male" :disabled="pageF.single" @click="handleConnectHang" |
| | | v-hasPermi="['tms:tmsDispatchOrder:connectHang']">接挂 |
| | | </el-button> |
| | | |
| | | <el-button |
| | | type="warning" |
| | | icon="Avatar" |
| | | :disabled="!( isCustoms == 0)" |
| | | @click="handleCustoms" |
| | | v-hasPermi="['tms:tmsDispatchOrder:customs']" |
| | | >委托报关信息 |
| | | <el-button type="warning" icon="Avatar" :disabled="!(isCustoms == 0)" @click="handleCustoms" |
| | | v-hasPermi="['tms:tmsDispatchOrder:customs']">委托报关信息 |
| | | </el-button> |
| | | <el-button |
| | | type="primary" |
| | | icon="UserFilled" |
| | | :disabled="!( isLoad == 0)" |
| | | @click="handleLoading" |
| | | v-hasPermi="['tms:tmsDispatchOrder:loading']" |
| | | >委托卸货信息 |
| | | <el-button type="primary" icon="UserFilled" :disabled="!(isLoad == 0)" @click="handleLoading" |
| | | v-hasPermi="['tms:tmsDispatchOrder:loading']">委托卸货信息 |
| | | </el-button> |
| | | <el-button |
| | | type="primary" |
| | | icon="UserFilled" |
| | | :disabled="pageF.single" |
| | | @click="handleZZ" |
| | | v-hasPermi="['tms:tmsDispatchOrder:zzdj']" |
| | | >增值作业登记 |
| | | <el-button type="primary" icon="UserFilled" :disabled="pageF.single" @click="handleZZ" |
| | | v-hasPermi="['tms:tmsDispatchOrder:zzdj']">增值作业登记 |
| | | </el-button> |
| | | <el-button |
| | | type="primary" |
| | | icon="Printer" |
| | | :disabled="pageF.single" |
| | | @click="handlePrint" |
| | | v-hasPermi="['tms:tmsDispatchOrder:print']" |
| | | >承运单打印 |
| | | <el-button type="primary" icon="Printer" :disabled="pageF.single" @click="handlePrint" |
| | | v-hasPermi="['tms:tmsDispatchOrder:print']">承运单打印 |
| | | </el-button> |
| | | <el-button |
| | | type="primary" |
| | | icon="UserFilled" |
| | | :disabled="!zxhdjSingle" |
| | | @click="handleZXHDJ" |
| | | v-hasPermi="['tms:tmsDispatchOrder:zzdj']" |
| | | >装卸货点登记 |
| | | <el-button type="primary" icon="UserFilled" :disabled="!zxhdjSingle" @click="handleZXHDJ" |
| | | v-hasPermi="['tms:tmsDispatchOrder:zzdj']">装卸货点登记 |
| | | </el-button> |
| | | </template> |
| | | |
| | | <template #loadingServiceProviderName="{ row }"> |
| | | <template v-if="String(row.isCustoms).trim() === '0' && !row.loadingServiceProviderName"> |
| | | <el-link type="primary" underline="never" @click="handleCustomsAdd(row)" |
| | | style="font-weight: bold; cursor: pointer; color: #409eff;"> |
| | | 待添加 |
| | | </el-link> |
| | | </template> |
| | | |
| | | <template v-else> |
| | | <span>{{ row.loadingServiceProviderName }}</span> |
| | | </template> |
| | | </template> |
| | | |
| | | <!-- 卸货服务 --> |
| | | <template #customsServiceProviderName="{ row }"> |
| | | <template v-if="String(row.isLoad).trim() === '0' && !row.customsServiceProviderName"> |
| | | <el-link type="primary" underline="never" @click="handleLoadingAdd(row)" |
| | | style="font-weight: bold; cursor: pointer; color: #409eff;"> |
| | | 待添加 |
| | | </el-link> |
| | | </template> |
| | | |
| | | <template v-else> |
| | | <span>{{ row.customsServiceProviderName }}</span> |
| | | </template> |
| | | </template> |
| | | |
| | | |
| | | |
| | | <template #menu="{ row, index, size }"> |
| | | <el-tooltip content="查看" placement="top" :enterable="false"> |
| | | <el-link type="primary" icon="el-icon-view" :underline="false" class="link-btn" |
| | | @click="$refs.crudRef.rowView(row, index)"> |
| | | </el-link> |
| | | </el-tooltip> |
| | | |
| | | <el-tooltip content="编辑" placement="top" :enterable="false"> |
| | | <el-link type="primary" icon="el-icon-edit" :underline="false" class="link-btn" |
| | | @click="$refs.crudRef.rowEdit(row, index)"> |
| | | </el-link> |
| | | </el-tooltip> |
| | | |
| | | </template> |
| | | <template #menu-before="{row}"> |
| | | <el-tooltip content="运输货品登记" placement="top"> |
| | | <el-link size="small" type="primary" @click="handleAddGoods(row)" class="link-btn" |
| | | v-hasPermi="['tms:tmsGoodsDetail:add']" v-if="[0,1,2].includes(row.status)" |
| | | :underline="false" icon="el-icon-document-add">运输货品登记 |
| | | v-hasPermi="['tms:tmsGoodsDetail:add']" v-if="[0, 1, 2].includes(row.status)" :underline="false" |
| | | icon="el-icon-document-add"> |
| | | </el-link> |
| | | </el-tooltip> |
| | | |
| | | <el-tooltip content="实际运输记录" placement="top"> |
| | | <el-link size="small" type="primary" @click="handleActual(row)" class="link-btn" |
| | | v-hasPermi="['tms:tmsDispatchOrder:update']" v-if="[0,1,2].includes(row.status)" |
| | | :underline="false" icon="el-icon-set-up">实际运输记录 |
| | | v-hasPermi="['tms:tmsDispatchOrder:update']" v-if="[0, 1, 2].includes(row.status)" :underline="false" |
| | | icon="el-icon-set-up"> |
| | | </el-link> |
| | | <el-link size="small" type="primary" v-if="row.status == 0" @click="handleConfirm(row)" class="link-btn" |
| | | v-hasPermi="['tms:tmsDispatchOrder:confirmOrder']" |
| | | :underline="false" icon="el-icon-pointer">确定 |
| | | </el-link> |
| | | <el-link size="small" type="primary" v-if="[0,1,2].includes(row.status)" @click="handleClose(row)" class="link-btn" |
| | | v-hasPermi="['tms:tmsDispatchOrder:closeOrder']" |
| | | :underline="false" icon="el-icon-close">作废 |
| | | </el-link> |
| | | </el-tooltip> |
| | | |
| | | <el-tooltip content="复制" placement="top"> |
| | | <el-link size="small" type="primary" @click="handleCopy(row)" class="link-btn" :underline="false" |
| | | v-hasPermi="['tms:tmsDispatchOrder:copyOrder']" |
| | | icon="el-icon-connection">复制 |
| | | v-hasPermi="['tms:tmsDispatchOrder:copyOrder']" icon="el-icon-connection"> |
| | | </el-link> |
| | | <el-link size="small" type="primary" v-if="[1,2].includes(row.status)" @click="handleUploadItinerary(row)" |
| | | v-hasPermi="['tms:tmsTrip:add']" |
| | | class="link-btn" :underline="false" icon="el-icon-upload">上传行程 |
| | | </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> |
| | | <el-link size="small" type="primary" v-if="[2].includes(row.status)" @click="handleOk(row)" class="link-btn" |
| | | v-hasPermi="['tms:tmsDispatchOrder:okOrder']" |
| | | :underline="false" icon="el-icon-circle-check">完成行程 |
| | | </el-link> |
| | | <!-- <el-link size="small" type="primary" v-if="[2,3].includes(row.status)" @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-tooltip> |
| | | <el-tooltip content="日志" placement="top"> |
| | | <el-link size="small" type="primary" @click="handleLog(row)" class="link-btn" :underline="false" |
| | | icon="el-icon-tickets">日志 |
| | | icon="el-icon-tickets"> |
| | | </el-link> |
| | | </el-tooltip> |
| | | </template> |
| | | |
| | | <!-- <template #menu="{row}"> |
| | | |
| | | </template> --> |
| | | |
| | | <template #shipperId-form="{disabled}"> |
| | | <div style="display:flex; align-items: center;justify-content: space-between"> |
| | | <avue-input-table :props="consignorProps" dataType="string" |
| | | :children="consignorOption" :disabled="disabled" |
| | | :on-load="onShipperLoad" suffixIcon="search" |
| | | v-model="form.shipperId" style="width: 80%" |
| | | @change="changeShipper" |
| | | placeholder="请选择装货点"></avue-input-table> |
| | | <avue-input-table :props="consignorProps" dataType="string" :children="consignorOption" :disabled="disabled" |
| | | :on-load="onShipperLoad" suffixIcon="search" v-model="form.shipperId" style="width: 80%" |
| | | @change="changeShipper" placeholder="请选择装货点"></avue-input-table> |
| | | <el-button icon="plus" :disabled="disabled" @click="handleAddShipper"></el-button> |
| | | </div> |
| | | </template> |
| | | <template #receiverId-form="{disabled}"> |
| | | <div style="display:flex; align-items: center;justify-content: space-between"> |
| | | <avue-input-table :props="consignorProps" |
| | | :children="consignorOption" dataType="string" |
| | | :on-load="onConsignorLoad" suffixIcon="search" |
| | | v-model="form.receiverId" :disabled="disabled" |
| | | @change="changeReceiver" style="width: 80%" |
| | | placeholder="请选择卸货点"></avue-input-table> |
| | | <avue-input-table :props="consignorProps" :children="consignorOption" dataType="string" |
| | | :on-load="onConsignorLoad" suffixIcon="search" v-model="form.receiverId" :disabled="disabled" |
| | | @change="changeReceiver" style="width: 80%" placeholder="请选择卸货点"></avue-input-table> |
| | | <el-button icon="plus" :disabled="disabled" @click="handleAddReceiver"></el-button> |
| | | </div> |
| | | </template> |
| | |
| | | </avue-crud> |
| | | <el-dialog :title="pageF.title" v-model="pageF.open" class="avue-dialog avue-dialog--top" width="80%"> |
| | | <h2 v-if="optionType == 'addFinance'">报价费用</h2> |
| | | <avue-crud v-if="optionType == 'addFinance'" |
| | | :option="itemsTableOption" |
| | | :data="itemsTableData" |
| | | @selection-change="selectionChange2" |
| | | > |
| | | <avue-crud v-if="optionType == 'addFinance'" :option="itemsTableOption" :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> |
| | | </avue-crud> |
| | | <h2 v-if="optionType == 'addFinance'">实报实销费用</h2> |
| | | <h2 v-if="optionType == 'addFinance'">实报实销费用1</h2> |
| | | <avue-form v-if="optionType == 'addItinerary' || optionType == 'addFinance'" v-model="boxForm" ref="boxFormRef" |
| | | :option="boxFormOption"> |
| | | |
| | | </avue-form> |
| | | <avue-crud |
| | | :option="boxTableOption" |
| | | :data="boxTableData" |
| | | > |
| | | <avue-crud :option="boxTableOption" :data="boxTableData"> |
| | | </avue-crud> |
| | | <template #footer> |
| | | <div class="dialog-footer"> |
| | |
| | | |
| | | <el-dialog :title="title" v-model="open" class="avue-dialog avue-dialog--top" width="40%"> |
| | | <div v-if="optionType === 'dropHook'"> |
| | | <el-descriptions |
| | | :column="2" |
| | | border |
| | | > |
| | | <el-descriptions :column="2" border> |
| | | <el-descriptions-item label="调度单号">{{ form.dispatchNo }}</el-descriptions-item> |
| | | <el-descriptions-item label="客户">{{ form.customerName }}</el-descriptions-item> |
| | | <el-descriptions-item label="派出车型">{{ form.$actualVehicleType }}</el-descriptions-item> |
| | |
| | | </el-descriptions> |
| | | </div> |
| | | <div v-if="optionType == 'connectHang'"> |
| | | <el-descriptions style="margin-bottom: 20px" |
| | | :column="2" |
| | | border |
| | | > |
| | | <el-descriptions style="margin-bottom: 20px" :column="2" border> |
| | | <el-descriptions-item label="调度单号">{{ form.dispatchNo }}</el-descriptions-item> |
| | | <el-descriptions-item label="客户">{{ form.customerName }}</el-descriptions-item> |
| | | <el-descriptions-item label="派出车型">{{ form.$actualVehicleType }}</el-descriptions-item> |
| | |
| | | </div> |
| | | |
| | | <div v-if="optionType == 'customs'"> |
| | | <el-descriptions style="margin-bottom: 20px" |
| | | :column="2" |
| | | border |
| | | > |
| | | <el-descriptions style="margin-bottom: 20px" :column="2" 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> |
| | |
| | | </div> |
| | | |
| | | <div v-if="optionType == 'loading'"> |
| | | <el-descriptions style="margin-bottom: 20px" |
| | | :column="2" |
| | | border |
| | | > |
| | | <el-descriptions style="margin-bottom: 20px" :column="2" 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-dialog title="货品信息登记" v-model="open2" class="avue-dialog avue-dialog--top" width="80%"> |
| | | <avue-crud |
| | | :option="goodsTableOption" |
| | | v-model="goodsForm" |
| | | @row-update="rowGoodsUpdate" |
| | | @row-save="rowGoodsSave" |
| | | @row-del="rowGoodsDel" |
| | | :data="goodsTableData" ref="goodsCrudRef" |
| | | > |
| | | <avue-crud :option="goodsTableOption" v-model="goodsForm" @row-update="rowGoodsUpdate" @row-save="rowGoodsSave" |
| | | @row-del="rowGoodsDel" :data="goodsTableData" ref="goodsCrudRef"> |
| | | </avue-crud> |
| | | <!-- <template #footer>--> |
| | | <!-- <div class="dialog-footer">--> |
| | |
| | | </el-dialog> |
| | | |
| | | <el-dialog title="实际运输信息" v-model="open3" class="avue-dialog avue-dialog--top" width="80%"> |
| | | <avue-form v-model="actualForm" |
| | | ref="actualFormRef" |
| | | :option="actualFormOption"> |
| | | <avue-form v-model="actualForm" ref="actualFormRef" :option="actualFormOption"> |
| | | |
| | | </avue-form> |
| | | <template #footer> |
| | |
| | | <el-descriptions-item label="车型">{{form.$actualVehicleType}}</el-descriptions-item> |
| | | <el-descriptions-item label="车牌">{{form.licensePlate}}</el-descriptions-item> |
| | | </el-descriptions> |
| | | <avue-tabs :option="tabsOption" ref="tabsOptionRef" |
| | | @change="handleChange"></avue-tabs> |
| | | <avue-tabs :option="tabsOption" ref="tabsOptionRef" @change="handleChange"></avue-tabs> |
| | | |
| | | <avue-crud v-if="active !== 'tab4'" |
| | | :option="zzItemsTableOption" ref="itemsTableRef" |
| | | :data="zzItemsTableData" |
| | | > |
| | | <avue-crud v-if="active !== 'tab4'" :option="zzItemsTableOption" ref="itemsTableRef" :data="zzItemsTableData"> |
| | | <template #count="{row}"> |
| | | <el-input-number v-model="row.count" placeholder="计费数量" |
| | | :min="0"></el-input-number> |
| | | <el-input-number v-model="row.count" placeholder="计费数量" :min="0"></el-input-number> |
| | | </template> |
| | | <template #remark="{row}"> |
| | | <el-input v-model="row.remark" placeholder="备注" ></el-input> |
| | |
| | | |
| | | <div v-if="active === 'tab4'"> |
| | | <h2>实报实销费用</h2> |
| | | <avue-form v-model="boxForm" ref="boxFormRef" |
| | | :option="boxFormOption"> |
| | | <!-- <avue-form v-model="boxForm" ref="boxFormRef" :option="boxFormOption"> |
| | | |
| | | </avue-form> |
| | | <avue-crud |
| | | :option="boxTableOption" |
| | | :data="boxTableData" |
| | | > |
| | | </avue-form> --> |
| | | <avue-crud :option="expenditureTableOption" :data="tmsFinanceDetails"> |
| | | <template #actualFeeAmount="{ row }"> |
| | | <el-input-number v-model="row.actualFeeAmount" :precision="2" :min="0" controls-position="right" |
| | | placeholder="输入金额" style="width: 100%" /> |
| | | </template> |
| | | |
| | | <template #currency="{ row }"> |
| | | <el-radio-group v-model="row.currency"> |
| | | <el-radio v-for="item in sys_currency" :key="item.value" :label="item.value"> |
| | | {{ item.label }} |
| | | </el-radio> |
| | | </el-radio-group> |
| | | </template> |
| | | <template #voucherUrl="{ row }"> |
| | | <avue-upload v-model="row.voucherUrl" :action="'/common/upload2'" type="upload" accept="image/*" |
| | | @upload-after="(res, done, loading, column) => handleUploadAfter(res, done, loading, column, row)"></avue-upload> |
| | | </template> |
| | | <template #remark="{ row }"> |
| | | <el-input v-model="row.remark" placeholder="填写备注" clearable /> |
| | | </template> |
| | | </avue-crud> |
| | | <avue-crud :option="boxTableOption" :data="boxTableData"> |
| | | |
| | | </avue-crud> |
| | | </div> |
| | | <template #footer> |
| | | <div class="dialog-footer"> |
| | | <el-button type="primary" |
| | | :loading="pageF.isUploading" @click="submitTabForm"> |
| | | <el-button type="primary" :loading="pageF.isUploading" @click="submitTabForm"> |
| | | {{ pageF.isUploading ? '提交中' : '确 定' }} |
| | | </el-button> |
| | | |
| | |
| | | <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> |
| | | |
| | |
| | | <el-descriptions-item label="历史打印次数">{{form.printCount}}</el-descriptions-item> |
| | | </el-descriptions> |
| | | <h3 class="title" style="color: #333;font-weight: bold;">单据信息</h3> |
| | | <avue-form v-model="boxForm" ref="boxFormRef" |
| | | :option="boxFormOption"> |
| | | <avue-form v-model="boxForm" ref="boxFormRef" :option="boxFormOption"> |
| | | |
| | | </avue-form> |
| | | </div> |
| | |
| | | <template #footer> |
| | | <div class="dialog-footer"> |
| | | <el-button @click="print = 0" v-if="print == 1">重新填写</el-button> |
| | | <el-button type="primary" |
| | | :loading="pageF.isUploading" @click="submitForm6"> |
| | | {{ pageF.isUploading ? '提交中' : '确 定' }} |
| | | <el-button type="primary" :loading="pageF.isUploading" @click="submitForm6"> |
| | | {{ pageF.isUploading ? '提交中' : '确 定2' }} |
| | | </el-button> |
| | | |
| | | <el-button @click="open6 = false">取 消</el-button> |
| | |
| | | |
| | | <!-- 用户导入对话框 --> |
| | | <el-dialog title="调度单导入" v-model="upload.open" width="400px" append-to-body> |
| | | <el-upload |
| | | ref="uploadRef" |
| | | :limit="1" |
| | | accept=".xlsx, .xls" |
| | | :headers="upload.headers" |
| | | :action="upload.url + '?updateSupport=' + upload.updateSupport" |
| | | :disabled="upload.isUploading" |
| | | :on-progress="handleFileUploadProgress" |
| | | :on-success="handleFileSuccess" |
| | | :auto-upload="false" |
| | | drag |
| | | > |
| | | <el-upload ref="uploadRef" :limit="1" accept=".xlsx, .xls" :headers="upload.headers" |
| | | :action="upload.url + '?updateSupport=' + upload.updateSupport" :disabled="upload.isUploading" |
| | | :on-progress="handleFileUploadProgress" :on-success="handleFileSuccess" :auto-upload="false" drag> |
| | | <el-icon class="el-icon--upload"><upload-filled /></el-icon> |
| | | <div class="el-upload__text">将文件拖到此处,或<em>点击上传</em></div> |
| | | <template #tip> |
| | | <div class="el-upload__tip text-center"> |
| | | <span>仅允许导入xls、xlsx格式文件。</span> |
| | | <el-link type="primary" :underline="false" style="font-size:12px;vertical-align: baseline;" @click="importTemplate">下载模板</el-link> |
| | | <el-link type="primary" :underline="false" style="font-size:12px;vertical-align: baseline;" |
| | | @click="importTemplate">下载模板</el-link> |
| | | </div> |
| | | </template> |
| | | </el-upload> |
| | |
| | | |
| | | |
| | | <el-dialog title="预配订单装卸货点登记" v-model="open7" class="avue-dialog avue-dialog--top" width="80%"> |
| | | <avue-form v-model="shipperReceiverForm" |
| | | ref="shipperReceiverFormRef" |
| | | :option="shipperReceiverFormOption"> |
| | | <avue-form v-model="shipperReceiverForm" ref="shipperReceiverFormRef" :option="shipperReceiverFormOption"> |
| | | <template #dispatchNos="{disabled}"> |
| | | <div class="dispatchNos"> |
| | | <el-tag |
| | | v-for="tag in shipperReceiverForm.dispatchNos" |
| | | :key="tag" |
| | | closable |
| | | @close="handleCloseDispatchNo(tag)" |
| | | > |
| | | <el-tag v-for="tag in shipperReceiverForm.dispatchNos" :key="tag" closable |
| | | @close="handleCloseDispatchNo(tag)"> |
| | | {{ tag }} |
| | | </el-tag> |
| | | </div> |
| | |
| | | </template> |
| | | <template #shipperId="{disabled}"> |
| | | <div style="display:flex; align-items: center;justify-content: space-between"> |
| | | <avue-input-table :props="consignorProps" dataType="string" |
| | | :children="consignorOption" :disabled="disabled" |
| | | :on-load="onShipperLoad" suffixIcon="search" |
| | | v-model="shipperReceiverForm.shipperId" style="width: 80%" |
| | | @change="changeShipper2" |
| | | placeholder="请选择装货点"></avue-input-table> |
| | | <avue-input-table :props="consignorProps" dataType="string" :children="consignorOption" :disabled="disabled" |
| | | :on-load="onShipperLoad" suffixIcon="search" v-model="shipperReceiverForm.shipperId" style="width: 80%" |
| | | @change="changeShipper2" placeholder="请选择装货点"></avue-input-table> |
| | | <el-button icon="plus" :disabled="disabled" @click="handleAddShipper2"></el-button> |
| | | </div> |
| | | </template> |
| | | <template #receiverId="{disabled}"> |
| | | <div style="display:flex; align-items: center;justify-content: space-between"> |
| | | <avue-input-table :props="consignorProps" |
| | | :children="consignorOption" dataType="string" |
| | | :on-load="onConsignorLoad" suffixIcon="search" |
| | | v-model="shipperReceiverForm.receiverId" :disabled="disabled" |
| | | @change="changeReceiver2" style="width: 80%" |
| | | placeholder="请选择卸货点"></avue-input-table> |
| | | <avue-input-table :props="consignorProps" :children="consignorOption" dataType="string" |
| | | :on-load="onConsignorLoad" suffixIcon="search" v-model="shipperReceiverForm.receiverId" |
| | | :disabled="disabled" @change="changeReceiver2" style="width: 80%" placeholder="请选择卸货点"></avue-input-table> |
| | | <el-button icon="plus" :disabled="disabled" @click="handleAddReceiver2"></el-button> |
| | | </div> |
| | | </template> |
| | | </avue-form> |
| | | <template #footer> |
| | | <div class="dialog-footer"> |
| | | <el-button type="primary" |
| | | :loading="pageF.isUploading" @click="submitZxForm"> |
| | | <el-button type="primary" :loading="pageF.isUploading" @click="submitZxForm"> |
| | | {{ pageF.isUploading ? '提交中' : '确 定' }} |
| | | </el-button> |
| | | |
| | |
| | | </template> |
| | | </el-dialog> |
| | | |
| | | <el-dialog title="导入日志" v-model="importLogVisible" width="80%"> |
| | | <avue-crud :data="importLogData" :option="importLogOption" :table-loading="importLogLoading" |
| | | @on-load="getImportLogList"></avue-crud> |
| | | </el-dialog> |
| | | </basicContainer> |
| | | </template> |
| | | |
| | |
| | | checkCloseOrder, |
| | | closeOrder, |
| | | printDispatchOrder, |
| | | importTemplateTmsDispatchOrder,ypdddjSumbit |
| | | importTemplateTmsDispatchOrder, ypdddjSumbit, |
| | | tmsTmsDispatchOrderImportLog, |
| | | saveTmsFinanceDetail2 |
| | | } from "@/api/tms/tmsDispatchOrder"; |
| | | import useCurrentInstance from "@/utils/useCurrentInstance"; |
| | | import {computed, onMounted, reactive, ref, toRefs, watch, getCurrentInstance, nextTick} from "vue"; |
| | |
| | | |
| | | const {appContext} = getCurrentInstance(); |
| | | |
| | | const {proxy} = useCurrentInstance(); |
| | | const { proxy } = useCurrentInstance( |
| | | ); |
| | | const { fee_type, sys_currency } = proxy.useDict('fee_type', 'sys_currency') |
| | | const crudRef = ref(); |
| | | const boxFormRef = ref(); |
| | | const goodsCrudRef = ref(); |
| | |
| | | goodsTableData, goodsForm, actualForm, selectionList2,isCustoms,isLoad,open5,open6,open7,zxhdjSingle |
| | | } = toRefs(data); |
| | | const option = ref({ |
| | | menuType: 'icon', |
| | | viewBtn: false, // 关闭原生查看 |
| | | editBtn: false, // 关闭原生编辑 |
| | | |
| | | searchIndex: 7, // 关键:折叠时显示的个数(根据你的字段数量调整) |
| | | searchIcon: true, // 关键:显示折叠/展开按钮 |
| | | searchMenuSpan: 6, // 搜索按钮栏占位(可选) |
| | | |
| | | pageKey: 'TmsDispatchOrder', |
| | | rowKey: 'id', |
| | | labelWidth: 130, |
| | |
| | | display: false, |
| | | search: true, |
| | | }, |
| | | licensePlate: { |
| | | label: '车牌号', minWidth: 120, |
| | | display: false, |
| | | search: true, |
| | | }, |
| | | customerName: { |
| | | label: '客户', |
| | | display: false, minWidth: 120, |
| | | search: true, |
| | | }, |
| | | mainDriverName: { |
| | | label: '主驾驶员', |
| | | display: false, minWidth: 120, |
| | | search: true, |
| | | }, |
| | | requiredVehicleTypes: { |
| | | label: '下单车型', minWidth: 130, |
| | | display: false, type: 'select', search: true, |
| | | dicUrl: '/system/dict/data/type/vehicle_type', |
| | | dataType: 'string', |
| | | |
| | | }, |
| | | createTimeRange: { |
| | | label: '创建时间', display: false, search: true, searchRange: true, type: 'date', |
| | | format: 'YYYY-MM-DD', hide: true, searchSpan: 5, |
| | | valueFormat: 'YYYY-MM-DD', |
| | | }, |
| | | updateTimeRange: { |
| | | label: '更新时间', display: false, search: true, searchRange: true, type: 'date', |
| | | format: 'YYYY-MM-DD', hide: true, searchSpan: 5, |
| | | valueFormat: 'YYYY-MM-DD', |
| | | }, |
| | | loadingServiceProviderName: { |
| | | label: '装货服务商名称', minWidth: 150, |
| | | display: false, |
| | | search: true, |
| | | }, |
| | | customsServiceProviderName: { |
| | | label: '报关服务商名称', minWidth: 150, |
| | | display: false, |
| | | search: true, |
| | | }, |
| | | projectName: { |
| | | label: '项目名称', |
| | | display: false, minWidth: 120, |
| | | search: true, |
| | | }, |
| | | |
| | | contractName: { |
| | | label: '关联合同名称', minWidth: 120, |
| | | 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, |
| | |
| | | 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, |
| | | // }, |
| | | requiredVehicleTypes: { |
| | | label: '下单车型',minWidth: 130, |
| | | display: false, type: 'select', search: true, |
| | | dicUrl: '/system/dict/data/type/vehicle_type', |
| | | dataType: 'string', |
| | | |
| | | }, |
| | | actualVehicleType: { |
| | | label: '派出车型', minWidth: 130, |
| | | display: false, |
| | |
| | | |
| | | }, |
| | | |
| | | licensePlate: { |
| | | label: '车牌号', minWidth: 120, |
| | | display: false, |
| | | search: true, |
| | | }, |
| | | |
| | | |
| | | shipperName: { |
| | | label: '装货点名称', |
| | |
| | | hide: false, |
| | | search: false, |
| | | }, |
| | | createTimeRange: { |
| | | label: '创建时间', display: false, search: true, searchRange: true, type: 'date', |
| | | format: 'YYYY-MM-DD', hide: true, searchSpan: 5, |
| | | valueFormat: 'YYYY-MM-DD', |
| | | }, |
| | | |
| | | updateBy: { |
| | | label: '更新人', minWidth: 150, |
| | | addDisplay: 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, |
| | |
| | | const handleUploadItinerary = (row: any) => { |
| | | optionType.value = 'addItinerary'; |
| | | boxFormOption.value = itineraryOption.value; |
| | | console.log(itineraryOption.value); |
| | | |
| | | boxTableOption.value = itineraryTableOption.value; |
| | | listTmsTrip({dispatchOrderId: row.id, pageNum: 1, pageSize: 999}).then(res => { |
| | | boxTableData.value = res.rows || []; |
| | |
| | | vehicleNumber: row.licensePlate, |
| | | vehicleId: row.vehicleId, |
| | | } |
| | | console.log(boxForm.value); |
| | | |
| | | }) |
| | | } |
| | | const cancelBox = () => { |
| | |
| | | pageF.isUploading = false; |
| | | }) |
| | | }else if (optionType.value === 'customs') { |
| | | customsOrder({id:form.value.id, |
| | | customsOrder({ |
| | | id: form.value.id, |
| | | customsServiceProviderId: form.value.customsServiceProviderId, |
| | | customsServiceProviderName: form.value.customsServiceProviderName, |
| | | }).then(res => { |
| | |
| | | pageF.isUploading = false; |
| | | }) |
| | | }else if (optionType.value === 'loading') { |
| | | loadingOrder({id:form.value.id, |
| | | loadingOrder({ |
| | | id: form.value.id, |
| | | loadingServiceProviderId: form.value.loadingServiceProviderId, |
| | | loadingServiceProviderName: form.value.loadingServiceProviderName, |
| | | }).then(res => { |
| | |
| | | form.value = selectionList.value[0]; |
| | | optionType.value = 'customs'; |
| | | boxFormOption.value = customsOption.value; |
| | | |
| | | } |
| | | |
| | | const handleCustomsAdd = (selectionList) => { |
| | | title.value = '补充委托装卸信息'; |
| | | open.value = true; |
| | | form.value = selectionList; |
| | | optionType.value = 'loading'; |
| | | boxFormOption.value = loadingOption.value; |
| | | } |
| | | const handleLoading = () => { |
| | | title.value = '补充委托装卸信息'; |
| | | open.value = true; |
| | | form.value = selectionList.value[0]; |
| | | optionType.value = 'loading'; |
| | | boxFormOption.value = loadingOption.value; |
| | | } |
| | | const handleLoadingAdd = (selectionList) => { |
| | | title.value = '补充委托装卸信息'; |
| | | open.value = true; |
| | | form.value = selectionList; |
| | | optionType.value = 'loading'; |
| | | boxFormOption.value = loadingOption.value; |
| | | } |
| | |
| | | dispatchOrderId: form.value.id, financeType: 2, |
| | | pageNum: 1, pageSize: 999 |
| | | }).then(async res => { |
| | | |
| | | boxTableData.value = res.rows || []; |
| | | |
| | | boxForm.value = { |
| | |
| | | let quoteFeeItems = zzItemsTableData.value.filter((item:any)=>{ |
| | | return item.count && item.count > 0; |
| | | }) |
| | | console.log(quoteFeeItems) |
| | | pushTmsQuoteFee({...form.value,quoteFeeItems:quoteFeeItems}).then(res=>{ |
| | | ElMessage.success('保存成功'); |
| | | open4.value = false; |
| | | }) |
| | | }else if (active.value === 'tab4'){ |
| | | if (Array.isArray(boxForm.value.feeVoucherUrl)) { |
| | | boxForm.value.feeVoucherUrl = boxForm.value.feeVoucherUrl.toString(); |
| | | } |
| | | // if (Array.isArray(boxForm.value.feeVoucherUrl)) { |
| | | // boxForm.value.feeVoucherUrl = boxForm.value.feeVoucherUrl.toString(); |
| | | // } |
| | | //boxForm.value.rowItems = boxTableData.value; |
| | | saveTmsFinanceDetail(boxForm.value).then(res => { |
| | | // console.log(tmsFinanceDetails.value); |
| | | // console.log(boxForm.value); |
| | | // 1. 提取填写了金额的数据(金额大于0) |
| | | const validDetails = tmsFinanceDetails.value.filter(item => item.actualFeeAmount && item.actualFeeAmount > 0); |
| | | |
| | | if (validDetails.length === 0) { |
| | | ElMessage.warning('请至少填写一项费用金额'); |
| | | return; |
| | | } |
| | | |
| | | // 2. 校验:填写了金额的是否都选了币制 |
| | | const incomplete = validDetails.find(item => !item.currency); |
| | | if (incomplete) { |
| | | ElMessage.error(`费用类型【${incomplete.feeTypeName}】已填写金额,请选择币制!`); |
| | | return; // 拦截提交 |
| | | } |
| | | |
| | | // 3. 处理凭证 URL (如果有单张或多张上传的逻辑) |
| | | // 假设后端需要的是逗号分隔的字符串 |
| | | const submitData = validDetails.map(item => { |
| | | let url = item.voucherUrl; |
| | | if (Array.isArray(url)) { |
| | | url = url.join(','); |
| | | } |
| | | return { ...item, voucherUrl: url }; |
| | | }); |
| | | |
| | | |
| | | saveTmsFinanceDetail2(submitData).then(res => { |
| | | ElMessage({ |
| | | message: "操作成功!", |
| | | type: 'success' |
| | | }) |
| | | open4.value = false; |
| | | onLoad(page.value) |
| | | boxFormRef.value?.resetFields(); |
| | | getTab4Data(); |
| | | }) |
| | | // saveTmsFinanceDetail(boxForm.value).then(res => { |
| | | // ElMessage({ |
| | | // message: "操作成功!", |
| | | // type: 'success' |
| | | // }) |
| | | // boxFormRef.value?.resetFields(); |
| | | // getTab4Data(); |
| | | // }) |
| | | } |
| | | } |
| | | |
| | |
| | | } |
| | | }) |
| | | } |
| | | const importLogVisible = ref(false); |
| | | const importLogLoading = ref(false); |
| | | const importLogData = ref([]); |
| | | |
| | | // 弹窗表格配置 |
| | | const importLogOption = { |
| | | header: false, |
| | | addBtn: false, |
| | | menu: false, // 仅展示,不需要操作列 |
| | | column: [ |
| | | { label: '导入时间', prop: 'importTime', type: 'datetime', format: 'YYYY-MM-DD HH:mm:ss' }, |
| | | { label: '导入文件名称', prop: 'fileName' }, |
| | | { label: '操作人', prop: 'operator' }, |
| | | { label: '成功行数', prop: 'successCount' }, |
| | | { label: '失败行数', prop: 'failureCount' }, |
| | | { label: '失败说明', prop: 'failureDescription', overHidden: true } |
| | | ] |
| | | }; |
| | | |
| | | // 打开日志弹窗 |
| | | const handleImportLog = () => { |
| | | importLogVisible.value = true; |
| | | }; |
| | | |
| | | // 获取日志列表数据(需根据实际 API 调整) |
| | | const getImportLogList = () => { |
| | | importLogData.value = [] |
| | | // 假设有一个 getLogApi 的接口 |
| | | tmsTmsDispatchOrderImportLog().then(res => { |
| | | if (res.code == 200) { |
| | | importLogLoading.value = true; |
| | | importLogData.value = res.data; |
| | | importLogLoading.value = false; |
| | | } |
| | | }); |
| | | |
| | | }; |
| | | // 1. 定义唯一的变量名 |
| | | const tmsFinanceDetails = ref([]); // 数据源 |
| | | const expenditureTableOption = ref({ |
| | | addBtn: false, |
| | | menu: false, |
| | | header: false, |
| | | border: true, |
| | | index: false, |
| | | selection: false, |
| | | column: [ |
| | | { |
| | | label: '费用类型', |
| | | prop: 'feeTypeName', |
| | | width: 150 |
| | | }, |
| | | { |
| | | label: '费用金额', |
| | | prop: 'actualFeeAmount', |
| | | slot: true, |
| | | width: 150 |
| | | }, |
| | | { |
| | | label: '币制', |
| | | prop: 'currency', |
| | | slot: true, |
| | | width: 200 |
| | | }, |
| | | { |
| | | |
| | | label: '费用凭证', |
| | | display: true, |
| | | span: 24, |
| | | accept: 'string', dataType: 'object', |
| | | type: 'upload', |
| | | // action: '/common/upload2', |
| | | |
| | | prop: 'voucherUrl', // 这里改成 prop 属性 |
| | | slot: true, // 开启插槽 |
| | | width: 200 |
| | | }, |
| | | { |
| | | label: '备注', |
| | | prop: 'remark', |
| | | slot: true |
| | | } |
| | | ] |
| | | }); |
| | | // 3. 回显初始化 |
| | | const initExpenditureData = () => { |
| | | if (fee_type.value && fee_type.value.length > 0 && tmsFinanceDetails.value.length === 0) { |
| | | tmsFinanceDetails.value = fee_type.value.map(item => ({ |
| | | feeType: item.value, |
| | | feeTypeName: item.label, |
| | | feeAmount: undefined, |
| | | currency: '', |
| | | voucherUrl: '', |
| | | remark: '' |
| | | })); |
| | | } |
| | | }; |
| | | // 4. 监听切换 |
| | | watch(() => active.value, (val) => { |
| | | if (val === 'tab4') { |
| | | initExpenditureData(); |
| | | } |
| | | }); |
| | | const handleUploadAfter = (res, done, loading, column, row) => { |
| | | // res 是接口返回的完整数据 |
| | | if (res && res.url) { |
| | | // 手动给这一行的数据赋值 |
| | | row.voucherUrl = res.url; |
| | | console.log('上传成功,当前行数据:', row); |
| | | } else if (res.data && res.data.url) { |
| | | // 如果返回的数据包裹在 data 里 |
| | | row.voucherUrl = res.data.url; |
| | | } |
| | | done(); // 必须调用 done 结束上传状态 |
| | | }; |
| | | </script> |
| | | <style lang="scss" scoped> |
| | | |
| | | ::v-deep .cydprint .el-dialog__body{ |
| | | overflow: hidden; |
| | | //padding: 0; |
| | | margin: 0; |
| | | } |
| | | |
| | | #print{ |
| | | .title{ |
| | | text-align: center; |
| | |
| | | font-weight: bold; |
| | | margin: 0; |
| | | } |
| | | |
| | | .header{ |
| | | position: relative; |
| | | |
| | | .order{ |
| | | font-size: 12pt; |
| | | color: #000; |
| | | line-height: 23pt; |
| | | } |
| | | |
| | | .sub-title{ |
| | | position: absolute; |
| | | left: 50%; |
| | |
| | | |
| | | table { |
| | | width: 100%; |
| | | border-collapse: collapse; /* 合并边框 */ |
| | | border-collapse: collapse; |
| | | /* 合并边框 */ |
| | | font-size: 12px; |
| | | table-layout: fixed; /* 关键点 */ |
| | | table-layout: fixed; |
| | | /* 关键点 */ |
| | | } |
| | | table, td { |
| | | |
| | | table, |
| | | td { |
| | | border: 1px solid #000; |
| | | |
| | | } |
| | | |
| | | td { |
| | | padding: 4px; |
| | | vertical-align: middle; |
| | | width: 50%; /* 强制等宽 */ |
| | | width: 50%; |
| | | /* 强制等宽 */ |
| | | word-break: break-all; |
| | | } |
| | | } |
| | | |
| | | .dispatchNos{ |
| | | //border: 1px solid #ebeef5; |
| | | border-radius: 4px; |