peng
2025-10-23 c29c852bfe5541106461e0b6a05383f679602dfa
页面调整
5个文件已修改
1个文件已添加
1024 ■■■■■ 已修改文件
manager/src/api/order.js 8 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
manager/src/views/member/list/index.vue 8 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
manager/src/views/order/order/orderList.vue 15 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
manager/src/views/order/order/storeOrderList.vue 878 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
manager/src/views/userAction/userAction.vue 29 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
manager/src/views/userAction/userActionRecord.vue 86 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
manager/src/api/order.js
@@ -84,6 +84,10 @@
export const getOrderList = (params) => {
  return getRequest(`/order/order`, params)
}
//  查询店铺分享订单列表
export const getShareOrderList = (params) => {
  return getRequest(`/order/order/share`, params)
}
export const getStoreSelect = ()=>{
  return getRequest('/order/order/storeSelect')
}
@@ -92,6 +96,10 @@
export const exportOrder = (params) => {
  return getRequest(`/order/order/queryExportOrder`, params,'blob')
}
//  导出分享商户订单列表
export const queryShareExportOrder = (params) => {
  return getRequest(`/order/order/queryShareExportOrder`, params,'blob')
}
//  订单付款
export const orderPay = (sn) => {
manager/src/views/member/list/index.vue
@@ -6,6 +6,9 @@
          <Form-item label="会员名称" prop="username">
            <Input type="text" v-model="searchForm.username" placeholder="请输入会员名称" clearable style="width: 200px" />
          </Form-item>
          <Form-item label="会员id" prop="memberId">
            <Input type="text" v-model="searchForm.memberId" placeholder="请输入会员id" clearable style="width: 200px" />
          </Form-item>
          <Form-item label="会员昵称" prop="nickName">
            <Input type="text" v-model="searchForm.nickName" placeholder="请输入会员昵称" clearable style="width: 200px" />
@@ -172,6 +175,11 @@
      ruleValidate: {}, //修改验证
      columns: [
        {
          title: "会员id",
          key: "id",
          tooltip: true,
        },
        {
          title: "会员名称",
          key: "username",
          tooltip: true,
manager/src/views/order/order/orderList.vue
@@ -18,6 +18,15 @@
            style="width: 160px"
          />
        </Form-item>
        <Form-item label="会员id" prop="memberId">
          <Input
            type="text"
            v-model="searchForm.memberId"
            placeholder="请输入会员id"
            clearable
            style="width: 160px"
          />
        </Form-item>
<!--        <Form-item label="会员名称" prop="buyerName">-->
<!--          <Input-->
<!--            type="text"-->
@@ -323,6 +332,12 @@
      selectDate: null,
      columns: [
        {
          title: "会员id",
          key: "memberId",
          minWidth: 240,
          tooltip: true
        },
        {
          title: "订单号",
          key: "sn",
          minWidth: 240,
manager/src/views/order/order/storeOrderList.vue
New file
@@ -0,0 +1,878 @@
<template>
  <div>
    <Card>
      <Form
        ref="searchForm"
        @keydown.enter.native="handleSearch"
        :model="searchForm"
        inline
        :label-width="70"
        class="search-form"
      >
        <Form-item label="订单号" prop="orderSn">
          <Input
            type="text"
            v-model="searchForm.orderSn"
            placeholder="请输入订单号"
            clearable
            style="width: 160px"
          />
        </Form-item>
        <Form-item label="会员id" prop="memberId">
          <Input
            type="text"
            v-model="searchForm.memberId"
            placeholder="请输入会员id"
            clearable
            style="width: 160px"
          />
        </Form-item>
<!--        <Form-item label="会员名称" prop="buyerName">-->
<!--          <Input-->
<!--            type="text"-->
<!--            v-model="searchForm.buyerName"-->
<!--            placeholder="请输入会员名称"-->
<!--            clearable-->
<!--            style="width: 160px"-->
<!--          />-->
<!--        </Form-item>-->
        <Form-item label="会员昵称" prop="nickName">
          <Input
            type="text"
            v-model="searchForm.nickName"
            placeholder="请输入会员昵称"
            clearable
            style="width: 160px"
          />
        </Form-item>
        <Form-item label="定制商品" prop="customizeFlag">
          <Select
            v-model="searchForm.customizeFlag"
            placeholder="请选择"
            clearable
            style="width: 160px"
          >
            <Option value="CUSTOMIZE">定制商品</Option>
          </Select>
        </Form-item>
        <Form-item label="订单类型" prop="orderType">
          <Select
            v-model="searchForm.orderPromotionType"
            placeholder="请选择"
            clearable
            style="width: 160px"
          >
            <Option value="NORMAL">普通订单</Option>
            <Option value="PINTUAN">拼团订单</Option>
            <Option value="GIFT">赠品订单</Option>
            <Option value="POINTS">积分订单</Option>
            <Option value="KANJIA">砍价订单</Option>
          </Select>
        </Form-item>
        <Form-item label="店铺" prop="store">
          <Select
            v-model="searchForm.storeSelectId"
            placeholder="请选择"
            clearable
            style="width: 160px"
            filterable
          >
            <Option
              v-for="store in storeSelectList"
              :key="store.id"
              :label="store.label"
              :value="store.id"
            >
              {{ store.label }}
            </Option>
          </Select>
        </Form-item>
        <Form-item label="下单时间">
          <DatePicker
            v-model="selectDate"
            type="datetimerange"
            format="yyyy-MM-dd HH:mm:ss"
            clearable
            @on-change="selectDateRange"
            placeholder="选择起始时间"
            style="width: 160px"
          ></DatePicker>
        </Form-item>
<!--        <Form-item label="订单状态" prop="orderStatus">-->
<!--          <Select-->
<!--            v-model="searchForm.orderStatus"-->
<!--            placeholder="请选择"-->
<!--            clearable-->
<!--            style="width: 160px"-->
<!--          >-->
<!--            <Option value="UNPAID">未付款</Option>-->
<!--            <Option value="PAID">已付款</Option>-->
<!--            <Option value="UNDELIVERED">待发货</Option>-->
<!--            <Option value="DELIVERED">已发货</Option>-->
<!--            <Option value="COMPLETED">已完成</Option>-->
<!--            <Option value="TAKE">待核验</Option>-->
<!--            <Option value="CANCELLED">已关闭</Option>-->
<!--            <Option value="STAY_PICKED_UP">待自提</Option>-->
<!--          </Select>-->
<!--        </Form-item>-->
        <Button
          @click="handleSearch"
          type="primary"
          icon="ios-search"
          class="search-btn"
          >搜索</Button
        >
      </Form>
      <div>
        <Button @click="exportOrder" type="info" class="export">导出订单</Button>
      </div>
      <div class="order-tab">
        <div v-for="(item,index) in orderStatus" :key="index" :class="{'current': currentStatus === item.value}" @click="orderStatusClick(item)">
          {{item.title}}
        </div>
      </div>
      <Table
        :loading="loading"
        border
        :columns="columns"
        :data="data"
        ref="table"
        sortable="custom"
      >
        <template slot="sn" slot-scope="{ row }">
          <div style="width: 100%" @click="detail(row)">
          <span>{{row.sn}}</span>
          </div>
        </template>
        <template  slot="nickName" slot-scope="{ row }">
          <div style="width: 100%;height:20px;min-width: 50px" @click="handleNickNameClick(row)">
            <span >{{row.nickName}}</span>
          </div>
        </template>
      </Table>
      <Row type="flex" justify="end" class="mt_10">
        <Page
          :current="searchForm.pageNumber"
          :total="total"
          :page-size="searchForm.pageSize"
          @on-change="changePage"
          @on-page-size-change="changePageSize"
          :page-size-opts="[10, 20, 50]"
          size="small"
          show-total
          show-elevator
          show-sizer
        ></Page>
      </Row>
      <!-- 修改模态框 -->
      <Modal v-model="descFlag" width="500">
        <!-- 自定义标题插槽 -->
        <div slot="header" :style="{ color: titleColor, fontSize: '16px', fontWeight: 'bold' }">
          {{ descTitle }}
        </div>
        <Form ref="form" :model="form" :rules="ruleValidate" :label-width="80">
          <Input v-model="form.id" v-show="false" />
          <FormItem label="头像">
            <img :src="form.face || defaultPic" class="face" />
            <Button type="text" class="upload" @click="() => {
            this.picModelFlag = true;
            this.$refs.ossManage.selectImage = true;
          }">修改</Button>
            <input type="file" style="display: none" id="file" />
          </FormItem>
          <FormItem label="用户名" prop="name">
            <Input v-model="form.username" style="width: 200px" disabled />
          </FormItem>
          <FormItem label="用户昵称" prop="name">
            <Input v-model="form.nickName" style="width: 200px" />
          </FormItem>
          <FormItem label="标签" prop="tags">
            <Select v-model="selectTagIds" multiple filterable :loading="selectLoading" style="width:200px;">
              <Option v-for="item in options" :key="item.id" :label="item.tagName" :value="item.id"></Option>
            </Select>
          </FormItem>
          <FormItem label="性别" prop="sex">
            <RadioGroup type="button" button-style="solid" v-model="form.sex">
              <Radio :label="1">
                <span>男</span>
              </Radio>
              <Radio :label="0">
                <span>女</span>
              </Radio>
            </RadioGroup>
          </FormItem>
          <!--        <FormItem label="修改密码" prop="password">-->
          <!--          <Input type="password" style="width: 220px" password v-model="form.newPassword" />-->
          <!--        </FormItem>-->
          <FormItem label="生日" prop="birthday">
            <DatePicker type="date" format="yyyy-MM-dd" v-model="form.birthday" style="width: 220px"></DatePicker>
          </FormItem>
          <FormItem label="所在地" prop="mail">
            {{ form.region || '暂无地址' }}
            <Button style="margin-left: 10px;" @click="$refs.map.open()">选择</Button>
          </FormItem>
        </Form>
        <div slot="footer">
          <Button @click="descFlag = false">取消</Button>
          <Button type="primary" @click="handleSubmitModal" :disabled="submitDisabled">
            确定
          </Button>
        </div>
      </Modal>
      <Modal width="1200px" v-model="picModelFlag">
        <ossManage @callback="callbackSelected" :isComponent="true" :initialize="picModelFlag" ref="ossManage" />
      </Modal>
      <Modal
        v-model="showGeneralQrCode"
        title="二维码"
        width="800"
        :mask-closable="false"
        :loading="codeLoading"
      >
        <vue-qr
          :text="QRCodeUrl"
          :margin="0"
          colorDark="#000"
          colorLight="#fff"
          :size="150"
        ></vue-qr>
        <div slot="footer">
          <Button type="text" @click="closeGeneralQrCode">关闭</Button>
          <!--          <Button type="primary" @click="generalQrCode">确认</Button>-->
        </div>
      </Modal>
      <multipleMap ref="map" @callback="selectedRegion" />
    </Card>
  </div>
</template>
<script>
import multipleMap from "@/components/map/multiple-map";
import ossManage from "@/views/sys/oss-manage/ossManage";
import * as API_Order from "@/api/order";
import JsonExcel from "vue-json-excel";
import * as API_Member from "@/api/member.js";
import { getTags } from "@/api/tag.js";
import vueQr from "vue-qr";
import {getStoreSelect} from "../../../api/order";
import {getShareOrderList, queryShareExportOrder} from "@/api/order";
export default {
  name: "orderList",
  components: {
    "download-excel": JsonExcel,
    ossManage,
    multipleMap,
    "vue-qr": vueQr,
  },
  data() {
    return {
      //下拉框数据
      storeSelectList:[],
      // 表格的表头以及内容
      fields: {
        订单编号: "sn",
        下单时间: "createTime",
        客户名称: "memberName",
        支付方式: {
          field: "clientType",
          callback: (value) => {
            if (value == "H5") {
              return "移动端";
            } else if (value == "PC") {
              return "PC端";
            } else if (value == "WECHAT_MP") {
              return "小程序端";
            } else if (value == "APP") {
              return "移动应用端";
            } else {
              return value;
            }
          },
        },
        商品数量: "groupNum",
        付款状态: {
          field: "payStatus",
          callback: (value) => {
            return value == "UNPAID"
              ? "未付款"
              : value == "PAID"
              ? "已付款"
              : "";
          },
        },
        店铺: "storeName",
      },
      loading: true, // 表单加载状态
      searchForm: {
        // 搜索框初始化对象
        pageNumber: 1, // 当前页数
        pageSize: 10, // 页面大小
        sort: "createTime", // 默认排序字段
        order: "desc", // 默认排序方式
        startDate: "", // 起始时间
        endDate: "", // 终止时间
        orderType: "",
        orderSn: "",
        buyerName: "",
        nickName:"",
        orderStatus: "",
      },
      selectDate: null,
      columns: [
        {
          title: "店铺名称",
          key: "storeName",
          minWidth: 240,
          tooltip: true
        },
        {
          title: "会员id",
          key: "memberId",
          minWidth: 240,
          tooltip: true
        },
        {
          title: "订单号",
          key: "sn",
          minWidth: 240,
          tooltip: true,
          slot: 'sn'
        },
        {
          title: "订单来源",
          key: "clientType",
          width: 120,
          render: (h, params) => {
            if (params.row.clientType == "H5") {
              return h("div", {}, "移动端");
            } else if (params.row.clientType == "PC") {
              return h("div", {}, "PC端");
            } else if (params.row.clientType == "WECHAT_MP") {
              return h("div", {}, "小程序端");
            } else if (params.row.clientType == "APP") {
              return h("div", {}, "移动应用端");
            } else {
              return h("div", {}, params.row.clientType);
            }
          },
        },
        {
          title: "订单类型",
          key: "orderPromotionType",
          width: 120,
          render: (h, params) => {
            if (params.row.orderPromotionType == "NORMAL") {
              return h("div", [
                h("tag", { props: { color: "blue" } }, "普通订单"),
              ]);
            } else if (params.row.orderPromotionType == "PINTUAN") {
              return h("div", [
                h("tag", { props: { color: "volcano" } }, "拼团订单"),
              ]);
            } else if (params.row.orderPromotionType == "GIFT") {
              return h("div", [
                h("tag", { props: { color: "green" } }, "赠品订单"),
              ]);
            } else if (params.row.orderPromotionType == "POINTS") {
              return h("div", [
                h("tag", { props: { color: "geekblue" } }, "积分订单"),
              ]);
            } else if (params.row.orderPromotionType == "KANJIA") {
              return h("div", [
                h("tag", { props: { color: "pink" } }, "砍价订单"),
              ]);
            }
          },
        },
        {
          title: "买家名称",
          key: "nickName",
          minWidth: 130,
          tooltip: true,
          slot:'nickName'
        },
        {
          title: "订单金额",
          key: "flowPrice",
          minWidth: 100,
          tooltip: true,
          render: (h, params) => {
            return h("priceColorScheme", {props:{value:params.row.flowPrice,color:this.$mainColor}} );
          },
        },
        {
          title: "定制商品",
          key: "customizeFlag",
          minWidth: 120,
          tooltip: true,
          render: (h, params) => {
            if (params.row.customizeFlag == "CUSTOMIZE") {
              return h("div", [
                h("tag", { props: { color: "blue" } }, "定制商品"),
              ]);
            } else  {
              return h("div", [
                h("tag", { props: { color: "volcano" } }, "普通商品"),
              ]);
            }
          },
        },
        {
          title: "订单状态",
          key: "orderStatus",
          minWidth: 100,
          render: (h, params) => {
            if (params.row.orderStatus == "UNPAID") {
              return h("div", [
                h("tag", { props: { color: "magenta" } }, "未付款"),
              ]);
            } else if (params.row.orderStatus == "PAID") {
              return h("div", [
                h("tag", { props: { color: "blue" } }, "已付款"),
              ]);
            } else if (params.row.orderStatus == "UNDELIVERED") {
              return h("div", [
                h("tag", { props: { color: "geekblue" } }, "待发货"),
              ]);
            } else if (params.row.orderStatus == "STAY_PICKED_UP") {
              return h("div", [
                h("tag", { props: { color: "geekblue" } }, "待自提"),
              ]);
            } else if (params.row.orderStatus == "DELIVERED") {
              return h("div", [
                h("tag", { props: { color: "cyan" } }, "已发货"),
              ]);
            } else if (params.row.orderStatus == "COMPLETED") {
              return h("div", [
                h("tag", { props: { color: "green" } }, "已完成"),
              ]);
            } else if (params.row.orderStatus == "TAKE") {
              return h("div", [
                h("tag", { props: { color: "volcano" } }, "待核验"),
              ]);
            } else if (params.row.orderStatus == "CANCELLED") {
              return h("div", [
                h("tag", { props: { color: "red" } }, "已关闭"),
              ]);
            }
          },
        },
        {
          title: "下单时间",
          key: "createTime",
          width: 170,
        },
        {
          title:"收货人",
          key:"consigneeName",
          width: 170,
        },
        {
          title:"手机号",
          key:"consigneeMobile",
          width: 170,
        },
        {
          title: "操作",
          key: "action",
          align: "center",
          width: 150,
          fixed:"right",
          render: (h, params) => {
            const buttons = [];
            // 查看按钮 - 始终显示
            buttons.push(
              h(
                "Button",
                {
                  props: { type: "info", size: "small" },
                  style: { marginRight: "5px" },
                  on: {
                    click: () => {
                      this.detail(params.row);
                    },
                  },
                },
                "查看"
              )
            );
            // 根据订单状态为'PAID'时显示额外操作按钮
            if (params.row.orderStatus === 'PAID') {
              buttons.push(
                h(
                  "Button",
                  {
                    props: { type: "primary", size: "small" },
                    style: { marginRight: "5px" },
                    on: {
                      click: () => {
                        this.handlePaidOrder(params.row);
                      },
                    },
                  },
                  "更新订单状态"
                )
              );
            }
            // // 根据订单状态为'PAID'时显示额外操作按钮
            // if (params.row.deliverStatus === 'UNDELIVERED') {
            //   buttons.push(
            //     h(
            //       "Button",
            //       {
            //         props: { type: "primary", size: "small" },
            //         style: { marginRight: "5px" },
            //         on: {
            //           click: () => {
            //             this.handlerEditorQrcode(params.row);
            //           },
            //         },
            //       },
            //       "修改地址二维码"
            //     )
            //   );
            // }
            return h('div', buttons);
          },
        },
      ],
      data: [], // 表单数据
      total: 0, // 表单数据总数
      orderStatus: [
        {title: '全部', value: ''},
        {title: '未付款', value: 'UNPAID'},
        {title: '已付款', value: 'PAID'},
        {title: '待发货', value: 'UNDELIVERED'},
        {title: '已发货', value: 'DELIVERED'},
        {title: '待核验', value: 'TAKE'},
        {title: '待自提', value: 'STAY_PICKED_UP'},
        {title: '已完成', value: 'COMPLETED'},
        {title: '已关闭', value: 'CANCELLED'},
      ],
      currentStatus: '',
      descTitle: "", // modal标题
      descFlag: false, //编辑查看框
      form:{},
      ruleValidate:{},
      selectTagIds: [],
      selectTags: [],
      defaultPic: require('@/assets/default.png'),
      selectLoading:false,
      picModelFlag: false, // 选择图片
      options: [],
      titleColor:'#333', // 默认标题颜色
      submitDisabled:false,
      QRCodeUrl:'',
      showGeneralQrCode:false,
      codeLoading:false,
    };
  },
  methods: {
    getStoreSelect(){
      API_Order.getStoreSelect().then(res =>{
        if (res.result){
          this.storeSelectList = res.result;
        }
      })
    },
    closeGeneralQrCode(){
      this.showGeneralQrCode = false;
    },
    // handlerEditorQrcode(row){
    //   this.QRCodeUrl = '';
    //   this.showGeneralQrCode = true
    //   this.codeLoading = true;
    //
    //   //获得商品对应的第一个skuid
    //   this.codeLoading = false;
    //   this.QRCodeUrl = this.QRcodeBaseUrl+ '/scanpage/editOrderAddress'+'?orderSn='+row.sn
    //   console.log(this.QRCodeUrl);
    //
    // },
    // 选中的图片
    callbackSelected(val) {
      console.log(val)
      this.picModelFlag = false;
      this.form.face = val.url;
    },
     handleNickNameClick(row){
      this.titleColor = '#333'
      this.form = {};
      this.selectTagIds = [];
      this.selectTags= [];
      this.descTitle ='';
      this.descFlag = true;
      this.getMemberInfo(row.memberId);
    },
    /**
     * 查询查看会员详情
     */
    async getMemberInfo(id) {
      this.submitDisabled = false;
      var that = this;
      await API_Member.getMemberInfoData(id).then((res) => {
        if (res.result) {
          debugger
          that.selectTags = []
          that.selectTagIds = []
          res.result.tags.forEach(element => {
            that.selectTags.push(element.tagName)
            that.selectTagIds.push(element.tagId)
          });
          this.descTitle = res.result.nickName;
          this.$set(this, "form", res.result);
        }else{
          //查询到用户不存在,或已删除情况
          this.descTitle = "用户已删除"
          this.titleColor ='#ff4d4f';
          this.submitDisabled = true;
        }
        console.log(this.form)
      });
    },
    remoteMethod(query) {
      this.selectLoading = true;
      var params = {
        "tagTypeKey": "USER",
        "pageNumber": 1,
        "pageSize": 500
      }
      getTags(params).then(res => {
        this.options = res.data;
        this.selectLoading = false;
      });
    },
    handleSubmitModal(){
      debugger
      const { nickName, sex, username, face, newPassword, id, regionId, region } = this.form;
      let time = new Date(this.form.birthday);
      let birthday = this.form.birthday === undefined ? '' :
        time.getFullYear() + "-" + (time.getMonth() + 1) + "-" + time.getDate();
      let submit = {
        regionId,
        region,
        nickName,
        username,
        sex,
        birthday,
        face,
        id
      };
      submit.tags = this.selectTagIds
      if (newPassword) {
        submit.password = this.md5(newPassword);
      }
      API_Member.updateMember(submit).then((res) => {
        if (res.result) {
          this.$Message.success("修改成功!");
          this.descFlag = false;
          this.getDataList();
        }
      });
    },
// 选中的地址
    selectedRegion(val) {
      if (val.type === 'select') {
        const paths = val.data.map(item => item.name).join(',')
        const ids = val.data.map(item => item.id).join(',')
        this.$set(this.form, 'region', paths)
        this.$set(this.form, 'regionId', ids)
      }
      else {
        this.$set(this.form, 'region', val.data.addr)
        this.$set(this.form, 'regionId', val.data.addrId)
      }
    },
    // 初始化数据
    init() {
      this.getDataList();
      this.remoteMethod("")
    },
    // 分页 改变页码
    changePage(v) {
      this.searchForm.pageNumber = v;
      this.getDataList();
    },
    // 分页 改变页数
    changePageSize(v) {
      this.searchForm.pageNumber = 1;
      this.searchForm.pageSize = v;
      this.getDataList();
    },
    // 搜索
    handleSearch() {
      this.searchForm.pageNumber = 1;
      this.searchForm.pageSize = 10;
      this.getDataList();
    },
    // 起止时间从新赋值
    selectDateRange(v) {
      if (v) {
        this.searchForm.startDate = v[0];
        this.searchForm.endDate = v[1];
      }
    },
    // 获取列表数据
    getDataList() {
      this.loading = true;
      API_Order.getShareOrderList(this.searchForm).then((res) => {
        this.loading = false;
        if (res.success) {
          this.data = res.result.records;
          this.total = res.result.total;
        }
      });
      this.loading = false;
    },
    // 跳转详情页面
    detail(v) {
      let sn = v.sn;
      this.$router.push({
        name: "order-detail",
        query: { sn: sn },
      })
    },
    // 处理已付款订单的操作
    handlePaidOrder(order) {
      // 这里可以添加已付款订单的具体操作逻辑
      // 例如:显示确认对话框,发起发货请求等
      this.$Modal.confirm({
        title: '更新状态',
        content: `确认对订单号:${order.sn} 进行更新状操作吗?`,
        onOk: () => {
          // 调用发货API
          this.deliverOrder(order);
        },
        onCancel: () => {
          this.$Message.info('已取消操作');
        }
      });
    },
    // 发货操作
    deliverOrder(order) {
      console.log('------------->获取订单信息',order);
      console.log('订单sn编号',order.sn);
      // 调用发货API
      API_Order.sendMessage(order.sn).then((res) => {
        console.log('-------------->',res);
        if (res.success) {
          this.$Message.success('更新状态成功');
          // 延迟5秒刷新列表mq消息是异步的无法实时同步需要执行延迟刷新
          setTimeout(() => {
            this.getDataList();
          }, 5000);
        } else {
          this.$Message.error('更新状态失败');
        }
      }).catch((error) => {
        console.error('更新状态失败:', error);
        this.$Message.error('更新状态失败,请重试');
      });
    },
    // 导出订单
    async exportOrder() {
      if(this.searchForm.startDate==""||this.searchForm.endDate==""){
        this.$Message.error("必须选择时间范围,搜索后进行导出!");
      }else{
        API_Order.queryShareExportOrder(this.searchForm)
          .then((res) => {
            const blob = new Blob([res], {
              type: "application/vnd.ms-excel;charset=utf-8",
            });
            //对于<a>标签,只有 Firefox 和 Chrome(内核) 支持 download 属性
            //IE10以上支持blob但是依然不支持download
            if ("download" in document.createElement("a")) {
              //支持a标签download的浏览器
              const link = document.createElement("a"); //创建a标签
              link.download = "订单列表.xlsx"; //a标签添加属性
              link.style.display = "none";
              link.href = URL.createObjectURL(blob);
              document.body.appendChild(link);
              link.click(); //执行下载
              URL.revokeObjectURL(link.href); //释放url
              document.body.removeChild(link); //释放标签
            } else {
              navigator.msSaveBlob(blob, fileName);
            }
          })
          .catch((err) => {
            console.log(err);
          });
      }
    },
    // 订单筛选
    orderStatusClick(item) {
      this.currentStatus = item.value;
      this.searchForm.orderStatus = item.value;
      this.getDataList();
    },
  },
  mounted() {
    this.init();
    this.getStoreSelect();
  },
};
</script>
<style lang="scss" scoped>
.export {
  margin: 10px 20px 10px 0;
}
.export-excel-wrapper {
  display: inline;
}
.order-tab {
  width: 950px;
  height: 36px;
  display: flex;
  align-items: center;
  justify-content: space-between;
  background-color: #f0f0f0;
  padding: 0 10px;
  margin-bottom: 10px;
  div {
    text-align: center;
    padding: 4px 12px;
    border-radius: 4px;
    cursor: pointer;
  }
  .current {
    background-color: #ffffff;
  }
}
.face {
  width: 60px;
  height: 60px;
  border-radius: 50%; // 圆形头像
}
</style>
manager/src/views/userAction/userAction.vue
@@ -6,16 +6,19 @@
          <Form-item label="用户昵称" prop="userName">
            <Input type="text" v-model="searchForm.userName" placeholder="请输入用户昵称" clearable style="width: 200px" />
          </Form-item>
          <Form-item label="用户id" prop="userId">
            <Input type="text" v-model="searchForm.userId" placeholder="请输入用户id" clearable style="width: 200px" />
          </Form-item>
          <Form-item label="页面类型" prop="pageCode">
            <Select
              v-model="searchForm.pageCode"
              clearable
            <Select
              v-model="searchForm.pageCode"
              clearable
              filterable
              style="width: 200px"
              placeholder="请选择页面类型">
              <Option
                v-for="item in pageTypeOptions"
                :key="item.value"
              <Option
                v-for="item in pageTypeOptions"
                :key="item.value"
                :value="item.value"
                :label="item.label">
                {{ item.label }}
@@ -108,6 +111,7 @@
        pageSize: 10,
        userName: "",
        pageCode: "",
        userId: "",
        beginDate: startTime,
        endDate: endTime
      },
@@ -141,7 +145,7 @@
      ],
      columns: [
        {
          title: "用户名称",
          title: "用户id",
          key: "userId",
          minWidth: 120
        },
@@ -149,11 +153,6 @@
          title: "用户昵称",
          key: "nickName",
          minWidth: 100
        },
        {
          title: "会话ID",
          key: "sessionId",
          minWidth: 150
        },
        {
          title: "页面类型",
@@ -189,11 +188,6 @@
            };
            return h('span', pageCodes[params.row.pageCode] || params.row.pageCode);
          }
        },
        {
          title: "页面名称",
          key: "pageNameCn",
          minWidth: 150
        },
        {
          title: "进入时间",
@@ -408,6 +402,7 @@
      this.searchForm.pageSize = 10;
      this.searchForm.userName = "";
      this.searchForm.pageCode = "";
      this.searchForm.userId = "";
      // 使用正确的参数名称和方法
      this.searchForm.beginDate = this.getDefaultBeginDate();
      this.searchForm.endDate = this.getDefaultEndDate();
manager/src/views/userAction/userActionRecord.vue
@@ -66,7 +66,7 @@
        </Page>
      </Row>
    </Card>
    <!-- 用户行为详情弹窗 -->
    <Modal
      v-model="detailModalVisible"
@@ -79,19 +79,19 @@
        <!-- 详情筛选条件 -->
        <Row @keydown.enter.native="handleDetailSearch">
          <Form ref="detailSearchForm" :model="detailSearchForm" inline :label-width="80" style="width: 100%" class="search-form">
            <Form-item label="用户昵称" prop="userName">
              <Input type="text" v-model="detailSearchForm.userName" placeholder="请输入用户昵称" clearable style="width: 200px" />
            </Form-item>
<!--            <Form-item label="用户昵称" prop="userName">-->
<!--              <Input type="text" v-model="detailSearchForm.userName" placeholder="请输入用户昵称" clearable style="width: 200px" />-->
<!--            </Form-item>-->
            <Form-item label="页面类型" prop="pageCode">
              <Select
                v-model="detailSearchForm.pageCode"
                clearable
              <Select
                v-model="detailSearchForm.pageCode"
                clearable
                filterable
                style="width: 200px"
                placeholder="请选择页面类型">
                <Option
                  v-for="item in pageTypeOptions"
                  :key="item.value"
                <Option
                  v-for="item in pageTypeOptions"
                  :key="item.value"
                  :value="item.value"
                  :label="item.label">
                  {{ item.label }}
@@ -218,7 +218,7 @@
      ],
      columns: [
        {
          title: "用户名称",
          title: "用户id",
          key: "userId",
          minWidth: 120
        },
@@ -295,7 +295,8 @@
                },
                on: {
                  click: () => {
                    this.goToGoodsDetail(params.row.pageParams);
                    // 修改:使用新窗口打开商品详情页面,保留弹窗
                    this.openGoodsDetailInNewTab(params.row.pageParams);
                  }
                }
              }, '查看商品详情') : null,
