yyb
15 小时以前 d1733a6f090c0caf96c30c4b2f4f08c7d43c8d3c
Merge branch 'dev_银川_中盛建材' of http://114.132.189.42:9002/r/product-inventory-management into dev_银川_中盛建材
已添加1个文件
已修改2个文件
443 ■■■■ 文件已修改
src/views/productionManagement/productStructure/ImportDialog.vue 242 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/views/productionManagement/productStructure/index.vue 186 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/views/productionPlan/productionPlan/index.vue 15 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/views/productionManagement/productStructure/ImportDialog.vue
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,242 @@
<template>
  <el-dialog :title="title"
             v-model="dialogVisible"
             :width="width"
             :append-to-body="appendToBody"
             @close="handleClose">
    <div v-if="showProductTypeSelect"
         style="margin-bottom: 20px;">
      <el-form :inline="true"
               :model="form">
        <el-form-item label="产品类型"
                      prop="dictCode"
                      style="margin-bottom: 0;">
          <el-select v-model="form.dictCode"
                     placeholder="请选择产品类型"
                     clearable
                     style="width: 200px;">
            <el-option v-for="option in productTypeOptions"
                       :key="option.dictCode"
                       :label="option.dictLabel"
                       :value="option.dictCode" />
          </el-select>
        </el-form-item>
      </el-form>
    </div>
    <el-upload ref="uploadRef"
               :limit="limit"
               :accept="accept"
               :headers="headers"
               :action="action"
               :data="uploadData"
               :disabled="disabled"
               :before-upload="beforeUpload"
               :on-progress="onProgress"
               :on-success="onSuccess"
               :on-error="onError"
               :on-change="onChange"
               :auto-upload="autoUpload"
               drag>
      <el-icon class="el-icon--upload">
        <UploadFilled />
      </el-icon>
      <div class="el-upload__text">将文件拖到此处,或<em>点击上传</em></div>
      <template #tip>
        <div class="el-upload__tip text-center">
          <span>{{ tipText }}</span>
          <el-link v-if="showDownloadTemplate"
                   type="primary"
                   :underline="false"
                   style="font-size: 12px; vertical-align: baseline; margin-left: 5px;"
                   @click="handleDownloadTemplate">下载模板</el-link>
        </div>
      </template>
    </el-upload>
    <template #footer>
      <div class="dialog-footer">
        <el-button type="primary"
                   @click="handleConfirm">ç¡® å®š</el-button>
        <el-button @click="handleCancel">取 æ¶ˆ</el-button>
      </div>
    </template>
  </el-dialog>
</template>
<script setup>
  import { computed, ref, reactive, watch } from "vue";
  import { UploadFilled } from "@element-plus/icons-vue";
  import { ElMessage } from "element-plus";
  import { getDicts } from "@/api/system/dict/data";
  const props = defineProps({
    modelValue: {
      type: Boolean,
      default: false,
    },
    title: {
      type: String,
      default: "导入",
    },
    width: {
      type: String,
      default: "400px",
    },
    appendToBody: {
      type: Boolean,
      default: true,
    },
    limit: {
      type: Number,
      default: 1,
    },
    accept: {
      type: String,
      default: ".xlsx, .xls",
    },
    headers: {
      type: Object,
      default: () => ({}),
    },
    action: {
      type: String,
      required: true,
    },
    disabled: {
      type: Boolean,
      default: false,
    },
    autoUpload: {
      type: Boolean,
      default: false,
    },
    tipText: {
      type: String,
      default: "仅允许导入xls、xlsx格式文件。",
    },
    showDownloadTemplate: {
      type: Boolean,
      default: true,
    },
    showProductTypeSelect: {
      type: Boolean,
      default: false,
    },
    beforeUpload: {
      type: Function,
      default: null,
    },
    onProgress: {
      type: Function,
      default: null,
    },
    onSuccess: {
      type: Function,
      default: null,
    },
    onError: {
      type: Function,
      default: null,
    },
    onChange: {
      type: Function,
      default: null,
    },
  });
  const emit = defineEmits([
    "update:modelValue",
    "close",
    "confirm",
    "cancel",
    "download-template",
  ]);
  const dialogVisible = computed({
    get: () => props.modelValue,
    set: val => emit("update:modelValue", val),
  });
  const uploadRef = ref(null);
  const productTypeOptions = ref([]);
  const form = reactive({
    dictCode: "",
  });
  // èŽ·å–äº§å“ç±»åž‹å­—å…¸
  const getProductTypeOptions = () => {
    getDicts("product_type")
      .then(res => {
        if (res.code === 200) {
          productTypeOptions.value = res.data;
        }
      })
      .catch(err => {
        console.error("获取产品类型字典失败:", err);
      });
  };
  // ç›‘听对话框显示,加载产品类型字典
  watch(
    () => props.modelValue,
    newVal => {
      if (newVal && props.showProductTypeSelect) {
        getProductTypeOptions();
      }
    }
  );
  // ä¸Šä¼ æ•°æ®
  const uploadData = computed(() => {
    if (props.showProductTypeSelect) {
      return {
        dictCode: form.dictCode,
      };
    }
    return {};
  });
  const handleClose = () => {
    form.dictCode = "";
    emit("close");
  };
  const handleConfirm = () => {
    if (props.showProductTypeSelect && !form.dictCode) {
      ElMessage.warning("请选择产品类型");
      return;
    }
    emit("confirm");
  };
  const submit = () => {
    if (uploadRef.value) {
      uploadRef.value.submit();
    }
  };
  const handleCancel = () => {
    form.dictCode = "";
    emit("cancel");
    dialogVisible.value = false;
  };
  const handleDownloadTemplate = () => {
    emit("download-template");
  };
  defineExpose({
    uploadRef,
    submit,
    clearFiles: () => {
      if (uploadRef.value) {
        uploadRef.value.clearFiles();
      }
    },
  });
