tuqin
2026-09-24 dc3fc550fe292043cc452dc9aeb0c8a1eeab3b30
src/views/inventoryManagement/dispatchLog/Record.vue
@@ -1,41 +1,85 @@
<template>
  <div>
    <div class="search_form" style="margin-bottom: 10px">
      <div>
        <span class="search_title ml10">出库日期:</span>
        <el-date-picker
          v-model="searchForm.timeStr"
          type="date"
          placeholder="请选择日期"
          value-format="YYYY-MM-DD"
          format="YYYY-MM-DD"
          clearable
          @change="handleQuery"
        />
        <span class="search_title ml10">来源:</span>
        <el-select
          v-model="searchForm.recordType"
          style="width: 240px"
          placeholder="请选择"
          clearable
        >
          <el-option
            v-for="item in stockRecordTypeOptions"
            :key="item.value"
            :label="item.label"
            :value="item.value"
          />
        </el-select>
        <el-button type="primary" @click="handleQuery" style="margin-left: 10px"
          >搜索</el-button
        >
      </div>
      <div>
        <el-button type="primary" @click="handleBatchApprove">审批</el-button>
        <el-button @click="handleOut">导出</el-button>
        <el-button type="danger" plain @click="handleDelete">删除</el-button>
        <el-button type="primary" plain @click="handlePrint">打印</el-button>
      </div>
      <el-form
          ref="searchFormRef"
          :model="searchForm"
          class="demo-form-inline"
      >
        <el-row :gutter="20">
          <el-col :span="4">
            <el-form-item label="出库日期" prop="timeStr">
              <el-date-picker v-model="searchForm.timeStr"
                              type="date"
                              placeholder="请选择日期"
                              value-format="YYYY-MM-DD"
                              format="YYYY-MM-DD"
                              clearable/>
            </el-form-item>
          </el-col>
          <el-col :span="4">
            <el-form-item label="产品大类" prop="productName">
              <el-input v-model="searchForm.productName"
                        style="width: 240px"
                        placeholder="请输入"
                        clearable/>
            </el-form-item>
          </el-col>
          <el-col :span="4">
            <el-form-item label="产品规格" prop="model">
              <el-input v-model="searchForm.model"
                        style="width: 240px"
                        placeholder="请输入"
                        clearable/>
            </el-form-item>
          </el-col>
          <el-col :span="4">
            <el-form-item label="批号" prop="batchNo">
              <el-input v-model="searchForm.batchNo"
                        style="width: 240px"
                        placeholder="请输入"
                        clearable/>
            </el-form-item>
          </el-col>
          <el-col :span="4">
            <el-form-item label="来源" prop="recordType">
              <el-select
                  v-model="searchForm.recordType"
                  style="width: 240px"
                  placeholder="请选择"
                  clearable
              >
                <el-option
                    v-for="item in stockRecordTypeOptions"
                    :key="item.value"
                    :label="item.label"
                    :value="item.value"
                />
              </el-select>
            </el-form-item>
          </el-col>
          <!-- 按钮 -->
          <el-col :span="4">
            <el-form-item>
              <el-button type="primary" @click="getList">
                搜索
              </el-button>
              <el-button @click="resetSearch">
                重置
              </el-button>
            </el-form-item>
          </el-col>
        </el-row>
      </el-form>
    </div>
    <div class="actions">
      <!-- <el-button type="primary" @click="handleBatchApprove">审批</el-button> -->
      <el-button type="info" plain icon="Upload" @click="handleImport">导入</el-button>
      <el-button @click="handleOut">导出</el-button>
      <el-button type="danger" plain @click="handleDelete">删除</el-button>
      <el-button type="primary" plain @click="handlePrint">打印</el-button>
    </div>
    <div class="table_list">
      <el-table
@@ -59,28 +103,34 @@
        <el-table-column
          label="出库日期"
          prop="createTime"
          width="120"
          show-overflow-tooltip
        />
        >
          <template #default="scope">
            <span>{{ parseTime(scope.row.createTime, '{y}-{m}-{d}') }}</span>
          </template>
        </el-table-column>
        <el-table-column
          label="产品大类"
          prop="productName"
          show-overflow-tooltip
        />
        <el-table-column label="规格型号" prop="model" show-overflow-tooltip />
        <el-table-column label="批号" prop="batchNo" show-overflow-tooltip />
        <el-table-column label="单位" prop="unit" show-overflow-tooltip />
        <el-table-column label="批号" prop="batchNo" width="150" show-overflow-tooltip />
        <el-table-column label="单位" prop="unit" width="80" show-overflow-tooltip />
        <el-table-column
          label="出库数量"
          prop="stockOutNum"
          width="80"
          show-overflow-tooltip
        />
        <el-table-column label="出库人" prop="createBy" show-overflow-tooltip />
        <el-table-column label="出库人" prop="createBy" width="100" show-overflow-tooltip />
        <el-table-column label="来源" prop="recordType" show-overflow-tooltip>
          <template #default="scope">
            {{ getRecordType(scope.row.recordType) }}
          </template>
        </el-table-column>
        <el-table-column
        <!-- <el-table-column
          label="审批状态"
          prop="approvalStatus"
          show-overflow-tooltip