@@ -308,7 +309,8 @@
                },
                on: {
                  click: () => {
                    this.goToOrderDetail(params.row.pageParams);
                    // 修改:使用新窗口打开订单详情页面,保留弹窗
                    this.openOrderDetailInNewTab(params.row.pageParams);
                  }
                }
              }, '查看订单详情') : null
@@ -333,7 +335,7 @@
      },
      detailColumns: [
        {
          title: "用户名称",
          title: "用户Id",
          key: "userId",
          minWidth: 120
        },
@@ -342,11 +344,7 @@
          key: "nickName",
          minWidth: 100
        },
        {
          title: "会话ID",
          key: "sessionId",
          minWidth: 150
        },
        {
          title: "页面类型",
          key: "pageCode",
@@ -383,11 +381,6 @@
          }
        },
        {
          title: "页面名称",
          key: "pageNameCn",
          minWidth: 150
        },
        {
          title: "进入时间",
          key: "enterTime",
          minWidth: 160
@@ -418,7 +411,8 @@
                  },
                  on: {
                    click: () => {
                      this.goToGoodsDetail(params.row.pageParams);
                      // 修改:使用新窗口打开商品详情页面,保留弹窗
                      this.openGoodsDetailInNewTab(params.row.pageParams);
                    }
                  }
                }, '查看商品详情')