</script>
<style scoped>
  .dialog-footer {
    text-align: center;
  }
</style>
src/views/productionManagement/productStructure/index.vue
@@ -1,23 +1,49 @@
<template>
  <div class="app-container">
    <div style="text-align: right; margin-bottom: 10px;">
      <el-button type="info"
                 plain
                 icon="Upload"
                 @click="handleImport"
                 v-hasPermi="['product:bom:import']">导入</el-button>
      <el-button type="warning"
                 plain
                 icon="Download"
                 @click="handleExport"
                 :disabled="selectedRows.length !== 1"
                 v-hasPermi="['product:bom:export']">导出</el-button>
      <el-button type="primary"
                 @click="handleAdd">新增</el-button>
      <el-button type="danger"
                 plain
                 @click="handleBatchDelete"
                 :disabled="selectedRows.length === 0">删除</el-button>
    <div style="display: flex; justify-content: space-between; align-items: center; margin-bottom: 15px;">
      <!-- æœç´¢åŒºåŸŸ -->
      <div class="search-form">
        <el-form :inline="true"
                 :model="searchForm">
          <el-form-item label="产品类型"
                        style="margin-bottom: 0px !important;">
            <el-select v-model="searchForm.dictCode"
                       style="width: 200px;"
                       placeholder="请选择产品类型"
                       clearable>
              <el-option v-for="option in productTypeOptions"
                         :key="option.dictCode"
                         :label="option.dictLabel"
                         :value="option.dictCode" />
            </el-select>
          </el-form-item>
          <el-form-item style="margin-bottom: 0px !important;">
            <el-button type="primary"
                       @click="handleSearch">搜索</el-button>
            <el-button @click="handleReset">重置</el-button>
          </el-form-item>
        </el-form>
      </div>
      <!-- æŒ‰é’®åŒºåŸŸ -->
      <div>
        <el-button type="info"
                   plain
                   icon="Upload"
                   @click="handleImport"
                   v-hasPermi="['product:bom:import']">导入</el-button>
        <el-button type="warning"
                   plain
                   icon="Download"
                   @click="handleExport"
                   :disabled="selectedRows.length !== 1"
                   v-hasPermi="['product:bom:export']">导出</el-button>
        <el-button type="primary"
                   @click="handleAdd">新增</el-button>
        <el-button type="danger"
                   plain
                   @click="handleBatchDelete"
                   :disabled="selectedRows.length === 0">删除</el-button>
      </div>
    </div>
    <PIMTable rowKey="id"
              :column="tableColumn"
@@ -46,12 +72,16 @@
               :model="form"
               :rules="rules"
               label-width="120px">
        <el-form-item label="产品名称"
                      prop="productModelId">
          <el-button type="primary"
                     @click="showProductSelectDialog = true">
            {{ form.productName || '选择产品' }}-{{ form.productModelName }}
          </el-button>
        <el-form-item label="产品类型"
                      prop="dictCode">
          <el-select v-model="form.dictCode"
                     placeholder="请选择产品类型"
                     clearable>
            <el-option v-for="option in productTypeOptions"
                       :key="option.dictCode"
                       :label="option.dictLabel"
                       :value="option.dictCode" />
          </el-select>
        </el-form-item>
        <el-form-item label="版本号"
                      prop="version">
@@ -74,10 +104,6 @@
                   @click="handleSubmit">确定</el-button>
      </template>
    </el-dialog>
    <!-- äº§å“é€‰æ‹©å¼¹çª— -->
    <ProductSelectDialog v-model="showProductSelectDialog"
                         @confirm="handleProductSelect"
                         single />
    <!-- BOM导入对话框 -->
    <ImportDialog ref="uploadRef"
                  v-model="upload.open"
@@ -88,6 +114,7 @@
                  :on-progress="handleFileUploadProgress"
                  :on-success="handleFileSuccess"
                  :show-download-template="true"
                  :show-product-type-select="true"
                  @confirm="submitFileForm"
                  @download-template="handleDownloadTemplate"
                  @close="handleImportClose" />
