Sfoglia il codice sorgente

售后管理新增派车记录表单

hezhanp 8 mesi fa
parent
commit
422ee697d4

+ 9 - 0
src/api/salesServiceManagement/index.js

@@ -485,3 +485,12 @@ export async function costDelete(data) {
   }
   return Promise.reject(new Error(res.data.message));
 }
+// 售后服务管理 派车管理
+
+export async function pageByDispatchRecord(params) {
+  const res = await request.get(`/eom/afterSalesReport/pageByDispatchRecord`, { params });
+  if (res.data.code == 0) {
+    return res.data.data;
+  }
+  return Promise.reject(new Error(res.data.message));
+}

+ 12 - 0
src/api/system/dictionary-data/index.js

@@ -86,3 +86,15 @@ export async function removeDictionaryDataBatch (data) {
   }
   return Promise.reject(new Error(res.data.message));
 }
+
+/**
+ * 查询机构列表
+ * @param params 查询条件
+ */
+export async function listOrganizations (params) {
+  const res = await request.get('/main/group/getGroupList', params);
+  if (res.data.code == 0) {
+    return res.data.data;
+  }
+  return Promise.reject(new Error(res.data.message));
+}

+ 105 - 35
src/views/salesServiceManagement/vehiclerecord/components/search.vue

@@ -1,49 +1,119 @@
-<!-- 搜索表单 -->
 <template>
-  <seekPage :seekList="seekList" :formLength="3" @search="search"></seekPage>
+  <el-form :model="form" label-width="100px" class="search-form">
+    <el-form-item label="关键字:">
+      <el-input v-model="form.keyWord" placeholder="请输入"></el-input>
+    </el-form-item>
+
+    <el-form-item label="所属部门:">
+      <ele-tree-select
+        v-model="form.deptId"
+        :data="deptTreeData"
+        label-key="name"
+        value-key="id"
+        clearable
+        default-expand-all
+        placeholder="请选择"
+        ref="deptTreeSelect"
+        @change="handleDeptChange"
+      />
+    </el-form-item>
+
+    <el-form-item label="派车类型:">
+      <el-select v-model="form.pieCarType" placeholder="请选择">
+        <el-option
+          v-for="item in pietypeList"
+          :key="item.value"
+          :label="item.label"
+          :value="item.value"
+        ></el-option>
+      </el-select>
+    </el-form-item>
+
+    <el-form-item>
+      <el-button type="primary" @click="search"> 搜索 </el-button>
+      <el-button @click="resetForm"> 重置 </el-button>
+    </el-form-item>
+  </el-form>
 </template>
+
 <script>
