Преглед изворни кода

课程打卡活动消息提醒

wangxy пре 1 недеља
родитељ
комит
24cf97e28e

+ 18 - 0
src/api/company/checkinActivity.js

@@ -0,0 +1,18 @@
+import request from '@/utils/request'
+
+// 打卡活动预警列表
+export function warningList(query) {
+  return request({
+    url: '/company/checkinActivity/warningList',
+    method: 'get',
+    params: query
+  })
+}
+
+// 获取活动列表
+export function getActivityList() {
+  return request({
+    url: '/company/checkinActivity/activityList',
+    method: 'get'
+  })
+}

+ 108 - 0
src/api/his/integralOrder.js

@@ -0,0 +1,108 @@
+import request from '@/utils/request'
+
+// 查询积分商品订单列表
+export function listIntegralOrder(query) {
+  return request({
+    url: '/his/integralOrder/list',
+    method: 'get',
+    params: query
+  })
+}
+
+// 查询积分商品订单详细
+export function getIntegralOrder(orderId) {
+  return request({
+    url: '/his/integralOrder/' + orderId,
+    method: 'get'
+  })
+}
+
+// 查询物流信息
+export function getExpress(orderId) {
+  return request({
+    url: '/his/integralOrder/getExpress/' + orderId,
+    method: 'get'
+  })
+}
+
+// 发货
+export function sendgoods(data) {
+  return request({
+    url: '/his/integralOrder/sendGoods',
+    method: 'put',
+    data: data
+  })
+}
+
+// 新增积分商品订单
+export function addIntegralOrder(data) {
+  return request({
+    url: '/his/integralOrder',
+    method: 'post',
+    data: data
+  })
+}
+
+// 修改积分商品订单
+export function updateIntegralOrder(data) {
+  return request({
+    url: '/his/integralOrder',
+    method: 'put',
+    data: data
+  })
+}
+
+// 删除积分商品订单
+export function delIntegralOrder(orderId) {
+  return request({
+    url: '/his/integralOrder/' + orderId,
+    method: 'delete'
+  })
+}
+
+// 导出积分商品订单
+export function exportIntegralOrder(query) {
+  return request({
+    url: '/his/integralOrder/export',
+    method: 'get',
+    params: query
+  })
+}
+
+// 查询收货人电话
+export function getOrderUserPhone(orderId) {
+  return request({
+    url: '/his/integralOrder/queryPhone/' + orderId,
+    method: 'get'
+  })
+}
+
+// 手动创建订单
+export function createOrderByManually(data) {
+  return request({
+    url: '/his/integralOrder/createByManually',
+    method: 'post',
+    data: data
+  })
+}
+
+// 获取积分商品列表(用于创建订单)
+export function getCheckinPrizeGoodsList(query) {
+  let url = '/his/integralGoods/getCheckinPrizeGoodsListByUserId';
+  const params = [];
+  if (query.userIds && Array.isArray(query.userIds) && query.userIds.length > 0) {
+    query.userIds.forEach(id => {
+      params.push(`userIds=${id}`);
+    });
+  }
+  if (query.goodsName) {
+    params.push(`goodsName=${encodeURIComponent(query.goodsName)}`);
+  }
+  if (params.length > 0) {
+    url += '?' + params.join('&');
+  }
+  return request({
+    url: url,
+    method: 'get'
+  })
+}

+ 171 - 0
src/views/course/checkinActivityWarning/index.vue

