张诺
2 天以前 437a70bd86d8adda3da41853b8b1c2706a22fdd7
优化文档管理及基础信息页面
已修改10个文件
已添加1个文件
607 ■■■■ 文件已修改
src/views/archiveManagement/index.vue 156 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/views/archiveManagement/mould/archiveDialog.vue 119 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/views/basicInformation/index.vue 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/views/basicInformation/mould/coal.vue 2 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/views/basicInformation/mould/coalMeiZhiZiDuanWeiHu.vue 2 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/views/basicInformation/mould/coalQualityMaintenance.vue 7 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/views/basicInformation/mould/customer.vue 2 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/views/basicInformation/mould/supplier.vue 2 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/views/procureMent/components/ProductionDialog.vue 154 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/views/procureMent/index.vue 145 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/views/production/components/ProductionDialog.vue 16 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/views/archiveManagement/index.vue
@@ -92,10 +92,21 @@
    </div>
    <div class="right">
      <el-row :gutter="24">
          <el-col :span="2" :offset="20"><el-button :icon="Delete" type="danger">删除</el-button></el-col>
          <el-col :span="2"><el-button :icon="Plus" type="primary">新增</el-button></el-col>
        <el-col :span="2" :offset="20"
          ><el-button :icon="Delete" type="danger" @click="delHandler">删除</el-button></el-col
        >
        <el-col :span="2"
          ><el-button
            :icon="Plus"
            type="primary"
            @click="add"
            :disabled="!tableData.length"
            >新增</el-button
          ></el-col
        >
      </el-row>
      <ETable
        :maxHeight="1200"
        :loading="loading"
        :table-data="tableData"
        :columns="columns"
@@ -107,17 +118,27 @@
      </ETable>
      <Pagination
        :total="total"
        :page-size="10"
        :page-count="Math.ceil(total / 10)"
        @page-change="currentPageChange"
        :page="queryParams.current"
        :limit="queryParams.pageSize"
        :show-total="true"
        @pagination="handlePageChange"
        :layout="'total, prev, pager, next, jumper'"
      ></Pagination>
    </div>
    <archiveDialog
      v-model:centerDialogVisible="dialogVisible"
      @centerDialogVisible="centerDialogVisible"
      :row="row"
      @submitForm="submitForm"
    >
    </archiveDialog>
  </el-card>