@@ -115,7 +142,8 @@
  import { useRouter } from "vue-router";
  import { ElMessageBox } from "element-plus";
  import ProductSelectDialog from "@/views/basicData/product/ProductSelectDialog.vue";
  import ImportDialog from "@/components/Dialog/ImportDialog.vue";
  import ImportDialog from "./ImportDialog.vue";
  import { getDicts } from "@/api/system/dict/data";
  const router = useRouter();
  const { proxy } = getCurrentInstance();
@@ -132,26 +160,41 @@
      minWidth: 140,
    },
    {
      label: "产品编码",
      prop: "productCode",
      label: "产品类型",
      prop: "dictLabel",
      dataType: "tag",
      formatType: params => {
        if (params == "3.5砌块") {
          return "warning";
        } else if (params == "5.0砌块") {
          return "primary";
        } else if (params == "板材") {
          return "success";
        } else {
          return "info";
        }
      },
    },
    // {
    //   label: "产品编码",
    //   prop: "productCode",
      minWidth: 160,
    },
    {
      label: "产品名称",
      prop: "productName",
    //   minWidth: 160,
    // },
    // {
    //   label: "产品名称",
    //   prop: "productName",
      minWidth: 160,
    },
    {
      label: "规格型号",
      prop: "productModelName",
      minWidth: 140,
    },
    //   minWidth: 160,
    // },
    // {
    //   label: "规格型号",
    //   prop: "productModelName",
    //   minWidth: 140,
    // },
    {
      label: "版本号",
      prop: "version",
      width: 100,
    },
    {
      label: "备注",
@@ -217,21 +260,23 @@
  const data = reactive({
    form: {
      id: undefined,
      productName: "",
      productModelName: "",
      productModelId: "",
      dictCode: "",
      remark: "",
      version: "",
    },
    rules: {
      productModelId: [
        { required: true, message: "请选择产品", trigger: "change" },
      dictCode: [
        { required: true, message: "请选择产品类型", trigger: "change" },
      ],
      version: [{ required: true, message: "请输入版本号", trigger: "blur" }],
    },
    searchForm: {
      dictCode: "",
    },
    productTypeOptions: [],
  });
  const { form, rules } = toRefs(data);
  const { form, rules, searchForm, productTypeOptions } = toRefs(data);
  // è¡¨æ ¼é€‰æ‹©æ•°æ®
  const handleSelectionChange = selection => {
@@ -245,12 +290,37 @@
    getList();
  };
  // èŽ·å–äº§å“ç±»åž‹å­—å…¸
  const getProductTypeOptions = () => {
    getDicts("product_type")
      .then(res => {
        if (res.code === 200) {
          productTypeOptions.value = res.data;
        }
      })
      .catch(err => {
        console.error("获取产品类型字典失败:", err);
      });
  };
  // æœç´¢
  const handleSearch = () => {
    getList();
  };
  // é‡ç½®
  const handleReset = () => {
    searchForm.value.dictCode = "";
    getList();
  };
  // æŸ¥è¯¢åˆ—表
  const getList = () => {
    tableLoading.value = true;
    listPage({
      current: page.current,
      size: page.size,
      dictCode: searchForm.value.dictCode,
    })
      .then(res => {
        const records = res?.data?.records || [];
@@ -270,9 +340,7 @@
    operationType.value = "add";
    Object.assign(form.value, {
      id: undefined,
      productName: "",
      productModelName: "",
      productModelId: "",
      dictCode: "",
      remark: "",
      version: "",
    });
@@ -284,9 +352,7 @@
    operationType.value = "edit";
    Object.assign(form.value, {
      id: row.id,
      productName: row.productName || "",
      productModelName: row.productModelName || "",
      productModelId: row.productModelId || "",
      dictCode: row.dictCode || "",
      remark: row.remark || "",
      version: row.version || "",
    });
@@ -508,6 +574,14 @@
  };
  onMounted(() => {
    getProductTypeOptions();
    getList();
  });
</script>
<style scoped lang="scss">
  .search-form {
    :deep(.search-form) {
      margin-bottom: 0px !important;
    }
  }
</style>
src/views/productionPlan/productionPlan/index.vue
@@ -48,6 +48,20 @@
                          style="width: 240px;"
                          @change="handleQuery" />
        </el-form-item>
        <el-form-item label="下发状态:">
          <el-select v-model="searchForm.status"
                     placeholder="请选择状态"
                     clearable
                     filterable
                     style="width: 100px">
            <el-option label="待下发"
                       value="0" />
            <el-option label="部分下发"
                       value="1" />
            <el-option label="已下发"
                       value="2" />
          </el-select>
        </el-form-item>
        <el-form-item>
          <el-button type="primary"
                     @click="handleQuery">搜索</el-button>
@@ -668,6 +682,7 @@
    height: 0,
    startDate: "",
    endDate: "",
    status: "",
    strength: "",
    remarkOne: "",
    remarkTwo: "",