张诺
3 天以前 1a73c77e1d14205014f6a77a8954de480d436c0e
联调基础模块信息-》供应商-》客户信息-》煤种信息
采购信息 联调
已修改9个文件
已添加3个文件
1278 ■■■■■ 文件已修改
src/api/basicInformation/coal.js 14 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/api/basicInformation/coalQualityMaintenance.js 9 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/api/basicInformation/customer.js 27 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/api/procureMent/index.js 29 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/api/tool/publicInterface.js 9 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/components/Table/ETable.vue 331 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/views/basicInformation/index.vue 355 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/views/basicInformation/mould/coal.vue 99 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/views/basicInformation/mould/customer.vue 182 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/views/basicInformation/mould/supplier.vue 102 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/views/procureMent/components/ProductionDialog.vue 8 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/views/procureMent/index.vue 113 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/api/basicInformation/coal.js
@@ -1,7 +1,7 @@
// ç…¤è´¨ç»´æŠ¤
// ç…¤ç§ä¿¡æ¯
import request from '@/utils/request'
// æŸ¥è¯¢ç…¤è´¨ç»´æŠ¤åˆ—表
// æŸ¥è¯¢ç…¤ç§ä¿¡æ¯åˆ—表
export function getCoalInfo(query) {
    return request({
        url: '/coalInfo/list',
@@ -10,7 +10,7 @@
    })
}
// æ–°å¢žæˆ–编辑煤质维护
// æ–°å¢žæˆ–编辑煤种信息
export function addOrEditCoalInfo(query) {
    return request({
        url: '/coalInfo/addOrEditCoalInfo',
@@ -18,4 +18,12 @@
        data: query
    })
}
// åˆ é™¤ç…¤ç§ä¿¡æ¯æ•°æ®
export function delCoalInfo(query) {
    return request({
        url: '/coalInfo/delCoalInfo',
        method: 'delete',
        data: query
    })
}
src/api/basicInformation/coalQualityMaintenance.js
@@ -17,4 +17,11 @@
        data: query
    })
}
// åˆ é™¤ç…¤è´¨ç»´æŠ¤æ•°æ®
export function delCoalQuality(query){
    return request({
        url: '/coalQuality/delCoalQuality',
        method: 'delete',
        data: query
    })
}
src/api/basicInformation/customer.js
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,27 @@
// å®¢æˆ·ä¿¡æ¯
import request from '@/utils/request'
// èŽ·å–å®¢æˆ·ä¿¡æ¯åˆ—è¡¨
export function getCustomerList(query) {
    return request({
        url: '/customer/list',
        method: 'get',
        params: query
    })
}
// æ–°å¢žæˆ–编辑客户信息列表
export function addOrEditCustomer(query){
    return request({
        url: '/customer/addOrEditCustomer',
        method: 'post',
        data: query
    })
}
// åˆ é™¤å®¢æˆ·ä¿¡æ¯åˆ—表
export function delCustomer(query){
    return request({
        url: '/customer/delCustomer',
        method: 'delete',
        data: query
    })
}
src/api/procureMent/index.js
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,29 @@
// é‡‡è´­ç®¡ç†
import request from '@/utils/request'
// æŸ¥è¯¢é‡‡è´­ç®¡ç†åˆ—表
export function purchaseRegistration(query) {
    return request({
        url: '/purchaseRegistration/list',
        method: 'get',
        params: query
    })
}
// æ–°å¢žç¼–辑采购管理
export function addOrEditPR(query) {
    return request({
        url: '/purchaseRegistration/addOrEditPR',
        method: 'post',
        data: query
    })
}
// åˆ é™¤é‡‡è´­ç®¡ç†
export function delPR(query) {
    return request({
        url: '/purchaseRegistration/delPR',
        method: 'delete',
        data: query
    })
}
src/api/tool/publicInterface.js
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,9 @@
import request from '@/utils/request'
// èŽ·å–è·¯ç”±
export const testUserList = () => {
  return request({
    url: '/test/user/list',
    method: 'get'
  })
}
src/components/Table/ETable.vue
@@ -1,178 +1,169 @@
<template>
    <el-table
      v-loading="loading"
      :data="tableData"
      :border="border"
      :show-selection="showSelection"
      :max-height="maxHeight"
      :header-cell-style="{ background: '#EBEEF5', color: '#3D3D3D' }"
      @selection-change="handleSelectionChange"
      @row-click="handleRowClick"
      @row-dblclick="handleRowDblClick"
      @cell-click="handleCellClick"
      :max-width="maxWidth"
      @export="handleExport"
    >
      <el-table-column v-if="showSelection" type="selection" width="55" align="center" />
      <el-table-column v-if="showIndex" label="序号" type="index" width="60" align="center"  />
      <template v-for="col in columns" :key="col.prop">
        <el-table-column
          v-bind="col"
          :show-overflow-tooltip="shouldShowTooltip(col, tableData)"
          :formatter="(row, column, cellValue) => cellValue == null || cellValue === '' ? '--' : cellValue"
          align="center"
        >
          <template v-if="col.slot" #default>
            <slot></slot>
          </template>
        </el-table-column>
      </template>
      <!-- æ“ä½œåˆ— -->
      <el-table-column v-if="showOperations" :label="operationsLabel" :width="operationsWidth" fixed="right" align="center">
        <template #default="scope">
          <slot name="operations" :row="scope.row">
            <el-button
              v-if="operations.includes('edit')"
              link
              type="primary"
              size="small"
              @click="handleEdit(scope.row)"
            >编辑</el-button>
<!--            <el-button-->
<!--              v-if="operations.includes('delete')"-->
<!--              link-->
<!--              type="danger"-->
<!--              size="small"-->
<!--              @click="handleDelete(scope.row)"-->
<!--            >删除</el-button>-->
          </slot>
  <el-table v-loading="loading" :data="tableData" :border="border" :show-selection="showSelection" :max-height="maxHeight"
    :header-cell-style="{ background: '#EBEEF5', color: '#3D3D3D' }" @selection-change="handleSelectionChange"
    @row-click="handleRowClick" @row-dblclick="handleRowDblClick" @cell-click="handleCellClick" :max-width="maxWidth"
    @export="handleExport">
    <el-table-column v-if="showSelection" type="selection" width="55" align="center" />
    <el-table-column v-if="showIndex" label="序号" type="index" width="60" align="center" /> <template
      v-for="col in columns" :key="col.prop">
      <el-table-column v-bind="col" :show-overflow-tooltip="shouldShowTooltip(col, tableData)"
        :formatter="col.formatter || defaultFormatter" align="center">
        <template v-if="col.slot" #default>
          <slot></slot>
        </template>
      </el-table-column>
    </el-table>
  </template>
    </template>
    <!-- æ“ä½œåˆ— -->
    <el-table-column v-if="showOperations" :label="operationsLabel" :width="operationsWidth" fixed="right" align="center">
      <template #default="scope">
        <slot name="operations" :row="scope.row">
          <el-button v-if="operations.includes('edit')" link type="primary" size="small"
            @click="handleEdit(scope.row)">编辑</el-button>
          <!--            <el-button-->
          <!--              v-if="operations.includes('delete')"-->
          <!--              link-->
          <!--              type="danger"-->
          <!--              size="small"-->
          <!--              @click="handleDelete(scope.row)"-->
          <!--            >删除</el-button>-->
        </slot>
      </template>
    </el-table-column>
  </el-table>