@@ -0,0 +1,171 @@
+<template>
+  <div class="app-container">
+
+    <el-form :model="queryParams" ref="queryForm" :inline="true" v-show="showSearch" label-width="90px">
+      <el-form-item label="用户ID" prop="userId">
+        <el-input v-model="queryParams.userId" placeholder="请输入用户ID" clearable size="small" />
+      </el-form-item>
+      <el-form-item label="手机号" prop="phone">
+        <el-input v-model="queryParams.phone" placeholder="请输入手机号" clearable size="small" />
+      </el-form-item>
+      <el-form-item label="活动" prop="activityId">
+        <el-select filterable v-model.number="queryParams.activityId" placeholder="请选择活动"
+                   clearable size="small">
+          <el-option
+            v-for="item in activityList"
+            :key="item.activityId"
+            :label="item.activityName"
+            :value="item.activityId"
+          />
+        </el-select>
+      </el-form-item>
+      <el-form-item label="打卡时间" prop="checkinTime">
+        <el-date-picker v-model="queryParams.checkinTime" size="small" style="width: 160px" value-format="yyyy-MM-dd"
+                        type="date" placeholder="选择打卡时间" clearable></el-date-picker>
+      </el-form-item>
+      <el-form-item label="状态" prop="status">
+        <el-select v-model="queryParams.status" placeholder="请选择状态" clearable size="small">
+          <el-option label="未完成打卡" value="1" />
+          <el-option label="已完成打卡" value="2" />
+          <el-option label="奖励未到账" value="3" />
+          <el-option label="奖励已到账" value="4" />
+          <el-option label="待发货" value="5" />
+          <el-option label="已发货" value="6" />
+        </el-select>
+      </el-form-item>
+
+      <el-form-item>
+        <el-button type="primary" icon="el-icon-search" size="mini" @click="handleQuery">搜索</el-button>
+        <el-button icon="el-icon-refresh" size="mini" @click="resetQuery">重置</el-button>
+      </el-form-item>
+    </el-form>
+
+    <el-row :gutter="10" class="mb8">
+      <right-toolbar :showSearch.sync="showSearch" @queryTable="getList"></right-toolbar>
+    </el-row>
+
+    <el-table v-loading="loading" border :data="checkinList" :row-class-name="tableRowClassName">
+      <el-table-column label="用户ID" align="center" prop="userId" />
+      <el-table-column label="用户昵称" align="center" prop="userNickName" />
+      <el-table-column label="手机号" align="center" prop="phone" />
+      <el-table-column label="公司" align="center" prop="companyName" />
+      <el-table-column label="项目" align="center" prop="projectName" />
+      <el-table-column label="活动名称" align="center" prop="activityName" />
+      <el-table-column label="活动开始时间" align="center" prop="activityStartTime" width="160" />
+      <el-table-column label="活动结束时间" align="center" prop="activityEndTime" width="160" />
+      <el-table-column label="打卡时间" align="center" prop="checkinTime" width="160" />
+      <el-table-column label="状态" align="center" prop="status">
+        <template slot-scope="scope">
+          {{ formatStatus(scope.row.status) }}
+        </template>
+      </el-table-column>
+      <el-table-column label="奖品类型" align="center" prop="prizeType">
+        <template slot-scope="scope">
+          {{ scope.row.prizeType === 1 ? '红包' : scope.row.prizeType === 2 ? '积分商品' : scope.row.prizeType }}
+        </template>
+      </el-table-column>
+      <el-table-column label="打卡剩余天数" align="center" prop="remainingDays" />
+    </el-table>
+    <pagination v-show="total > 0" :total="total" :page.sync="queryParams.pageNum" :limit.sync="queryParams.pageSize"
+                @pagination="getList" />
+  </div>
+</template>
+
+<script>
+import { warningList, getActivityList } from "@/api/company/checkinActivity";
+
+export default {
+  name: "CheckinActivityWarning",
+  data() {
+    return {
+      activityList: [],
+      // 遮罩层
+      loading: true,
+      // 显示搜索条件
+      showSearch: true,
+      // 总条数
+      total: 0,
+      // 表格数据
+      checkinList: [],
+      // 查询参数
+      queryParams: {
+        pageNum: 1,
+        pageSize: 10,
+        userId: null,
+        phone: null,
+        activityId: null,
+        checkinTime: null,
+        status: null
+      }
+    };
+  },
+  created() {
+    this.getActivityList();
+    this.getList();
+  },
+  methods: {
+    /** 获取活动列表 */
+    getActivityList() {
+      getActivityList().then(response => {
+        this.activityList = response.rows || [];
+        console.log('活动列表数据:', this.activityList);
+      });
+    },
+    /** 格式化状态 */
+    formatStatus(status) {
+      const statusMap = {
+        1: '未完成打卡',
+        2: '已完成打卡',
+        3: '奖励未到账',
+        4: '奖励已到账',
+        5: '待发货',
+        6: '已发货'
+      };
+      return statusMap[status] || status;
+    },
+    /** 表格行样式 */
+    tableRowClassName({ row }) {
+      if (row.remainingDays == 3) {
+        return 'warning-row';
+      }
+      return '';
+    },
+    /** 搜索按钮操作 */
+    handleQuery() {
+      this.queryParams.pageNum = 1;
+      this.getList();
+    },
+    /** 重置按钮操作 */
+    resetQuery() {
+      this.resetForm("queryForm");
+      this.handleQuery();
+    },
+    /** 查询列表 */
+    getList() {
+      this.loading = true;
+      warningList(this.queryParams).then(response => {
+        this.checkinList = response.rows;
+        this.total = response.total;
+        this.loading = false;
+      }).catch(() => {
+        this.loading = false;
+      });
+    }
+  }
+};
+</script>
+
+<style>
+.warning-row {
+  background-color: #fde2e2 !important;
+}
+.warning-row:hover {
+  background-color: #fbc4c4 !important;
+}
+.warning-row td {
+  background-color: #fde2e2 !important;
+}
+.warning-row:hover td {
+  background-color: #fbc4c4 !important;
+}
+</style>

+ 309 - 0
src/views/his/integralOrder/components/integralOrderDetails.vue

