| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658 |
- # -*- coding: utf-8 -*-
- """Regenerate waybill/index.vue with UTF-8 Chinese and region cascaders."""
- import os
- OUT = os.path.join(
- os.path.dirname(os.path.dirname(__file__)),
- "ruoyi-ui", "src", "views", "basic", "waybill", "index.vue"
- )
- # fmt: off
- VUE = r'''<template>
- <div class="app-container">
- <el-form ref="queryForm" :model="queryParams" :inline="true" size="small" v-show="showSearch" label-width="88px">
- <el-form-item label="\u8fd0\u5355\u53f7" prop="waybillNo">
- <el-input v-model="queryParams.waybillNo" placeholder="\u8bf7\u8f93\u5165\u8fd0\u5355\u53f7" clearable style="width: 180px" @keyup.enter.native="handleQuery" />
- </el-form-item>
- <el-form-item label="\u8fd0\u8f93\u7c7b\u578b" prop="transportType">
- <el-select v-model="queryParams.transportType" placeholder="\u8bf7\u9009\u62e9" clearable style="width: 140px">
- <el-option v-for="item in transportTypeOptions" :key="item" :label="item" :value="item" />
- </el-select>
- </el-form-item>
- <el-form-item label="\u53d1\u8d27\u4f01\u4e1a" prop="senderCompany">
- <el-input v-model="queryParams.senderCompany" placeholder="\u8bf7\u8f93\u5165\u53d1\u8d27\u4f01\u4e1a" clearable style="width: 160px" @keyup.enter.native="handleQuery" />
- </el-form-item>
- <el-form-item label="\u6536\u8d27\u4f01\u4e1a" prop="receiverCompany">
- <el-input v-model="queryParams.receiverCompany" placeholder="\u8bf7\u8f93\u5165\u6536\u8d27\u4f01\u4e1a" clearable style="width: 160px" @keyup.enter.native="handleQuery" />
- </el-form-item>
- <el-form-item label="\u5ba1\u6838\u72b6\u6001" prop="auditStatus">
- <el-select v-model="queryParams.auditStatus" placeholder="\u8bf7\u9009\u62e9" clearable style="width: 120px">
- <el-option v-for="item in auditStatusOptions" :key="item.value" :label="item.label" :value="item.value" />
- </el-select>
- </el-form-item>
- <el-form-item>
- <el-button type="primary" icon="el-icon-search" size="mini" @click="handleQuery">\u641c\u7d22</el-button>
- <el-button icon="el-icon-refresh" size="mini" @click="resetQuery">\u91cd\u7f6e</el-button>
- </el-form-item>
- </el-form>
- <el-row :gutter="10" class="mb8">
- <el-col :span="1.5">
- <el-button type="primary" plain icon="el-icon-plus" size="mini" @click="handleAdd" v-hasPermi="['transport:waybill:add']">\u65b0\u589e</el-button>
- </el-col>
- <el-col :span="1.5">
- <el-button type="success" plain icon="el-icon-check" size="mini" :disabled="single" @click="handleApprove()" v-hasPermi="['transport:waybill:approve']">\u5ba1\u6838\u901a\u8fc7</el-button>
- </el-col>
- <el-col :span="1.5">
- <el-button type="danger" plain icon="el-icon-delete" size="mini" :disabled="multiple" @click="handleDelete()" v-hasPermi="['transport:waybill:remove']">\u5220\u9664</el-button>
- </el-col>
- <right-toolbar :showSearch.sync="showSearch" @queryTable="getList" />
- </el-row>
- <el-table border stripe v-loading="loading" :data="waybillList" @selection-change="handleSelectionChange">
- <el-table-column type="selection" width="55" align="center" />
- <el-table-column label="\u8fd0\u5355\u53f7" prop="waybillNo" min-width="150" align="center" show-overflow-tooltip />
- <el-table-column label="\u8fd0\u8f93\u7c7b\u578b" prop="transportType" width="110" align="center" />
- <el-table-column label="\u5355\u636e\u65e5\u671f" prop="documentDate" width="110" align="center" />
- <el-table-column label="\u53d1\u8d27\u4f01\u4e1a" prop="senderCompany" min-width="140" align="center" show-overflow-tooltip />
- <el-table-column label="\u6536\u8d27\u4f01\u4e1a" prop="receiverCompany" min-width="140" align="center" show-overflow-tooltip />
- <el-table-column label="\u9884\u8ba1\u53d1\u8f66" prop="planDepartTime" width="160" align="center" />
- <el-table-column label="\u9884\u8ba1\u5230\u8fbe" prop="planArriveTime" width="160" align="center" />
- <el-table-column label="\u603b\u6570\u91cf" prop="totalQuantity" width="90" align="right" />
- <el-table-column label="\u603b\u91cd\u91cf(kg)" prop="totalWeight" width="100" align="right" />
- <el-table-column label="\u5ba1\u6838\u72b6\u6001" prop="auditStatus" width="100" align="center">
- <template slot-scope="scope">
- <el-tag :type="auditTagType(scope.row.auditStatus)" size="small">{{ auditStatusLabel(scope.row.auditStatus) }}</el-tag>
- </template>
- </el-table-column>
- <el-table-column label="\u64cd\u4f5c" align="center" width="220" class-name="small-padding fixed-width">
- <template slot-scope="scope">
- <el-button type="text" size="mini" icon="el-icon-view" @click="handleView(scope.row)" v-hasPermi="['transport:waybill:query']">\u67e5\u770b</el-button>
- <el-button type="text" size="mini" icon="el-icon-edit" @click="handleUpdate(scope.row)" v-hasPermi="['transport:waybill:edit']" v-if="canEdit(scope.row)">\u4fee\u6539</el-button>
- <el-button type="text" size="mini" icon="el-icon-check" @click="handleApprove(scope.row)" v-hasPermi="['transport:waybill:approve']" v-if="scope.row.auditStatus === 1">\u5ba1\u6838</el-button>
- <el-button type="text" size="mini" icon="el-icon-delete" @click="handleDelete(scope.row)" v-hasPermi="['transport:waybill:remove']" v-if="canEdit(scope.row)">\u5220\u9664</el-button>
- </template>
- </el-table-column>
- </el-table>
- <pagination v-show="total > 0" :total="total" :page.sync="queryParams.pageNum" :limit.sync="queryParams.pageSize" @pagination="getList" />
- <el-dialog title="\u8fd0\u5355\u8be6\u60c5" :visible.sync="detailOpen" width="92%" top="3vh" append-to-body custom-class="waybill-detail-dialog" @closed="detailData = null">
- <waybill-detail v-if="detailData" :detail="detailData" />
- <div slot="footer">
- <el-button @click="detailOpen = false">\u5173 \u95ed</el-button>
- </div>
- </el-dialog>
- <el-dialog :title="title" :visible.sync="open" width="1280px" append-to-body :close-on-click-modal="false" @closed="onDialogClosed">
- <el-form ref="form" :model="form" :rules="rules" label-width="110px">
- <el-divider content-position="left">\u57fa\u7840\u4fe1\u606f</el-divider>
- <el-row :gutter="12">
- <el-col :span="6">
- <el-form-item label="\u8fd0\u5355\u53f7">
- <el-input v-model="form.waybillNo" readonly placeholder="\u4fdd\u5b58\u540e\u81ea\u52a8\u751f\u6210" />
- </el-form-item>
- </el-col>
- <el-col :span="6">
- <el-form-item label="\u8fd0\u8f93\u7c7b\u578b" prop="transportType">
- <el-select v-model="form.transportType" placeholder="\u8bf7\u9009\u62e9\u8fd0\u8f93\u7c7b\u578b" style="width: 100%">
- <el-option v-for="item in transportTypeOptions" :key="item" :label="item" :value="item" />
- </el-select>
- </el-form-item>
- </el-col>
- <el-col :span="6">
- <el-form-item label="\u5355\u636e\u65e5\u671f" prop="documentDate">
- <el-date-picker v-model="form.documentDate" type="date" value-format="yyyy-MM-dd" placeholder="\u8bf7\u9009\u62e9" style="width: 100%" />
- </el-form-item>
- </el-col>
- <el-col :span="6">
- <el-form-item label="\u5907\u6ce8">
- <el-input v-model="form.remark" placeholder="\u53ef\u9009\u586b\u5199" maxlength="500" />
- </el-form-item>
- </el-col>
- <el-col :span="6">
- <el-form-item label="\u9884\u8ba1\u53d1\u8f66" prop="planDepartTime">
- <el-date-picker v-model="form.planDepartTime" type="datetime" value-format="yyyy-MM-dd HH:mm:ss" placeholder="\u8bf7\u9009\u62e9" style="width: 100%" />
- </el-form-item>
- </el-col>
- <el-col :span="6">
- <el-form-item label="\u9884\u8ba1\u5230\u8fbe" prop="planArriveTime">
- <el-date-picker v-model="form.planArriveTime" type="datetime" value-format="yyyy-MM-dd HH:mm:ss" placeholder="\u8bf7\u9009\u62e9" style="width: 100%" />
- </el-form-item>
- </el-col>
- </el-row>
- <el-divider content-position="left">\u53d1\u8d27\u65b9</el-divider>
- <el-row :gutter="12">
- <el-col :span="8">
- <el-form-item label="\u53d1\u8d27\u4f01\u4e1a" prop="senderCompany">
- <el-input v-model="form.senderCompany" placeholder="\u8bf7\u8f93\u5165\u53d1\u8d27\u4f01\u4e1a" />
- </el-form-item>
- </el-col>
- <el-col :span="12">
- <el-form-item label="\u6240\u5728\u7701\u5e02\u53bf" prop="senderRegionArr">
- <el-cascader size="large" style="width: 100%" :options="regionOptions" v-model="form.senderRegionArr" clearable @change="handleSenderRegionChange" />
- </el-form-item>
- </el-col>
- <el-col :span="12">
- <el-form-item label="\u8be6\u7ec6\u5730\u5740" prop="senderAddressDetail">
- <el-input v-model="form.senderAddressDetail" placeholder="\u8bf7\u8f93\u5165\u8be6\u7ec6\u5730\u5740" />
- </el-form-item>
- </el-col>
- <el-col :span="6">
- <el-form-item label="\u8054\u7cfb\u4eba" prop="senderContact">
- <el-input v-model="form.senderContact" placeholder="\u8054\u7cfb\u4eba" />
- </el-form-item>
- </el-col>
- <el-col :span="6">
- <el-form-item label="\u8054\u7cfb\u7535\u8bdd" prop="senderPhone">
- <el-input v-model="form.senderPhone" placeholder="\u8054\u7cfb\u7535\u8bdd" />
- </el-form-item>
- </el-col>
- <el-col :span="12">
- <el-form-item label="\u88c5\u8d27\u65f6\u95f4\u8981\u6c42">
- <el-input v-model="form.loadTimeRequire" placeholder="\u5982\uff1a\u4e0a\u53488\u70b9\u524d\u5b8c\u6210\u88c5\u8d27" />
- </el-form-item>
- </el-col>
- </el-row>
- <el-divider content-position="left">\u6536\u8d27\u65b9</el-divider>
- <el-row :gutter="12">
- <el-col :span="8">
- <el-form-item label="\u6536\u8d27\u4f01\u4e1a" prop="receiverCompany">
- <el-input v-model="form.receiverCompany" placeholder="\u8bf7\u8f93\u5165\u6536\u8d27\u4f01\u4e1a" />
- </el-form-item>
- </el-col>
- <el-col :span="12">
- <el-form-item label="\u6240\u5728\u7701\u5e02\u53bf" prop="receiverRegionArr">
- <el-cascader size="large" style="width: 100%" :options="regionOptions" v-model="form.receiverRegionArr" clearable @change="handleReceiverRegionChange" />
- </el-form-item>
- </el-col>
- <el-col :span="12">
- <el-form-item label="\u8be6\u7ec6\u5730\u5740" prop="receiverAddressDetail">
- <el-input v-model="form.receiverAddressDetail" placeholder="\u8bf7\u8f93\u5165\u8be6\u7ec6\u5730\u5740" />
- </el-form-item>
- </el-col>
- <el-col :span="6">
- <el-form-item label="\u8054\u7cfb\u4eba" prop="receiverContact">
- <el-input v-model="form.receiverContact" placeholder="\u8054\u7cfb\u4eba" />
- </el-form-item>
- </el-col>
- <el-col :span="6">
- <el-form-item label="\u8054\u7cfb\u7535\u8bdd" prop="receiverPhone">
- <el-input v-model="form.receiverPhone" placeholder="\u8054\u7cfb\u7535\u8bdd" />
- </el-form-item>
- </el-col>
- <el-col :span="6">
- <el-form-item label="\u8ba1\u5212\u7b7e\u6536" prop="planSignTime">
- <el-date-picker v-model="form.planSignTime" type="datetime" value-format="yyyy-MM-dd HH:mm:ss" placeholder="\u8bf7\u9009\u62e9" style="width: 100%" />
- </el-form-item>
- </el-col>
- </el-row>
- <el-divider content-position="left">\u8d27\u7269\u660e\u7ec6</el-divider>
- <div class="mb8">
- <el-button type="primary" plain size="mini" icon="el-icon-plus" @click="addCargoRow">\u6dfb\u52a0\u8d27\u7269\u884c</el-button>
- </div>
- <el-table :data="form.cargoList" border size="small" show-summary :summary-method="cargoSummaryMethod">
- <el-table-column label="\u5e8f\u53f7" width="60" align="center">
- <template slot-scope="scope">{{ scope.$index + 1 }}</template>
- </el-table-column>
- <el-table-column label="\u8d27\u7269\u540d\u79f0" min-width="140">
- <template slot-scope="scope">
- <el-input v-model="scope.row.cargoName" placeholder="\u8d27\u7269\u540d\u79f0" />
- </template>
- </el-table-column>
- <el-table-column label="\u89c4\u683c\u578b\u53f7" min-width="120">
- <template slot-scope="scope">
- <el-input v-model="scope.row.specModel" placeholder="\u89c4\u683c\u578b\u53f7" />
- </template>
- </el-table-column>
- <el-table-column label="\u5355\u4f4d" width="90">
- <template slot-scope="scope">
- <el-input v-model="scope.row.unit" placeholder="\u5355\u4f4d" />
- </template>
- </el-table-column>
- <el-table-column label="\u6570\u91cf" width="120" align="right">
- <template slot-scope="scope">
- <el-input-number v-model="scope.row.quantity" :min="0" :precision="2" controls-position="right" style="width: 100%" @change="recalcCargoTotals" />
- </template>
- </el-table-column>
- <el-table-column label="\u91cd\u91cf(kg)" width="120" align="right">
- <template slot-scope="scope">
- <el-input-number v-model="scope.row.weightKg" :min="0" :precision="2" controls-position="right" style="width: 100%" @change="recalcCargoTotals" />
- </template>
- </el-table-column>
- <el-table-column label="\u4f53\u79ef(m\u00b3)" width="120" align="right">
- <template slot-scope="scope">
- <el-input-number v-model="scope.row.volumeM3" :min="0" :precision="3" controls-position="right" style="width: 100%" @change="recalcCargoTotals" />
- </template>
- </el-table-column>
- <el-table-column label="\u8d27\u503c(\u5143)" width="130" align="right">
- <template slot-scope="scope">
- <el-input-number v-model="scope.row.cargoValue" :min="0" :precision="2" controls-position="right" style="width: 100%" @change="recalcCargoTotals" />
- </template>
- </el-table-column>
- <el-table-column label="\u64cd\u4f5c" width="70" align="center">
- <template slot-scope="scope">
- <el-button type="text" size="mini" @click="removeCargoRow(scope.$index)">\u5220</el-button>
- </template>
- </el-table-column>
- </el-table>
- <el-divider content-position="left">\u8fd0\u8f93\u8981\u6c42</el-divider>
- <el-row :gutter="12">
- <el-col :span="6">
- <el-form-item label="\u6e29\u5ea6\u4e0a\u9650(\u2103)">
- <el-input-number v-model="form.tempMax" :precision="1" controls-position="right" style="width: 100%" />
- </el-form-item>
- </el-col>
- <el-col :span="6">
- <el-form-item label="\u6e29\u5ea6\u4e0b\u9650(\u2103)">
- <el-input-number v-model="form.tempMin" :precision="1" controls-position="right" style="width: 100%" />
- </el-form-item>
- </el-col>
- <el-col :span="6">
- <el-form-item label="\u6e7f\u5ea6\u8981\u6c42">
- <el-input v-model="form.humidityRequire" placeholder="\u5982\uff1a60%-70%" />
- </el-form-item>
- </el-col>
- <el-col :span="24">
- <el-form-item label="\u8fd0\u8f93\u7279\u6b8a\u8bf4\u660e">
- <el-input v-model="form.transportSpecialNote" type="textarea" :rows="2" placeholder="\u8bf7\u8f93\u5165\u8fd0\u8f93\u7279\u6b8a\u8bf4\u660e" />
- </el-form-item>
- </el-col>
- <el-col :span="24">
- <el-form-item label="\u8fd0\u8f93\u6807\u7b7e">
- <el-checkbox v-model="form.labelTempRecord" :true-label="1" :false-label="0">\u6e29\u5ea6\u8bb0\u5f55</el-checkbox>
- <el-checkbox v-model="form.labelFragile" :true-label="1" :false-label="0">\u6613\u788e\u54c1</el-checkbox>
- <el-checkbox v-model="form.labelShockproof" :true-label="1" :false-label="0">\u9632\u9707</el-checkbox>
- <el-checkbox v-model="form.labelMoistureproof" :true-label="1" :false-label="0">\u9632\u6f6e</el-checkbox>
- </el-form-item>
- </el-col>
- </el-row>
- <el-divider content-position="left">\u8d44\u6e90\u5206\u914d</el-divider>
- <el-row :gutter="12">
- <el-col :span="6">
- <el-form-item label="\u7269\u6d41\u7ebf\u8def" prop="lineNum">
- <el-select v-model="form.lineNum" placeholder="\u8bf7\u9009\u62e9\u7269\u6d41\u7ebf\u8def" filterable clearable style="width: 100%" @change="handleLineChange">
- <el-option v-for="line in lineList" :key="line.lineNum" :label="line.lineNum + ' - ' + line.lineName" :value="line.lineNum" />
- </el-select>
- </el-form-item>
- </el-col>
- <el-col :span="6">
- <el-form-item label="\u7ebf\u8def\u540d\u79f0">
- <el-input v-model="form.lineName" readonly />
- </el-form-item>
- </el-col>
- <el-col :span="6">
- <el-form-item label="\u8f66\u724c\u53f7">
- <el-input v-model="form.carNum" readonly />
- </el-form-item>
- </el-col>
- <el-col :span="6">
- <el-form-item label="\u8f66\u578b">
- <el-input v-model="form.carModel" readonly />
- </el-form-item>
- </el-col>
- <el-col :span="6">
- <el-form-item label="\u53f8\u673a\u59d3\u540d">
- <el-input v-model="form.driverName" readonly />
- </el-form-item>
- </el-col>
- <el-col :span="6">
- <el-form-item label="\u53f8\u673a\u7535\u8bdd">
- <el-input v-model="form.driverPhone" readonly />
- </el-form-item>
- </el-col>
- <el-col :span="6">
- <el-form-item label="\u9884\u4f30\u91cc\u7a0b(km)">
- <el-input v-model="form.estimateDistance" readonly />
- </el-form-item>
- </el-col>
- </el-row>
- </el-form>
- <div slot="footer" class="dialog-footer">
- <div class="submit-tip">\u63d0\u4ea4\u540e\u5c06\u8fdb\u5165\u5f85\u5ba1\u6838\u72b6\u6001\uff0c\u5ba1\u6838\u901a\u8fc7\u540e\u4e0d\u53ef\u4fee\u6539</div>
- <el-button type="primary" @click="submitForm">\u63d0 \u4ea4</el-button>
- <el-button @click="cancel">\u53d6 \u6d88</el-button>
- </div>
- </el-dialog>
- </div>
- </template>
- '''
- # fmt: on
- SCRIPT = r'''
- <script>
- import {
- listWaybill,
- getWaybill,
- addWaybill,
- updateWaybill,
- approveWaybill,
- delWaybill,
- previewWaybillNo
- } from "@/api/basic/waybill";
- import { getLogisticsList } from "@/api/baseInfo/logistics";
- import { getFindByKey } from "@/utils";
- import { regionData, CodeToText, TextToCode } from "element-plus-china-area";
- import WaybillDetail from "./components/WaybillDetail";
- export default {
- name: "TransportWaybill",
- components: { WaybillDetail },
- data() {
- return {
- loading: false,
- showSearch: true,
- total: 0,
- waybillList: [],
- ids: [],
- single: true,
- multiple: true,
- open: false,
- detailOpen: false,
- detailData: null,
- title: "",
- lineList: [],
- regionOptions: regionData,
- transportTypeOptions: ["\u51b7\u94fe\u8fd0\u8f93", "\u5e38\u6e29\u8fd0\u8f93", "\u6574\u8f66\u8fd0\u8f93", "\u96f6\u62c5\u8fd0\u8f93"],
- auditStatusOptions: [
- { value: 0, label: "\u8349\u7a3f" },
- { value: 1, label: "\u5f85\u5ba1\u6838" },
- { value: 2, label: "\u5df2\u901a\u8fc7" }
- ],
- queryParams: {
- pageNum: 1,
- pageSize: 10,
- waybillNo: undefined,
- transportType: undefined,
- senderCompany: undefined,
- receiverCompany: undefined,
- auditStatus: undefined
- },
- form: {},
- cargoTotals: { quantity: 0, weightKg: 0, volumeM3: 0, cargoValue: 0 },
- rules: {
- transportType: [{ required: true, message: "\u8bf7\u9009\u62e9\u8fd0\u8f93\u7c7b\u578b", trigger: "change" }],
- documentDate: [{ required: true, message: "\u8bf7\u9009\u62e9\u5355\u636e\u65e5\u671f", trigger: "change" }],
- planDepartTime: [{ required: true, message: "\u8bf7\u9009\u62e9\u9884\u8ba1\u53d1\u8f66\u65f6\u95f4", trigger: "change" }],
- planArriveTime: [{ required: true, message: "\u8bf7\u9009\u62e9\u9884\u8ba1\u5230\u8fbe\u65f6\u95f4", trigger: "change" }],
- senderCompany: [{ required: true, message: "\u53d1\u8d27\u4f01\u4e1a\u4e0d\u80fd\u4e3a\u7a7a", trigger: "blur" }],
- senderRegionArr: [{ required: true, message: "\u8bf7\u9009\u62e9\u53d1\u8d27\u7701\u5e02\u533a", trigger: "change" }],
- receiverCompany: [{ required: true, message: "\u6536\u8d27\u4f01\u4e1a\u4e0d\u80fd\u4e3a\u7a7a", trigger: "blur" }],
- receiverRegionArr: [{ required: true, message: "\u8bf7\u9009\u62e9\u6536\u8d27\u7701\u5e02\u533a", trigger: "change" }]
- }
- };
- },
- created() {
- this.getList();
- this.loadLineList();
- },
- methods: {
- auditStatusLabel(status) {
- const map = { 0: "\u8349\u7a3f", 1: "\u5f85\u5ba1\u6838", 2: "\u5df2\u901a\u8fc7" };
- return map[status] != null ? map[status] : "-";
- },
- auditTagType(status) {
- const map = { 0: "info", 1: "warning", 2: "success" };
- return map[status] || "info";
- },
- canEdit(row) {
- return row.auditStatus === 0 || row.auditStatus === 1;
- },
- loadLineList() {
- getLogisticsList({}).then((res) => {
- this.lineList = res.data || [];
- });
- },
- getList() {
- this.loading = true;
- listWaybill(this.queryParams).then((res) => {
- this.waybillList = res.rows || [];
- this.total = res.total || 0;
- this.loading = false;
- }).catch(() => { this.loading = false; });
- },
- buildEmptyCargoRow() {
- return { cargoName: "", specModel: "", unit: "", quantity: undefined, weightKg: undefined, volumeM3: undefined, cargoValue: undefined };
- },
- reset() {
- this.form = {
- id: undefined, waybillNo: "", transportType: undefined,
- documentDate: this.parseTime(new Date(), "{y}-{m}-{d}"),
- planDepartTime: undefined, planArriveTime: undefined, remark: "",
- senderCompany: "", senderRegionArr: [], senderProvince: "", senderCity: "", senderDistrict: "",
- senderAddressDetail: "", senderContact: "", senderPhone: "", loadTimeRequire: "",
- receiverCompany: "", receiverRegionArr: [], receiverProvince: "", receiverCity: "", receiverDistrict: "",
- receiverAddressDetail: "", receiverContact: "", receiverPhone: "", planSignTime: undefined,
- tempMax: undefined, tempMin: undefined, humidityRequire: "", transportSpecialNote: "",
- labelTempRecord: 0, labelFragile: 0, labelShockproof: 0, labelMoistureproof: 0,
- lineNum: undefined, lineName: "", carNum: "", carModel: "", driverName: "", driverPhone: "",
- estimateDistance: undefined, auditStatus: 1, cargoList: [this.buildEmptyCargoRow()]
- };
- this.recalcCargoTotals();
- this.resetForm("form");
- },
- fillForm(data) {
- this.form = Object.assign(this.resetFormData(), data || {});
- if (!this.form.cargoList || !this.form.cargoList.length) {
- this.form.cargoList = [this.buildEmptyCargoRow()];
- }
- this.$set(this.form, "senderRegionArr", this.textToRegionArr(this.form.senderProvince, this.form.senderCity, this.form.senderDistrict));
- this.$set(this.form, "receiverRegionArr", this.textToRegionArr(this.form.receiverProvince, this.form.receiverCity, this.form.receiverDistrict));
- this.recalcCargoTotals();
- },
- resetFormData() {
- return { cargoList: [this.buildEmptyCargoRow()], senderRegionArr: [], receiverRegionArr: [], labelTempRecord: 0, labelFragile: 0, labelShockproof: 0, labelMoistureproof: 0 };
- },
- getCodeToText(codeStr, codeArray) {
- if (codeStr == null && codeArray == null) return "";
- const arr = codeArray || (codeStr ? codeStr.split(",") : []);
- if (!arr.length) return "";
- let area = "";
- switch (arr.length) {
- case 1: area += CodeToText[arr[0]]; break;
- case 2: area += CodeToText[arr[0]] + "/" + CodeToText[arr[1]]; break;
- case 3: area += CodeToText[arr[0]] + "/" + CodeToText[arr[1]] + "/" + CodeToText[arr[2]]; break;
- default: break;
- }
- return area;
- },
- applyRegionText(prefix, codeArray) {
- const parts = (this.getCodeToText(null, codeArray) || "").split("/");
- this.form[prefix + "Province"] = parts[0] || "";
- this.form[prefix + "City"] = parts[1] || "";
- this.form[prefix + "District"] = parts[2] || "";
- },
- textToRegionArr(province, city, district) {
- const arr = [];
- if (!province) return arr;
- try {
- const provinceNode = TextToCode[province];
- if (!provinceNode || !provinceNode.code) return arr;
- arr.push(provinceNode.code);
- if (city && provinceNode[city] && provinceNode[city].code) {
- const cityNode = provinceNode[city];
- arr.push(cityNode.code);
- if (district && cityNode[district] && cityNode[district].code) {
- arr.push(cityNode[district].code);
- }
- }
- } catch (e) { return []; }
- return arr;
- },
- handleSenderRegionChange(value) {
- this.form.senderRegionArr = value || [];
- this.applyRegionText("sender", this.form.senderRegionArr);
- },
- handleReceiverRegionChange(value) {
- this.form.receiverRegionArr = value || [];
- this.applyRegionText("receiver", this.form.receiverRegionArr);
- },
- syncRegionFieldsBeforeSubmit() {
- this.applyRegionText("sender", this.form.senderRegionArr);
- this.applyRegionText("receiver", this.form.receiverRegionArr);
- },
- handleQuery() { this.queryParams.pageNum = 1; this.getList(); },
- resetQuery() { this.resetForm("queryForm"); this.handleQuery(); },
- handleSelectionChange(selection) {
- this.ids = selection.map((item) => item.id);
- this.single = selection.length !== 1;
- this.multiple = !selection.length;
- },
- handleAdd() {
- this.reset();
- previewWaybillNo().then((res) => { this.form.waybillNo = res.data || ""; });
- this.open = true;
- this.title = "\u65b0\u589e\u8fd0\u5355";
- },
- handleView(row) {
- const id = row.id || this.ids[0];
- getWaybill(id).then((res) => {
- this.detailData = res.data || {};
- this.detailOpen = true;
- });
- },
- handleUpdate(row) {
- const id = row.id || this.ids[0];
- getWaybill(id).then((res) => { this.fillForm(res.data); this.open = true; this.title = "\u4fee\u6539\u8fd0\u5355"; });
- },
- handleApprove(row) {
- const id = row && row.id ? row.id : this.ids[0];
- if (!id) { this.$modal.msgWarning("\u8bf7\u9009\u62e9\u8981\u5ba1\u6838\u7684\u8bb0\u5f55"); return; }
- const target = row || this.waybillList.find((item) => item.id === id);
- if (target && target.auditStatus !== 1) { this.$modal.msgWarning("\u4ec5\u5f85\u5ba1\u6838\u72b6\u6001\u53ef\u5ba1\u6838\u901a\u8fc7"); return; }
- this.$modal.confirm('\u786e\u8ba4\u5ba1\u6838\u901a\u8fc7\u8fd0\u5355"' + (target ? target.waybillNo : id) + '"\u5417\uff1f').then(() => approveWaybill(id)).then(() => {
- this.$modal.msgSuccess("\u5ba1\u6838\u6210\u529f");
- this.getList();
- }).catch(() => {});
- },
- handleLineChange(lineNum) {
- const item = getFindByKey(this.lineList, lineNum, "lineNum");
- if (!item) {
- this.form.lineName = ""; this.form.carNum = ""; this.form.carModel = "";
- this.form.driverName = ""; this.form.driverPhone = ""; this.form.estimateDistance = undefined;
- return;
- }
- this.form.lineName = item.lineName;
- this.form.carNum = item.carNum;
- this.form.carModel = item.carModel;
- this.form.driverName = item.driverName;
- this.form.driverPhone = item.phone;
- this.form.estimateDistance = item.totalMileage;
- },
- addCargoRow() { this.form.cargoList.push(this.buildEmptyCargoRow()); },
- removeCargoRow(index) {
- this.form.cargoList.splice(index, 1);
- if (!this.form.cargoList.length) this.form.cargoList.push(this.buildEmptyCargoRow());
- this.recalcCargoTotals();
- },
- sumField(list, field) {
- return (list || []).reduce((sum, row) => sum + Number(row[field] || 0), 0);
- },
- recalcCargoTotals() {
- const list = this.form.cargoList || [];
- this.cargoTotals = {
- quantity: this.sumField(list, "quantity"),
- weightKg: this.sumField(list, "weightKg"),
- volumeM3: this.sumField(list, "volumeM3"),
- cargoValue: this.sumField(list, "cargoValue")
- };
- this.form.totalQuantity = this.cargoTotals.quantity;
- this.form.totalWeight = this.cargoTotals.weightKg;
- this.form.totalVolume = this.cargoTotals.volumeM3;
- this.form.totalValue = this.cargoTotals.cargoValue;
- },
- cargoSummaryMethod({ columns }) {
- const sums = [];
- columns.forEach((column, index) => {
- if (index === 0) { sums[index] = "\u5408\u8ba1"; return; }
- if (column.label === "\u6570\u91cf") sums[index] = this.formatNum(this.cargoTotals.quantity, 2);
- else if (column.label === "\u91cd\u91cf(kg)") sums[index] = this.formatNum(this.cargoTotals.weightKg, 2);
- else if (column.label === "\u4f53\u79ef(m\u00b3)") sums[index] = this.formatNum(this.cargoTotals.volumeM3, 3);
- else if (column.label === "\u8d27\u503c(\u5143)") sums[index] = this.formatNum(this.cargoTotals.cargoValue, 2);
- else sums[index] = "";
- });
- return sums;
- },
- formatNum(val, precision) { return Number(val || 0).toFixed(precision); },
- validateCargoList() {
- const list = (this.form.cargoList || []).filter((row) => row.cargoName || row.unit || row.quantity);
- if (!list.length) { this.$modal.msgError("\u8bf7\u81f3\u5c11\u6dfb\u52a0\u4e00\u6761\u8d27\u7269\u660e\u7ec6"); return false; }
- for (let i = 0; i < list.length; i++) {
- const row = list[i];
- if (!row.cargoName) { this.$modal.msgError("\u7b2c" + (i + 1) + "\u884c\u8d27\u7269\u540d\u79f0\u4e0d\u80fd\u4e3a\u7a7a"); return false; }
- if (!row.unit) { this.$modal.msgError("\u7b2c" + (i + 1) + "\u884c\u5355\u4f4d\u4e0d\u80fd\u4e3a\u7a7a"); return false; }
- if (!row.quantity || Number(row.quantity) <= 0) { this.$modal.msgError("\u7b2c" + (i + 1) + "\u884c\u6570\u91cf\u5fc5\u987b\u5927\u4e8e0"); return false; }
- }
- this.form.cargoList = list;
- return true;
- },
- buildPayload() {
- this.syncRegionFieldsBeforeSubmit();
- this.recalcCargoTotals();
- return {
- ...this.form,
- auditStatus: this.form.auditStatus != null ? this.form.auditStatus : 1,
- cargoList: (this.form.cargoList || []).map((row, index) => ({
- id: row.id, cargoName: row.cargoName, specModel: row.specModel, unit: row.unit,
- quantity: row.quantity, weightKg: row.weightKg, volumeM3: row.volumeM3, cargoValue: row.cargoValue, sortOrder: index
- }))
- };
- },
- submitForm() {
- this.$refs.form.validate((valid) => {
- if (!valid) return;
- if (!this.validateCargoList()) return;
- const payload = this.buildPayload();
- const request = payload.id ? updateWaybill(payload) : addWaybill(payload);
- this.$modal.confirm("\u786e\u8ba4\u63d0\u4ea4\u8fd0\u5355\u5417\uff1f").then(() => request).then(() => {
- this.$modal.msgSuccess("\u63d0\u4ea4\u6210\u529f");
- this.open = false;
- this.getList();
- }).catch(() => {});
- });
- },
- cancel() { this.open = false; },
- onDialogClosed() { this.reset(); },
- handleDelete(row) {
- const ids = row && row.id ? row.id : this.ids.join(",");
- if (!ids) return;
- const nos = row && row.waybillNo ? row.waybillNo : ids;
- this.$modal.confirm('\u662f\u5426\u786e\u8ba4\u5220\u9664\u8fd0\u5355\u7f16\u53f7\u4e3a"' + nos + '"\u7684\u6570\u636e\u9879\uff1f').then(() => delWaybill(ids)).then(() => {
- this.$modal.msgSuccess("\u5220\u9664\u6210\u529f");
- this.getList();
- }).catch(() => {});
- }
- }
- };
- </script>
- <style scoped lang="scss">
- .submit-tip { float: left; line-height: 32px; font-size: 12px; color: #e6a23c; }
- .dialog-footer { overflow: hidden; }
- </style>
- <style lang="scss">
- .waybill-detail-dialog .el-dialog__body {
- padding: 12px 20px 8px;
- max-height: calc(100vh - 140px);
- overflow-y: auto;
- }
- </style>
- '''
- def main():
- content = VUE.encode("utf-8").decode("unicode_escape") + SCRIPT.encode("utf-8").decode("unicode_escape")
- os.makedirs(os.path.dirname(OUT), exist_ok=True)
- with open(OUT, "w", encoding="utf-8", newline="\n") as f:
- f.write(content)
- print("written", OUT, len(content))
- if __name__ == "__main__":
- main()
|