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