@@ -0,0 +1,309 @@
+<template>
+  <div style="background-color: #f0f2f5; padding-bottom: 20px; min-height: 100%;">
+    <div style="padding: 20px; background-color: #fff;">
+      积分订单详情
+    </div>
+    <div class="contentx" v-if="item!=null">
+      <div class="desct">积分订单信息</div>
+      <div class="order-status" v-if="item!=null && item.status != 5">
+        <el-steps :active="item.status==4?0:item.status" align-center finish-status="success">
+          <el-step title="待支付"></el-step>
+          <el-step title="待发货"></el-step>
+          <el-step title="待收货"></el-step>
+          <el-step title="已完成"></el-step>
+        </el-steps>
+      </div>
+      <el-card shadow="never" style="margin-top: 15px">
+        <div class="operate-container" v-if="item!=null">
+          <span style="margin-left: 20px" class="color-danger">订单状态:
+            <el-tag prop="status" v-for="(ite, index) in statusOptions" :key="index" v-if="item.status==ite.dictValue">{{ite.dictLabel}}</el-tag>
+          </span>
+          <div class="operate-button-container" v-if="item.status==1" v-hasPermi="['his:integralOrder:sendGoods']">
+            <el-button size="mini" @click="sendVisible=true">发货</el-button>
+          </div>
+          <div class="operate-button-container" v-if="item.deliverySn!=null" v-hasPermi="['his:integralOrder:express']">
+            <el-button size="mini" @click="showExpress()">查看物流</el-button>
+          </div>
+          <div class="operate-button-container" v-hasPermi="['his:integralOrder:edit']">
+            <el-button size="mini" @click="updateOrder()">修改订单</el-button>
+          </div>
+        </div>
+        <div class="desct">基本信息</div>
+        <el-descriptions title="" :column="3" border>
+          <el-descriptions-item label="订单编号"><span v-if="item!=null">{{item.orderCode}}</span></el-descriptions-item>
+          <el-descriptions-item label="会员ID"><span v-if="item!=null">{{item.userId}}</span></el-descriptions-item>
+          <el-descriptions-item label="会员"><span v-if="item.nickName!=null">{{item.nickName}}({{item.phone}})</span></el-descriptions-item>
+          <el-descriptions-item label="用户名称"><span v-if="item!=null">{{item.userName}}</span></el-descriptions-item>
+          <el-descriptions-item label="用户电话"><span v-if="item!=null">{{item.userPhone}}</span>
+            <el-button icon="el-icon-search" size="mini" @click="handlePhone()" style="margin-left: 20px;" circle v-hasPermi="['his:integralOrder:queryPhone']"></el-button>
+          </el-descriptions-item>
+          <el-descriptions-item label="用户地址"><span v-if="item!=null">{{item.userAddress}}</span></el-descriptions-item>
+          <el-descriptions-item label="支付积分"><span v-if="item!=null">{{item.integral}}</span></el-descriptions-item>
+          <el-descriptions-item label="状态"><span v-if="item!=null"><dict-tag :options="statusOptions" :value="item.status"/></span></el-descriptions-item>
+          <el-descriptions-item label="快递公司编号"><span v-if="item!=null">{{item.deliveryCode}}</span></el-descriptions-item>
+          <el-descriptions-item label="快递名称"><span v-if="item!=null">{{item.deliveryName}}</span></el-descriptions-item>
+          <el-descriptions-item label="快递单号"><span v-if="item!=null">{{item.deliverySn}}</span></el-descriptions-item>
+          <el-descriptions-item label="发货时间"><span v-if="item!=null">{{item.deliveryTime}}</span></el-descriptions-item>
+          <el-descriptions-item label="提交时间"><span v-if="item!=null">{{item.createTime}}</span></el-descriptions-item>
+        </el-descriptions>
+      </el-card>
+    </div>
+    <div class="contentx" v-if="item!=null" style="padding-bottom: 70px;">
+      <div class="desct">商品信息</div>
+      <el-table border v-if="prod!=null" :data="prod" size="small" style="margin-top: 20px">
+        <el-table-column label="商品图片" align="center">
+          <template slot-scope="scope">
+            <img :src="scope.row.imgUrl" style="height: 80px">
+          </template>
+        </el-table-column>
+        <el-table-column label="商品名称" align="center">
+          <template slot-scope="scope">
+            <p>{{scope.row.goodsName}}</p>
+          </template>
+        </el-table-column>
+        <el-table-column label="积分" align="center">
+          <template slot-scope="scope">
+            <p>¥{{scope.row.integral}}</p>
+          </template>
+        </el-table-column>
+        <el-table-column label="金额" align="center">
+          <template slot-scope="scope">
+            <p>¥{{scope.row.cash || 0}}</p>
+          </template>
+        </el-table-column>
+      </el-table>
+    </div>
+
+    <!-- 发货弹窗 -->
+    <el-dialog width="50%" title="发货" :visible.sync="sendVisible" append-to-body @close="sendCancel">
+      <el-form ref="form" :model="form" :rules="rules" label-width="120px">
+        <el-form-item label="快递公司编号" prop="deliveryCode">
+          <el-input v-model="form.deliveryCode" placeholder="请输入快递公司编号" />
+        </el-form-item>
+        <el-form-item label="快递名称" prop="deliveryName">
+          <el-input v-model="form.deliveryName" placeholder="请输入快递名称" />
+        </el-form-item>
+        <el-form-item label="快递单号" prop="deliverySn">
+          <el-input v-model="form.deliverySn" placeholder="请输入快递单号" />
+        </el-form-item>
+      </el-form>
+      <div slot="footer" class="dialog-footer">
+        <el-button type="primary" @click="sendGoods">确 定</el-button>
+        <el-button @click="sendCancel">取 消</el-button>
+      </div>
+    </el-dialog>
+
+    <!-- 物流信息弹窗 -->
+    <el-dialog :title="expressDialog.title" :visible.sync="expressDialog.open" width="600px" append-to-body>
+      <el-table style="margin-top: 20px;width: 100%" ref="orderHistoryTable" :data="traces" border>
+        <el-table-column label="操作时间" width="160" align="center">
+          <template slot-scope="scope">
+            {{scope.row.AcceptTime}}
+          </template>
+        </el-table-column>
+        <el-table-column label="位置" align="center">
+          <template slot-scope="scope">
+            {{scope.row.Location}}
+          </template>
+        </el-table-column>
+        <el-table-column label="描述" align="center">
+          <template slot-scope="scope">
+            {{scope.row.AcceptStation}}
+          </template>
+        </el-table-column>
+      </el-table>
+    </el-dialog>
+
+    <!-- 修改订单弹窗 -->
+    <el-dialog :title="editOrder.title" :visible.sync="editOrder.open" width="600px" append-to-body>
+      <el-form ref="editForm" :model="editForm" :rules="editRules" label-width="100px">
+        <el-form-item label="订单状态" prop="status">
+          <el-select v-model="editForm.status" placeholder="请选择状态" clearable size="small" filterable>
+            <el-option
+              v-for="dict in statusOptions"
+              :key="dict.dictValue"
+              :label="dict.dictLabel"
+              :value="dict.dictValue"
+            />
+          </el-select>
+        </el-form-item>
+        <el-form-item label="详情地址" prop="userAddress">
+          <el-input v-model="editForm.userAddress" placeholder="请输入" />
+        </el-form-item>
+        <el-form-item label="备注" prop="remark">
+          <el-input v-model="editForm.remark" placeholder="请输入备注" />
+        </el-form-item>
+      </el-form>
+      <div slot="footer" class="dialog-footer">
+        <el-button type="primary" @click="submitEditForm">确 定</el-button>
+      </div>
+    </el-dialog>
+  </div>
+</template>
+
+<script>
+import { getExpress, getIntegralOrder, updateIntegralOrder, sendgoods, getOrderUserPhone } from "@/api/his/integralOrder";
+
+export default {
+  name: "integralOrderDetails",
+  data() {
+    return {
+      expressDialog: {
+        title: "物流信息",
+        open: false,
+      },
+      editOrder: {
+        title: "修改订单",
+        open: false,
+      },
+      editForm: {
+        orderId: null,
+        status: null,
+        userAddress: null,
+        remark: "",
+      },
+      editRules: {},
+      item: null,
+      express: null,
+      traces: [],
+      rules: {
+        deliveryCode: [
+          { required: true, message: '请输入快递公司编号', trigger: 'blur' }
+        ],
+        deliveryName: [
+          { required: true, message: '请输入快递名称', trigger: 'blur' }
+        ],
+        deliverySn: [
+          { required: true, message: '请输入快递单号', trigger: 'blur' }
+        ]
+      },
+      sendVisible: false,
+      form: {
+        deliveryCode: null,
+        deliveryName: null,
+        deliverySn: null,
+        orderId: null,
+      },
+      prod: null,
+      statusOptions: []
+    }
+  },
+  created() {
+    this.getDicts("sys_integral_order_status").then(response => {
+      this.statusOptions = response.data;
+    });
+  },
+  methods: {
+    handlePhone() {
+      const orderId = this.item.orderId;
+      getOrderUserPhone(orderId).then(response => {
+        this.item.userPhone = response.userPhone;
+      })
+    },
+    updateOrder() {
+      this.editOrder.open = true;
+      this.editForm.orderId = this.item.orderId;
+      this.editForm.remark = this.item.remark;
+      this.editForm.status = this.item.status.toString();
+      this.editForm.userAddress = this.item.userAddress.toString();
+    },
+    // 修改订单状态
+    submitEditForm() {
+      this.$refs["editForm"].validate(valid => {
+        if (valid) {
+          updateIntegralOrder(this.editForm).then(response => {
+            if (response.code === 200) {
+              this.msgSuccess("操作成功");
+              this.editOrder.open = false;
+              this.getDetails(this.item.orderId);
+            }
+          });
+        }
+      });
+    },
+    sendCancel() {
+      this.sendVisible = false;
+      this.form = {
+        deliveryCode: null,
+        deliveryName: null,
+        deliverySn: null,
+        orderId: null,
+      }
+    },
+    showExpress() {
+      this.expressDialog.open = true;
+      getExpress(this.item.orderId).then(response => {
+        this.express = response.data;
+        if (this.express != null && this.express.Traces != null) {
+          this.traces = this.express.Traces
+        }
+      });
+    },
+    sendGoods() {
+      this.form.orderId = this.item.orderId;
+      sendgoods(this.form).then(response => {
+        this.msgSuccess("修改成功");
+        this.sendVisible = false;
+        getIntegralOrder(this.item.orderId).then(response => {
+          this.item = response.data;
+          this.$parent.$parent.getList();
+        });
+        this.form = {
+          deliveryCode: null,
+          deliveryName: null,
+          deliverySn: null,
+          orderId: null,
+        }
+      });
+    },
+    getDetails(orderId) {
+      this.item = null;
+      getIntegralOrder(orderId).then(response => {
+        this.item = response.data;
+        this.prod = [JSON.parse(this.item.itemJson)];
+      });
+    },
+  }
+}
+</script>
+
+<style>
+.contentx {
+  height: 100%;
+  background-color: #fff;
+  padding: 0px 20px 20px;
+  margin: 20px;
+}
+
+.el-descriptions-item__label.is-bordered-label {
+  font-weight: normal;
+}
+
+.el-descriptions-item__content {
+  max-width: 150px;
+  min-width: 100px;
+}
+
+.desct {
+  padding-top: 20px;
+  padding-bottom: 20px;
+  color: #524b4a;
+  font-weight: bold;
+}
+
+.operate-container {
+  background: #F2F6FC;
+  height: 60px;
+  margin: -20px -20px 0;
+  line-height: 60px;
+}
+
+.order-content {
+  margin: 10px;
+}
+
+.operate-button-container {
+  float: right;
+  margin-right: 20px
+}
+</style>

