From 3849263b31a16a91ff08acaa42786ecfde76f33c Mon Sep 17 00:00:00 2001
From: zhangback <zhangback@163.com>
Date: 星期四, 27 十一月 2025 20:18:08 +0800
Subject: [PATCH] 提交
---
ui/admin-ui3/src/views/tms/collectionTmsQuoteDetail/index.vue | 630 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++
1 files changed, 630 insertions(+), 0 deletions(-)
diff --git a/ui/admin-ui3/src/views/tms/collectionTmsQuoteDetail/index.vue b/ui/admin-ui3/src/views/tms/collectionTmsQuoteDetail/index.vue
new file mode 100644
index 0000000..1fda4f8
--- /dev/null
+++ b/ui/admin-ui3/src/views/tms/collectionTmsQuoteDetail/index.vue
@@ -0,0 +1,630 @@
+<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="success"
+ icon="Edit"
+ :disabled="pageF.single"
+ v-hasPermi="['tms:tmsQuoteDetail:edit']"
+ @click="handleUpdate">淇敼
+ </el-button>
+ <el-button
+ type="danger"
+ icon="Delete"
+ :disabled="pageF.multiple"
+ @click="handleDelete"
+ v-hasPermi="['tms:tmsQuoteDetail:remove']"
+ >鍒犻櫎
+ </el-button>
+ <el-button
+ type="warning"
+ plain
+ icon="Download"
+ @click="handleExport"
+ v-hasPermi="['tms:tmsQuoteDetail:export']"
+ >瀵煎嚭
+ </el-button>
+ <el-button
+ type="default"
+ plain
+ icon="Back"
+ @click="handleBack"
+ >杩斿洖
+ </el-button>
+ </template>
+ <template #items-form="scope">
+ <avue-crud
+ :option="{...itemsTableOption,selection: !scope.disabled}" @selection-change="selectionChange2"
+
+ :data="form.items" ref="itemsCrudRef"
+ >
+ <template #freightPrice="{row}">
+ <el-input v-model="row.freightPrice" :min="1" :disabled="scope.disabled || !rowKeys.includes(row.rowKey)" type="number" placeholder="璇疯緭鍏ラ噾棰�"></el-input>
+ </template>
+ <template #currency="{row}">
+ <el-radio-group v-model="row.currency" :disabled="scope.disabled || !rowKeys.includes(row.rowKey)">
+ <el-radio
+ v-for="dict in sys_currency"
+ :key="dict.value"
+ :label="dict.value"
+ >{{ dict.label }}</el-radio>
+ </el-radio-group>
+ </template>
+
+ </avue-crud>
+ </template>
+ </avue-crud>
+
+
+ </basicContainer>
+</template>
+
+<script setup name="tmsQuoteDetail" lang="ts">
+import {
+ TmsQuoteDetailI,
+ addTmsQuoteDetail,
+ delTmsQuoteDetail,
+ exportTmsQuoteDetail,
+ getTmsQuoteDetail,
+ listTmsQuoteDetail,
+ updateTmsQuoteDetail
+} from "@/api/tms/tmsQuoteDetail";
+import useCurrentInstance from "@/utils/useCurrentInstance";
+import {computed, reactive, ref, toRefs,onBeforeMount} from "vue";
+import {PagesInterface, PageQueryInterface} from "@/utils/globalInterface";
+import {usePagePlus} from "@/hooks/usePagePlus";
+import {hasPermission} from "@/utils/permissionUtils";
+import {getTmsServiceProvider, listTmsServiceProvider} from "@/api/tms/tmsServiceProvider";
+import {getArea, getCity, getProvince, getStreet} from "@/api/tms/tmsRegion";
+import {useRoute,useRouter } from "vue-router";
+import {randomId} from "@smallwei/avue";
+
+const {proxy} = useCurrentInstance();
+const crudRef = ref();
+const route = useRoute();
+const router = useRouter();
+
+const {vehicle_type,sys_currency} =
+ proxy.useDict("vehicle_type","sys_currency");
+
+const permissionList = computed(() => {
+ return {
+ addBtn: hasPermission(["tms:tmsQuoteDetail:add"]),
+ delBtn: hasPermission(["tms:tmsQuoteDetail:remove"]),
+ editBtn: hasPermission(["tms:tmsQuoteDetail:edit"]),
+ viewBtn: hasPermission(["tms:tmsQuoteDetail:query"]),
+ }
+})
+
+const data = reactive({
+ form: <TmsQuoteDetailI>{},
+ queryParams: <TmsQuoteDetailI & PageQueryInterface>{},
+ page: <PagesInterface>{
+ pageSize: 10,
+ total: 0,
+ currentPage: 1,
+ },
+ selectionList: [],
+ selectionList2:<any>[]
+})
+const {queryParams, form, page, selectionList,selectionList2} = toRefs(data);
+const option = ref({
+ pageKey: 'TmsQuoteDetail',
+ rowKey: 'id',
+ labelWidth: 120,
+ group:[
+ {
+ label:"鍩虹淇℃伅",
+ prop: 'jcxx',
+ column:{
+ systemCode: {
+ label: '绯荤粺缂栧彿',
+ addDisplay: false,
+ editDisplay: false,
+ viewDisplay: true,
+ },
+ quotePlanCode: {
+ label: '鍏宠仈鎶ヤ环鏂规缂栧彿',
+ addDisplay: false,
+ editDisplay: false,
+ viewDisplay: true,
+ },
+
+ startRegionCode: {
+ label: '璧风偣琛屾斂鍖哄煙',
+ addDisplay: true,
+ editDisplay: true,dataType: 'string',
+ viewDisplay: true,checkStrictly:true,
+ type:'cascader',
+ rules: [
+ {
+ required: true,
+ message: "璧风偣琛屾斂鍖哄煙涓嶈兘涓虹┖", trigger: "blur"
+ }
+ ],
+ lazy: true,
+ props: {
+ label: 'name',
+ value: 'code'
+ },
+ change:({value=[]}:{value:any})=>{
+ if (value && value.length>0){
+ const cascader = crudRef.value?.getPropRef?.('startRegionCode')?.$refs?.temp;
+ console.log('cascader.getCheckedNodes()',cascader.getCheckedNodes())
+ if (cascader.getCheckedNodes() && cascader.getCheckedNodes().length >0){
+
+ form.value.startRegionCode= cascader.getCheckedNodes()[0].pathValues.toString();
+ form.value.startRegion= cascader.getCheckedNodes()[0].text!;
+ form.value.transportRoute = `${form.value.startRegion}->${form.value.endRegion}`;
+ }
+ }
+ },
+ lazyLoad (node:any, resolve:any) {
+ const stopLevel = 3;
+ const level = node.level;
+ const data = node.data || {};
+ const code = data.code;
+ let list:any = [];
+ const callback = () => {
+ resolve((list || []).map((ele:any) => ({
+ ...ele,
+ leaf: level >= stopLevel
+ })));
+ };
+ if (level === 0) {
+ getProvince().then(res => {
+ list = res.data || [];
+ callback();
+ });
+ } else if (level === 1) {
+ getCity(code).then(res => {
+ list = res.data ||[];
+ callback();
+ });
+ } else if (level === 2) {
+ getArea(code).then(res => {
+ list = res.data || [];
+ callback();
+ });
+ }else if (level === 3) {
+ getStreet(code).then(res => {
+ list = res.data || [];
+ callback();
+ });
+ } else {
+ callback();
+ }
+ }
+ },
+ // startWarehouse: {
+ // label: '璧风偣浠撳簱',
+ // addDisplay: true,
+ // editDisplay: true,
+ // viewDisplay: true,
+ // type: 'select', dataType: 'string', dicUrl: '/system/dict/data/type/sys_warehouse',
+ //
+ // },
+ endRegionCode: {
+ label: '缁堢偣琛屾斂鍖哄煙',
+ addDisplay: true,
+ editDisplay: true,
+ viewDisplay: true,dataType: 'string',
+ type:'cascader',checkStrictly:true,
+ rules: [
+ {
+ required: true,
+ message: "缁堢偣琛屾斂鍖哄煙涓嶈兘涓虹┖", trigger: "blur"
+ }
+ ],
+ lazy: true,
+ props: {
+ label: 'name',
+ value: 'code'
+ },
+ change:({value=[]}:{value:any})=>{
+ if (value && value.length>0){
+ const cascader = crudRef.value?.getPropRef?.('endRegionCode')?.$refs?.temp;
+ if (cascader.getCheckedNodes() && cascader.getCheckedNodes().length >0){
+ form.value.endRegionCode= cascader.getCheckedNodes()[0].pathValues.toString();
+ form.value.endRegion= cascader.getCheckedNodes()[0].text!;
+ form.value.transportRoute = `${form.value.startRegion}->${form.value.endRegion}`;
+ }
+ }
+ },
+ lazyLoad (node:any, resolve:any) {
+ const stopLevel = 3;
+ const level = node.level;
+ const data = node.data || {};
+ const code = data.code;
+ let list:any = [];
+ const callback = () => {
+ resolve((list || []).map((ele:any) => ({
+ ...ele,
+ leaf: level >= stopLevel
+ })));
+ };
+ if (level === 0) {
+ getProvince().then(res => {
+ list = res.data || [];
+ callback();
+ });
+ } else if (level === 1) {
+ getCity(code).then(res => {
+ list = res.data ||[];
+ callback();
+ });
+ } else if (level === 2) {
+ getArea(code).then(res => {
+ list = res.data || [];
+ callback();
+ });
+ }else if (level === 3) {
+ getStreet(code).then(res => {
+ list = res.data || [];
+ callback();
+ });
+ } else {
+ callback();
+ }
+ }
+ },
+ // endWarehouse: {
+ // label: '缁堢偣浠撳簱',
+ // addDisplay: true,
+ // editDisplay: true,
+ // viewDisplay: true,
+ // type: 'select', dataType: 'string', dicUrl: '/system/dict/data/type/sys_warehouse',
+ //
+ // },
+ transportRoute: {
+ label: '杩愯緭绾胯矾',span:24,
+ disabled: true,
+ // type: 'textarea', minRows: 3, maxRows: 5,
+ addDisplay: true,
+ editDisplay: true,
+ viewDisplay: true,
+ hide: false,
+ search: true,
+ rules: [
+ {
+ required: true,
+ message: "杩愯緭绾胯矾涓嶈兘涓虹┖", trigger: "blur"
+ }
+ ],
+ },
+ vehicleType: {
+ label: '杞﹀瀷',
+ addDisplay: false,
+ editDisplay: true,
+ viewDisplay: true,
+ type: 'select', dataType: 'string', dicUrl: '/system/dict/data/type/vehicle_type',
+ rules: [
+ {
+ required: true,
+ message: "杞﹀瀷涓嶈兘涓虹┖", trigger: "change"
+ }
+ ],
+ },
+ // transportMode: {
+ // label: '杩愯緭鏂瑰紡',
+ // addDisplay: true,
+ // editDisplay: true,
+ // viewDisplay: true,
+ // type: 'select', dataType: 'string', dicUrl: '/system/dict/data/type/transport_mode',
+ //
+ // },
+ // routeType: {
+ // label: '绾胯矾绫诲瀷',
+ // addDisplay: true,
+ // editDisplay: true,
+ // viewDisplay: true,
+ // type: 'select', dataType: 'string', dicUrl: '/system/dict/data/type/route_type',
+ //
+ // },
+ freightPrice: {
+ label: '杩愯垂鎶ヤ环',
+ addDisplay: false,
+ editDisplay: true,
+ viewDisplay: true,type: 'number',
+ rules: [
+ {
+ required: true,
+ message: "杩愯垂鎶ヤ环涓嶈兘涓虹┖", trigger: "blur"
+ }
+ ],
+ },
+ }
+ },
+ {
+ label: '杞﹀瀷鎶ヤ环',
+ prop: 'cxbj', addDisplay: true,editDisplay: false,viewDisplay: false,
+ column: {
+ items:{
+ label: '',labelWidth:0,span:24,
+ }
+ }
+ },
+
+ {
+ label: '鍏朵粬淇℃伅',
+ prop: 'qtxx',
+ column: {
+ status: {
+ label: '鐘舵��',
+ type: 'radio', dicUrl: '/system/dict/data/type/sys_normal_disable',
+ addDisplay: false,dataType:'string',
+ editDisplay: true,
+ viewDisplay: true,
+ hide: false,
+ search: true,
+ rules: [
+ {
+ required: true,
+ message: "鐘舵�佷笉鑳戒负绌�", trigger: "blur"
+ }
+ ],
+ },
+ createBy: {
+ label: '鍒涘缓浜�',
+ addDisplay: false,
+ editDisplay: false,
+ viewDisplay: true,
+ hide: true,
+ search: false,
+ },
+ createTime: {
+ label: '鍒涘缓鏃堕棿',
+ type: 'date', valueFormat: 'YYYY-MM-DD',
+ addDisplay: false,
+ editDisplay: false,
+ viewDisplay: true,
+ hide: true,
+ search: false,
+ },
+ updateBy: {
+ label: '鏇存柊浜�',
+ addDisplay: false,
+ editDisplay: false,
+ viewDisplay: true,
+ hide: false,
+ search: false,
+ },
+ updateTime: {
+ label: '鏇存柊鏃堕棿',
+ type: 'date', valueFormat: 'YYYY-MM-DD',
+ addDisplay: false,
+ editDisplay: false,
+ viewDisplay: true,
+ hide: false,
+ search: false,
+ },
+ remark: {
+ label: '澶囨敞',
+ type: 'textarea', minRows: 3, maxRows: 5,
+ addDisplay: true,span:24,
+ editDisplay: true,
+ viewDisplay: true,
+ hide: true,
+ search: false,
+ },
+ }
+ }
+ ],
+ column: {
+ systemCode: {
+ label: '绯荤粺缂栧彿',minWidth:150,
+ display: false,
+ hide: false,
+ search: true,
+ },
+ quotePlanCode: {
+ label: '鎶ヤ环鏂规缂栧彿',minWidth:150,
+ display: false,
+ },
+ // vehicleProviderName: {
+ // label: '杞﹁締鏈嶅姟鍟�',minWidth:150,
+ // display: false,
+ // hide: quotePlanType.value != 1,
+ // search: quotePlanType.value == 1,
+ // },
+ transportRoute: {
+ label: '杩愯緭绾胯矾',minWidth:150,
+ display: false,overHidden: true,
+ hide: false,
+ },
+ startRegion: {
+ label: '璧风偣琛屾斂鍖哄煙',
+ display: false,minWidth:150,
+ hide: false,overHidden: true,
+ search: false,
+ },
+ // startWarehouse: {
+ // label: '璧风偣浠撳簱', display: false,
+ // hide: false,minWidth:150,
+ // search: true,
+ // type: 'select', dataType: 'string', dicUrl: '/system/dict/data/type/sys_warehouse',
+ //
+ // },
+ endRegion: {
+ label: '缁堢偣琛屾斂鍖哄煙',overHidden: true,
+ display: false,minWidth:150,
+ hide: false,
+ },
+ // endWarehouse: {
+ // label: '缁堢偣浠撳簱',
+ // display: false,minWidth:150,
+ // type: 'select', dataType: 'string', dicUrl: '/system/dict/data/type/sys_warehouse',
+ // search: true,
+ // },
+ vehicleType: {
+ label: '杞﹀瀷',
+ display: false,minWidth:150,
+ type: 'select', dataType: 'string', dicUrl: '/system/dict/data/type/vehicle_type',
+ search: true,
+ },
+ // transportMode: {
+ // label: '杩愯緭鏂瑰紡',minWidth:150,
+ // display: false,
+ // hide: false,
+ // search: true,
+ // type: 'select', dataType: 'string', dicUrl: '/system/dict/data/type/transport_mode',
+ //
+ // },
+ // routeType: {
+ // label: '绾胯矾绫诲瀷',
+ // display: false,
+ // hide: false,minWidth:150,
+ // search: true,
+ // type: 'select', dataType: 'string', dicUrl: '/system/dict/data/type/route_type',
+ //
+ // },
+ freightPrice: {
+ label: '杩愯垂鎶ヤ环',
+ display: false,
+ hide: false,minWidth:150,
+ },
+ currency: {
+ label: '甯佸埗',
+ display: false,
+ hide: false,minWidth:150,
+ search: true,
+ type: 'select', dataType: 'string', dicUrl: '/system/dict/data/type/sys_currency',
+
+ },
+ status: {
+ label: '鐘舵��',
+ type: 'radio',dataType:'string', dicUrl: '/system/dict/data/type/sys_normal_disable',
+ display: false,
+ hide: false,
+ search: true,minWidth:150,
+ },
+ updateBy: {
+ label: '鏇存柊浜�',
+ display: false,minWidth:150,
+ },
+ updateTime: {
+ label: '鏇存柊鏃堕棿',
+ display: false,minWidth:180,
+ },
+ }
+})
+
+const itemsTableOption = ref({
+ pageKey: 'itemsTable',
+ rowKey: 'rowKey',
+ header: false,
+ addBtn: false,menu: false,
+ column:{
+ vehicleType:{
+ label: '杞﹀瀷',
+ type: 'select', dataType: 'string', dicUrl: '/system/dict/data/type/vehicle_type',
+ },
+ freightPrice:{
+ label: '*杩愯垂鎶ヤ环',
+ },
+ currency:{
+ label: '甯佸埗',
+ }
+ }
+})
+const itemsCrudRef =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: listTmsQuoteDetail,
+ getDetailApi: getTmsQuoteDetail,
+ exportApi: exportTmsQuoteDetail,
+ deleteApi: delTmsQuoteDetail,
+ addApi: addTmsQuoteDetail,
+ updateApi: updateTmsQuoteDetail,
+ handleUpdateFunc: () => {
+ crudRef.value.rowEdit(selectionList.value[0]);
+ },
+ handleSelectionChangeFunc: (selection: any) => {
+ selectionList.value = selection;
+ },
+ getBeginListFunc(params:any = {}){
+ params.quotePlanId = (route.query?.quotePlanId||'') as string;
+ return params;
+ },
+ rowSaveBegin:(row:any,loading:any)=>{
+ row.quotePlanId = (route.query?.quotePlanId||'') as string;
+ if (selectionList2.value.length == 0){
+ proxy.$modal.msgError("璇疯嚦灏戦�夋嫨涓�鏉¤溅鍨嬫姤浠�");
+ loading();
+ throw new Error("璇疯嚦灏戦�夋嫨涓�鏉¤溅鍨嬫姤浠�");
+
+ }
+ let filter = selectionList2.value.filter((item:any)=>{
+ return !item.freightPrice || !item.currency
+ });
+ if (filter.length > 0){
+ proxy.$modal.msgError("璇峰~鍐欐墍鏈夊繀濉」");
+ loading();
+ throw new Error("璇峰~鍐欐墍鏈夊繀濉」")
+ }
+ row.quoteItems = selectionList2.value;
+ },
+ handleBeforeOpenFunc:(type:string)=>{
+ form.value.items = [];
+ if (type === 'add'){
+ form.value.items = vehicle_type.value.map((item:any)=>{
+ return { rowKey: randomId() ,vehicleType: item.value,}
+ })
+ }
+ },
+
+})
+const handleBack = () => {
+ router.back()
+}
+
+const rowKeys = ref<any>([]);
+const selectionChange2 = (selection?: any[]) => {
+ selectionList2.value = selection;
+ rowKeys.value = selection?.map((item:any)=>item.rowKey);
+}
+
+</script>
--
Gitblit v1.8.0