+import { listOrganizations } from '@/api/system/organization';
+import { getByCode } from '@/api/system/dictionary-data';
+
 export default {
   data() {
     return {
+      form: {
+        keyWord: '',
+        deptId: '',
+        pieCarType: ''
+      },
+      pietypeList: [],
+      deptTreeData: []
     };
   },
-  props: {},
-  computed: {
-    // 表格列配置
-    seekList() {
-      return [
-        {
-          label: '关键字:',
-          value: 'keyWord',
-          type: 'input',
-          placeholder: '请输入',
-          class:'123'
-        },
-        {
-          label: '所属部门:',
-          value: 'deptId',
-          type: 'select',
-          planList: this.serviceList,
-          placeholder: '请选择'
-        },
-        {
-          label: '派车类型:',
-          value: 'responseSpeed',
-          type: 'select',
-          planList: this.serviceList,
-          placeholder: '请选择'
-        },
-      ];
-    }
+
+  created() {
+    this.getpietypeCode('pie_car_type');
   },
+
   methods: {
-    /* 搜索 */
-    search(e) {
-      this.$emit('search', {
-        ...e
-      });
+    async getpietypeCode(code) {
+      try {
+        const res = await getByCode(code);
+        if (res.code == 0) {
+          let list = Object.values(res.data).map((el) => {
+            let k = Object.keys(el)[0];
+            let v = Object.values(el)[0];
+            return { label: v, value: k };
+          });
+          this.pietypeList = list;
+
+          const deptRes = await listOrganizations();
+          this.deptTreeData = this.$util.toTreeData({
+            data: deptRes || [],
+            idField: 'id',
+            parentIdField: 'parentId'
+          });
+
+          this.$emit('pass-pietype-list', list, deptRes);
+        }
+      } catch (err) {
+        this.$message.error(err.message);
+      }
+    },
+
+    search() {
+      this.$emit('search', { ...this.form });
+    },
+
+    resetForm() {
+      this.form = {
+        keyWord: '',
+        deptId: '',
+        pieCarType: ''
+      };
+      this.search()
+    },
+
+    handleDeptChange(val, node) {
+      console.log(val,node)
     }
   }
 };
 </script>
+
+<style scoped>
+/* 原有样式保留 */
+.search-form {
+  margin-bottom: 20px;
+  display: flex;
+  align-items: center;
+  gap: 20px;
+  flex-wrap: wrap;
+}
+
+.search-form /deep/ .el-form-item {
+  margin-bottom: 0;
+}
+</style>

+ 192 - 136
src/views/salesServiceManagement/vehiclerecord/index.vue

@@ -1,7 +1,11 @@
 <template>
   <div class="ele-body">
     <el-card shadow="never" v-loading="loading">
-      <search class="seep-search" @search="reload"></search>
+      <search
+        class="seep-search"
+        @search="reload"
+        @pass-pietype-list="handlePietypeList"
+      ></search>
       <!-- 数据表格 -->
       <ele-pro-table
         ref="table"
@@ -12,154 +16,206 @@
       >
         <!-- 表头工具栏 -->
         <template v-slot:toolbar></template>
-        <!-- <template v-slot:code="{ row }"
-          ><el-link
-            type="primary"
-            :underline="false"
-            @click="goDetail(row, 'view')"
-          >
-            {{ row.code }}
-          </el-link>
-        </template>-->
-        <!-- 操作列 -->
-        <!-- <template v-slot:action="{ row }"></template> -->
       </ele-pro-table>
     </el-card>
   </div>
 </template>
 
 <script>
-  import search from './components/search.vue';
-  import { evaluatePage } from '@/api/salesServiceManagement/index';
+import search from './components/search.vue';
+import { pageByDispatchRecord } from '@/api/salesServiceManagement/index';
+import dictMixins from '@/mixins/dictMixins';
 
-  import dictMixins from '@/mixins/dictMixins';
-  export default {
-    mixins: [dictMixins],
-    components: {
-      search
-    },
-    data() {
-      return {
-        evaluateStatus: {
-          1: '非常不满意',
-          2: '不满意',
-          3: '一般',
-          4: '满意',
-          5: '非常满意'
+export default {
+  mixins: [dictMixins],
+  components: {
+    search
+  },
+  data() {
+    return {
+      pietypeList: [],
+      deptResList: [], // 部门
+      deptIdToNameMap: {},
+      // 加载状态
+      loading: false
+    };
+  },
+  computed: {
+    columns() {
+      return [
+        {
+          columnKey: 'index',
+          label: '序号',
+          type: 'index',
+          width: 55,
+          align: 'center',
+          showOverflowTooltip: true,
+          fixed: 'left'
         },
-        // 表格列配置
-
-        // 加载状态
-        loading: false
-      };
-    },
-    computed: {
-      columns() {
-        return [
-          {
-            columnKey: 'index',
-            label: '序号',
-            type: 'index',
-            width: 55,
-            align: 'center',
-            showOverflowTooltip: true,
-            fixed: 'left'
-          },
-          {
-            slot: 'code',
-            prop: 'code',
-            label: '编码',
-            align: 'center',
-            showOverflowTooltip: true
-          },
-          {
-            prop: 'workCode',
-            label: '工单编码',
-            align: 'center',
-            showOverflowTooltip: true
-          },
-          {
-            prop: 'contactName',
-            label: '客户名称',
-            align: 'center',
-            showOverflowTooltip: true
-          },
-          {
-            prop: 'contactCode',
-            label: '客户编码',
-            align: 'center',
-            showOverflowTooltip: true
-          },
-          {
-            prop: 'attitudeRating',
-            label: '服务态度评分',
-            align: 'center',
-            showOverflowTooltip: true,
-            formatter: (row) => {
-              return this.evaluateStatus[row.attitudeRating];
-            }
-          },
-          {
-            prop: 'responseSpeed',
-            label: '响应速度评分',
-            align: 'center',
-            showOverflowTooltip: true,
-            formatter: (row) => {
-              return this.evaluateStatus[row.responseSpeed];
-            }
-          },
-          {
-            prop: 'serviceRating',
-            label: '整体满意度',
-            align: 'center',
-            showOverflowTooltip: true,
-            formatter: (row) => {
-              return this.evaluateStatus[row.serviceRating];
-            }
-          },
-          {
-            prop: 'evaluationContent',
-            label: '评价内容',
-            align: 'center',
-            showOverflowTooltip: true
-          },
-
-          {
-            prop: 'createUserName',
-            label: '创建人',
-            align: 'center',
-            showOverflowTooltip: true
-          },
-          {
-            prop: 'createTime',
-            label: '创建时间',
-            align: 'center',
-            showOverflowTooltip: true
+        {
+          slot: 'demandCode',
+          prop: 'demandCode',
+          label: '售后需求编码',
+          align: 'center',
+          showOverflowTooltip: true,
+          minWidth: 200
+        },
+        {
+          prop: 'pieCarType',
+          label: '派车类型',
+          align: 'center',
+          showOverflowTooltip: true,
+          minWidth: 200,
+          formatter: (row) => this.getPieTypeLabel(row.pieCarType)
+        },
+        {
+          prop: 'createUserName',
+          label: '申请人',
+          align: 'center',
+          showOverflowTooltip: true,
+          minWidth: 200,
+        },
+        {
+          prop: 'department',
+          label: '所属部门',
+          align: 'center',
+          minWidth: 300,
+          showOverflowTooltip: true,
+          formatter: (row) => {
+            const deptIds = row.valueJson?.department || [];
+            return this.getDeptNames(deptIds);
           }
-        ];
+        },
+        {
+          prop: 'subject_matter',
+          label: '出差事由',
+          align: 'center',
+          minWidth: 200,
+          showOverflowTooltip: true,
+          formatter: (row) => row.valueJson?.subject_matter || ''
+        },
+        {
+          prop: 'estimated_duration',
+          label: '预计出差时长',
+          align: 'center',
+          minWidth: 200,
+          showOverflowTooltip: true,
+          formatter: (row) => row.valueJson?.estimated_duration || ''
+        },
+        {
+          prop: 'travel_time',
+          label: '出差时间',
+          align: 'center',
+          minWidth: 200,
+          showOverflowTooltip: true,
+          formatter: (row) => row.valueJson?.travel_time || ''
+        },
+        {
+          prop: 'return_time',
+          label: '返回时间',
+          align: 'center',
+          showOverflowTooltip: true,
+          minWidth: 200,
+          formatter: (row) => row.valueJson?.return_time || ''
+        },
+        {
+          prop: 'car_number',
+          label: '车牌号',
+          align: 'center',
+          showOverflowTooltip: true,
+          minWidth: 200,
+          formatter: (row) => row.valueJson?.car_number || ''
+        },
+        {
+          prop: 'vehicle_user',
+          label: '用车人',
+          align: 'center',
+          showOverflowTooltip: true,
+          minWidth: 200,
+          formatter: (row) => row.valueJson?.vehicle_user || ''
+        },
+        {
+          prop: 'vehicle_mileage',
+          label: '出差里程数',
+          align: 'center',
+          showOverflowTooltip: true,
+          minWidth: 200,
+          formatter: (row) => row.valueJson?.vehicle_mileage || ''
+        },
+        {
+          prop: 'return_mileage_to_factory',
+          label: '返厂里程数',
+          align: 'center',
+          showOverflowTooltip: true,
+          minWidth: 200,
+          formatter: (row) => row.valueJson?.return_mileage_to_factory || ''
+        },
+        {
+          prop: 'status',
+          label: '状态',
+          align: 'center',
+          showOverflowTooltip: true,
+          minWidth: 200,
+        },
+        {
+          prop: 'createTime',
+          label: '创建时间',
+          align: 'center',
+          showOverflowTooltip: true,
+          minWidth: 200,
+        }
+      ];
+    }
+  },
+  methods: {
+    getDeptNames(deptIdArr) {
+      if (!deptIdArr || !Array.isArray(deptIdArr) || deptIdArr.length === 0) {
+        return "-";
       }
+      const deptNames = deptIdArr.map(deptId => 
+        this.deptIdToNameMap[deptId] || ''
+      );
+      return deptNames.join("、");
     },
-    created() {},
-    methods: {
-      /* 表格数据源 */
-      datasource({ page, limit, where, order }) {
-        return evaluatePage({ pageNum: page, size: limit, ...where });
-      },
-      /* 刷新表格 */
-      reload(where) {
-        this.$refs.table.reload({ page: 1, where });
-      }
+    getPieTypeLabel(value) {
+      if (!value) return '';
+      const target = this.pietypeList.find(item => item.value === String(value));
+      return target ? target.label : value;
+    },
+    handlePietypeList(list, deptRes) {
+      this.pietypeList = list;
+      this.deptResList = deptRes;
+      this.deptIdToNameMap = deptRes.reduce((map, dept) => {
+        map[dept.id] = dept.name;
+        return map;
+      }, {});
+    },
+    datasource({ page, limit, where }) {
+      const dataPromise = pageByDispatchRecord({
+        pageNum: page,
+        size: limit,
+        ...where
+      });
+      dataPromise
+        .then(response => console.log(response))
+        .catch(error => console.error('获取数据失败:', error));
+      return dataPromise;
+    },
+    /* 刷新表格 */
+    reload(where) {
+      this.$refs.table.reload({ page: 1, where });
     }
-  };
+  }
+};
 </script>
 
 <style lang="scss" scoped>
-  ::v-deep .el-input__inner::placeholder {
-    font-size: 13px;
-  }
-  ::v-deep .seep-search {
-    .el-input__inner {
-      padding: 0 5px 0 10px;
-    }
+::v-deep .el-input__inner::placeholder {
+  font-size: 13px;
+}
+::v-deep .seep-search {
+  .el-input__inner {
+    padding: 0 5px 0 10px;
   }
-</style>
+}
+</style>