</template>
  
  <script setup>
  import { defineEmits } from 'vue'
  import { ElMessage, ElMessageBox } from 'element-plus'
  const props = defineProps({
    // æœ€å¤§å®½åº¦
    maxWidth: {
      type: [String, Number],
      default: 'auto'
    },
    handleCellClick: {
      type: Function,
      default: () => {}
    },
    handleRowClick: {
      type: Function,
      default: () => {}
    },
    handleExport: {
      type: Function,
      default: () => {}
    },
    handleRowDblClick: {
      type: Function,
      default: () => {}
    },
    // é«˜åº¦
    maxHeight: {
      type: [String, Number],
      default: 'auto'
    },
    // åŠ è½½çŠ¶æ€
    loading: {
      type: Boolean,
      default: false
    },
    //   border
    border: {
      type: Boolean,
      default: false
    },
    // è¡¨æ ¼æ•°æ®
    tableData: {
      type: Array,
      default: () => []
    },
    // æ˜¯å¦æ˜¾ç¤ºé€‰æ‹©åˆ—
    showSelection: {
      type: Boolean,
      default: true
    },
    // æ˜¯å¦æ˜¾ç¤ºåºå·åˆ—
    showIndex: {
      type: Boolean,
      default: true
    },
    // åˆ—配置
    columns: {
      type: Array,
      default: () => []
    },
    // æ˜¯å¦æ˜¾ç¤ºæ“ä½œåˆ—
    showOperations: {
      type: Boolean,
      default: true
    },
    // æ“ä½œåˆ—标签
    operationsLabel: {
      type: String,
      default: '操作'
    },
    // æ“ä½œåˆ—宽度
    operationsWidth: {
      type: [String, Number],
      default: 100
    },
    // æ˜¾ç¤ºå“ªäº›æ“ä½œæŒ‰é’®
    operations: {
      type: Array,
      default: () => ['edit', 'delete', 'export']
    },
    // åˆ é™¤ç¡®è®¤ä¿¡æ¯
    deleteConfirmText: {
      type: String,
      default: '确认删除该记录?'
    }
  })
  // æ£€æŸ¥åˆ—是否需要显示tooltip
  const shouldShowTooltip = (col, data) => {
import { defineEmits } from 'vue'
import { ElMessage, ElMessageBox } from 'element-plus'
const props = defineProps({
  // æœ€å¤§å®½åº¦
  maxWidth: {
    type: [String, Number],
    default: 'auto'
  },
  handleCellClick: {
    type: Function,
    default: () => { }
  },
  handleRowClick: {
    type: Function,
    default: () => { }
  },
  handleExport: {
    type: Function,
    default: () => { }
  },
  handleRowDblClick: {
    type: Function,
    default: () => { }
  },
  // é«˜åº¦
  maxHeight: {
    type: [String, Number],
    default: 'auto'
  },
  // åŠ è½½çŠ¶æ€
  loading: {
    type: Boolean,
    default: false
  },
  //   border
  border: {
    type: Boolean,
    default: false
  },
  // è¡¨æ ¼æ•°æ®
  tableData: {
    type: Array,
    default: () => []
  },
  // æ˜¯å¦æ˜¾ç¤ºé€‰æ‹©åˆ—
  showSelection: {
    type: Boolean,
    default: true
  },
  // æ˜¯å¦æ˜¾ç¤ºåºå·åˆ—
  showIndex: {
    type: Boolean,
    default: true
  },
  // åˆ—配置
  columns: {
    type: Array,
    default: () => []
  },
  // æ˜¯å¦æ˜¾ç¤ºæ“ä½œåˆ—
  showOperations: {
    type: Boolean,
    default: true
  },
  // æ“ä½œåˆ—标签
  operationsLabel: {
    type: String,
    default: '操作'
  },
  // æ“ä½œåˆ—宽度
  operationsWidth: {
    type: [String, Number],
    default: 100
  },
  // æ˜¾ç¤ºå“ªäº›æ“ä½œæŒ‰é’®
  operations: {
    type: Array,
    default: () => ['edit', 'delete', 'export']
  },
  // åˆ é™¤ç¡®è®¤ä¿¡æ¯
  deleteConfirmText: {
    type: String,
    default: '确认删除该记录?'
  }
})
// æ£€æŸ¥åˆ—是否需要显示tooltip
const shouldShowTooltip = (col, data) => {
  // å¦‚果列配置中明确设置了showOverflowTooltip,使用该设置
  if (col.hasOwnProperty('showOverflowTooltip')) {
    return col.showOverflowTooltip;
  }
  // å¦‚果没有prop,直接返回false
  if (!col.prop) return false;
  // æ£€æŸ¥è¯¥åˆ—在所有数据中是否有非空值
  // æ£€æŸ¥è¯¥åˆ—在所有数据中是否有非空值,默认显示tooltip
  return data.some(row => row[col.prop] != null && row[col.prop] !== '');
};
// é»˜è®¤çš„æ ¼å¼åŒ–函数
const defaultFormatter = (row, column, cellValue) => {
  return cellValue == null || cellValue === '' || cellValue === 0 ? '--' : cellValue;
};
// å¤„理选择变化、编辑、删除和导出操作
  const emit = defineEmits(['selection-change', 'edit', 'delete', 'export'])
  const handleSelectionChange = (selection) => {
    emit('selection-change', selection)
  }
  const handleEdit = (row) => {
    emit('edit', row)
  }
  const handleDelete = (row) => {
    ElMessageBox.confirm(
      props.deleteConfirmText,
      '警告',
      {
        confirmButtonText: '确定',
        cancelButtonText: '取消',
        type: 'warning'
      }
    ).then(() => {
      emit('delete', row)
    }).catch(() => {})
  }
  const handleExport = (row) => {
    emit('export', row)
  }
  </script>
const emit = defineEmits(['selection-change', 'edit', 'delete', 'export'])
const handleSelectionChange = (selection) => {
  emit('selection-change', selection)
}
const handleEdit = (row) => {
  emit('edit', row)
}
const handleDelete = (row) => {
  ElMessageBox.confirm(
    props.deleteConfirmText,
    '警告',
    {
      confirmButtonText: '确定',
      cancelButtonText: '取消',
      type: 'warning'
    }
  ).then(() => {
    emit('delete', row)
  }).catch(() => { })
}
const handleExport = (row) => {
  emit('export', row)
}
</script>
  
  <style scoped>
  .el-table {
.el-table {
    margin: 20px 0 !important;
  }
  
@@ -187,4 +178,16 @@
      overflow-x: auto;
    }
  }
  </style>
  /* æ”¯æŒåœ°å€åˆ—换行显示 */
  :deep(.el-table .cell) {
    white-space: normal !important;
    word-break: break-all;
    line-height: 1.4;
  }
  /* ä¸ºåœ°å€åˆ—设置最小高度以容纳多行文本 */
  :deep(.el-table td) {
    padding: 8px 0;
  }
</style>
src/views/basicInformation/index.vue
@@ -1,12 +1,13 @@
<template>
  <div>
    <el-form :inline="true" :model="queryParams" class="search-form">
      <el-form-item label="供应商名称">
        <el-input v-model="queryParams.searchAll" placeholder="请输入关键词" clearable />
  <div>    <el-form :inline="true" :model="queryParams" class="search-form" >
      <el-form-item label="搜索" v-if="tabName === 'supplier' || tabName === 'customer'">
        <el-input v-model="queryParams.searchAll" placeholder="供应商/识别码/详细地址" clearable />
      </el-form-item>
      <el-form-item label="搜索" v-if="tabName === 'coal' || tabName === 'coalQualityMaintenance'">
        <el-input v-model="queryParams.searchAll" placeholder="请输入搜索信息" clearable />
      </el-form-item>
      <el-form-item>
        <el-button type="primary" @click="getList">查询</el-button>
        <el-button type="primary" @click="search">查询</el-button>
        <el-button @click="resetQuery">重置</el-button>
      </el-form-item>
    </el-form>