+ 607 - 0
src/views/his/integralOrder/index.vue

@@ -0,0 +1,607 @@
+<template>
+  <div class="app-container">
+    <el-form :model="queryParams" ref="queryForm" :inline="true" v-show="showSearch" label-width="68px">
+      <el-form-item label="订单编号" prop="orderCode">
+        <el-input
+          v-model="queryParams.orderCode"
+          placeholder="请输入订单编号"
+          clearable
+          size="small"
+          @keyup.enter.native="handleQuery"
+        />
+      </el-form-item>
+      <el-form-item label="用户名称" prop="userName">
+        <el-input
+          v-model="queryParams.userName"
+          placeholder="请输入用户名称"
+          clearable
+          size="small"
+          @keyup.enter.native="handleQuery"
+        />
+      </el-form-item>
+      <el-form-item label="用户电话" prop="userPhone">
+        <el-input
+          v-model="queryParams.userPhone"
+          placeholder="请输入用户电话"
+          clearable
+          size="small"
+          @keyup.enter.native="handleQuery"
+        />
+      </el-form-item>
+
+      <el-form-item label="状态" prop="status">
+        <el-select v-model="queryParams.status" placeholder="状态" clearable size="small">
+          <el-option
+            v-for="dict in statusOptions"
+            :key="dict.dictValue"
+            :label="dict.dictLabel"
+            :value="dict.dictValue"
+          />
+        </el-select>
+      </el-form-item>
+      <el-form-item label="快递单号" prop="deliverySn">
+        <el-input
+          v-model="queryParams.deliverySn"
+          placeholder="请输入快递单号"
+          clearable
+          size="small"
+          @keyup.enter.native="handleQuery"
+        />
+      </el-form-item>
+
+      <el-form-item label="提交时间" prop="createTime">
+        <el-date-picker
+          v-model="createTime"
+          size="small"
+          style="width: 220px"
+          value-format="yyyy-MM-dd"
+          type="daterange"
+          range-separator="-"
+          start-placeholder="开始日期"
+          end-placeholder="结束日期"
+          @change="change"
+        />
+      </el-form-item>
+
+      <el-form-item>
+        <el-button type="primary" icon="el-icon-search" size="mini" @click="handleQuery">搜索</el-button>
+        <el-button icon="el-icon-refresh" size="mini" @click="resetQuery">重置</el-button>
+      </el-form-item>
+    </el-form>
+
+    <el-row :gutter="10" class="mb8">
+      <el-col :span="1.5">
+        <el-button
+          type="primary"
+          icon="el-icon-plus"
+          size="mini"
+          @click="handleAdd"
+          v-hasPermi="['his:integralOrder:addManually']"
+        >创建订单</el-button>
+      </el-col>
+      <el-col :span="1.5">
+        <el-button
+          type="warning"
+          plain
+          icon="el-icon-download"
+          size="mini"
+          :loading="exportLoading"
+          @click="handleExport"
+          v-hasPermi="['his:integralOrder:export']"
+        >导出</el-button>
+      </el-col>
+      <right-toolbar :showSearch.sync="showSearch" @queryTable="getList"></right-toolbar>
+    </el-row>
+
+    <el-tabs type="card" v-model="actName" @tab-click="handleClickX">
+      <el-tab-pane label="全部订单" name="10"></el-tab-pane>
+      <el-tab-pane v-for="(item,index) in statusOptions" :key="index" :label="item.dictLabel" :name="item.dictValue"></el-tab-pane>
+    </el-tabs>
+
+    <el-table v-loading="loading" border :data="integralOrderList" @selection-change="handleSelectionChange">
+      <el-table-column type="selection" width="55" align="center" />
+      <el-table-column label="订单编号" align="center" prop="orderCode" />
+      <el-table-column label="商品信息" align="center" width="200">
+        <template slot-scope="scope">
+          <div style="display: flex; align-items: center; justify-content: center;">
+            <span style="white-space: pre-line; text-align: left;">{{ scope.row.goodsName }}</span>
+          </div>
+        </template>
+      </el-table-column>
+      <el-table-column label="用户名称" align="center" prop="userName" />
+      <el-table-column label="用户电话" align="center" prop="userPhone" />
+      <el-table-column label="用户地址" align="center" prop="userAddress" show-overflow-tooltip />
+      <el-table-column label="支付积分" align="center" prop="integral" />
+      <el-table-column label="支付金额" align="center" prop="payMoney" />
+      <el-table-column label="状态" align="center" prop="status">
+        <template slot-scope="scope">
+          <dict-tag :options="statusOptions" :value="scope.row.status"/>
+        </template>
+      </el-table-column>
+      <el-table-column label="快递公司编号" align="center" prop="deliveryCode" />
+      <el-table-column label="快递名称" align="center" prop="deliveryName" />
+      <el-table-column label="快递单号" align="center" prop="deliverySn" />
+      <el-table-column label="发货时间" align="center" prop="deliveryTime" width="180"/>
+      <el-table-column label="提交时间" align="center" prop="createTime" width="180"/>
+      <el-table-column label="备注" align="center" prop="remark" show-overflow-tooltip/>
+      <el-table-column label="操作" align="center" class-name="small-padding fixed-width" fixed="right">
+        <template slot-scope="scope">
+          <el-button
+             size="mini"
+             type="text"
+             @click="handledetails(scope.row)"
+          >详情</el-button>
+        </template>
+      </el-table-column>
+    </el-table>
+
+    <pagination
+      v-show="total>0"
+      :total="total"
+      :page.sync="queryParams.pageNum"
+      :limit.sync="queryParams.pageSize"
+      @pagination="getList"
+    />
+
+    <!-- 订单详情抽屉 -->
+    <el-drawer
+      :with-header="false"
+      size="75%"
+      :title="show.title"
+      :visible.sync="show.open"
+    >
+      <integralOrderDetails ref="Details" />
+    </el-drawer>
+
+    <!-- 创建订单对话框 -->
+    <el-dialog :title="title" v-if="open" :visible.sync="open" width="1000px" append-to-body :close-on-click-modal="false">
+      <el-form ref="form" :model="form" :rules="rules" label-width="120px">
+        <el-form-item label="会员信息" prop="userId">
+          <el-row>
+            <el-col>
+              <el-input placeholder="请输入会员手机号" style="width:240px;" v-model="phone"/>
+              <el-button plain style="margin-left:10px;" @click="searchUser()">查询</el-button>
+              <el-button plain style="margin-left:10px;" icon="el-icon-plus" type="primary" @click="handleAddUser()">添加会员</el-button>
+            </el-col>
+          </el-row>
+          <el-table border style="margin-top:5px;" v-loading="userloading" :data="users">
+            <el-table-column label="ID" align="center" prop="userId" />
+            <el-table-column label="会员头像" align="center" width="80">
+              <template slot-scope="scope">
+                <el-popover placement="right" title="" trigger="hover">
+                  <img slot="reference" :src="scope.row.avatar" width="50">
+                  <img :src="scope.row.avatar" style="max-width: 120px;">
+                </el-popover>
+              </template>
+            </el-table-column>
+            <el-table-column label="昵称" align="center" prop="nickName" />
+            <el-table-column label="手机号" align="center" prop="phone" />
+            <el-table-column label="状态" align="center" prop="status">
+              <template slot-scope="scope">
+                <el-tag prop="status" v-for="(item, index) in userStatusOptions" :key="index" v-if="scope.row.status==item.dictValue">{{item.dictLabel}}</el-tag>
+              </template>
+            </el-table-column>
+          </el-table>
+        </el-form-item>
+        <el-form-item label="收货信息" prop="addressId">
+          <el-row>
+            <el-col>
+              <el-button plain type="primary" icon="el-icon-plus" @click="handleAddUserAddress()">添加收货地址</el-button>
+            </el-col>
+          </el-row>
+          <el-radio-group v-model="form.addressId" style="width:100%">
+            <el-table border style="margin-top:5px;" v-loading="addressloading" :data="address">
+              <el-table-column label="ID" align="center">
+                <template slot-scope="scope">
+                  <el-radio :label="scope.row.addressId"></el-radio>
+                </template>
+              </el-table-column>
+              <el-table-column label="收货人姓名" align="center" prop="realName" />
+              <el-table-column label="收货人所在省" align="center" prop="province" />
+              <el-table-column label="收货人所在市" align="center" prop="city" />
+              <el-table-column label="收货人所在区" align="center" prop="district" />
+              <el-table-column label="收货人详细地址" align="center" prop="detail" />
+            </el-table>
+          </el-radio-group>
+        </el-form-item>
+        <el-form-item label="商品信息" prop="product">
+          <el-input
+            v-model="queryParams.productName"
+            placeholder="请输入商品名称搜索"
+            clearable
+            size="small"
+            style="width: 300px; margin-bottom: 10px;"
+            @keyup.enter.native="getProductList"
+          />
+          <el-button
+            type="primary"
+            size="small"
+            style="margin-left: 10px;"
+            @click="getProductList"
+          >搜索</el-button>
+          <el-table border width="100%" style="margin-top:5px;" :data="productJson" @selection-change="handleProductSelectionChange">
+            <el-table-column type="selection" width="55" align="center" />
+            <el-table-column label="商品图片" align="center" width="120">
+              <template slot-scope="scope">
+                <el-popover placement="right" title="" trigger="hover">
+                  <img slot="reference" :src="scope.row.imgUrl" width="100">
+                  <img :src="scope.row.imgUrl" style="max-width: 150px;">
+                </el-popover>
+              </template>
+            </el-table-column>
+            <el-table-column label="商品名称" show-overflow-tooltip align="center" prop="goodsName" />
+            <el-table-column label="积分" align="center" prop="integral" />
+            <el-table-column label="金额" align="center" prop="cash">
+              <template slot-scope="scope">
+                <span v-if="scope.row.cash!=null">{{scope.row.cash.toFixed(2)}}</span>
+              </template>
+            </el-table-column>
+          </el-table>
+        </el-form-item>
+        <el-form-item label="支付方式" prop="payType">
+          <el-select v-model="form.payType" placeholder="请选择支付方式" clearable size="small">
+            <el-option
+              v-for="item in payTypeOptions"
+              :key="item.dictValue"
+              :label="item.dictLabel"
+              :value="item.dictValue"
+            />
+          </el-select>
+        </el-form-item>
+        <el-form-item label="支付金额" prop="payMoney">
+          <el-input v-model="form.payMoney" placeholder="请输入支付金额" clearable size="small" style="width: 200px;" />
+        </el-form-item>
+      </el-form>
+      <div slot="footer" class="dialog-footer">
+        <el-button type="primary" @click="submitForm">确 定</el-button>
+        <el-button @click="cancel">取 消</el-button>
+      </div>
+    </el-dialog>
+
+    <!-- 添加会员弹窗 -->
+    <el-dialog :title="user.title" v-if="user.open" :visible.sync="user.open" width="500px" append-to-body>
+      <add-user @addUser="addUser" />
+    </el-dialog>
+
+    <!-- 添加收货地址弹窗 -->
+    <el-dialog :title="userAddress.title" v-if="userAddress.open" :visible.sync="userAddress.open" width="800px" append-to-body>
+      <add-user-address ref="addUserAddress" @addUserAddress="addUserAddress" />
+    </el-dialog>
+  </div>
+</template>
+
+<script>
+import { listIntegralOrder, getIntegralOrder, exportIntegralOrder, createOrderByManually, getCheckinPrizeGoodsList } from "@/api/his/integralOrder";
+import { userList } from "@/api/store/user";
+import { listUserAddress } from "@/api/store/userAddress";
+import integralOrderDetails from './components/integralOrderDetails.vue';
+import addUser from "@/views/store/components/addUser.vue";
+import addUserAddress from "@/views/store/components/addUserAddress.vue";
+
+export default {
+  name: "IntegralOrder",
+  components: { integralOrderDetails, addUser, addUserAddress },
+  data() {
+    return {
+      show: {
+        open: false,
+        title: "订单详情"
+      },
+      // 遮罩层
+      loading: true,
+      actName: "10",
+      // 导出遮罩层
+      exportLoading: false,
+      // 选中数组
+      ids: [],
+      // 非单个禁用
+      single: true,
+      // 非多个禁用
+      multiple: true,
+      // 显示搜索条件
+      showSearch: true,
+      // 总条数
+      total: 0,
+      // 积分商品订单表格数据
+      integralOrderList: [],
+      // 状态字典
+      statusOptions: [],
+      // 查询参数
+      queryParams: {
+        pageNum: 1,
+        pageSize: 10,
+        orderCode: null,
+        userName: null,
+        userPhone: null,
+        integral: null,
+        status: null,
+        deliverySn: null,
+        createTime: null,
+        sTime: null,
+        eTime: null,
+        productName: null
+      },
+      createTime: null,
+      // 创建订单相关
+      open: false,
+      title: "",
+      phone: null,
+      userloading: false,
+      users: [],
+      address: [],
+      addressloading: false,
+      productJson: [],
+      payTypeOptions: [],
+      userStatusOptions: [],
+      // 表单参数
+      form: {
+        addressId: null,
+        userId: null,
+        payType: null,
+        payMoney: null,
+        goodsIds: []
+      },
+      // 表单校验
+      rules: {},
+      // 添加会员弹窗
+      user: {
+        open: false,
+        title: "创建会员"
+      },
+      // 添加收货地址弹窗
+      userAddress: {
+        open: false,
+        title: "创建收货地址"
+      }
+    };
+  },
+  created() {
+    this.getList();
+    this.getDicts("sys_integral_order_status").then(response => {
+      this.statusOptions = response.data;
+    });
+    this.getDicts("sys_company_status").then(response => {
+      this.userStatusOptions = response.data;
+    });
+    this.getDicts("sys_package_pay_type").then(response => {
+      this.payTypeOptions = response.data;
+    });
+  },
+  methods: {
+    change() {
+      if (this.createTime != null) {
+        this.queryParams.sTime = this.createTime[0];
+        this.queryParams.eTime = this.createTime[1];
+      } else {
+        this.queryParams.sTime = null;
+        this.queryParams.eTime = null;
+      }
+    },
+    handledetails(row) {
+      this.show.open = true;
+      setTimeout(() => {
+        this.$refs.Details.getDetails(row.orderId);
+      }, 1);
+    },
+    /** 查询积分商品订单列表 */
+    getList() {
+      this.loading = true;
+      listIntegralOrder(this.queryParams).then(response => {
+        const processedData = response.rows.map(item => {
+          let goodsName = '';
+          try {
+            if (item.itemJson) {
+              const itemData = JSON.parse(item.itemJson);
+              if (Array.isArray(itemData) && itemData.length > 0) {
+                const goodsInfoList = itemData
+                  .filter(goods => goods.goodsName)
+                  .map(goods => {
+                    const name = goods.goodsName || '';
+                    const itemNum = goods.num || 1;
+                    return `${name},数量:${itemNum}个`;
+                  });
+
+                if (goodsInfoList.length > 0) {
+                  goodsName = goodsInfoList.join('\n');
+                } else if (itemData[0].goodsName) {
+                  const firstItem = itemData[0];
+                  goodsName = `${firstItem.goodsName || ''},数量:${firstItem.num || 1}个`;
+                }
+              }
+              else if (itemData.goodsName) {
+                goodsName = `${itemData.goodsName},数量:${itemData.num || 1}个`;
+              }
+            }
+          } catch (error) {
+            console.error('解析itemJson失败:', error);
+            goodsName = '';
+          }
+
+          return {
+            ...item,
+            goodsName: goodsName
+          };
+        });
+
+        this.integralOrderList = processedData;
+        this.total = response.total;
+        this.loading = false;
+      }).catch(error => {
+        console.error('查询订单列表失败:', error);
+        this.loading = false;
+        this.$message.error('查询订单列表失败');
+      });
+    },
+    /** 搜索按钮操作 */
+    handleQuery() {
+      this.queryParams.pageNum = 1;
+      this.getList();
+    },
+    /** 重置按钮操作 */
+    resetQuery() {
+      this.resetForm("queryForm");
+      this.createTime = null;
+      this.queryParams.sTime = null;
+      this.queryParams.eTime = null;
+      this.handleQuery();
+    },
+    // 多选框选中数据
+    handleSelectionChange(selection) {
+      this.ids = selection.map(item => item.orderId);
+      this.single = selection.length !== 1;
+      this.multiple = !selection.length;
+    },
+    handleClickX(tab, event) {
+      if (tab.name == "10") {
+        this.queryParams.status = null;
+      } else {
+        this.queryParams.status = tab.name;
+      }
+      this.handleQuery();
+    },
+    /** 导出按钮操作 */
+    handleExport() {
+      const queryParams = this.queryParams;
+      this.$confirm('是否确认导出所有积分商品订单数据项?', "警告", {
+        confirmButtonText: "确定",
+        cancelButtonText: "取消",
+        type: "warning"
+      }).then(() => {
+        this.exportLoading = true;
+        return exportIntegralOrder(queryParams);
+      }).then(response => {
+        this.download(response.msg);
+        this.exportLoading = false;
+      }).catch(() => {});
+    },
+    // ========== 创建订单相关方法 ==========
+    /** 新增按钮操作 */
+    handleAdd() {
+      this.reset();
+      this.productJson = [];
+      this.phone = null;
+      this.users = [];
+      this.address = [];
+      this.queryParams.productName = null;
+      this.form = {
+        addressId: null,
+        userId: null,
+        payType: null,
+        payMoney: null,
+        goodsIds: []
+      };
+      this.open = true;
+      this.title = "创建订单";
+    },
+    // 取消按钮
+    cancel() {
+      this.open = false;
+      this.reset();
+    },
+    // 表单重置
+    reset() {
+      this.form = {
+        addressId: null,
+        userId: null,
+        payType: null,
+        payMoney: null,
+        goodsIds: []
+      };
+      this.resetForm("form");
+    },
+    /** 提交按钮 */
+    submitForm() {
+      this.$refs["form"].validate(valid => {
+        if (valid) {
+          createOrderByManually(this.form).then(response => {
+            this.msgSuccess("新增成功");
+            this.open = false;
+            this.form = {
+              addressId: null,
+              userId: null,
+              payType: null,
+              payMoney: null,
+              goodsIds: []
+            };
+            this.getList();
+          });
+        }
+      });
+    },
+    // 查询会员
+    searchUser() {
+      if (this.phone == null || this.phone == "") {
+        return;
+      }
+      var data = { phone: this.phone };
+      this.userloading = true;
+      this.users = [];
+      this.address = [];
+      userList(data).then(response => {
+        this.users = response.rows;
+        this.userloading = false;
+        if (this.users != null && this.users.length == 1) {
+          this.form.userId = this.users[0].userId;
+          this.getAddressList(this.form.userId);
+        }
+      });
+    },
+    // 添加会员回调
+    addUser(phone) {
+      this.user.open = false;
+      this.phone = phone;
+      this.searchUser();
+    },
+    // 打开添加会员弹窗
+    handleAddUser() {
+      this.user.open = true;
+    },
+    // 打开添加收货地址弹窗
+    handleAddUserAddress() {
+      if (this.form.userId == null) {
+        this.msgError("请选择会员");
+        return;
+      }
+      this.userAddress.open = true;
+      setTimeout(() => {
+        this.$refs.addUserAddress.init(this.form.userId);
+      }, 500);
+    },
+    // 添加收货地址回调
+    addUserAddress() {
+      this.userAddress.open = false;
+      this.getAddressList(this.form.userId);
+    },
+    // 获取地址列表
+    getAddressList(userId) {
+      var data = { userId: userId };
+      this.addressloading = true;
+      this.address = [];
+      listUserAddress(data).then(response => {
+        this.address = response.rows;
+        this.addressloading = false;
+      });
+    },
+    // 查询商品列表
+    getProductList() {
+      if (!this.form.userId) {
+        this.msgWarning("请先选择会员");
+        return;
+      }
+      const params = {
+        userIds: [this.form.userId]
+      };
+      if (this.queryParams.productName) {
+        params.goodsName = this.queryParams.productName;
+      }
+      getCheckinPrizeGoodsList(params).then(response => {
+        this.productJson = response.rows || response.data || [];
+      });
+    },
+    // 商品选择变化
+    handleProductSelectionChange(selection) {
+      this.form.goodsIds = selection.map(item => item.goodsId);
+    }
+  }
+};
+</script>