Pārlūkot izejas kodu

ip营销活动页面

Alex 7 mēneši atpakaļ
vecāks
revīzija
8bedfd4270

+ 65 - 0
src/views/recycle/bookStat/book-search.vue

@@ -0,0 +1,65 @@
+<!-- 搜索表单 -->
+<template>
+  <ele-card :body-style="{ paddingBottom: '8px' }">
+    <ProSearch
+      :items="formItems"
+      ref="searchRef"
+      @search="search"
+      :initKeys="initKeys"
+    ></ProSearch>
+  </ele-card>
+</template>
+
+<script setup>
+  import { reactive, ref, defineEmits } from 'vue';
+  import ProSearch from '@/components/CommonPage/ProSearch2.vue';
+  import dayjs from 'dayjs';
+
+  let { proxy } = getCurrentInstance();
+  const emit = defineEmits(['search']);
+
+  const formItems = reactive([
+    { type: 'input', label: '书名', prop: 'bookName' },
+    { type: 'input', label: 'ISBN', prop: 'isbn' },
+    { type: 'input', label: '作者', prop: 'author' },
+    { type: 'input', label: '出版社', prop: 'publish' },
+    {
+      type: 'daterange',
+      label: '回收时间',
+      prop: 'recycleDate',
+      keys: ['rcNumStartTime', 'rcNumEndTime'],
+      props: {
+        format: 'YYYY-MM-DD',
+        valueFormat: 'YYYY-MM-DD',
+        onChange: (val) => {
+          searchRef.value?.setData({
+            rcNumStartTime: val && val.length > 0 ? val[0] : '',
+            rcNumEndTime: val && val.length > 0 ? val[1] : ''
+          });
+        }
+      }
+    },
+  ]);
+
+  let rcNumStartTime = dayjs().subtract(3, 'day').format('YYYY-MM-DD');
+  let rcNumEndTime = dayjs().format('YYYY-MM-DD');
+  let recycleDate = [rcNumStartTime, rcNumEndTime];
+
+  const initKeys = reactive({
+    bookName: '',
+    isbn: '',
+    author: '',
+    publish: '',
+    rcNumStartTime,
+    rcNumEndTime,
+    recycleDate: recycleDate
+  });
+
+  const searchRef = ref(null);
+  /** 搜索 */
+  const search = (data) => {
+    let params = JSON.parse(JSON.stringify(data));
+    delete params.recycleDate;
+    emit('search', params);
+  };
+</script>

+ 355 - 0
src/views/recycle/bookStat/index.vue