@@ -20,13 +21,14 @@
      <el-row :gutter="24" class="table-toolbar">
        <el-button type="primary" :icon="Plus" @click="handleAdd">新建</el-button>
        <el-button type="danger" :icon="Delete" @click="handleDelete">删除</el-button>
        <el-button type="info" :icon="Download" @click="handleExport">导出</el-button>
        <el-button type="info" :icon="Download" @click="handleExport" v-show="tabName === 'supplier' || tabName === 'customer'">导出</el-button>
      </el-row>
      <!-- è¡¨æ ¼ç»„ä»¶ -->
      <div>
        <data-table :loading="loading" :table-data="tableData" :columns="columns"
          @selection-change="handleSelectionChange" @edit="handleEdit" :show-selection="true" :border="true" />
      </div>      <pagination v-if="total>0" :page="pageNum" :limit="pageSizes" :total="total" @pagination="handPagination"
      </div>
      <pagination v-if="total>0" :page="pageNum" :limit="pageSizes" :total="total" @pagination="handPagination"
        :layout="'total, prev, pager, next, jumper'" />
      <Supplier v-if="tabName === 'supplier'" v-model:supplierDialogFormVisible="dialogFormVisible" :form="form"
        :title="title" @submit="handleSubmit" @beforeClose="handleBeforeClose"
