| | |
| | | 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') |
| | | } |
| | |
| | | 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) => { |
| | |
| | | <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" /> |
| | |
| | | ruleValidate: {}, //修改验证 |
| | | columns: [ |
| | | { |
| | | title: "会员id", |
| | | key: "id", |
| | | tooltip: true, |
| | | }, |
| | | { |
| | | title: "会员名称", |
| | | key: "username", |
| | | tooltip: true, |
| | |
| | | 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"--> |
| | |
| | | selectDate: null, |
| | | columns: [ |
| | | { |
| | | title: "会员id", |
| | | key: "memberId", |
| | | minWidth: 240, |
| | | tooltip: true |
| | | }, |
| | | { |
| | | title: "订单号", |
| | | key: "sn", |
| | | minWidth: 240, |
| New file |
| | |
| | | <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> |
| | |
| | | <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 }} |
| | |
| | | pageSize: 10, |
| | | userName: "", |
| | | pageCode: "", |
| | | userId: "", |
| | | beginDate: startTime, |
| | | endDate: endTime |
| | | }, |
| | |
| | | ], |
| | | columns: [ |
| | | { |
| | | title: "用户名称", |
| | | title: "用户id", |
| | | key: "userId", |
| | | minWidth: 120 |
| | | }, |
| | |
| | | title: "用户昵称", |
| | | key: "nickName", |
| | | minWidth: 100 |
| | | }, |
| | | { |
| | | title: "会话ID", |
| | | key: "sessionId", |
| | | minWidth: 150 |
| | | }, |
| | | { |
| | | title: "页面类型", |
| | |
| | | }; |
| | | return h('span', pageCodes[params.row.pageCode] || params.row.pageCode); |
| | | } |
| | | }, |
| | | { |
| | | title: "页面名称", |
| | | key: "pageNameCn", |
| | | minWidth: 150 |
| | | }, |
| | | { |
| | | title: "进入时间", |
| | |
| | | this.searchForm.pageSize = 10; |
| | | this.searchForm.userName = ""; |
| | | this.searchForm.pageCode = ""; |
| | | this.searchForm.userId = ""; |
| | | // 使用正确的参数名称和方法 |
| | | this.searchForm.beginDate = this.getDefaultBeginDate(); |
| | | this.searchForm.endDate = this.getDefaultEndDate(); |
| | |
| | | </Page> |
| | | </Row> |
| | | </Card> |
| | | |
| | | |
| | | <!-- 用户行为详情弹窗 --> |
| | | <Modal |
| | | v-model="detailModalVisible" |
| | |
| | | <!-- 详情筛选条件 --> |
| | | <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 }} |
| | |
| | | ], |
| | | columns: [ |
| | | { |
| | | title: "用户名称", |
| | | title: "用户id", |
| | | key: "userId", |
| | | minWidth: 120 |
| | | }, |
| | |
| | | }, |
| | | on: { |
| | | click: () => { |
| | | this.goToGoodsDetail(params.row.pageParams); |
| | | // 修改:使用新窗口打开商品详情页面,保留弹窗 |
| | | this.openGoodsDetailInNewTab(params.row.pageParams); |
| | | } |
| | | } |
| | | }, '查看商品详情') : null, |
| | |
| | | }, |
| | | on: { |
| | | click: () => { |
| | | this.goToOrderDetail(params.row.pageParams); |
| | | // 修改:使用新窗口打开订单详情页面,保留弹窗 |
| | | this.openOrderDetailInNewTab(params.row.pageParams); |
| | | } |
| | | } |
| | | }, '查看订单详情') : null |
| | |
| | | }, |
| | | detailColumns: [ |
| | | { |
| | | title: "用户名称", |
| | | title: "用户Id", |
| | | key: "userId", |
| | | minWidth: 120 |
| | | }, |
| | |
| | | key: "nickName", |
| | | minWidth: 100 |
| | | }, |
| | | { |
| | | title: "会话ID", |
| | | key: "sessionId", |
| | | minWidth: 150 |
| | | }, |
| | | |
| | | { |
| | | title: "页面类型", |
| | | key: "pageCode", |
| | |
| | | } |
| | | }, |
| | | { |
| | | title: "页面名称", |
| | | key: "pageNameCn", |
| | | minWidth: 150 |
| | | }, |
| | | { |
| | | title: "进入时间", |
| | | key: "enterTime", |
| | | minWidth: 160 |
| | |
| | | }, |
| | | on: { |
| | | click: () => { |
| | | this.goToGoodsDetail(params.row.pageParams); |
| | | // 修改:使用新窗口打开商品详情页面,保留弹窗 |
| | | this.openGoodsDetailInNewTab(params.row.pageParams); |
| | | } |
| | | } |
| | | }, '查看商品详情') |
| | |
| | | }, |
| | | on: { |
| | | click: () => { |
| | | this.goToOrderDetail(params.row.pageParams); |
| | | // 修改:使用新窗口打开订单详情页面,保留弹窗 |
| | | this.openOrderDetailInNewTab(params.row.pageParams); |
| | | } |
| | | } |
| | | }, '查看订单详情') |
| | |
| | | this.getDataListWithoutValidation(); |
| | | }); |
| | | }, |
| | | // 跳转到商品详情页面 |
| | | goToGoodsDetail(pageParams) { |
| | | // 在新标签页中打开商品详情页面 |
| | | openGoodsDetailInNewTab(pageParams) { |
| | | try { |
| | | // 解析pageParams JSON字符串 |
| | | const params = JSON.parse(pageParams); |
| | |
| | | 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); |
| | |
| | | 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("参数解析失败"); |
| | |
| | | // 获取详情数据 |
| | | getDetailData() { |
| | | this.detailTableLoading = true; |
| | | |
| | | |
| | | // 处理时间格式 |
| | | const params = { ...this.detailSearchForm }; |
| | | if (params.beginDate) { |
| | |
| | | if (params.endDate) { |
| | | params.endDate = this.formatDate(params.endDate); |
| | | } |
| | | |
| | | |
| | | // 调用与userAction.vue相同的接口,但增加userId参数 |
| | | userStayList(params).then(res => { |
| | | if (res.code === 200) { |
| | |
| | | console.log("nextTick回调,调用init方法"); |
| | | this.init(); |
| | | }); |
| | | }, |
| | | // 添加路由监听,处理页面回显问题 |
| | | watch: { |
| | | $route(to, from) { |
| | | // 当路由发生变化时,如果当前是userActionRecord页面,则重新加载数据 |
| | | if (to.name === 'user-action-record') { |
| | | this.$nextTick(() => { |
| | | this.getDataListWithoutValidation(); |
| | | }); |
| | | } |
| | | } |
| | | } |
| | | }; |
| | | </script> |
| | |
| | | .mt_10 { |
| | | padding: 10px 0; |
| | | } |
| | | </style> |
| | | </style> |