Bladeren bron

fix 仓库数据对接

haveyou 1 jaar geleden
bovenliggende
commit
93e7182859

+ 1 - 1
index.html

@@ -15,7 +15,7 @@
         document.documentElement.classList.add('is-webkit');
       }
     </script>
-    <title>RuoYi Ele Admin</title>
+    <title>书嗨后台管理</title>
     <style>
       .ele-admin-loading {
         width: 28px;

+ 86 - 0
src/components/CommonPage/ProDatePicker.vue

@@ -0,0 +1,86 @@
+<template>
+  <el-date-picker
+    v-model="selectDate"
+    type="datetimerange"
+    unlink-panels
+    range-separator="到"
+    start-placeholder="开始时间"
+    end-placeholder="结束时间"
+    :shortcuts="shortcuts"
+    v-bind="$attrs"
+    value-format="YYYY-MM-DD HH:mm:ss"
+    @change="handleDateChange"
+  />
+</template>
+<script setup>
+  const emit = defineEmits(['update:modelValue']);
+  const props = defineProps({
+    modelValue: {
+      type: Object,
+      default: () => ({})
+    },
+    startKey: {
+      type: String,
+      default: 'createTimeStart'
+    },
+    endKey: {
+      type: String,
+      default: 'createTimeEnd'
+    }
+  });
+
+  let selectDate = ref([]);
+  watch(
+    () => props.modelValue,
+    (value) => {
+      selectDate.value = value[props.startKey]
+        ? [value[props.startKey], value[props.endKey]]
+        : [];
+    },
+    { deep: true }
+  );
+
+  const handleDateChange = (value) => {
+    let temp = {};
+    if (value && value.length === 2) {
+      temp[props.startKey] = value[0];
+      temp[props.endKey] = value[1];
+    } else {
+      temp[props.startKey] = '';
+      temp[props.endKey] = '';
+    }
+    console.log(value);
+    console.log(temp,'xxxx');
+    emit('update:modelValue', temp);
+  };
+
+  const shortcuts = [
+    {
+      text: '上周',
+      value: () => {
+        const end = new Date();
+        const start = new Date();
+        start.setTime(start.getTime() - 3600 * 1000 * 24 * 7);
+        return [start, end];
+      }
+    },
+    {
+      text: '近1月',
+      value: () => {
+        const end = new Date();
+        const start = new Date();
+        start.setTime(start.getTime() - 3600 * 1000 * 24 * 30);
+        return [start, end];
+      }
+    },
+    {
+      text: '近3月',
+      value: () => {
+        const end = new Date();
+        const start = new Date();
+        start.setTime(start.getTime() - 3600 * 1000 * 24 * 90);
+        return [start, end];
+      }
+    }
+  ];
+</script>

+ 6 - 0
src/components/CommonUpload/index.vue

@@ -1,6 +1,7 @@
 <template>
   <EleUploadList
     v-model="images"
+    :show-file-list="showFileList"
     :readonly="readonly"
     :disabled="disabled"
     :preview="preview"
@@ -39,6 +40,11 @@
   defineOptions({ name: 'CommonUpload' });
 
   const props = defineProps({
+    // 是否显示文件列表
+    showFileList: {
+      type: Boolean,
+      default: true
+    },
     /** 文件大小限制, 单位MB */
     fileLimit: {
       type: Number,

+ 5 - 1
src/components/ImageUpload/index.vue

@@ -20,7 +20,11 @@
     :beforeUploadClick="beforeUploadClick"
     :beforeItemEdit="beforeItemEdit"
     :locale="locale"
-  />
+  >
+    <template v-for="name in Object.keys($slots)" #[name]="slotProps">
+      <slot :name="name" v-bind="slotProps || {}"></slot>
+    </template>
+  </CommonUpload>
 </template>
 
 <script setup>

+ 1 - 1
src/views/data/books/components/book-base-info.vue

@@ -6,7 +6,7 @@
       }}</el-text>
     </div>
     <div class="flex justify-between items-start">
-      <div class="flex flex-col items-start">
+      <div class="flex flex-col items-start" style="min-width:240px">
         <div class="common-text">
           <el-text>ISBN:</el-text>
           <el-text>{{ row.isbn }}</el-text>

+ 134 - 0
src/views/data/books/components/book-export-log.vue

@@ -0,0 +1,134 @@
+<!-- 编辑弹窗 -->
+<template>
+  <ele-modal
+    form
+    :width="1160"
+    v-model="visible"
+    title="导出记录"
+    @open="handleOpen"
+  >
+    <common-table
+      ref="pageRef"
+      :pageConfig="pageConfig"
+      :columns="columns"
+      :tools="false"
+    >
+      <template #toolbar>
+        <ProDatePicker
+          start-placeholder="申请时间(开始时间)"
+          end-placeholder="申请时间(结束时间)"
+          v-model="searchData"
+        />
+        <el-button type="primary" @click="reload" class="ml-4">查询</el-button>
+        <el-button type="info" @click="handleReset">重置</el-button>
+      </template>
+
+      <template #action="{ row }">
+        <el-button
+          type="primary"
+          link
+          :disabled="row.exportStatus != 3"
+          @click="handleDownload(row)"
+          class="ml-4"
+          >[下载]</el-button
+        >
+        <el-button
+          type="danger"
+          link
+          @click="handleReset"
+          :disabled="row.exportStatus == 1"
+          >[删除]</el-button
+        >
+      </template>
+    </common-table>
+    <template #footer>
+      <el-button @click="handleCancel">关闭</el-button>
+    </template>
+  </ele-modal>
+</template>
+
+<script setup>
+  import { ref, reactive, nextTick } from 'vue';
+  import request from '@/utils/request';
+  import CommonTable from '@/components/CommonPage/CommonTable.vue';
+  import ProDatePicker from '@/components/CommonPage/ProDatePicker.vue';
+  import { download, toFormData, checkDownloadRes } from '@/utils/common';
+
+  const searchData = reactive({ createTimeStart: '', createTimeEnd: '' });
+
+  const pageRef = ref(null);
+  function reload() {
+    console.log('reload', searchData);
+    pageRef.value?.reload(searchData);
+  }
+  function handleReset() {
+    searchData.createTimeStart = '';
+    searchData.createTimeEnd = '';
+    reload();
+  }
+
+  /** 弹窗是否打开 */
+  const visible = defineModel({ type: Boolean });
+
+  /** 关闭弹窗 */
+  const handleCancel = () => {
+    visible.value = false;
+  };
+
+  /** 弹窗打开事件 */
+  const handleOpen = () => {
+    visible.value = true;
+    nextTick(() => console.log('打开'));
+  };
+
+  let statusKeys = ['', '处理中', '失败', '成功'];
+  // cleanStatus 文件清理状态 0未清理 1已清理
+  /** 表格列配置 */
+  const columns = ref([
+    { label: '申请时间', prop: 'createTime', align: 'center', width: 180 },
+    { label: '条数', prop: 'dataCount', align: 'center', width: 90 },
+    { label: '操作员', prop: 'createName', align: 'center' },
+    { label: '导出类型', prop: 'exportName', align: 'center' },
+    {
+      label: '处理状态',
+      prop: 'exportStatus',
+      align: 'center',
+      formatter: (row) => statusKeys[row.exportStatus],
+      width: 90
+    },
+    {
+      label: '上次下载时间',
+      prop: 'downloadTime',
+      align: 'center',
+      width: 180
+    },
+    { label: '下载次数', prop: 'downloadNum', align: 'center', width: 90 },
+    {
+      columnKey: 'action',
+      label: '操作',
+      width: 150,
+      align: 'center',
+      slot: 'action'
+    }
+  ]);
+
+  const pageConfig = reactive({
+    pageUrl: '/common/exportrecord/pagelist',
+    fileName: '操作记录',
+    cacheKey: 'data-operation-log'
+  });
+
+  async function handleDownload(row) {
+    const res = await request({
+      url: '/common/exportrecord/downLoadFile?id=' + row.id,
+      method: 'get',
+      responseType: 'blob'
+    });
+    await checkDownloadRes(res);
+    download(res.data, row.fileName);
+  }
+
+  defineExpose({
+    handleOpen
+  });
+</script>

+ 6 - 2
src/views/data/books/index.vue

@@ -105,6 +105,7 @@
     <books-import ref="importRef" v-model="showImport"></books-import>
     <books-change-log ref="changeLogRef"></books-change-log>
     <upload-image ref="uploadImageRef"></upload-image>
+    <book-export-log ref="exportLogRef"></book-export-log>
   </ele-page>
 </template>
 
@@ -126,6 +127,7 @@
   import booksChangeLog from '@/views/data/books/components/books-change-log.vue';
   import bookBaseInfo from '@/views/data/books/components/book-base-info.vue';
   import uploadImage from '@/views/data/books/components/upload-image.vue';
+  import bookExportLog from '@/views/data/books/components/book-export-log.vue';
   import { useDictData } from '@/utils/use-dict-data';
 
   defineOptions({ name: 'recycleOrderCancelled' });
@@ -229,8 +231,10 @@
   }
 
   //导出记录
-  function handleExportLog() {}
+  const exportLogRef = ref(null);
+  function handleExportLog() {
+    exportLogRef.value?.handleOpen();
+  }
   //导入记录
   function handleImportLog() {}
-
 </script>

+ 99 - 0
src/views/data/defaultImage/index.vue

@@ -0,0 +1,99 @@
+<template>
+  <ele-page flex-table>
+    <ele-card flex-table header="默认图片设置">
+      <el-button
+        type="primary"
+        style="width: 200px"
+        @click="handleSubmit"
+        v-permission="'data:defaultImage:set'"
+        >设置默认图片</el-button
+      >
+
+      <div class="flex flex-wrap mt-4">
+        <image-upload ref="imagesUploadRef" v-model="form.images" :tools="false" multiple />
+      </div>
+    </ele-card>
+  </ele-page>
+</template>
+
+<script setup>
+  import { ref, reactive, nextTick } from 'vue';
+  import ImageUpload from '@/components/ImageUpload/index.vue';
+  import { Plus } from '@element-plus/icons-vue';
+  import request from '@/utils/request';
+  import { ElMessage } from 'element-plus';
+
+  const form = reactive({
+    images: [],
+    radio: 1
+  });
+  /** 弹窗是否打开 */
+  const visible = defineModel({ type: Boolean });
+  const radio = ref(1);
+  /** 关闭弹窗 */
+  const handleCancel = () => {
+    visible.value = false;
+  };
+
+  //选择的文件
+  const checkList = ref([]);
+
+  /** 弹窗打开事件 */
+  const handleOpen = () => {
+    visible.value = true;
+    nextTick(() => {
+      checkAll.value = false;
+      checkList.value = [];
+      form.images = [];
+    });
+  };
+
+  const uploadRef = ref(null);
+  //批量删除
+  function handleBatchDelete() {
+    let checkFiles = form.images.filter((item) =>
+      checkList.value.includes(item.uid)
+    );
+    checkFiles.forEach((file) => {
+      uploadRef.value?.handleRemove(file);
+    });
+  }
+
+  const checkAll = ref(false);
+  function handleCheckAllChange() {
+    checkList.value = checkAll.value ? form.images.map((item) => item.uid) : [];
+  }
+
+  function handleSubmit() {
+    const formData = new FormData();
+    form.images.forEach((file) => {
+      formData.append('files', file.raw); //文件
+    });
+
+    request.post('/common/uploads', formData).then((res) => {
+      if (res.data.code === 200) {
+        visible.value = false;
+        ElMessage.success('上传成功');
+      }
+    });
+  }
+
+  defineExpose({
+    handleOpen
+  });
+</script>
+
+<style lang="scss">
+  .image-item {
+    margin-right: 10px;
+    margin-bottom: 10px;
+    position: relative;
+    border-radius: 6px;
+    border: 1px solid #e4e7ed;
+    .checkbox-item {
+      position: absolute;
+      top: -8px;
+      left: 0;
+    }
+  }
+</style>

+ 10 - 0
src/views/recycleLogistics/warehouse/components/area-setting.vue

@@ -25,6 +25,7 @@
             style="margin-right: 5px"
             :true-value="1"
             :false-value="0"
+            :indeterminate="isIndeterCityShow(item,'otherSelected')"
             v-if="item.otherSelected == 1"
             disabled
           ></el-checkbox>
@@ -35,6 +36,7 @@
             style="margin-right: 5px"
             :true-value="1"
             :false-value="0"
+            :indeterminate="isIndeterCityShow(item,'mySelected')"
             v-else
           ></el-checkbox>
           <ele-popover
@@ -124,6 +126,14 @@
     return length > 0 && length < len;
   });
 
+  //计算省市是否全选
+  const isIndeterCityShow = computed(() => (item, type) => {
+    let len = item.childInfo.length;
+    let length = item.childInfo.filter((i) => i[type] == 1).length;
+
+    return length > 0 && length < len;
+  });
+
   /** 弹窗打开事件 */
   const title = ref('仓库区域设置');
   const handleOpen = (row) => {