@@ -43,7 +45,7 @@
</template>
<script setup>
import { ref, reactive, onMounted } from "vue";
import { ref, reactive, onMounted, computed } from "vue";
import { ElMessage, ElMessageBox } from "element-plus";
import { Plus, Edit, Delete, Download } from "@element-plus/icons-vue";
import DataTable from "@/components/Table/ETable.vue";
@@ -54,8 +56,12 @@
import coalQualityMaintenance from "./mould/coalQualityMaintenance.vue";
const { proxy } = getCurrentInstance()
import { getSupply, addOrEditSupply, delSupply } from "@/api/basicInformation/supplier.js";
import { getCoalInfo, addOrEditCoalInfo } from "@/api/basicInformation/coal.js";
import { getCoalQuality, addOrEditCoalQuality } from "@/api/basicInformation/coalQualityMaintenance.js";
import { getCoalInfo, delCoalInfo } from "@/api/basicInformation/coal.js";
import { getCoalQuality, delCoalQuality } from "@/api/basicInformation/coalQualityMaintenance.js";
import { testUserList } from "@/api/tool/publicInterface.js";
import { getAreaOptions } from "@/api/system/area.js";
import { getCustomerList, delCustomer } from "@/api/basicInformation/customer.js";
// å¼¹çª—
const coalQualityMaintenanceDialogFormVisible = ref(false);
const customerDialogFormVisible = ref(false);
@@ -65,6 +71,12 @@
const form = ref({});
const title = ref("");
const copyForm = ref({});
// ç”¨æˆ·åˆ—表数据
const userList = ref([]);
// ç”¨æˆ·æ˜ å°„表,用于快速查找
const userMap = ref({});
// åœ°å€æ˜ å°„表,用于快速查找地址名称
const addressMap = ref({});
// å½“前标签
const tabName = ref("supplier");
// çŠ¶æ€å˜é‡
@@ -76,13 +88,73 @@
const selectedRows = ref([]);
// æŸ¥è¯¢å‚æ•°
const queryParams = reactive({
  searchText: "",
  supplierName: "",
  identifyNumber: "",
  address: "",
});
onMounted(() => {
  handleTabClick({ props: { name: "supplier" } });
// åœ°å€é€‰æ‹©æ•°æ®
const addressSelectOptions = ref([]);
const fetchAreaOptions = async () => {
  addressSelectOptions.value = [];
  const res = await getAreaOptions();
  if (res.code === 200) {
    addressSelectOptions.value = res.data;
    buildAddressMap(res.data); // æž„建地址映射表
  }
}
// æž„建地址映射表,用于快速查找地址名称
const buildAddressMap = (areaData) => {
  const buildMap = (list, pathList = []) => {
    list.forEach(item => {
      const currentPath = [...pathList, item.label];
      addressMap.value[item.id] = {
        name: item.label,
        fullPath: currentPath.join(' / ')
      };
      if (item.children && item.children.length > 0) {
        buildMap(item.children, currentPath);
      }
    });
  };
  buildMap(areaData);
};
// åœ°å€æ ¼å¼åŒ–函数
const formatAddressArray = (addressIds) => {
  // å¦‚果地址映射表还没有准备好,显示 --
  if (!addressMap.value || Object.keys(addressMap.value).length === 0||!addressIds || !Array.isArray(addressIds) || addressIds.length === 0 || addressIds.every(id => !id)) {
    return '--';
  }
  const addressNames = addressIds.map(id => {
    return addressMap.value[id]?.name || '--';
  });
  // å¦‚果所有地址名称都是 '--',则返回 '--'
  if (addressNames.every(name => name === '--')) {
    return '--';
  }
  return addressNames.filter(name => name !== '--').join(' / ');
};
// èŽ·å–ç”¨æˆ·åˆ—è¡¨æ•°æ®
const getUserList = async () => {
  try {
    const res = await testUserList();
    if (res && res.data) {
      userList.value = res.data;
      userList.value.forEach(user => {
        userMap.value[user.userId] = user.username;
      });
      console.log('用户映射表:', userMap.value);
    }
  } catch (error) {
    console.error('获取用户列表失败:', error);
  }
};
onMounted(async () => {
  await handleTabClick({ props: { name: "supplier" } });
  await fetchAreaOptions(); // å…ˆèŽ·å–åœ°å€é€‰æ‹©æ•°æ®å¹¶æž„å»ºæ˜ å°„è¡¨
  await getUserList(); // èŽ·å–ç”¨æˆ·åˆ—è¡¨
});
const columns = ref();
// æ ‡ç­¾é¡µæ•°æ®
@@ -96,40 +168,128 @@
const addOrEdit = ref("add");
// è¡¨æ ¼æ•°æ®
const tableData = ref([]);
// æŸ¥è¯¢æ–¹æ³•
const handleQuery = () => {
};
// supplier ä¾›åº”商数据
const supplierColumns = ref([
  { prop: "supplierName", label: "供应商名称", minWidth: 200 },
  { prop: "taxpayerId", label: "统一人识别号", minWidth: 120 },
  { prop: "businessAddress", label: "经营地址", minWidth: 150 },
  { prop: "bids", label: "详细地址", minWidth: 150 },
  { prop: "supplierName", label: "供应商名称", minWidth: 100 },
  { prop: "taxpayerId", label: "统一人识别号", minWidth: 170 },  {
    prop: "bids",
    label: "经营地址",
    minWidth: 150,
    showOverflowTooltip: true,
    formatter: (row, column, cellValue) => {
      let arr = [
        row.bprovinceId,
        row.bcityId,
        row.bdistrictId,
      ]
      return formatAddressArray(arr);
    }
  },
  { prop: "businessAddress", label: "经营详细地址", minWidth: 150 },
  { prop: "bankAccount", label: "开户行", minWidth: 120 },
  { prop: "bankName", label: "银行账号", minWidth: 150 },
  { prop: "contactPerson", label: "联系人", minWidth: 100 },
  { prop: "contactAddress", label: "联系地址", minWidth: 150 },
  { prop: "maintainer", label: "维护人", minWidth: 100 },
  { prop: "createTime", label: "维护日期", minWidth: 100 },
  { prop: "contactPerson", label: "联系人", minWidth: 100 },
  {
    prop: "cids",
    label: "联系人地址",
    minWidth: 150,
    showOverflowTooltip: true,
    formatter: (row, column, cellValue) => {
      let arr = [
        row.cprovinceId,
        row.ccityId,
        row.cdistrictId,
      ]
      return formatAddressArray(arr);
    }
  },{ prop: "contactAddress", label: "联系人详细地址", minWidth: 120 },
  // {
  //   prop: "maintainerId",
  //   label: "维护人",
  //   minWidth: 80,
  //   formatter: (row, column, cellValue) => {
  //     // å¦‚果用户映射表还没有准备好,显示 --
  //     if (!userMap.value || Object.keys(userMap.value).length === 0) {
  //       return '--';
  //     }
  //     // å¦‚果值为空或null,显示 --
  //     if (cellValue === null || cellValue === undefined || cellValue === '') {
  //       return '--';
  //     }
  //     // å¦‚果用户映射表中有对应的用户名,返回用户名
  //     if (userMap.value[cellValue]) {
  //       return userMap.value[cellValue];
  //     }
  //     // å¦‚果没有匹配的用户,显示 --
  //     return '--';
  //   }
  // },
  { prop: "createTime", label: "维护日期", minWidth: 120 },
]);
// customer å®¢æˆ·æ•°æ®
const customerColumns = ref([
  { prop: "customerName", label: "客户名称", minWidth: 200 },
  { prop: "identifyNumber", label: "统一人识别号", minWidth: 120 },
  { prop: "address", label: "经营地址", minWidth: 150 },
  { prop: "detailedaddress", label: "详细地址", minWidth: 150 },
  { prop: "bank", label: "开户行", minWidth: 120 },
  { prop: "bankAccount", label: "银行账号", minWidth: 150 },
  { prop: "contacts", label: "联系人", minWidth: 100 },
  { prop: "contactAddress", label: "联系地址", minWidth: 150 },
  { prop: "maintainer", label: "维护人", minWidth: 100 },
  { prop: "maintainDate", label: "维护日期", minWidth: 100 },
  { prop: "customerName", label: "客户名称", minWidth: 100 },
  { prop: "taxpayerId", label: "统一人识别号", minWidth: 120 },
{
    prop: "bids",
    label: "经营地址",
    minWidth: 150,
    showOverflowTooltip: true,
    formatter: (row, column, cellValue) => {
      console.log(row, column, cellValue);
      let arr = [
        row.businessProvinceId,
        row.businessCityId,
        row.businessDistrictId,
      ]
      return formatAddressArray(arr);
    }
  },
  { prop: "businessAddress", label: "详细地址", minWidth: 150 },
  { prop: "bankName", label: "开户行", minWidth: 120 },
  { prop: "bankAccount", label: "银行账号", minWidth: 150 },
  { prop: "contactPerson", label: "联系人", minWidth: 100 },
  { prop: "contactPhone", label: "联系人电话", minWidth: 100 },
{
    prop: "cids",
    label: "联系人地址",
    minWidth: 150,
    showOverflowTooltip: true,
    formatter: (row, column, cellValue) => {
      let arr = [
        row.provinceId,
        row.cityId,
        row.districtId,
      ]
      return formatAddressArray(arr);
    }
  },
  { prop: "contactAddress", label: "联系人详细地址", minWidth: 150 },
  { prop: "updateTime", label: "维护日期", minWidth: 100 },
]);
// coal ç…¤ç§æ•°æ®
const coalColumns = ref([
  { prop: "coalName", label: "煤种名称", minWidth: 200 },
  { prop: "maintainerId", label: "维护人", minWidth: 120 },
  { prop: "coal", label: "煤种名称", minWidth: 200 },  {
    prop: "maintainerId",
    label: "维护人",
    minWidth: 120,
    formatter: (row, column, cellValue) => {
      // å¦‚果用户映射表还没有准备好,显示 --
      if (!userMap.value || Object.keys(userMap.value).length === 0) {
        return '--';
      }
      // å¦‚果值为空或null,显示 --
      if (cellValue === null || cellValue === undefined || cellValue === '') {
        return '--';
      }
      // å¦‚果用户映射表中有对应的用户名,返回用户名
      if (userMap.value[cellValue]) {
        return userMap.value[cellValue];
      }
      // å¦‚果没有匹配的用户,显示 --
      return '--';
    }
  },
  { prop: "maintenanceDate", label: "维护日期", minWidth: 150 },
]);
// coalQualityMaintenance ç…¤è´¨ç»´æŠ¤æ•°æ®
@@ -181,6 +341,7 @@
      queryParams[key] = "";
    }
  });
  getList()
};
// æ–°å¢ž
const handleAdd = () => {
@@ -220,20 +381,20 @@
};
// åˆ†é¡µ
const handPagination = (val) => {
  console.log("分页参数:", val);
  pageNum.value = val.page;
  pageSizes.value = val.limit;
  getList();
};
// æäº¤è¡¨å•
const handleSubmit = async (val) => {
  console.log(val)
  if (val.code !== 200) {
    ElMessage.error("操作失败:" + result.msg);
  console.log(val);
  if (val.result.code !== 200) {
    ElMessage.error("操作失败:" + val.result.msg);
    return;
  }
  ElMessage.success("新增成功:" + result.msg);
  ElMessage.success(val.title + val.result.msg);
  dialogFormVisible.value = false;
  getList();
};
const handleDialogFormVisible = (value) => {
  dialogFormVisible.value = value;
@@ -245,6 +406,34 @@
// ç¼–辑
const handleEdit = (row) => {
  form.value = JSON.parse(JSON.stringify(row));
  if(form.value.bprovinceId && form.value.bdistrictId && form.value.bcityId  ){
    form.value.bids = [
    row.bprovinceId,
    row.bcityId,
    row.bdistrictId,
  ];
  }
   if(form.value.cprovinceId && form.value.cdistrictId && form.value.ccityId  ){
    form.value.cids = [
    row.cprovinceId,
    row.ccityId,
    row.cdistrictId,
  ];
  }
  if(form.value.businessCityId && form.value.businessDistrictId && form.value.businessProvinceId) {
    form.value.bids = [
      row.businessProvinceId,
      row.businessCityId,
      row.businessDistrictId,
    ];
  }
  if(form.value.cityId && form.value.districtId && form.value.provinceId) {
    form.value.cids = [
      row.provinceId,
      row.cityId,
      row.districtId,
    ];
  }
  addOrEdit.value = "edit";
  handleAddEdit(tabName.value);
};
@@ -258,7 +447,6 @@
  selectedRows.value.forEach(element => {
    return arr.push(element.id);
  });
  console.log("选中的数据ID:", arr);
  ElMessageBox.confirm("确定删除选中的数据吗?", "提示", {
    confirmButtonText: "确定",
    cancelButtonText: "取消",
@@ -266,13 +454,27 @@
  })
    .then(async () => {
      try {
        let res = await delSupply(arr)
        console.log(res)
        selectedRows.value = [];
        getlist()
      } catch {
        let res;
        if( tabName.value === "supplier" ) {
          res = await delSupply(arr);
        } else if (tabName.value === "coal") {
          res = await delCoalInfo(arr);
        } else if (tabName.value === "coalQualityMaintenance") {
          res = await delCoalQuality(arr);
        } else if( tabName.value === "customer") {
          res = await delCustomer(arr);
        }
        if(res.code !== 200 && res.meg == "操作成功") {
          ElMessage.error("删除失败:" + res.msg);
          return;
        }
        ElMessage.success("删除成功");
        await getList();
      } catch (e) {
        console.error(e);
        ElMessage.error("删除失败,请稍后再试");
        return;
      } finally {
        selectedRows.value = [];
      }
    }).catch(() => {
      ElMessage.info("已取消删除操作");
@@ -283,11 +485,23 @@
  dialogFormVisible.value = false;
  form.value = {};
};
const handleExport = (row) => {
  proxy.download("system/post/export", {
const handleExport = () => {
  if(tabName.value === "supplier") {
    Export("/supply/export", "供应商信息");
  } else if (tabName.value === "customer") {
    Export("/customer/export", "客户信息");
  } else if (tabName.value === "coal") {
    Export("/supply/export", "煤种信息");
  } else if (tabName.value === "coalQualityMaintenance") {
    Export("/supply/export", "煤质维护信息");
  }
}
const Export = (api,name) => {
  proxy.download(api, {
    ...queryParams.value
  }, `post_${new Date().getTime()}.xlsx`)
  ElMessage.success("导出数据:" + row.supplierName);
  }, `${name}${new Date().getTime()}.xlsx`)
  ElMessage.success("导出数据:" + name);
};
// é€‰æ‹©æŽ¥å£
const selectInterface = () => {
@@ -298,26 +512,41 @@
      searchAll: queryParams.searchAll,
    });
  } else if (tabName.value === "customer") {
    return getSupply({
    return getCustomerList({
      current: pageNum.value,
      pageSize: pageSizes.value,
      ...queryParams
      searchAll: queryParams.searchAll,
    });
  } else if (tabName.value === "coal") {
    console.log(addOrEdit.value)
    return getCoalInfo();
    return getCoalInfo({
      current: pageNum.value,
      pageSize: pageSizes.value,
      searchAll: queryParams.searchAll,
    });
  } else if (tabName.value === "coalQualityMaintenance") {
    return getCoalQuality({
      current: pageNum.value,
      pageSize: pageSizes.value,
      ...queryParams
      searchAll: queryParams.searchAll,
    });
  }
}
const search = () => {
  pageNum.value = 1; // é‡ç½®é¡µç 
  getList();
};
// èŽ·å–åˆ—è¡¨æ•°æ®
const getList = async () => {
  loading.value = true;
  /* if (Object.keys(addressMap.value).length === 0) {
    await fetchAreaOptions();
  } */
  let { data, code } = await selectInterface()
  console.log(data)
  if(code !== 200) {
    ElMessage.error("获取数据失败:" + data.msg);
    loading.value = false;
    return;
  }
  tableData.value = data.records;
  total.value = data.total;
  loading.value = false;
src/views/basicInformation/mould/coal.vue
@@ -6,29 +6,32 @@
            width="500"
            :close-on-click-modal="false"
            :before-close="handleClose"
        >
            <el-form
        >            <el-form
                ref="formRef"
                style="max-width: 600px; margin: 0 auto"
                :model="formData"
                :rules="rules"
                label-width="auto"
                label-width="120px"
            >
                <el-form-item label="煤种名称" prop="coal">
                    <el-input
                        v-model="formData.coal"
                        placeholder="请输入煤种名称"
                    />
                </el-form-item>
                <el-form-item label="维护人姓名" prop="maintainerId">
                </el-form-item>                <el-form-item label="维护人姓名" prop="maintainerId">
                    <el-input
                        v-model="formData.maintainerId"
                        placeholder="请输入维护人姓名"
                        :value="userStore.name || ''"
                        placeholder="维护人姓名"
                        disabled
                    />
                </el-form-item>                <el-form-item label="维护日期" prop="maintenanceDate">
                    <el-input
                        :value="getCurrentDate()"
                        placeholder="维护日期"
                        disabled
                    />
                </el-form-item>
                <el-form-item label="维护日期" prop="maintenanceDate">
                    <el-input v-model="formData.maintenanceDate" placeholder="请输入银行账户" />
                </el-form-item>
                <el-form-item>
                    <el-button type="primary" @click="submitForm">
                        ç¡®å®š
@@ -42,8 +45,11 @@
</template>
<script setup>
import { ref, watch ,defineProps } from 'vue'
import { ref, watch, defineProps, reactive, onMounted } from 'vue'
import { addOrEditCoalInfo } from '@/api/basicInformation/coal'
import useUserStore from '@/store/modules/user'
const userStore = useUserStore()
const props = defineProps({
    beforeClose: {
@@ -64,8 +70,38 @@
    },
})
const emit = defineEmits(['submit', 'handleBeforeClose','update:coalDialogFormVisible'])
// åœ¨ç»„件挂载时获取用户信息
onMounted(async () => {
    // å¦‚æžœstore中没有用户信息,则获取用户信息
    if (!userStore.name) {
        try {
            await userStore.getInfo()
            console.log('用户信息:', {
                id: userStore.id,
                name: userStore.name,
                nickName: userStore.nickName
            })
            // è‡ªåŠ¨å¡«å……ç»´æŠ¤äººID
            if (props.addOrEdit === 'add') {
                formData.value.maintainerId = userStore.id
            }
        } catch (error) {
            console.error('获取用户信息失败:', error)
        }
    } else {
        console.log('用户信息:', {
            id: userStore.id,
            name: userStore.name,
            nickName: userStore.nickName
        })
        // è‡ªåŠ¨å¡«å……ç»´æŠ¤äººID
        if (props.addOrEdit === 'add') {
            formData.value.maintainerId = userStore.id
        }
    }
})
const emit = defineEmits(['submit', 'handleBeforeClose','update:coalDialogFormVisible'])
// è¡¨å•引用
const formRef = ref(null)
// è¡¨å•数据
@@ -76,6 +112,10 @@
// ç›‘听外部传入的表单数据变化
watch(() => props.form, (newVal) => {
    formData.value = { ...newVal }
    // å¦‚果是新增模式,设置维护人
    if (props.addOrEdit === 'add' && userStore.id) {
        formData.value.maintainerId = userStore.id
    }
}, { deep: true })
// ç›‘听内部弹窗状态变化
@@ -88,7 +128,18 @@
    if (!formRef.value) return
    await formRef.value.validate(async (valid, fields) => {
        if (valid) {
            formData.value.maintenanceDate = "2023-10-01" // ç¤ºä¾‹æ—¥æœŸ
            delete formData.value.createTime
            delete formData.value.updateTime
            delete formData.value.maintainerName // åˆ é™¤æ˜¾ç¤ºç”¨çš„字段,只保留ID
            // ç¡®ä¿maintainerId有值
            if (!formData.value.maintainerId) {
                formData.value.maintainerId = userStore.id
            }
            // è®¾ç½®ç»´æŠ¤æ—¥æœŸ
            formData.value.maintenanceDate = getCurrentDate()
            let result = await addOrEditCoalInfo({
                ...formData.value,
            })
@@ -124,21 +175,15 @@
    { required: true, message: "请正确输入纳税人识别号", trigger: "blur" },
    { min: 17, max: 20, message: "请输入17-20位纳税人识别号", trigger: "blur" },
  ],
  address: [
    {
      required: true,
      message: "请选择经营地址",
      trigger: "change",
    },
  ],
  bankAccount: [{ required: true, message: "请输入银行账户", trigger: "blur" }],
  bank: [{ required: true, message: "请输入开户行", trigger: "blur" }],
  contacts: [{ required: true, message: "请输入开户行", trigger: "blur" }],
  contactsPhone: [
    { required: true, message: "请输入联系人", trigger: "blur" },
    { min: 11, max: 11, message: "请输入11位联系人电话", trigger: "blur" },
  ],
});
// èŽ·å–å½“å‰æ—¥æœŸå¹¶æ ¼å¼åŒ–ä¸º YYYY-MM-DD
function getCurrentDate() {
  const today = new Date();
  const year = today.getFullYear();
  const month = String(today.getMonth() + 1).padStart(2, '0'); // æœˆä»½ä»Ž0开始
  const day = String(today.getDate()).padStart(2, '0');
  return `${year}-${month}-${day}`;
}
</script>
<style lang="sass" scoped>
src/views/basicInformation/mould/customer.vue
@@ -1,70 +1,65 @@
<template>
    <div>
        <el-dialog
            v-model="dialogVisible"
            :title="title"
            width="600"
            :close-on-click-modal="false"
            :before-close="handleClose"
        >
            <el-form
                ref="formRef"
                style="max-width: 400px; margin: 0 auto"
                :model="formData"
                :rules="rules"
                label-width="auto"
            >
                <el-form-item label="卡胡" prop="supplierName">
                    <el-input
                        v-model="formData.supplierName"
                        placeholder="请输入供货商名称"
                    />
                </el-form-item>
                <el-form-item label="纳税人识别号" prop="identifyNumber">
                    <el-input
                        v-model="formData.identifyNumber"
                        placeholder="请输入纳税人识别号"
                    />
                </el-form-item>
                <el-form-item label="经营地址" prop="address">
                      <el-cascader
                        placeholder="请选择经营地址"
                        size="default"
                        :options="addressSelectOptions"
                        v-model="formData.address"
                        @change="handleChange"
                      >
                      </el-cascader>
                    </el-form-item>
                    <el-form-item label="详细地址" prop="addressDetail">
                      <el-input
                        v-model="formData.addressDetail"
                        placeholder="请输入客户详细地址"
                      />
                    </el-form-item>
                <el-form-item label="银行账户" prop="bankAccount">
                    <el-input v-model="formData.bankAccount" placeholder="请输入银行账户" />
                </el-form-item>
                <el-form-item>
                    <el-button type="primary" @click="submitForm">
                        ç¡®å®š
                    </el-button>
                    <el-button v-if="addOrEdit === 'edit'" @click="resetForm">重置</el-button>
                    <el-button v-if="addOrEdit === 'add'" @click="cancelForm">取消</el-button>
                </el-form-item>
            </el-form>
        </el-dialog>
    </div>
  <div>
    <el-dialog v-model="dialogVisible" :title="title" width="600" :close-on-click-modal="false"
      :before-close="handleClose">
      <el-form ref="formRef" style="max-width: 400px; margin: 0 auto" :model="formData" :rules="rules" label-width="auto">
        <el-form-item label="客户名称" prop="customerName">
          <el-input v-model="formData.customerName" placeholder="请输入客户名称" />
        </el-form-item>
        <el-form-item label="纳税人识别号" prop="taxpayerId">
          <el-input v-model="formData.taxpayerId" placeholder="请输入纳税人识别号" />
        </el-form-item>
        <el-form-item label="经营地址" prop="bids">
          <el-cascader placeholder="请选择经营地址" size="default" :options="addressSelectOptions" v-model="formData.bids"
           :props="cascaderProps" @change="handleChange">
          </el-cascader>
        </el-form-item>
        <el-form-item label="经营详细地址" prop="businessAddress">
          <el-input v-model="formData.businessAddress" placeholder="请输入经营详细地址" />
        </el-form-item>
        <el-form-item label="开户行" prop="bankName">
          <el-input v-model="formData.bankName" placeholder="请输入开户行" />
        </el-form-item>
        <el-form-item label="银行账户" prop="bankAccount">
          <el-input v-model="formData.bankAccount" placeholder="请输入银行账户" />
        </el-form-item>
        <el-form-item label="联系人" prop="contactPerson">
          <el-input v-model="formData.contactPerson" placeholder="请输入联系人" />
        </el-form-item>
        <el-form-item label="联系电话" prop="contactPhone">
          <el-input v-model="formData.contactPhone" placeholder="请输入联系电话" />
        </el-form-item>
        <el-form-item label="联系人地址" prop="cids">
          <el-cascader placeholder="请选择联系人地址" size="default" :options="addressSelectOptions" v-model="formData.cids"
            :props="cascaderProps" @change="handleChange">
          </el-cascader>
        </el-form-item>
        <el-form-item label="联系人详细" prop="contactAddress">
          <el-input v-model="formData.contactAddress" placeholder="请输入联系人详细地址" />
        </el-form-item>
        <el-form-item>
          <el-button type="primary" @click="submitForm">
            ç¡®å®š
          </el-button>
          <el-button v-if="addOrEdit === 'edit'" @click="resetForm">重置</el-button>
          <el-button v-if="addOrEdit === 'add'" @click="cancelForm">取消</el-button>
        </el-form-item>
      </el-form>
    </el-dialog>
  </div>
</template>
<script setup>
import { ref, watch, onMounted } from "vue";
import { getAreaOptions } from "@/api/system/area.js";
import addressList from "@/api/jsonApi/areaList.json";
import { addOrEditCustomer } from "@/api/basicInformation/customer";
const props = defineProps({
  beforeClose: {
    type: Function,
    default: () => {},
    default: () => { },
  },
  form: {
    type: Object,
@@ -79,6 +74,7 @@
    default: "",
  },
});
const handleChange = (value) => {
  console.log(value);
};
@@ -88,17 +84,25 @@
  "update:customerDialogFormVisible",
]);
onMounted(() => {
  addressSelectOptions.value = mapAddress(addressList);
});
  fetchAreaOptions()
})
// ä¿®æ”¹æ ‘形选择的映射
const cascaderProps = ref({
  value: 'id', // æŒ‡å®švalue字段为id
  label: 'label', // æŒ‡å®šlabel字段
  children: 'children' // æŒ‡å®šå­èŠ‚ç‚¹å­—æ®µ
})
// åœ°å€é€‰æ‹©æ•°æ®
const addressSelectOptions = ref([]);
// å¤„理地址数据转换
function mapAddress(list) {
  return list.map((item) => ({
    value: item.no,
    label: item.name,
    children: item.children ? mapAddress(item.children) : undefined,
  }));
const fetchAreaOptions = async () => {
  addressSelectOptions.value = [];
  const res = await getAreaOptions();
  if (res.code === 200) {
    addressSelectOptions.value = res.data;
  }
}
// è¡¨å•引用
const formRef = ref(null);
@@ -118,6 +122,13 @@
  },
  { deep: true }
);
watch(
  () => props.form,
  (newVal) => {
    formData.value = { ...newVal };
  },
  { deep: true }
);
// ç›‘听内部弹窗状态变化
watch(
@@ -130,9 +141,32 @@
// æäº¤è¡¨å•
const submitForm = async () => {
  if (!formRef.value) return;
  await formRef.value.validate((valid, fields) => {
  await formRef.value.validate(async (valid, fields) => {
    if (valid) {
      emit("submit", formData.value);
      const obj = ref({});
      if (props.title.includes('新增')) {
        let result = await addOrEditCustomer({
          ...formData.value,
        })
        obj.value = {
          title: "新增",
          ...formData.value,
          result
        };
      } else {
        delete formData.value.createTime
        delete formData.value.updateTime
        let result = await addOrEditCustomer({
          ...formData.value,
        })
        console.log(result);
        obj.value = {
          title: "编辑",
          ...formData.value,
          result
        };
      }
      emit("submit", obj.value);
    }
  });
};
@@ -153,10 +187,10 @@
  emit("update:customerDialogFormVisible", false);
};
const rules = reactive({
  supplierName: [
  customerName: [
    { required: true, message: "请输入供货商名称", trigger: "blur" },
  ],
  identifyNumber: [
  taxpayerId: [
    { required: true, message: "请正确输入纳税人识别号", trigger: "blur" },
    { min: 17, max: 20, message: "请输入17-20位纳税人识别号", trigger: "blur" },
  ],
@@ -168,9 +202,11 @@
    },
  ],
  bankAccount: [{ required: true, message: "请输入银行账户", trigger: "blur" }],
  bank: [{ required: true, message: "请输入开户行", trigger: "blur" }],
  contacts: [{ required: true, message: "请输入开户行", trigger: "blur" }],
  contactsPhone: [
  bankName: [{ required: true, message: "请输入开户行", trigger: "blur" }],
  contactPerson: [{ required: true, message: "请输入开户行", trigger: "blur" }],
  cids: [{ required: true, message: "请输入开户行", trigger: "blur" }],
  bids: [{ required: true, message: "请输入开户行", trigger: "blur" }],
  contactPhone: [
    { required: true, message: "请输入联系人", trigger: "blur" },
    { min: 11, max: 11, message: "请输入11位联系人电话", trigger: "blur" },
  ],
src/views/basicInformation/mould/supplier.vue
@@ -1,39 +1,41 @@
<template>
  <div>
    <el-dialog v-model="dialogVisible" :title="title" width="600" :close-on-click-modal="false"
               :before-close="handleClose">
      <el-form ref="formRef" style="max-width: 400px; margin: 0 auto" :model="formData" :rules="rules"
               label-width="auto">
      :before-close="handleClose">
      <el-form ref="formRef" style="max-width: 400px; margin: 0 auto" :model="formData" :rules="rules" label-width="auto">
        <el-form-item label="客户名称" prop="supplierName">
          <el-input v-model="formData.supplierName" placeholder="请输入供货商名称"/>
          <el-input v-model="formData.supplierName" placeholder="请输入供货商名称" />
        </el-form-item>
        <el-form-item label="纳税人识别号" prop="taxpayerId">
          <el-input v-model="formData.taxpayerId" placeholder="请输入纳税人识别号"/>
          <el-input v-model="formData.taxpayerId" placeholder="请输入纳税人识别号" />
        </el-form-item>
        <el-form-item label="经营地址" prop="bids">
          <el-cascader placeholder="请选择经营地址" size="default" :options="addressSelectOptions"
                       v-model="formData.bids"
                       :props="cascaderProps"
                       @change="handleChange">
          <el-cascader placeholder="请选择经营地址" size="default" :options="addressSelectOptions" v-model="formData.bids"
            :props="cascaderProps" @change="handleChange">
          </el-cascader>
        </el-form-item>
        <el-form-item label="详细地址" prop="businessAddress">
          <el-input v-model="formData.businessAddress" placeholder="请输入客户详细地址"/>
          <el-input v-model="formData.businessAddress" placeholder="请输入客户详细地址" />
        </el-form-item>
        <el-form-item label="开户行" prop="bankAccount">
          <el-input v-model="formData.bankAccount" placeholder="请输入开户行"/>
          <el-input v-model="formData.bankAccount" placeholder="请输入开户行" />
        </el-form-item>
        <el-form-item label="银行账户" prop="bankName">
          <el-input v-model="formData.bankName" placeholder="请输入银行账户"/>
          <el-input v-model="formData.bankName" placeholder="请输入银行账户" />
        </el-form-item>
        <el-form-item label="联系人" prop="contactPerson">
          <el-input v-model="formData.contactPerson" placeholder="请输入联系人"/>
          <el-input v-model="formData.contactPerson" placeholder="请输入联系人" />
        </el-form-item>
        <el-form-item label="联系人电话" prop="contactPhone">
          <el-input v-model="formData.contactPhone" placeholder="请输入联系人电话"/>
          <el-input v-model="formData.contactPhone" placeholder="请输入联系人电话" />
        </el-form-item>
        <el-form-item label="联系人地址" prop="contactAddress">
          <el-input v-model="formData.contactAddress" placeholder="请输入联系人地址"/>
        <el-form-item label="联系人地址" prop="cids">
          <el-cascader placeholder="请选择联系人地址" size="default" :options="addressSelectOptions" v-model="formData.cids"
            :props="cascaderProps" @change="handleChange">
          </el-cascader>
        </el-form-item>
        <el-form-item label="联系人详细地址" prop="contactAddress">
          <el-input v-model="formData.contactAddress" placeholder="请输入联系人地址" />
        </el-form-item>
        <el-form-item>
          <el-button type="primary" @click="submitForm"> ç¡®å®š</el-button>
@@ -46,9 +48,9 @@
</template>
<script setup>
import {ref, watch, defineProps, onMounted} from "vue";
import {addOrEditSupply} from "@/api/basicInformation/supplier";
import {getAreaOptions} from "@/api/system/area.js";
import { ref, watch, defineProps, onMounted } from "vue";
import { addOrEditSupply } from "@/api/basicInformation/supplier";
import { getAreaOptions } from "@/api/system/area.js";
const props = defineProps({
  beforeClose: {
@@ -106,7 +108,7 @@
// è¡¨å•引用
const formRef = ref(null);
// è¡¨å•数据
const formData = ref({...props.form});
const formData = ref({ ...props.form });
// å¼¹çª—可见性
const dialogVisible = defineModel("supplierDialogFormVisible", {
  required: true,
@@ -114,19 +116,19 @@
});
// ç›‘听外部传入的表单数据变化
watch(
    () => props.form,
    (newVal) => {
      formData.value = {...newVal};
    },
    {deep: true}
  () => props.form,
  (newVal) => {
    formData.value = { ...newVal };
  },
  { deep: true }
);
// ç›‘听内部弹窗状态变化
watch(
    () => dialogVisible.value,
    (newVal) => {
      emit("update:supplierDialogFormVisible", newVal);
    }
  () => dialogVisible.value,
  (newVal) => {
    emit("update:supplierDialogFormVisible", newVal);
  }
);
// å¤„理地址选择变化
const handleChange = (value) => {
@@ -137,11 +139,13 @@
  if (!formRef.value) return;
  await formRef.value.validate(async (valid, fields) => {
    if (valid) {
      const obj = ref({});
      if (props.title.includes('新增')) {
        let result = await addOrEditSupply({
          ...formData.value,
        })
        let obj = {
        obj.value = {
          title: "新增",
          ...formData.value,
          result
        };
@@ -151,9 +155,13 @@
        let result = await addOrEditSupply({
          ...formData.value,
        })
        console.log(result)
        obj.value = {
          title: "编辑",
          ...formData.value,
          result
        };
      }
      emit("submit", obj);
      emit("submit", obj.value);
    }
  });
};
@@ -175,25 +183,25 @@
};
const rules = reactive({
  supplierName: [
    {required: true, message: "请输入供货商名称", trigger: "blur"},
    { required: true, message: "请输入供货商名称", trigger: "blur" },
  ],
  taxpayerId: [
    {required: true, message: "请正确输入纳税人识别号", trigger: "blur"},
    {min: 17, max: 20, message: "请输入17-20位纳税人识别号", trigger: "blur"},
    { required: true, message: "请正确输入纳税人识别号", trigger: "blur" },
    { min: 17, max: 20, message: "请输入17-20位纳税人识别号", trigger: "blur" },
  ],
  bids: [
    {
      required: true,
      message: "请选择经营地址",
      trigger: "change",
    },
  ],
  bankName: [{required: true, message: "请输入银行账户", trigger: "blur"}],
  bankAccount: [{required: true, message: "请输入开户行", trigger: "blur"}],
  contactPerson: [{required: true, message: "联系人", trigger: "blur"}],
  // bids: [
  //   {
  //     required: true,
  //     message: "请选择经营地址",
  //     trigger: "change",
  //   },
  // ],
  bankName: [{ required: true, message: "请输入银行账户", trigger: "blur" }],
  bankAccount: [{ required: true, message: "请输入开户行", trigger: "blur" }],
  contactPerson: [{ required: true, message: "联系人", trigger: "blur" }],
  contactPhone: [
    {required: true, message: "请输入联系人", trigger: "blur"},
    {min: 11, max: 11, message: "请输入11位联系人电话", trigger: "blur"},
    { required: true, message: "请输入联系人", trigger: "blur" },
    { min: 11, max: 11, message: "请输入11位联系人电话", trigger: "blur" },
  ],
});
</script>
src/views/procureMent/components/ProductionDialog.vue
@@ -1,7 +1,7 @@
<template>
  <div>
    <el-dialog
      v-model="dialogVisible"
      v-model="dialogFormVisible"
      :title="title"
      width="600"
      :close-on-click-modal="false"
@@ -81,8 +81,8 @@
    default: "",
  },
});
const emit = defineEmits(["update:visible", "success"]);
const dialogVisible = defineModel("dialogFormVisible", {
const emit = defineEmits(["update:dialogFormVisible", "success"]);
const dialogFormVisible = defineModel("dialogFormVisible", {
  required: true,
  type: Boolean,
});
@@ -109,7 +109,7 @@
};
// å…³é—­å¼¹çª—
const handleClose = () => {
  dialogVisible.value = false;
  dialogFormVisible.value = false;
  console.log(form.value);
};
const handleReset = () => {
src/views/procureMent/index.vue
@@ -58,18 +58,15 @@
          :show-selection="true"
          :border="true"
          :maxHeight="440"
        />
      <pagination
        />      <pagination
        v-if="total>0"
        :page-num="pageNum"
        :page-size="pageSize"
        :page="pageNum"
        :limit="pageSize"
        :total="total"
        @pagination="handleQuery"
        @pagination="handlePagination"
        :layout="'total, prev, pager, next, jumper'"
      />
    </el-card>
    <ProductionDialog
        v-if="total>0"
    </el-card>    <ProductionDialog
        v-model:dialogFormVisible="dialogFormVisible"
        :form="form"
        :title="title"
@@ -80,14 +77,14 @@
</template>
<script setup>
import { ref, reactive, onMounted } from "vue";
import { ref, reactive, onMounted, getCurrentInstance } from "vue";
import { ElMessage, ElMessageBox } from "element-plus";
import { Plus, Edit, Delete, Download } from "@element-plus/icons-vue";
import DataTable from "@/components/Table/ETable.vue";
import Pagination from "@/components/Pagination";
import ProductionDialog from "./components/ProductionDialog.vue";
import ProductionDialog from './components/ProductionDialog.vue';
import { purchaseRegistration } from "@/api/procureMent";
const { proxy } = getCurrentInstance()
const dialogFormVisible = ref(false);
const form = ref({});
const title = ref("");
@@ -103,7 +100,8 @@
  supplierName: "",
  identifyNumber: "",
  address: "",
  pageNum: 1,
  pageSize: 10
});
// æ˜¯å¦ç¼–辑
const addOrEdit = ref("add");
@@ -113,21 +111,30 @@
const handleQuery = () => {
  loading.value = true;
  // è¿™é‡Œæ·»åŠ å®žé™…çš„æŸ¥è¯¢é€»è¾‘
  setTimeout(() => {
    loading.value = false;
  }, 500);
  getList();
};
// åˆ†é¡µå¤„理
const handlePagination = (val) => {
  console.log("分页参数:", val);
  pageNum.value = val.page;
  pageSize.value = val.limit;
  queryParams.pageNum = val.page;
  queryParams.pageSize = val.limit;
  getList();
};
// supplier ä¾›åº”商数据
const columns = ref([
  { prop: "supplierName", label: "供应商名称", minWidth: 200 },
  { prop: "category", label: "煤种", minWidth: 120 },
  { prop: "unit", label: "单位", minWidth: 150 },
  { prop: "purchaseAmount", label: "采购数量", minWidth: 120 },
  { prop: "priceBeforeTax", label: "单价(税前)", minWidth: 150 },
  { prop: "totalBeforeTax", label: "总价(税前)", minWidth: 100 },
  { prop: "calorificValue", label: "热值", minWidth: 150 },
  { prop: "registrant", label: "登记人", minWidth: 100 },
  { prop: "coal", label: "煤种类型", minWidth: 120 },
  { prop: "purchaseQuantity", label: "采购数量", minWidth: 100 },
  { prop: "priceIncludingTax", label: "单价(含税)", minWidth: 150 },
  { prop: "totalPriceIncludingTax", label: "总价(含税)", minWidth: 100 },
  { prop: "taxRate", label: "税率", minWidth: 100 },
  { prop: "priceExcludingTax", label: "不含税单价", minWidth: 100 },
  { prop: "registrantId", label: "登记人", minWidth: 100 },
  { prop: "registrationDate", label: "登记日期", minWidth: 100 },
]);
@@ -142,6 +149,7 @@
};
// æ–°å¢ž
const handleAdd = () => {
  console.log("点击新增按钮");
  addOrEdit.value = "add";
  handleAddEdit();
};
@@ -154,11 +162,24 @@
// æ‰“开弹窗
const openDialog = () => {
  if (addOrEdit.value === "edit") {
    // ç¡®ä¿å¤åˆ¶ä¸€ä»½æ•°æ®ï¼Œé¿å…ç›´æŽ¥å¼•用
    form.value = JSON.parse(JSON.stringify(form.value));
    dialogFormVisible.value = true;
    return;
  }
  form.value = {};
  dialogFormVisible.value = true;
  // æ–°å»ºæ—¶åˆå§‹åŒ–表单
  form.value = {
    supplierName: "",
    category: "",
    unit: "",
    purchaseAmount: "",
    priceBeforeTax: "",
    totalBeforeTax: "",
    calorificValue: "",
    registrant: "",
    registrationDate: new Date().toISOString().split('T')[0]
  };  dialogFormVisible.value = true;
  console.log("openDialog è®¾ç½® dialogFormVisible =", dialogFormVisible.value);
};
// æäº¤è¡¨å•
@@ -221,36 +242,26 @@
  total.value = tableData.value.length;
  ElMessage.success("操作成功");
};
const getList = () => {
const getList = async () => {
  loading.value = true;
  setTimeout(() => {
    tableData.value = [
      {
        supplierName: "中国石油化工股份有限公司",
        category: "煤",
        unit: "吨",
        purchaseAmount: "1000",
        priceBeforeTax: "100",
        totalBeforeTax: "100000",
        calorificValue: "5000",
        registrant: "张三",
        registrationDate: "2025-01-01",
      },
      {
        supplierName: "中国中石化",
        category: "精品煤",
        unit: "千克",
        purchaseAmount: "1000",
        priceBeforeTax: "100",
        totalBeforeTax: "100000",
        calorificValue: "5000",
        registrant: "李四",
        registrationDate: "2025-01-01",
      }
    ]
    total.value = tableData.value.length;
  try {
    // ä¼ é€’分页参数
    let res = await purchaseRegistration({
      pageNum: pageNum.value,
      pageSize: pageSize.value,
      ...queryParams
    });
    console.log("API返回数据:", res);
    if (res && res.data) {
      tableData.value = res.data.records || [];
      total.value = res.data.total || 0;
    }
  } catch (error) {
    console.error("获取数据失败:", error);
    ElMessage.error("获取数据失败");
  } finally {
    loading.value = false;
  }, 500);
  }
};
getList();
</script>