</template>
<script setup>
import { onMounted, ref, nextTick } from "vue";
import { onMounted, ref, nextTick, reactive } from "vue";
import ETable from "@/components/Table/ETable.vue";
import { ElButton, ElInput, ElIcon } from "element-plus";
import { ElButton, ElInput, ElIcon, ElMessage } from "element-plus";
import archiveDialog from "./mould/archiveDialog.vue";
import Pagination from "@/components/Pagination/index.vue";
import {
  Plus,
@@ -134,6 +155,7 @@
  addOrEditArchive,
  delArchive,
} from "@/api/archiveManagement";
const dialogVisible = ref(false); // æŽ§åˆ¶å½’档对话框显示
const loading = ref(false);
const tableData = ref([]);
const treeData = ref([]);
@@ -142,35 +164,131 @@
const filterText = ref(""); // æœç´¢å…³é”®å­—
const treeRef = ref(); // æ ‘组件引用
const total = ref(0); // æ€»è®°å½•æ•°
const current = ref(1); // å½“前页码
const columns = [
  { prop: "name", label: "名称", minWidth: 180 },
  { prop: "type", label: "类型", minWidth: 120 },
  { prop: "status", label: "状态", minWidth: 100 },
];
const selectedRows = reactive([]); // å­˜å‚¨é€‰ä¸­è¡Œæ•°æ®
const handleSelectionChange = (selection) => {
  console.log("Selected rows:", selection);
  selectedRows.splice(0, selectedRows.length, ...selection);
};
const queryParams = reactive({
  searchText: "",
  current: 1,
  pageSize: 10, // å›ºå®šæ¯é¡µ10条
  treeId: null, // å½“前树节点ID
});
// æœç´¢è¿‡æ»¤åŠŸèƒ½
const handleFilter = () => {
  treeRef.value?.filter(filterText.value);
};
const row = ref({}); // å½“前选中行数据
const filterNode = (value, data) => {
  if (!value) return true;
  return data.name?.toLowerCase().includes(value.toLowerCase());
};
const submitForm = async (res) => {
  console.log("提交表单回调:", res);
  if (res && res.code === 200) {
    ElMessage.success("操作成功");
    // åˆ·æ–°åˆ—表数据
    await getArchiveListData();
  } else {
    ElMessage.error("操作失败: " + (res?.message || "未知错误"));
  }
}
const centerDialogVisible = (val) => {
  console.log(val);
};
// å¤„理节点点击
const handleNodeClick = async (data) => {
  console.log("点击节点:", data);
  let res = await getArchiveList(data.id);
  tableData.value = res.data?.records || res.data || [];
  console.log(data)
  // åˆ‡æ¢èŠ‚ç‚¹æ—¶é‡ç½®åˆ°ç¬¬ä¸€é¡µ
  queryParams.current = 1;
  queryParams.treeId = data.id;
  getArchiveListData();
};
const currentPageChange = (id) => {
  console.log(id);
// add
const add = () => {
  row.value = {}; // æ¸…空行数据,确保是新增模式
  dialogVisible.value = true;
  newName.value = ""; // æ¸…空输入框
};
// å¤„理分页变化
const handlePageChange = ({ page }) => {
  console.log("分页变化:", { page });
  queryParams.current = page;
  // pageSize å›ºå®šä¸º20,不再从参数中获取
  getArchiveListData();
};
const getArchiveListData = async () => {
  try {
    loading.value = true;
    console.log("获取归档列表数据", {
      treeId: queryParams.treeId,
      current: queryParams.current,
      pageSize: queryParams.pageSize,
    });
    let res = await getArchiveList({
      treeId: queryParams.treeId,
      current: queryParams.current,
      size: queryParams.pageSize,
    });
    if (res.code !== 200) {
      ElMessage.error("获取数据失败: " + res.message);
      tableData.value = [];
      total.value = 0;
      return;
    }
    tableData.value = res.data?.records || res.data || [];
    total.value = res.data?.total || 0;
    // ç¡®ä¿åˆ†é¡µå‚数正确更新
    if (res.data?.current) {
      queryParams.current = res.data.current;
    }
    // pageSize å›ºå®šä¸º20,不从后端获取
    console.log("数据更新完成:", {
      total: total.value,
      current: queryParams.current,
      pageSize: queryParams.pageSize,
      records: tableData.value.length,
    });
  } catch (error) {
    console.error("获取归档列表失败:", error);
    ElMessage.error("获取数据失败");
    tableData.value = [];
    total.value = 0;
  } finally {
    loading.value = false;
  }
};
const delHandler = async () => {
  if (selectedRows.length === 0) {
    ElMessage.warning("请选择要删除的数据");
    return;
  }
  try {
    const ids = selectedRows.map((row) => row.id);
    console.log(ids)
    const { code, msg } = await delArchive(ids);
    if (code !== 200) {
      ElMessage.warning("删除失败: " + msg);
    } else {
      ElMessage.success("删除成功");
      // åˆ é™¤æˆåŠŸåŽé‡æ–°èŽ·å–æ•°æ®
      await getArchiveListData();
    }
  } catch (error) {
    console.error("删除归档失败:", error);
    ElMessage.error("删除归档失败");
  }
};
// åŒå‡»ç¼–辑节点
const headerDbClick = (comeTreeData) => {
@@ -327,7 +445,11 @@
  }
};
const handleEdit = () => {};
const handleEdit = (rows) => {
  row.value = rows;
  dialogVisible.value = true;
  console.log("编辑节点:", row.value);
};
// ç§»é™¤æ‡’加载,直接获取数据
const getList = async () => {
src/views/archiveManagement/mould/archiveDialog.vue
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,119 @@
<template>
  <el-dialog v-model="centerDialogVisible" title="Warning" width="500" center>
    <el-form
      ref="ruleFormRef"
      style="max-width: 600px"
      :model="ruleForm"
      :rules="rules"
      label-width="auto"
    >
      <el-form-item label="名称" prop="name">
        <el-input v-model="ruleForm.name" placeholder="请输入文档名称"/>
      </el-form-item>
      <el-form-item label="请输入文档类型" prop="type">
        <el-select v-model="ruleForm.type" placeholder="请输入文档类型">
          <el-option label="合同" value="合同" />
          <el-option label="报告" value="报告" />
        </el-select>
      </el-form-item>
      <el-form-item label="请输入文档状态" prop="status">
        <el-select v-model="ruleForm.status" placeholder="请输入文档状态">
          <el-option v-for="option in options" :key="option.value" :label="option.label" :value="option.value" />
        </el-select>
      </el-form-item>
    </el-form>
    <template #footer>
      <div class="dialog-footer">
        <el-button @click="centerDialogVisible = false">Cancel</el-button>
        <el-button type="primary" @click="submit">
          Confirm
        </el-button>
      </div>
    </template>
  </el-dialog>
</template>
<script setup>
import { ref, watch } from "vue";
import { addOrEditArchive } from "@/api/archiveManagement"
const centerDialogVisible = defineModel("centerDialogVisible", {
  type: Boolean,
  default: false,
});
const props = defineProps({
  row: {
    type: Object,
    default: () => ({}),
  },
});
const copyFormData = (data) => {
  return JSON.parse(JSON.stringify(data));
};
// åˆå§‹åŒ–表单数据的辅助函数
const initFormData = (rowData) => {
  if (rowData && rowData.id) {
    return copyFormData(rowData);
  }
  return {
    name: "",
    type: "",
    status: "",
  };
};
// åˆå§‹åŒ–表单数据
const ruleFormRef = ref(null);
const ruleForm = ref(initFormData(props.row));
const copyForm = ref()
// ç›‘听 row çš„变化,更新 ruleForm
watch(() => props.row, (newRow) => {
  copyForm.value = initFormData(newRow);
  ruleForm.value = JSON.parse(JSON.stringify(copyForm.value));
}, { deep: true });
const rules = {
  name: [
    { required: true, message: "Please input activity name", trigger: "blur" },
  ],
  type: [
    { required: true, message: "Please select activity zone", trigger: "change" },
  ],
  status: [
    { required: true, message: "Please select activity count", trigger: "change" },
  ],
};
const options = [
  { value: "有效", label: "有效" },
  { value: "无效", label: "无效" },
  { value: "作废", label: "作废" },
];
const emit = defineEmits(["submitForm"]);
const submit = async () => {
  // éªŒè¯è¡¨å•
  if (!ruleFormRef.value) return;
  try {
    const valid = await ruleFormRef.value.validate();
    if (!valid) {
      return;
    }
    // è°ƒç”¨ API
    let res = await addOrEditArchive(ruleForm.value);
    console.log("API å“åº”:", res);
    // å‘送 emit äº‹ä»¶
    emit("submitForm", res);
    console.log("emit submitForm å·²å‘送");
    // å…³é—­å¯¹è¯æ¡†
    centerDialogVisible.value = false;
  } catch (error) {
    console.error("表单验证失败或API调用失败:", error);
  }
}
</script>
<style lang="less" scoped></style>
src/views/basicInformation/index.vue
@@ -314,7 +314,7 @@
    }
  },
  { prop: "contactAddress", label: "联系人详细地址", minWidth: 120 },
  { prop: "createTime", label: "维护日期", minWidth: 120 },
  { prop: "updateTime", label: "维护日期", minWidth: 120 },
]);
/**
src/views/basicInformation/mould/coal.vue
@@ -121,8 +121,6 @@
    if (!formRef.value) return
    await formRef.value.validate(async (valid, fields) => {
        if (valid) {
            delete formData.value.createTime
            delete formData.value.updateTime
            delete formData.value.maintainerName // åˆ é™¤æ˜¾ç¤ºç”¨çš„字段,只保留ID
            
            // ç¡®ä¿maintainerId有值
src/views/basicInformation/mould/coalMeiZhiZiDuanWeiHu.vue
@@ -91,8 +91,6 @@
          result
        };
      } else {
        delete formData.value.createTime
        delete formData.value.updateTime
        let result = await addOrEditCoalField({
          ...formData.value,
        })
src/views/basicInformation/mould/coalQualityMaintenance.vue
@@ -221,13 +221,6 @@
      coalFields: stringifyCoalFields(formData.value.coalFields),
      fieldIds: stringifyCoalFields(formData.value.fieldIds)
    };
    // åˆ é™¤ä¸éœ€è¦çš„æ—¶é—´å­—段(编辑时)
    if (isEditMode.value) {
      delete submitData.createTime;
      delete submitData.updateTime;
    }
    // è°ƒç”¨API提交数据
    const result = await addOrEditCoalPlan(submitData);
src/views/basicInformation/mould/customer.vue
@@ -158,8 +158,6 @@
          result
        };
      } else {
        delete formData.value.createTime
        delete formData.value.updateTime
        let result = await addOrEditCustomer({
          ...formData.value,
        })
src/views/basicInformation/mould/supplier.vue
@@ -153,8 +153,6 @@
          result
        };
      } else {
        delete formData.value.createTime
        delete formData.value.updateTime
        let result = await addOrEditSupply({
          ...formData.value,
        })
src/views/procureMent/components/ProductionDialog.vue
@@ -17,40 +17,44 @@
        style="max-width: 400px; margin: 0 auto"
      >
        <el-form-item label="供应商名称" prop="supplierName">
          <el-input v-model="form.supplierName" placeholder="请输入" />
          <el-select v-model="form.supplierName" placeholder="请选择供应商">
            <el-option :label="item.label" v-for="item in supplyList" :key="item.value" :value="item.value" />
          </el-select>
        </el-form-item>
        <el-form-item label="煤种" prop="coal">
            <el-select v-model="form.coal" placeholder="请选择煤种" clearable style="width: 100%">
              <el-option label="瘦煤" value="瘦煤" />
              <el-option label="气煤" value="气煤" />
              <el-option label="无烟煤" value="无烟煤" />
              <el-option label="长焰煤" value="长焰煤" />
              <el-option label="贫煤" value="贫煤" />
          <el-select v-model="form.coal" placeholder="请选择煤种">
            <el-option :label="item.label" v-for="item in coalList" :key="item.value" :value="item.value" />
            </el-select>
          </el-form-item>
        <el-form-item label="单位" prop="unit">
          <el-select v-model="form.unit" placeholder="请选择单位" clearable style="width: 100%">
          <el-select
            v-model="form.unit"
            placeholder="请选择单位"
            clearable
            style="width: 100%"
          >
              <el-option label="吨" value="吨" />
              <el-option label="千克" value="千克" />
            </el-select>
        </el-form-item>        <el-form-item label="采购数量" prop="purchaseQuantity">
        </el-form-item>
        <el-form-item label="采购数量" prop="purchaseQuantity">
          <el-input 
            v-model.number="form.purchaseQuantity" 
            placeholder="请输入"
            @blur="handleQuantityBlur"
          >
            <template v-slot:suffix>
            <i style="font-style:normal;">{{form.unit?form.unit:''}}</i>
              <i style="font-style: normal">{{ form.unit ? form.unit : "" }}</i>
          </template>
          </el-input>
        </el-form-item><el-form-item label="税率" prop="taxRate">
          </el-input> </el-form-item
        ><el-form-item label="税率" prop="taxRate">
          <el-input 
            v-model.number="form.taxRate" 
            placeholder="请输入税率"
            @blur="handleTaxRateBlur"
          >
            <template v-slot:suffix>
            <i style="font-style:normal;">%</i>
              <i style="font-style: normal">%</i>
          </template>
            </el-input>
        </el-form-item>
@@ -61,16 +65,17 @@
            @blur="handlePriceBlur"
          >
            <template v-slot:suffix>
            <i style="font-style:normal;">元</i>
              <i style="font-style: normal">元</i>
          </template>
          </el-input>
        </el-form-item>        <el-form-item label="单价(含税)" prop="priceIncludingTax">
        </el-form-item>
        <el-form-item label="单价(含税)" prop="priceIncludingTax">
          <el-input 
            v-model.number="form.priceIncludingTax"
            placeholder="自动计算" 
          >
            <template v-slot:suffix>
            <i style="font-style:normal;">元</i>
              <i style="font-style: normal">元</i>
          </template>
          </el-input>
        </el-form-item>
@@ -80,7 +85,7 @@
            placeholder="自动计算" 
          >
            <template v-slot:suffix>
            <i style="font-style:normal;">元</i>
              <i style="font-style: normal">元</i>
          </template>
          </el-input>
        </el-form-item>
@@ -90,7 +95,7 @@
            placeholder="自动计算" 
          >
            <template v-slot:suffix>
            <i style="font-style:normal;">元</i>
              <i style="font-style: normal">元</i>
          </template>
          </el-input>
        </el-form-item>
@@ -111,14 +116,10 @@
      <template #footer>
        <div class="dialog-footer">
          <!-- é‡ç½®å’Œå–消 -->
          <el-button
            @click="handleClose"
            v-if="title.includes('新增')"
          <el-button @click="handleClose" v-if="title.includes('新增')"
            >取消</el-button
          >
          <el-button
            @click="handleReset"
            v-if="title.includes('编辑')"
          <el-button @click="handleReset" v-if="title.includes('编辑')"
            >重置</el-button
          >
          <el-button type="primary" @click="handleSubmit">确认</el-button>
@@ -131,8 +132,10 @@
<script setup name="ProductionDialog">
import { ref, defineProps, watch, onMounted, nextTick, computed  } from "vue";
import { ElMessage } from "element-plus";
import useUserStore from '@/store/modules/user'
import useUserStore from "@/store/modules/user";
import {addOrEditPR} from "@/api/procureMent";
import { getSupply } from "@/api/basicInformation/supplier";
import { getCoalInfo } from "@/api/basicInformation/coal";
const props = defineProps({
  title: {
    type: String,
@@ -152,12 +155,42 @@
  required: true,
  type: Object,
});
const supplyList = ref([]);
const coalList = ref([]);
// èŽ·å–ä¾›åº”å•†ä¸‹æ‹‰å’Œç…¤ç§ä¸‹æ‹‰
const getDropdownData = async () => {
  try {
    const [supplyRes, coalRes] = await Promise.all([
      getSupply(),
      getCoalInfo(),
    ]);
    let supplyData = supplyRes.data.records;
    let coalData = coalRes.data.records;
    supplyList.value = supplyData.map((item) => ({
      value: item.id,
      label: item.supplierName,
    }));
    coalList.value = coalData.map((item) => ({
      value: item.id,
      label: item.coal,
    }));
    console.log(supplyList.value, coalList.value);
  } catch (error) {
    console.error("获取下拉数据失败:", error);
  }
};
defineExpose({
  getDropdownData,
});
const toFixed = (num, precision = 2) => {
  if (isNaN(num) || num === null || num === undefined || num === '') {
  if (isNaN(num) || num === null || num === undefined || num === "") {
    return 0;
  }
  return Math.floor(parseFloat(num) * Math.pow(10, precision)) / Math.pow(10, precision);
  return (
    Math.floor(parseFloat(num) * Math.pow(10, precision)) /
    Math.pow(10, precision)
  );
};
// å«ç¨Žå•价计算
const unitPriceWithTax = computed(() => {
@@ -211,34 +244,52 @@
  form.value.totalPriceExcludingTax = newValue;
});
const userStore = useUserStore()
const userStore = useUserStore();
const userInfo = ref({});
// å¤„理税率输入框失焦,确保精度
const handleTaxRateBlur = () => {
  if (form.value.taxRate !== null && form.value.taxRate !== undefined && form.value.taxRate !== '') {
  if (
    form.value.taxRate !== null &&
    form.value.taxRate !== undefined &&
    form.value.taxRate !== ""
  ) {
    form.value.taxRate = toFixed(parseFloat(form.value.taxRate), 2);
  }
};
// å¤„理不含税单价输入框失焦,确保精度
const handlePriceBlur = () => {
  if (form.value.priceExcludingTax !== null && form.value.priceExcludingTax !== undefined && form.value.priceExcludingTax !== '') {
    form.value.priceExcludingTax = toFixed(parseFloat(form.value.priceExcludingTax), 2);
  if (
    form.value.priceExcludingTax !== null &&
    form.value.priceExcludingTax !== undefined &&
    form.value.priceExcludingTax !== ""
  ) {
    form.value.priceExcludingTax = toFixed(
      parseFloat(form.value.priceExcludingTax),
      2
    );
  }
};
// å¤„理采购数量输入框失焦,确保精度
const handleQuantityBlur = () => {
  if (form.value.purchaseQuantity !== null && form.value.purchaseQuantity !== undefined && form.value.purchaseQuantity !== '') {
    form.value.purchaseQuantity = toFixed(parseFloat(form.value.purchaseQuantity), 3); // æ•°é‡ä¿ç•™3位小数
  if (
    form.value.purchaseQuantity !== null &&
    form.value.purchaseQuantity !== undefined &&
    form.value.purchaseQuantity !== ""
  ) {
    form.value.purchaseQuantity = toFixed(
      parseFloat(form.value.purchaseQuantity),
      3
    ); // æ•°é‡ä¿ç•™3位小数
  }
};
onMounted(async () => {
  let res = await userStore.getInfo()
  let res = await userStore.getInfo();
  userInfo.value = res;
})
});
const rules = {
  supplierName: [
    { required: true, message: "请输入供应商名称", trigger: "blur" },
@@ -249,10 +300,18 @@
    { required: true, message: "请输入采购数量", trigger: "blur" },
    { type: "number", message: "采购数量必须为数字", trigger: "blur" },
  ],
  priceExcludingTax: [{ required: true, message: "请输入单价", trigger: "blur" }],
  totalPriceExcludingTax: [{ required: true, message: "请输入总价", trigger: "blur" }],
  priceIncludingTax: [{ required: true, message: "请输入含税单价", trigger: "blur" }],
  totalPriceIncludingTax: [{ required: true, message: "请输入含税总价", trigger: "blur" }],
  priceExcludingTax: [
    { required: true, message: "请输入单价", trigger: "blur" },
  ],
  totalPriceExcludingTax: [
    { required: true, message: "请输入总价", trigger: "blur" },
  ],
  priceIncludingTax: [
    { required: true, message: "请输入含税单价", trigger: "blur" },
  ],
  totalPriceIncludingTax: [
    { required: true, message: "请输入含税总价", trigger: "blur" },
  ],
  taxRate: [{ required: true, message: "请输入税率", trigger: "blur" }],
  registrantId: [{ required: true, message: "请输入登记人", trigger: "blur" }],
  registrationDate: [
@@ -280,25 +339,25 @@
  await formRef.value.validate(async (valid) => {
    if (valid) {
      const obj = ref({});
      if (props.title.includes('新增')) {
      if (props.title.includes("新增")) {
        let result = await addOrEditPR({
          ...form.value,
        })
        });
        obj.value = {
          title: "新增",
          ...form.value,
          result
          result,
        };
      } else {
        delete form.value.updateTime
        delete form.value.createTime
        delete form.value.updateTime;
        delete form.value.createTime;
        let result = await addOrEditPR({
          ...form.value,
        })
        });
        obj.value = {
          title: "编辑",
          ...form.value,
          result
          result,
        };
      }
      emit("submit", obj.value);
@@ -307,5 +366,4 @@
};
</script>
<style lang="sass" scoped>
</style>
<style lang="sass" scoped></style>
src/views/procureMent/index.vue
@@ -2,16 +2,36 @@
  <div class="app-container">
    <el-form :inline="true" :model="queryParams" class="search-form">
      <el-form-item label="搜索">
        <el-input v-model="queryParams.searchText" placeholder="请输入关键词" clearable :style="{ width: '100%' }" />
        <el-input
          v-model="queryParams.searchText"
          placeholder="请输入关键词"
          clearable
          :style="{ width: '100%' }"
        />
      </el-form-item>
      <el-form-item label="供应商名称">
        <el-input v-model="queryParams.supplierName" placeholder="请输入" clearable :style="{ width: '100%' }" />
        <el-input
          v-model="queryParams.supplierName"
          placeholder="请输入"
          clearable
          :style="{ width: '100%' }"
        />
      </el-form-item>
      <el-form-item label="统一人识别号">
        <el-input v-model="queryParams.identifyNumber" placeholder="请输入" clearable :style="{ width: '100%' }" />
        <el-input
          v-model="queryParams.identifyNumber"
          placeholder="请输入"
          clearable
          :style="{ width: '100%' }"
        />
      </el-form-item>
      <el-form-item label="经营地址">
        <el-input v-model="queryParams.address" placeholder="请输入" clearable :style="{ width: '100%' }" />
        <el-input
          v-model="queryParams.address"
          placeholder="请输入"
          clearable
          :style="{ width: '100%' }"
        />
      </el-form-item>
      <el-form-item>
        <el-button type="primary" @click="handleQuery">查询</el-button>
@@ -21,17 +41,44 @@
    <el-card>
      <!-- æ“ä½œæŒ‰é’®åŒº -->
      <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="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-row>
      <!-- è¡¨æ ¼ç»„ä»¶ -->
      <data-table :loading="loading" :table-data="tableData" :columns="columns" @selection-change="handleSelectionChange"
        @edit="handleEdit" @delete="handleDeleteSuccess" :show-selection="true" :border="true" :maxHeight="440" />
      <pagination v-if="total>0" :page="pageNum" :limit="pageSize" :total="total" @pagination="handlePagination"
        :layout="'total, prev, pager, next, jumper'" />
    </el-card>    <ProductionDialog v-model:copyForm="copyForm" v-model:dialogFormVisible="dialogFormVisible" v-model:form="form" :title="title" @submit="handleSubmit"
      @success="handleSuccess" />
      <data-table
        :loading="loading"
        :table-data="tableData"
        :columns="columns"
        @selection-change="handleSelectionChange"
        @edit="handleEdit"
        @delete="handleDeleteSuccess"
        :show-selection="true"
        :border="true"
        :maxHeight="440"
      />
      <pagination
        v-if="total > 0"
        :page="current"
        :limit="pageSize"
        :total="total"
        @pagination="handlePagination"
        :layout="'total, prev, pager, next, jumper'"
      />
    </el-card>
    <ProductionDialog
      v-model:copyForm="copyForm"
      v-model:dialogFormVisible="dialogFormVisible"
      v-model:form="form"
      :title="title"
      @submit="handleSubmit"
      @success="handleSuccess"
      ref="productionDialogs"
    />
  </div>
</template>
@@ -41,32 +88,18 @@
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";
import useUserStore from '@/store/modules/user'
import useDictStore from "@/store/modules/dict";
import useUserStore from "@/store/modules/user";
// å¼•入字典数据
const useDictStores = useDictStore();
useDictStores.setDict({
  id: 1,
  name: "煤种类型",
  type: "coalType",
  items: [
    { label: "无烟煤", value: "anthracite" },
    { label: "烟煤", value: "bituminous" },
    { label: "褐煤", value: "lignite" }
  ]
})
console.log(useDictStores.dict);
const { proxy } = getCurrentInstance()
const { proxy } = getCurrentInstance();
const dialogFormVisible = ref(false);
const form = ref({});
const title = ref("");
// çŠ¶æ€å˜é‡
const loading = ref(false);
const total = ref(0);
const pageNum = ref(1)
const current = ref(1);
const pageSize = ref(10);
const selectedRows = ref([]);
const copyForm = ref({});
@@ -76,8 +109,8 @@
  supplierName: "",
  identifyNumber: "",
  address: "",
  pageNum: 1,
  pageSize: 10
  current: 1,
  pageSize: 10,
});
// æ˜¯å¦ç¼–辑
const addOrEdit = ref("add");
@@ -93,14 +126,14 @@
// èŽ·å–ç”¨æˆ·ä¿¡æ¯
const userInfo = ref({});
onMounted(async() => {
  let res = await userStore.getInfo()
  let res = await userStore.getInfo();
  userInfo.value = res.user;
});
// åˆ†é¡µå¤„理
const handlePagination = (val) => {
  pageNum.value = val.page;
  current.value = val.page;
  pageSize.value = val.limit;
  queryParams.pageNum = val.page;
  queryParams.current = val.page;
  queryParams.pageSize = val.limit;
  getList();
};
@@ -122,7 +155,7 @@
// é‡ç½®æŸ¥è¯¢
const resetQuery = () => {
  Object.keys(queryParams).forEach((key) => {
    if (key !== "pageNum" && key !== "pageSize") {
    if (key !== "current" && key !== "pageSize") {
      queryParams[key] = "";
    }
  });
@@ -133,9 +166,18 @@
  handleAddEdit();
};
// æ–°å¢žç¼–辑
const productionDialogs = ref(null); // æ·»åŠ ref声明
const handleAddEdit = () => {
  addOrEdit.value == "add" ? (title.value = "新增") : (title.value = "编辑");
  title.value = title.value + "采购信息";
  // æ­£ç¡®ä½¿ç”¨å­ç»„ä»¶ref
  if (productionDialogs.value) {
    // è¿™é‡Œå¯ä»¥è°ƒç”¨å­ç»„件的方法
    console.log("子组件实例:", productionDialogs.value.getDropdownData());
  }
  openDialog();
};
// æ‰“开弹窗
@@ -144,6 +186,7 @@
    // ç¡®ä¿å¤åˆ¶ä¸€ä»½æ•°æ®ï¼Œé¿å…ç›´æŽ¥å¼•用
    copyForm.value = JSON.parse(JSON.stringify(form.value));
    dialogFormVisible.value = true;
    // è§¦å‘ref里面的方法
    return;
  }
  // æ–°å»ºæ—¶åˆå§‹åŒ–表单
@@ -158,7 +201,7 @@
    totalPriceIncludingTax: "",
    taxRate: "",
    registrantId: userInfo.value.userName,
    registrationDate: new Date().toISOString().split('T')[0]
    registrationDate: new Date().toISOString().split("T")[0],
  };
  // æ–°å»ºæ—¶ä¹Ÿéœ€è¦è®¾ç½® copyForm ç”¨äºŽé‡ç½®åŠŸèƒ½
  copyForm.value = JSON.parse(JSON.stringify(form.value));
@@ -183,22 +226,18 @@
const handleEdit = (row) => {
  form.value = JSON.parse(JSON.stringify(row));
  addOrEdit.value = "edit";
  handleAddEdit()
  handleAddEdit();
};
const handleDelete = () => {
  if (selectedRows.value.length === 0) {
    ElMessage.warning("请选择要删除的数据");
    return;
  }
  ElMessageBox.confirm(
    `确定删除选中的数据吗?`,
    "提示",
    {
  ElMessageBox.confirm(`确定删除选中的数据吗?`, "提示", {
      confirmButtonText: "确定",
      cancelButtonText: "取消",
      type: "warning"
    }
  )
    type: "warning",
  })
    .then(() => {
      // æ¨¡æ‹Ÿåˆ é™¤æ“ä½œ
      tableData.value = tableData.value.filter(
@@ -210,15 +249,19 @@
    .catch(() => {
      ElMessage.info("已取消删除");
    });
}
};
const handleDeleteSuccess = (row) => {
  ElMessage.success("删除成功:" + row.supplierName);
};
// å¯¼å‡º
const handleExport = (row) => {
  proxy.download("system/post/export", {
    ...queryParams.value
  }, `post_${new Date().getTime()}.xlsx`)
  proxy.download(
    "system/post/export",
    {
      ...queryParams.value,
    },
    `post_${new Date().getTime()}.xlsx`
  );
  ElMessage.success("导出数据:" + row.supplierName);
};
// æˆåŠŸ
@@ -233,9 +276,9 @@
  try {
    // ä¼ é€’分页参数
    let res = await purchaseRegistration({
      pageNum: pageNum.value,
      current: current.value,
      pageSize: pageSize.value,
      ...queryParams
      ...queryParams,
    });
    if (res && res.data) {
      tableData.value = res.data.records || [];
src/views/production/components/ProductionDialog.vue
@@ -8,7 +8,6 @@
  >
    <el-button type="primary" @click="handlData">选择数据</el-button>
    <ETable
      v-if="tableData.length > 0"
      :columns="columns"
      height="200"
      @cell-edit="handleCellEdit"
@@ -19,7 +18,7 @@
    />
    <div class="empty-table">
    <h1>生产明细</h1>
      <el-row :gutter="10" v-if="tableData.length > 0">
      <el-row :gutter="10">
      <el-col :span="2">
        <el-button type="primary" @click="addNewRow">
          <el-icon>
@@ -45,7 +44,6 @@
      </el-col> -->
    </el-row>
    <ProductionDetailsTable
     v-if="tableData.length > 0"
      v-model="detailsTableData"
      :border="false"
      :show-operations="true"
@@ -53,7 +51,6 @@
      @input-change="handleDetailsChange"
      @delete-row="handleDeleteRow"
    />
      <div style="margin-top: 20px;" v-else>暂无数据,请选择配置数据</div>
    </div>
@@ -129,16 +126,7 @@
  { label: "本次使用数量", prop: "used" },
];
const detailsTableData = ref([
  {
    coalType: "",
    calorificValue: "",
    productionQuantity: "",
    laborCost: "",
    energyCost: "",
    equipmentDepreciation: "",
    purchasePrice: "",
    totalCost: "",
  },
]);
const handleRowClick = (row) => {
  currentRow.value = row;