@@ -434,7 +428,8 @@
                  },
                  on: {
                    click: () => {
                      this.goToOrderDetail(params.row.pageParams);
                      // 修改:使用新窗口打开订单详情页面,保留弹窗
                      this.openOrderDetailInNewTab(params.row.pageParams);
                    }
                  }
                }, '查看订单详情')
@@ -608,8 +603,8 @@
        this.getDataListWithoutValidation();
      });
    },
    // 跳转到商品详情页面
    goToGoodsDetail(pageParams) {
    // 在新标签页中打开商品详情页面
    openGoodsDetailInNewTab(pageParams) {
      try {
        // 解析pageParams JSON字符串
        const params = JSON.parse(pageParams);
@@ -621,20 +616,23 @@
          return;
        }
        // 跳转到商品详情页面,传递参数
        this.$router.push({
        // 构造商品详情页面的URL
        const routeData = this.$router.resolve({
          name: "goods-detail",
          query: {
            id: params.goodsId
          }
        });
        // 在新标签页中打开
        window.open(routeData.href, '_blank');
      } catch (error) {
        console.error("解析pageParams出错:", error);
        this.$Message.error("参数解析失败");
      }
    },
    // 跳转到订单详情页面
    goToOrderDetail(pageParams) {
    // 在新标签页中打开订单详情页面
    openOrderDetailInNewTab(pageParams) {
      try {
        // 解析pageParams JSON字符串
        const params = JSON.parse(pageParams);
@@ -646,13 +644,16 @@
          return;
        }
        // 跳转到订单详情页面,传递订单号参数
        this.$router.push({
        // 构造订单详情页面的URL
        const routeData = this.$router.resolve({
          name: "order-detail",
          query: {
            sn: params.sn
          }
        });
        // 在新标签页中打开
        window.open(routeData.href, '_blank');
      } catch (error) {
        console.error("解析pageParams出错:", error);
        this.$Message.error("参数解析失败");
@@ -672,7 +673,7 @@
    // 获取详情数据
    getDetailData() {
      this.detailTableLoading = true;
      // 处理时间格式
      const params = { ...this.detailSearchForm };
      if (params.beginDate) {
@@ -681,7 +682,7 @@
      if (params.endDate) {
        params.endDate = this.formatDate(params.endDate);
      }
      // 调用与userAction.vue相同的接口,但增加userId参数
      userStayList(params).then(res => {
        if (res.code === 200) {
@@ -730,6 +731,17 @@
      console.log("nextTick回调,调用init方法");
      this.init();
    });
  },
  // 添加路由监听,处理页面回显问题
  watch: {
    $route(to, from) {
      // 当路由发生变化时,如果当前是userActionRecord页面,则重新加载数据
      if (to.name === 'user-action-record') {
        this.$nextTick(() => {
          this.getDataListWithoutValidation();
        });
      }
    }
  }
};
</script>
@@ -773,4 +785,4 @@
.mt_10 {
  padding: 10px 0;
}
</style>
</style>