@@ -93,7 +143,7 @@
              {{ getApprovalStatusLabel(scope.row.approvalStatus) }}
            </el-tag>
          </template>
        </el-table-column>
        </el-table-column> -->
      </el-table>
      <pagination
        v-show="total > 0"
@@ -104,6 +154,41 @@
        @pagination="paginationChange"
      />
    </div>
    <!-- 出库导入对话框 -->
    <el-dialog :title="upload.title"
               v-model="upload.open"
               width="400px"
               append-to-body>
      <el-upload ref="uploadRef"
                 :limit="1"
                 accept=".xlsx, .xls"
                 :headers="upload.headers"
                 :action="upload.url"
                 :disabled="upload.isUploading"
                 :on-progress="handleFileUploadProgress"
                 :on-success="handleFileSuccess"
                 :on-error="handleFileError"
                 :auto-upload="false"
                 drag>
        <el-icon class="el-icon--upload"><upload-filled /></el-icon>
        <div class="el-upload__text">将文件拖到此处,或<em>点击上传</em></div>
        <template #tip>
          <div class="el-upload__tip text-center">
            <span>仅允许导入 xls、xlsx 格式文件。</span>
            <el-link type="primary"
                     :underline="false"
                     style="font-size: 12px; vertical-align: baseline"
                     @click="importTemplate">下载模板</el-link>
          </div>
        </template>
      </el-upload>
      <template #footer>
        <div class="dialog-footer">
          <el-button type="primary" @click="submitFileForm">确 定</el-button>
          <el-button @click="upload.open = false">取 消</el-button>
        </div>
      </template>
    </el-dialog>
  </div>
</template>
@@ -122,6 +207,8 @@
  findAllQualifiedStockOutRecordTypeOptions,
  findAllUnQualifiedStockOutRecordTypeOptions,
} from "@/api/basicData/enum.js";
import { parseTime } from "@/utils/ruoyi";
import { getToken } from "@/utils/auth.js";
const userStore = useUserStore();
const { proxy } = getCurrentInstance();
@@ -162,12 +249,14 @@
});
const { searchForm } = toRefs(data);
// 查询列表
/** 搜索按钮操作 */
const handleQuery = () => {
const searchFormRef = ref(null);
const resetSearch = () => {
  searchFormRef.value?.resetFields();
  page.current = 1;
  getList();
};
}
const paginationChange = (obj) => {
  page.current = obj.page;
  page.size = obj.limit;
@@ -630,6 +719,55 @@
  const seconds = String(date.getSeconds()).padStart(2, "0");
  return `${year}/${month}/${day} ${hours}:${minutes}:${seconds}`;
};
// 导入
const uploadRef = ref();
const upload = reactive({
  open: false,
  title: "",
  isUploading: false,
  headers: { Authorization: "Bearer " + getToken() },
  url: import.meta.env.VITE_APP_BASE_API + "/stockOutRecord/import?type=" + props.type,
});
const handleImport = () => {
  upload.title = "出库导入";
  upload.open = true;
};
const importTemplate = () => {
  proxy.download("/stockOutRecord/importTemplate", {}, "出库导入模板.xlsx");
};
const submitFileForm = () => {
  upload.isUploading = true;
  uploadRef.value.submit();
};
const handleFileUploadProgress = () => {
  upload.isUploading = true;
};
const handleFileSuccess = (response) => {
  upload.isUploading = false;
  upload.open = false;
  uploadRef.value.clearFiles();
  if (response.code === 200) {
    const failCount = response.failCount || 0;
    if (failCount > 0) {
      const errors = Array.isArray(response.errors) ? response.errors : [];
      proxy.$modal.alert(`${response.msg}\n\n${errors.join("\n")}`, "导入结果", {
        confirmButtonText: "知道了",
      }).then(() => {
        getList();
      });
    } else {
      proxy.$modal.msgSuccess(response.msg || "导入成功");
      getList();
    }
  } else {
    proxy.$modal.msgError(response.msg || "导入失败");
  }
};
const handleFileError = () => {
  upload.isUploading = false;
  proxy.$modal.msgError("文件上传失败");
};
onMounted(() => {
  getList();
  fetchStockRecordTypeOptions();
@@ -812,4 +950,10 @@
    page-break-after: avoid;
  }
}
.actions {
  display: flex;
  justify-content: flex-end;
  margin-bottom: 10px;
}
</style>