@@ -0,0 +1,355 @@
+<template>
+  <ele-page flex-table>
+    <book-search @search="reload"></book-search>
+
+    <common-table
+      ref="pageRef"
+      :pageConfig="pageConfig"
+      :columns="columns"
+      :tools="false"
+      @sort-change="handleSortChange"
+    >
+      <template #toolbar>
+        <el-radio-group @change="handleStatusChange" v-model="searchType">
+          <el-radio-button label="全部" value="0" />
+          <el-radio-button label="已加入回收书单(正在回收)" value="1" />
+          <el-radio-button label="已加入回收书单(暂停回收)" value="2" />
+          <el-radio-button label="未加入回收书单" value="3" />
+          <el-radio-button label="未加入回收书单(手动暂停)" value="5" />
+          <el-radio-button label="黑名单" value="4" />
+        </el-radio-group>
+
+        <span class="ml-8"></span>
+        <el-button
+          type="warning"
+          plain
+          v-permission="'recycle:workbench:batchRemoveBooklist'"
+          @click="handleOptBooklist('remove')"
+          v-if="['1', '2'].includes(searchType)"
+        >
+          移除回收书单
+        </el-button>
+        <el-button
+          type="success"
+          plain
+          v-permission="'recycle:workbench:batchAddBooklist'"
+          @click="handleOptBooklist('add')"
+          v-if="['3', '4', '5'].includes(searchType)"
+        >
+          加入回收书单
+        </el-button>
+        <el-button
+          type="warning"
+          plain
+          v-permission="'recycle:workbench:batchRemoveBlacklist'"
+          @click="handleOptBlacklist('remove')"
+          v-if="searchType === '4'"
+        >
+          移除黑名单
+        </el-button>
+        <el-button
+          type="danger"
+          plain
+          v-permission="'recycle:workbench:batchAddBlacklist'"
+          @click="handleOptBlacklist('add')"
+          v-if="searchType !== '4'"
+        >
+          加黑名单
+        </el-button>
+
+        <el-button
+          type="warning"
+          plain
+          v-permission="'recycle:workbench:batchPauseRecycle'"
+          @click="handleOptRecycle('pause')"
+          v-if="searchType === '1'"
+        >
+          暂停回收
+        </el-button>
+        <el-button
+          type="warning"
+          plain
+          v-permission="'recycle:workbench:batchStartRecycle'"
+          @click="handleOptRecycle('start')"
+          v-if="searchType === '2'"
+        >
+          开启回收
+        </el-button>
+
+        <el-button
+          type="success"
+          plain
+          v-permission="'recycle:workbench:batchAddSocial'"
+          @click="handleOptType(1)"
+        >
+          加社科库
+        </el-button>
+        <el-button
+          type="primary"
+          plain
+          v-permission="'recycle:workbench:batchAddTeach'"
+          @click="handleOptType(2)"
+        >
+          加教材库
+        </el-button>
+      </template>
+
+      <template #cover="{ row }">
+        <el-image
+          style="width: 90px; height: 120px; border-radius: 4px"
+          fit="cover"
+          :src="row.cover"
+        />
+      </template>
+      <template #baseInfo="{ row }">
+        <book-stat-info :row="row"></book-stat-info>
+      </template>
+      <template #stock="{ row }">
+        <book-stock :row="row"></book-stock>
+      </template>
+
+      <template #action="{ row }">
+        <el-button
+          type="primary"
+          link
+          v-permission="'recycle:workbench:viewUrl'"
+          @click="handleViewUrl(row, 'tb')"
+        >
+          [查看淘宝]
+        </el-button>
+        <el-button
+          type="danger"
+          link
+          v-permission="'recycle:workbench:viewUrl'"
+          @click="handleViewUrl(row, 'kw')"
+        >
+          [查看孔网]
+        </el-button>
+        <el-button
+          color="#192bbe"
+          plain
+          link
+          v-permission="'recycle:workbench:setParams'"
+          @click="handleSetParams(row)"
+        >
+          [设置独立参数]
+        </el-button>
+        <el-button
+          type="success"
+          link
+          v-permission="'recycle:workbench:removeBlacklist'"
+          @click="handleOptBlacklist('remove', row)"
+          v-if="row.bookStatus == 3"
+        >
+          [移除黑名单]
+        </el-button>
+        <el-button
+          type="warning"
+          link
+          v-permission="'recycle:workbench:addBlacklist'"
+          @click="handleOptBlacklist('add', row)"
+          v-if="row.bookStatus == 1 || row.bookStatus == 2"
+        >
+          [加入黑名单]
+        </el-button>
+        <el-button
+          type="danger"
+          link
+          v-permission="'recycle:workbench:pauseRecycle'"
+          @click="handleOptRecycle('pause', row)"
+          v-if="row.recycleStatus == 1"
+        >
+          [暂停回收]
+        </el-button>
+        <el-button
+          type="success"
+          link
+          v-permission="'recycle:workbench:startRecycle'"
+          @click="handleOptRecycle('start', row)"
+          v-else
+        >
+          [开启回收]
+        </el-button>
+        <el-button
+          type="success"
+          link
+          v-permission="'recycle:workbench:removeBooklist'"
+          @click="handleOptBooklist('remove', row)"
+          v-if="row.bookStatus == 2"
+        >
+          [移除回收书单]
+        </el-button>
+        <el-button
+          type="danger"
+          link
+          v-permission="'recycle:workbench:addBooklist'"
+          @click="handleOptBooklist('add', row)"
+          v-if="row.bookStatus == 1"
+        >
+          [加入回收书单]
+        </el-button>
+        <!-- 回收日志和售价日志 -->
+        <el-button
+          type="danger"
+          link
+          v-permission="'recycle:workbench:recycleLog'"
+          @click="handleViewRecycleLog(row)"
+        >
+          [回收日志]
+        </el-button>
+        <el-button
+          type="primary"
+          link
+          v-permission="'recycle:workbench:salesLog'"
+          @click="handleViewSalesLog(row)"
+        >
+          [售价日志]
+        </el-button>
+      </template>
+    </common-table>
+
+    <books-edit ref="editRef"></books-edit>
+    <set-params ref="paramsRef"></set-params>
+    <add-discount ref="discountRef" @refresh="reload"></add-discount>
+    <order-blacklist ref="blacklistRef" @refresh="reload"></order-blacklist>
+    <order-recycle-log ref="recycleLogRef" />
+    <order-sales-log ref="salesLogRef" />
+  </ele-page>
+</template>
+
+<script setup>
+  import { ref, reactive } from 'vue';
+  import CommonTable from '@/components/CommonPage/CommonTable.vue';
+  import booksEdit from '@/views/data/books/components/books-edit.vue';
+  import bookSearch from '@/views/recycle/bookStat/book-search.vue';
+  import bookStatInfo from '@/views/recycle/components/book-stat-info.vue';
+  import bookStock from '@/views/recycle/components/book-stock.vue';
+  import setParams from '@/views/recycle/components/set-params.vue';
+  import addDiscount from '@/views/recycle/components/add-discount.vue';
+  import orderBlacklist from '@/views/recycleOrder/detail/order-blacklist.vue';
+  import orderRecycleLog from '@/views/recycleOrder/detail/order-recycle-log.vue';
+  import orderSalesLog from '@/views/recycleOrder/detail/order-sales-log.vue';
+  import { useBookOperation } from '@/utils/use-book-operation';
+  import dayjs from 'dayjs';
+
+  defineOptions({ name: 'scanLoglist' });
+
+  const searchType = ref('0');
+  function handleStatusChange(value) {
+    pageRef.value.reload({ searchType: value });
+  }
+
+  function handleSortChange({ column, order }) {
+    // 1 扫描次数 2总回收量 3最后一次扫描时间
+    reload({
+      orderType: column.columnKey,
+      orderWay: order === 'ascending' ? 'asc' : 'desc'
+    });
+  }
+
+  /** 表格列配置 */
+  const columns = ref([
+    {
+      type: 'selection',
+      columnKey: 'selection',
+      width: 50,
+      align: 'center',
+      fixed: 'left'
+    },
+    {
+      label: '图片',
+      prop: 'cover',
+      width: 120,
+      slot: 'cover'
+    },
+    {
+      label: '信息',
+      prop: 'baseInfo',
+      width: 540,
+      slot: 'baseInfo'
+    },
+    {
+      label: '总回收数量',
+      minWidth: 120,
+      prop: 'recycleTotalNum',
+      sortable: true,
+      columnKey: '2'
+    },
+    {
+      label: '回收量',
+      prop: 'recycleTotalNumTime',
+      minWidth: 100,
+      formatter: (row) => row?.recycleTotalNumTime || 0
+    },
+    {
+      label: '最大回收量',
+      minWidth: 120,
+      prop: 'recycleMax',
+      sortable: true,
+      columnKey: '6'
+    },
+    {
+      columnKey: 'action',
+      label: '操作',
+      width: 200,
+      slot: 'action',
+      fixed: 'right'
+    }
+  ]);
+
+  /** 页面组件实例 */
+  const pageRef = ref(null);
+  let rcNumStartTime = dayjs().subtract(3, 'day').format('YYYY-MM-DD');
+  let rcNumEndTime = dayjs().format('YYYY-MM-DD');
+
+  const pageConfig = reactive({
+    pageUrl: '/user/userScanLog/recycleBookStat',
+    fileName: '扫码工作台',
+    cacheKey: 'workbenchTable',
+    params: {
+      searchType: '1',
+      rcNumStartTime,
+      rcNumEndTime
+    },
+    rowKey: 'isbn'
+  });
+
+  //查看回收日志
+  const recycleLogRef = ref(null);
+  function handleViewRecycleLog(row) {
+    recycleLogRef.value?.handleOpen(row);
+  }
+
+  //查看售价日志
+  const salesLogRef = ref(null);
+  function handleViewSalesLog(row) {
+    salesLogRef.value?.handleOpen(row);
+  }
+
+  //刷新表格
+  function reload(where) {
+    pageRef.value?.reload(where);
+  }
+  // 使用图书操作混入
+  const {
+    blacklistRef,
+    discountRef,
+    paramsRef,
+    handleOptBooklist,
+    handleOptBlacklist,
+    handleSetParams,
+    handleOptType,
+    handleOptRecycle
+  } = useBookOperation(pageRef);
+
+  //查看淘宝和孔网
+  function handleViewUrl(row, type) {
+    let url = '';
+    if (type == 'tb') {
+      url = `https://s.taobao.com/search?q=${row.isbn}`;
+    } else if (type == 'kw') {
+      url = `https://search.kongfz.com/product_result/?key=${row.isbn}&status=0&_stpmt=eyJzZWFyY2hfdHlwZSI6ImFjdGl2ZSJ9`;
+    }
+    window.open(url, '_blank');
+  }
+</script>

+ 118 - 0
src/views/recycle/components/book-stat-info.vue

@@ -0,0 +1,118 @@
+<template>
+  <div class="recycle-order-number flex flex-col items-start">
+    <div class="common-text">
+      <el-text>书名:</el-text>
+      <el-text type="primary" class="cursor-pointer" @click="handleEdit">{{
+        row.bookName
+      }}</el-text>
+    </div>
+
+    <div class="flex w-full">
+      <div class="flex flex-col" style="flex: 2">
+        <div class="common-text">
+          <el-text>作 者:</el-text>
+          <el-text>{{ row.author || '-' }} </el-text>
+        </div>
+        <div class="common-text">
+          <el-text>ISBN:</el-text>
+          <el-text>{{ row.isbn }}</el-text>
+        </div>
+
+        <div class="common-text">
+          <el-text>出版社:</el-text>
+          <el-text>{{ row.publish || '-' }}</el-text>
+        </div>
+        <div class="common-text">
+          <el-text>出版时间:</el-text>
+          <el-text>{{ publishDate }} </el-text>
+        </div>
+        <div class="common-text" v-if="showFormat">
+          <el-text>所属类型:</el-text>
+          <el-text>{{
+            row.bookTagName ? row.bookTagName + '库' : '-'
+          }}</el-text>
+        </div>
+        <div class="common-text" v-if="showFormat">
+          <el-text>回收状态:</el-text>
+          <dict-data
+            code="recycle_status"
+            :model-value="row.recycleStatus"
+            type="text"
+          ></dict-data>
+        </div>
+      </div>
+      <div class="flex flex-col" style="flex: 1.5">
+        <div class="common-text">
+          <el-text>定价:</el-text>
+          <el-text>¥ {{ row.price }}</el-text>
+        </div>
+        <div class="common-text" v-if="!showFormat">
+          <el-text>开本尺寸:</el-text>
+          <el-text>{{ row.bookFormat }}</el-text>
+        </div>
+        <div class="common-text" v-else>
+          <el-text>回收折扣:</el-text>
+          <el-text>{{ row.recycleDiscount }}折</el-text>
+          <el-text
+            v-if="row.sugDiscountStr"
+            style="color: #f56c6c; margin-left: 10px"
+            >{{ row.sugDiscountStr }}</el-text
+          >
+        </div>
+        <div class="common-text">
+          <el-text>回收价格:</el-text>
+          <el-text>¥ {{ row.recyclePrice }}</el-text>
+        </div>
+        <div class="common-text">
+          <el-text>销售价格:</el-text>
+          <el-text>¥ {{ row.productPrice || 0 }}</el-text>
+        </div>
+        <div class="common-text">
+          <el-text
+            >(已回收数量:{{ row.recycleNum || 0 }} 当前库存:{{
+              row.stockNum || 0
+            }})</el-text
+          >
+        </div>
+      </div>
+    </div>
+  </div>
+</template>
+
+<script setup>
+  import { dayjs } from 'element-plus';
+  import { computed } from 'vue';
+
+  const props = defineProps({
+    row: {
+      type: Object,
+      default: () => {}
+    },
+    showFormat: {
+      type: Boolean,
+      default: true
+    },
+    showTag: {
+      type: Boolean,
+      default: true
+    }
+  });
+
+  const emit = defineEmits(['edit']);
+
+  const publishDate = computed(() => {
+    return props.row.pubDate
+      ? dayjs(props.row.pubDate).format('YYYY-MM-DD')
+      : '-';
+  });
+
+  const handleEdit = () => {
+    emit('edit', props.row);
+  };
+</script>
+
+<style scoped>
+  .cursor-pointer {
+    cursor: pointer;
+  }
+</style>

+ 2 - 2
src/views/recycle/workbench/index.vue

@@ -102,7 +102,7 @@
         />
       </template>
       <template #baseInfo="{ row }">
-        <book-info :row="row"></book-info>
+        <book-stat-info :row="row"></book-stat-info>
       </template>
       <template #stock="{ row }">
         <book-stock :row="row"></book-stock>
@@ -222,7 +222,7 @@
   import CommonTable from '@/components/CommonPage/CommonTable.vue';
   import booksEdit from '@/views/data/books/components/books-edit.vue';
   import bookSearch from '@/views/recycle/workbench/book-search.vue';
-  import bookInfo from '@/views/recycle/components/book-info.vue';
+  import bookStatInfo from '@/views/recycle/components/book-stat-info.vue';
   import bookStock from '@/views/recycle/components/book-stock.vue';
   import setParams from '@/views/recycle/components/set-params.vue';
   import addDiscount from '@/views/recycle/components/add-discount.vue';