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

Merge branch 'master' into 跨公司客户接替

Long пре 1 недеља
родитељ
комит
935dd2cd1f

+ 22 - 0
.env.prod-ddgy

@@ -0,0 +1,22 @@
+# 页面标题
+VUE_APP_TITLE =叮当国医SCRM销售端
+# 公司名称
+VUE_APP_COMPANY_NAME =云联融智互联网医院有限公司
+# ICP备案号
+VUE_APP_ICP_RECORD =渝ICP备2024031984号-1
+# ICP网站访问地址
+VUE_APP_ICP_URL =https://beian.miit.gov.cn
+# 网站LOG
+VUE_APP_LOG_URL =@/assets/logo/ddgy.jpg
+
+# 生产环境配置
+ENV = 'production'
+
+# FS管理系统/开发环境
+VUE_APP_BASE_API = '/prod-api'
+
+#默认 1、会员 2、企微
+VUE_APP_COURSE_DEFAULT = 2
+
+# 路由懒加载
+VUE_CLI_BABEL_TRANSPILE_MODULES = true

+ 22 - 0
.env.prod-hat

@@ -0,0 +1,22 @@
+# 页面标题
+VUE_APP_TITLE =恒安图SCRM销售端
+# 公司名称
+VUE_APP_COMPANY_NAME =云联融智互联网医院有限公司
+# ICP备案号
+VUE_APP_ICP_RECORD =渝ICP备2024031984号-1
+# ICP网站访问地址
+VUE_APP_ICP_URL =https://beian.miit.gov.cn
+# 网站LOG
+VUE_APP_LOG_URL =@/assets/logo/hat.png
+
+# 生产环境配置
+ENV = 'production'
+
+# FS管理系统/开发环境
+VUE_APP_BASE_API = '/prod-api'
+
+#默认 1、会员 2、企微
+VUE_APP_COURSE_DEFAULT = 2
+
+# 路由懒加载
+VUE_CLI_BABEL_TRANSPILE_MODULES = true

+ 22 - 0
.env.prod-knt

@@ -0,0 +1,22 @@
+# 页面标题
+VUE_APP_TITLE = 康年堂SCRM销售端
+# 公司名称
+VUE_APP_COMPANY_NAME = 陕西康年堂医药连锁有限公司
+# ICP备案号
+VUE_APP_ICP_RECORD = 陕ICP备2023011686号-5
+# ICP网站访问地址
+VUE_APP_ICP_URL =https://beian.miit.gov.cn
+# 网站LOG
+VUE_APP_LOG_URL =@/assets/logo/knt.jpg
+
+# 生产环境配置
+ENV = 'production'
+
+#FS管理系统/生产环境
+VUE_APP_BASE_API = '/prod-api'
+
+# 路由懒加载
+VUE_CLI_BABEL_TRANSPILE_MODULES = true
+
+#默认 1、会员 2、企微
+VUE_APP_COURSE_DEFAULT = 1

+ 3 - 0
package.json

@@ -16,6 +16,7 @@
     "build:prod-test": "vue-cli-service build --mode prod-test",
     "build:prod-sxjz": "vue-cli-service build --mode prod-sxjz",
     "build:prod-jnmy": "vue-cli-service build --mode prod-jnmy",
+    "build:prod-knt": "vue-cli-service build --mode prod-knt",
     "build:prod-hdt": "vue-cli-service build --mode prod-hdt",
     "build:prod-yzt": "vue-cli-service build --mode prod-yzt",
     "build:prod-xfk": "vue-cli-service build --mode prod-xfk",
@@ -41,6 +42,8 @@
     "build:prod-syysy": "vue-cli-service build --mode prod-syysy",
     "build:prod-hyt": "vue-cli-service build --mode prod-hyt",
     "build:prod-hst": "vue-cli-service build --mode prod-hst",
+    "build:prod-hat": "vue-cli-service build --mode prod-hat",
+    "build:prod-ddgy": "vue-cli-service build --mode prod-ddgy",
     "preview": "node build/index.js --preview",
     "lint": "eslint --ext .js,.vue src",
     "test:unit": "jest --clearCache && vue-cli-service test:unit",

+ 11 - 0
src/api/company/userIntegralLogs.js

@@ -0,0 +1,11 @@
+import request from '@/utils/request'
+
+// 查询积分记录列表
+export function listUserIntegralLogs(query) {
+  return request({
+    url: '/company/companyIntegral/list',
+    method: 'get',
+    params: query
+  })
+}
+

+ 58 - 0
src/api/hisStore/integralGoods.js

@@ -0,0 +1,58 @@
+import request from '@/utils/request'
+
+// 查询积分商品列表
+export function listIntegralGoods(query) {
+  return request({
+    url: '/his/integralGoods/list',
+    method: 'get',
+    params: query
+  })
+}
+
+// 查询积分商品详细
+export function getIntegralGoods(goodsId) {
+  return request({
+    url: '/his/integralGoods/' + goodsId,
+    method: 'get'
+  })
+}
+export function importTemplate() {
+  return request({
+    url: '/his/integralGoods/importTemplate',
+    method: 'get'
+  })
+}
+// 新增积分商品
+export function addIntegralGoods(data) {
+  return request({
+    url: '/his/integralGoods',
+    method: 'post',
+    data: data
+  })
+}
+
+// 修改积分商品
+export function updateIntegralGoods(data) {
+  return request({
+    url: '/his/integralGoods',
+    method: 'put',
+    data: data
+  })
+}
+
+// 删除积分商品
+export function delIntegralGoods(goodsId) {
+  return request({
+    url: '/his/integralGoods/' + goodsId,
+    method: 'delete'
+  })
+}
+
+// 导出积分商品
+export function exportIntegralGoods(query) {
+  return request({
+    url: '/his/integralGoods/export',
+    method: 'get',
+    params: query
+  })
+}

+ 80 - 0
src/api/hisStore/integralOrder.js

@@ -0,0 +1,80 @@
+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 importTemplate() {
+  return request({
+    url: '/his/integralOrder/importTemplate',
+    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'
+  })
+}

BIN
src/assets/logo/ddgy.jpg


BIN
src/assets/logo/hat.png


BIN
src/assets/logo/knt.jpg


+ 8 - 0
src/views/company/companyUser/index.vue

@@ -118,6 +118,14 @@
           <el-table-column label="员工后台昵称" align="center" prop="nickName" :show-overflow-tooltip="true" 员工后台  width="100"/>
           <el-table-column label="部门" align="center" prop="deptName" :show-overflow-tooltip="true" />
           <el-table-column label="手机号码" align="center" prop="phonenumber" width="120" />
+          <el-table-column label="账户角色" align="center" :show-overflow-tooltip="true" width="150">
+            <template slot-scope="scope">
+              <span v-if="scope.row.roleNames && scope.row.roleNames.length > 0">
+                {{ scope.row.roleNames.join('、') }}
+              </span>
+              <span v-else>-</span>
+            </template>
+          </el-table-column>
           <el-table-column label="二维码" align="center" prop="qrCodeWeixin">
             <template slot-scope="scope">
               <!-- 显示已上传的二维码 -->

+ 1 - 1
src/views/course/courseWatchLog/deptWatchLog.vue

@@ -763,7 +763,7 @@ export default {
     },
     redLogList() {
       this.loadingRedLog = true;
-      console.info(this.redLogQueryParams)
+      console.info("------------dept",this.redLogQueryParams)
       myListCourseRedPacketLog(this.redLogQueryParams).then(e => {
         this.redLogsList = e.rows;
         this.redLogTotal = e.total;

+ 1 - 1
src/views/course/courseWatchLog/index.vue

@@ -1000,7 +1000,7 @@ export default {
     },
     redLogList() {
       this.loadingRedLog = true;
-      console.info(this.redLogQueryParams)
+      console.info("-----index",this.redLogQueryParams)
       listCourseRedPacketLog(this.redLogQueryParams).then(e => {
         this.redLogsList = e.rows;
         this.redLogTotal = e.total;

+ 1 - 1
src/views/course/courseWatchLog/watchLog.vue

@@ -979,7 +979,7 @@ export default {
     },
     redLogList() {
       this.loadingRedLog = true;
-      console.info(this.redLogQueryParams)
+      console.info("-----watch",this.redLogQueryParams)
       myListCourseRedPacketLog(this.redLogQueryParams).then(e => {
         this.redLogsList = e.rows;
         this.redLogTotal = e.total;

+ 318 - 0
src/views/hisStore/components/integralOrderDetails.vue

@@ -0,0 +1,318 @@
+<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"    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, listIntegralOrder, sendgoods,getIntegralOrder, delIntegralOrder, addIntegralOrder, updateIntegralOrder, exportIntegralOrder,getOrderUserPhone } from "@/api/hisStore/integralOrder";
+  export default {
+    name: "integralOrder",
+    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,
+        }
+      }
+    },
+    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>

+ 625 - 0
src/views/hisStore/integralOrder/addOrder.vue

@@ -0,0 +1,625 @@
+<template>
+  <div class="app-container">
+    <!-- 添加一个加载状态,在获取createOrderType之前显示 -->
+    <div v-if="!formReady" style="text-align: center; padding: 50px;">
+      <i class="el-icon-loading"></i> 正在加载...
+    </div>
+
+    <!-- 只有在formReady为true时才显示表单 -->
+    <el-form v-if="formReady" ref="form" :model="form" :rules="rules" label-width="120px">
+      <el-form-item label="会员信息" prop="userId">
+        <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" 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="phone" />
+            <el-table-column label="地址" align="center" prop="detail">
+              <template slot-scope="scope">
+                {{scope.row.province}} {{scope.row.city}} {{scope.row.district}} {{scope.row.detail}}
+              </template>
+            </el-table-column>
+          </el-table>
+        </el-radio-group>
+      </el-form-item>
+
+      <el-form-item label="商品列表">
+        <el-row>
+          <el-col>
+            <el-button plain type="primary" icon="el-icon-plus" @click="handleAddProduct">添加商品</el-button>
+          </el-col>
+        </el-row>
+        <el-table border :key="tablekey" width="100%" style="margin-top:5px;" :data="products">
+          <el-table-column label="商品名称" align="center" prop="goodsName" />
+          <el-table-column label="商品图片" align="center" width="100">
+            <template slot-scope="scope">
+              <el-popover placement="right" title="" trigger="hover">
+                <img slot="reference" :src="scope.row.imgUrl" width="50">
+                <img :src="scope.row.imgUrl" style="max-width: 50px;">
+              </el-popover>
+            </template>
+          </el-table-column>
+          <el-table-column label="库存" align="center" prop="stock" />
+          <el-table-column label="所需积分" align="center" prop="integral" />
+          <el-table-column label="需支付金额" align="center" prop="cash" />
+          <el-table-column label="商品编号" align="center" prop="barCode" />
+
+          <el-table-column label="操作" align="center" width="100px">
+            <template slot-scope="scope">
+              <el-button size="mini" type="text" icon="el-icon-delete" @click="handleDelete(scope.row)">删除</el-button>
+            </template>
+          </el-table-column>
+        </el-table>
+
+      </el-form-item>
+      <el-form-item label="订单备注" prop="mark">
+        <el-input type="textarea" rows="2" v-model="form.mark" placeholder="" />
+      </el-form-item>
+    </el-form>
+
+    <div v-if="formReady" slot="footer" class="dialog-footer" style="float: right; margin-bottom: 20px;">
+      <el-button type="primary" @click="submitForm">确 定</el-button>
+      <el-button @click="cancel">取 消</el-button>
+    </div>
+
+    <!-- 对话框部分保持不变 -->
+    <el-dialog :title="product.title" v-if="product.open" :visible.sync="product.open" width="1000px" append-to-body>
+      <product-select @selectProduct="selectProduct" />
+    </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>
+    <el-dialog :title="payQr.title" v-if="payQr.open" :visible.sync="payQr.open" width="240px" append-to-body>
+      <div style="padding-bottom:15px;">
+        <div class="qrcode" ref="qrCodeUrl"></div>
+      </div>
+    </el-dialog>
+  </div>
+</template>
+
+<script>
+import { addIntegralOrder } from "@/api/hisStore/integralOrder";
+import { getUserList } from "@/api/users/user";
+import { getAddressList } from "@/api/users/userAddress";
+import { getTcmScheduleList } from "@/api/company/tcmScheduleReport";
+import productSelect from "@/views/hisStore/integralOrder/integralProductSelect";
+import addUserAddress from "@/views/hisStore/components/addUserAddress";
+import config from "@/utils/config";
+import QRCode from 'qrcodejs2'
+import { treeselect } from "@/api/company/companyDept";
+import Treeselect from "@riophae/vue-treeselect";
+import "@riophae/vue-treeselect/dist/vue-treeselect.css";
+
+export default {
+  components: { Treeselect,productSelect,addUserAddress },
+  name: "StoreOrder",
+  props: {
+    customerId: {
+      type: Number,
+      required: false
+    },
+    userId: {
+      type: Number,
+      required: false
+    }
+  },
+  data() {
+    return {
+      // 添加表单准备状态
+      formReady: false,
+      createOrderType: null,
+      // 部门树选项
+      deptOptions: undefined,
+      // 部门名称
+      deptName: undefined,
+      defaultProps: {
+        children: "children",
+        label: "label",
+      },
+      deliveryPayStatusOptions:[],
+      deliveryStatusOptions:[],
+      dateRange: [],
+      orderTypeOptions:[],
+      orderMediumOptions:[],
+      payTypeOptions:[],
+      payQr:{
+        open:false,
+        title:"付款二维码"
+      },
+      user:{
+        open:false,
+        title:"创建会员"
+      },
+      userAddress:{
+        open:false,
+        title:"创建收货地址"
+      },
+      tablekey:false,
+      totalMoney:0.00,
+      products:[],
+      product:{
+        open:false,
+        title:"商品选择"
+      },
+      phone:null,
+      address:[],
+      addressloading: false,
+      userloading: false,
+      users:[],
+      userStatusOptions:[],
+      show:{
+        open:false,
+        title:"订单详情"
+      },
+      activeName:"00",
+      statusOptions:[],
+      // 遮罩层
+      loading: true,
+      // 选中数组
+      ids: [],
+      // 非单个禁用
+      single: true,
+      // 非多个禁用
+      multiple: true,
+      // 显示搜索条件
+      showSearch: true,
+      // 总条数
+      total: 0,
+      // 订单表格数据
+      storeOrderList: [],
+      // 弹出层标题
+      title: "",
+      // 是否显示弹出层
+      open: false,
+      createTimeRange:[],
+      payTimeRange:[],
+      deliveryImportTimeRange:[],
+      scheduleOptions:[],
+      // 查询参数
+      queryParams: {
+        pageNum: 1,
+        pageSize: 10,
+        orderCode: null,
+        extendOrderId: null,
+        userId: null,
+        realName: null,
+        userPhone: null,
+        userAddress: null,
+        cartId: null,
+        freightPrice: null,
+        totalNum: null,
+        totalPrice: null,
+        totalPostage: null,
+        payPrice: null,
+        payPostage: null,
+        deductionPrice: null,
+        couponId: null,
+        couponPrice: null,
+        paid: null,
+        payTime: null,
+        payType: null,
+        status: null,
+        refundStatus: null,
+        refundReasonWapImg: null,
+        refundReasonWapExplain: null,
+        refundReasonTime: null,
+        refundReasonWap: null,
+        refundReason: null,
+        refundPrice: null,
+        deliverySn: null,
+        deliveryName: null,
+        deliveryType: null,
+        deliveryId: null,
+        gainIntegral: null,
+        useIntegral: null,
+        payIntegral: null,
+        backIntegral: null,
+        mark: null,
+        isDel: null,
+        cost: null,
+        verifyCode: null,
+        storeId: null,
+        shippingType: null,
+        isChannel: null,
+        isRemind: null,
+        isSysDel: null
+      },
+      // 表单参数
+      form: {
+        addressId:null,
+        userId:null,
+        products:[],
+      },
+      // 表单校验
+      rules: {
+        userId: [
+          { required: true, message: "会员信息不能为空", trigger: "submit" }
+        ],
+        addressId: [
+          { required: true, message: "收货信息不能为空", trigger: "submit" }
+        ],
+        products: [
+          { required: true, message: "商品不能为空", trigger: "submit" }
+        ],
+      }
+    };
+  },
+  watch: {
+    // 根据名称筛选部门树
+    deptName(val) {
+      this.$refs.tree.filter(val);
+    },
+  },
+  created() {
+    // 先获取createOrderType,然后再初始化其他数据
+    this.initializeForm();
+  },
+  methods: {
+    // 初始化表单的方法
+    async initializeForm() {
+      try {
+
+        // 2. 然后并行加载其他数据
+        await Promise.all([
+          this.loadDictionaries(),
+          this.loadOtherData(),
+          this.initUser()
+        ]);
+
+        // 3. 所有数据加载完成后,设置表单为准备状态
+        this.formReady = true;
+        console.log('Form is ready to display');
+
+      } catch (error) {
+        console.error('Error initializing form:', error);
+        this.$message.error('表单初始化失败');
+      }
+    },
+
+    // 加载字典数据
+    async loadDictionaries() {
+      const dictPromises = [
+        this.getDicts("crm_customer_source").then((response) => {
+          this.orderMediumOptions = response.data;
+        }),
+        this.getDicts("store_order_type").then((response) => {
+          this.orderTypeOptions = response.data;
+        }),
+        this.getDicts("store_pay_type").then((response) => {
+          this.payTypeOptions = response.data;
+        }),
+        this.getDicts("user_status").then((response) => {
+          this.userStatusOptions = response.data;
+        }),
+        this.getDicts("store_order_status").then((response) => {
+          this.statusOptions = response.data;
+        }),
+        this.getDicts("store_order_delivery_status").then((response) => {
+          this.deliveryStatusOptions = response.data;
+        }),
+        this.getDicts("store_delivery_pay_status").then((response) => {
+          this.deliveryPayStatusOptions = response.data;
+        })
+      ];
+
+      await Promise.all(dictPromises);
+    },
+
+    // 加载其他数据
+    async loadOtherData() {
+      await Promise.all([
+        this.getTreeselect(),
+        getTcmScheduleList().then(response => {
+          this.scheduleOptions = response.data;
+        })
+      ]);
+    },
+
+    initUser(){
+      return new Promise((resolve) => {
+        if(this.userId != null){
+          var data={userId:this.userId}
+          this.userloading = true;
+          this.users=[];
+          this.address=[];
+          getUserList(data).then(response => {
+            this.users = response.data;
+            this.userloading = false;
+            if(this.users!=null&&this.users.length==1){
+              this.form.userId=this.users[0].userId;
+              this.getAddressList(this.form.userId).then(() => {
+                resolve();
+              });
+            } else {
+              resolve();
+            }
+          }).catch(() => {
+            resolve();
+          });
+        } else {
+          resolve();
+        }
+      });
+    },
+
+    /** 查询部门下拉树结构 */
+    getTreeselect() {
+      return treeselect().then((response) => {
+        this.deptOptions = response.data;
+      });
+    },
+
+    // 修改getAddressList方法,返回Promise
+    getAddressList(userId){
+      var data={userId:userId}
+      this.addressloading = true;
+      this.address=[];
+      return getAddressList(data).then(response => {
+        this.address = response.data;
+        this.addressloading = false;
+      });
+    },
+
+    // 其他方法保持不变...
+    // 筛选节点
+    filterNode(value, data) {
+      if (!value) return true;
+      return data.label.indexOf(value) !== -1;
+    },
+    // 节点单击事件
+    handleNodeClick(data) {
+      this.queryParams.deptId = data.id;
+      this.getList();
+    },
+    handleGenPayUrl(row){
+      this.payQr.open=true;
+      setTimeout(() => {
+        var qrcode = new QRCode(this.$refs.qrCodeUrl, {
+            text: config.payQRUrl+row.id,
+            width: 200,
+            height: 200,
+            colorDark: '#000000',
+            colorLight: '#ffffff',
+            correctLevel: QRCode.CorrectLevel.H
+        })
+      }, 200);
+    },
+    handleAddUser(){
+      this.user.open=true;
+    },
+    handleAddUserAddress(){
+      this.userAddress.open=true;
+      setTimeout(() => {
+        this.$refs.addUserAddress.init(this.form.userId);
+      }, 500);
+    },
+    addUserAddress(){
+      this.userAddress.open=false;
+      //获取地址
+      this.getAddressList(this.form.userId);
+    },
+    addUser(){
+      this.user.open=false;
+    },
+    compute(){
+      this.totalMoney=0;
+      var that=this;
+      this.products.forEach (function (value) {
+          that.totalMoney += value.money;
+      });
+    },
+    handleProductCountChange(row){
+      this.tablekey = !this.tablekey
+      row.money=row.count*row.price;
+      this.$forceUpdate();
+      this.compute();
+    },
+
+    selectProduct(row){
+      for(var i=0;i<this.products.length;i++){
+        if(this.products[i].id==row.id){
+          this.$message.warning("请删除商品在重新选择!")
+          return;
+        }
+      }
+      row.count=1;
+      row.money=row.count*row.price;
+      this.products.push(row);
+      this.$message.success("商品"+ row.goodsName + "添加成功")
+      this.compute();
+      this.product.open=false;
+    },
+    handleAddProduct(){
+      this.product.open=true;
+    },
+    searchUser(){
+      if(this.phone==null||this.phone==""){
+        return;
+      }
+      var data={phone:this.phone}
+      this.userloading = true;
+      this.users=[];
+      this.address=[];
+      getUserList(data).then(response => {
+        this.users = response.data;
+        this.userloading = false;
+        if(this.users!=null&&this.users.length==1){
+          this.form.userId=this.users[0].userId;
+          this.getAddressList(this.form.userId)
+        }
+      });
+    },
+    handleDetails(row){
+      this.show.open=true;
+      const orderId = row.id ;
+      setTimeout(() => {
+        this.$refs.order.getOrder(orderId);
+      }, 500);
+    },
+    handleClick(tab, event) {
+       if(tab.name=="all"){
+        this.queryParams.status==null;
+      }
+      else{
+         this.queryParams.status=tab.name;
+      }
+      this.getList();
+    },
+    /** 查询订单列表 */
+    getList() {
+      if(this.queryParams.status=='00'){
+        this.queryParams.status=null;
+      }
+      if(this.createTimeRange!=null&&this.createTimeRange.length==2){
+        this.queryParams.createTimeRange=this.createTimeRange[0]+"--"+this.createTimeRange[1]
+      }
+      else{
+        this.queryParams.createTimeRange=null;
+      }
+      if(this.payTimeRange!=null&&this.payTimeRange.length==2){
+        this.queryParams.payTimeRange=this.payTimeRange[0]+"--"+this.payTimeRange[1]
+      }
+      else{
+        this.queryParams.payTimeRange=null;
+      }
+      if(this.deliveryImportTimeRange!=null&&this.deliveryImportTimeRange.length==2){
+        this.queryParams.deliveryImportTimeRange=this.deliveryImportTimeRange[0]+"--"+this.deliveryImportTimeRange[1]
+      }
+      else{
+        this.queryParams.deliveryImportTimeRange=null;
+      }
+      this.loading = true;
+
+    },
+    // 取消按钮
+    cancel() {
+      this.open = false;
+      this.reset();
+      this.$emit("closePackage")
+    },
+    // 表单重置
+    reset() {
+      this.form = {
+        addressId:null,
+        userId:null,
+        products:null,
+      };
+      this.resetForm("form");
+    },
+    /** 搜索按钮操作 */
+    handleQuery() {
+      this.queryParams.pageNum = 1;
+      this.getList();
+    },
+    /** 重置按钮操作 */
+    resetQuery() {
+      this.resetForm("queryForm");
+      this.handleQuery();
+    },
+
+    /** 新增按钮操作 */
+    handleAdd() {
+      this.reset();
+      this.open = true;
+      this.title = "创建订单";
+    },
+
+    /** 提交按钮 */
+    submitForm() {
+      this.$refs["form"].validate(valid => {
+        if(this.products.length==0){
+          this.msgError("请选择商品");
+          return;
+        }
+        this.form.products=this.products;
+        if (valid) {
+          this.form.goodsId = this.form.products[0].goodsId;
+          // console.log("this.form:{}",this.form.products[0].goodsId)
+          addIntegralOrder(this.form).then(response => {
+            if (response.code === 200) {
+              this.msgSuccess("创建成功");
+              this.$emit("closePackage")
+            }
+          });
+        }
+      });
+    },
+    /** 删除按钮操作 */
+    handleDelete(row) {
+       this.products.splice(this.products.findIndex(item => item.id === row.id), 1)
+       this.compute();
+    },
+  }
+};
+</script>
+
+<style scoped lang="scss">
+.items{
+  margin: 5px 0px;
+  display: flex;
+  flex-direction: row;
+  align-items: center;
+  justify-content: flex-start;
+  .pic{
+    width:60px;
+    height:60px;
+  }
+  .goods-content{
+    margin-left: 10px;
+    max-width: 200px;
+    text-align: left;
+    .goods-title{
+      overflow:hidden;
+      white-space: nowrap;
+      text-overflow: ellipsis;
+      -o-text-overflow:ellipsis;
+    }
+  }
+}
+.el-message-box__message p{
+  max-height: 400px;
+  overflow:scroll;
+}
+.import-msg{
+  height: 500px;
+  overflow: auto;
+}
+</style>
+
+<style>
+.el-descriptions-item__label.is-bordered-label{
+  font-weight: normal;
+}
+</style>

+ 546 - 0
src/views/hisStore/integralOrder/index.vue

@@ -0,0 +1,546 @@
+<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-date-picker>
+              </el-form-item>
+      <el-form-item label="销售公司" prop="companyId">
+        <el-select v-model="queryParams.companyId" placeholder="销售公司"  size="small" @change="getAllUserlist(queryParams.companyId)" clearable>
+          <el-option
+            v-for="dict in qwCompanyList"
+            :key="dict.companyId"
+            :label="dict.companyName"
+            :value="dict.companyId"
+          />
+        </el-select>
+      </el-form-item>
+      <el-form-item label="销售账号" prop="userId">
+        <el-select v-model="queryParams.companyUserId" placeholder="销售账号"  size="small" clearable>
+          <el-option
+            v-for="dict in companyUserNameList"
+            :key="dict.userId"
+            :label="dict.userName"
+            :value="dict.userId"
+          />
+        </el-select>
+      </el-form-item>
+      <el-form-item label="企微微信" prop="companyUserName">
+        <el-select v-model="queryParams.qwUserId" placeholder="企微微信"  size="small" clearable>
+          <el-option
+            v-for="dict in qwUserList"
+            :key="dict.id"
+            :label="dict.qwUserName"
+            :value="dict.id"
+          />
+        </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">
+      <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>
+      <el-col :span="1.5">
+        <el-button
+          type="info"
+          plain
+          icon="el-icon-upload2"
+          size="mini"
+          @click="handleImport"
+          v-hasPermi="['his:integralOrder:exportDeliver']"
+        >导入发货</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" :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" 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="cash" />
+      <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="销售公司ID" align="center" prop="companyId" width="180"/>
+      <el-table-column label="销售ID" align="center" prop="companyUserId" width="180"/>
+      <el-table-column label="企业微信ID" align="center" prop="qwUserId" 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-dialog :title="title" :visible.sync="open" width="500px" append-to-body>
+      <el-form ref="form" :model="form" :rules="rules" label-width="80px">
+        <el-form-item label="订单编号" prop="orderCode">
+          <el-input v-model="form.orderCode" placeholder="请输入订单编号" />
+        </el-form-item>
+        <el-form-item label="用户id" prop="userId">
+          <el-input v-model="form.userId" placeholder="请输入用户id" />
+        </el-form-item>
+        <el-form-item label="用户名称" prop="userName">
+          <el-input v-model="form.userName" placeholder="请输入用户名称" />
+        </el-form-item>
+        <el-form-item label="用户电话" prop="userPhone">
+          <el-input v-model="form.userPhone" placeholder="请输入用户电话" />
+        </el-form-item>
+        <el-form-item label="用户地址" prop="userAddress">
+          <el-input v-model="form.userAddress" placeholder="请输入用户地址" />
+        </el-form-item>
+        <el-form-item label="商品信息" prop="itemJson">
+          <el-input v-model="form.itemJson" type="textarea" placeholder="请输入内容" />
+        </el-form-item>
+        <el-form-item label="支付积分" prop="integral">
+          <el-input v-model="form.integral" placeholder="请输入支付积分" />
+        </el-form-item>
+        <el-form-item label="1:待发货;2:待收货;3:已完成" prop="status">
+          <el-select v-model="form.status" placeholder="请选择1:待发货;2:待收货;3:已完成">
+            <el-option
+              v-for="dict in statusOptions"
+              :key="dict.dictValue"
+              :label="dict.dictLabel"
+              :value="dict.dictValue"
+            ></el-option>
+          </el-select>
+        </el-form-item>
+        <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-item label="发货时间" prop="deliveryTime">
+          <el-date-picker clearable size="small"
+            v-model="form.deliveryTime"
+            type="date"
+            value-format="yyyy-MM-dd"
+            placeholder="选择发货时间">
+          </el-date-picker>
+        </el-form-item>
+        <el-form-item label="备注" prop="remark">
+          <el-input v-model="form.remark" placeholder="请输入备注" />
+        </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-drawer
+    	:with-header="false"
+            size="75%"
+             :title="show.title" :visible.sync="show.open">
+         <integralOrderDetails  ref="Details" />
+       </el-drawer>
+   <el-dialog :title="upload.title" :visible.sync="upload.open" width="400px" append-to-body>
+         <el-upload
+           ref="upload"
+           :limit="1"
+           accept=".xlsx, .xls"
+           :headers="upload.headers"
+           :action="upload.url + '?updateSupport=' + upload.updateSupport"
+           :disabled="upload.isUploading"
+           :on-progress="handleFileUploadProgress"
+           :on-success="handleFileSuccess"
+           :auto-upload="false"
+           drag
+         >
+           <i class="el-icon-upload"></i>
+           <div class="el-upload__text">将文件拖到此处,或<em>点击上传</em></div>
+           <div class="el-upload__tip text-center" slot="tip">
+             <div class="el-upload__tip" slot="tip">
+             </div>
+             <span>仅允许导入xls、xlsx格式文件。</span>
+             <el-link type="primary" :underline="false" style="font-size:12px;vertical-align: baseline;" @click="importTemplate">下载模板</el-link>
+           </div>
+         </el-upload>
+       <div slot="footer" class="dialog-footer">
+         <el-button type="primary" @click="submitFileForm">确 定</el-button>
+         <el-button @click="upload.open = false">取 消</el-button>
+       </div>
+     </el-dialog>
+  </div>
+</template>
+
+<script>
+import {importTemplate, listIntegralOrder,importExpressTemplate, getIntegralOrder, delIntegralOrder, addIntegralOrder, updateIntegralOrder, exportIntegralOrder } from "@/api/hisStore/integralOrder";
+import integralOrderDetails from '../components/integralOrderDetails.vue';
+import { getToken } from "@/utils/auth";
+import {getCompanyList} from "@/api/company/company";
+import {getAllUserlist} from "@/api/company/companyUser";
+import {getQwUserInfo} from "@/api/qw/qwUser";
+
+export default {
+  name: "IntegralOrder",
+  components: { integralOrderDetails },
+  data() {
+    return {
+      show:{
+              open:false,
+            },
+      upload: {
+        // 是否显示弹出层
+        open: false,
+        // 弹出层标题
+        title: "",
+        // 是否禁用上传
+        isUploading: false,
+        // 是否更新已经存在的用户数据
+        updateSupport: 0,
+        // 设置上传的请求头部
+        headers: { Authorization: "Bearer " + getToken() },
+        // 上传的地址
+        url: process.env.VUE_APP_BASE_API + "/his/integralOrder/importData"
+      },
+      // 遮罩层
+      loading: true,
+      actName:"10",
+      // 导出遮罩层
+      exportLoading: false,
+      // 选中数组
+      ids: [],
+      // 非单个禁用
+      single: true,
+      // 非多个禁用
+      multiple: true,
+      // 显示搜索条件
+      showSearch: true,
+      // 总条数
+      total: 0,
+      // 积分商品订单表格数据
+      integralOrderList: [],
+      // 弹出层标题
+      title: "",
+      // 是否显示弹出层
+      open: false,
+      // 1:待发货;2:待收货;3:已完成字典
+      statusOptions: [],
+      // 查询参数
+      queryParams: {
+        pageNum: 1,
+        pageSize: 10,
+        orderCode: null,
+        userName: null,
+        userPhone: null,
+        integral: null,
+        status: null,
+        deliverySn: null,
+        createTime: null,
+        sTime:null,
+        eTime:null,
+        companyUserId:null,
+        qwUserId:null,
+        companyId:null,
+      },
+       createTime:null,
+      qwCompanyList:[],
+      companyUserNameList:[],
+      qwUserList:[],
+      // 表单参数
+      form: {},
+      // 表单校验
+      rules: {
+        userId: [
+          { required: true, message: "用户id不能为空", trigger: "blur" }
+        ],
+        status: [
+          { required: true, message: "1:待发货;2:待收货;3:已完成不能为空", trigger: "change" }
+        ],
+      }
+    };
+  },
+  created() {
+    this.getList();
+    this.getDicts("sys_integral_order_status").then(response => {
+      this.statusOptions = response.data;
+    });
+
+
+    //获取企业
+    getCompanyList().then(response => {
+      this.qwCompanyList = 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;
+          }
+
+        },
+    handleImport() {
+        this.upload.title = "导入";
+        this.upload.open = true;
+       },
+    importTemplate() {
+      importTemplate().then(response => {
+        this.download(response.msg);
+      });
+    },
+    // 文件上传中处理
+    handleFileUploadProgress(event, file, fileList) {
+      this.upload.isUploading = true;
+    },
+    // 文件上传成功处理
+    handleFileSuccess(response, file, fileList) {
+      this.upload.open = false;
+      this.upload.isUploading = false;
+      this.$refs.upload.clearFiles();
+      this.$alert(response.msg, "导入结果", { dangerouslyUseHTMLString: true });
+      this.getList();
+    },
+    // 提交上传文件
+    submitFileForm() {
+      this.$refs.upload.submit();
+    },
+    handledetails(row){
+        this.show.open=true;
+        setTimeout(() => {
+             this.$refs.Details.getDetails(row.orderId);
+        }, 1);
+    },
+    /** 查询积分商品订单列表 */
+    getList() {
+      this.loading = true;
+      listIntegralOrder(this.queryParams).then(response => {
+        this.integralOrderList = response.rows;
+        this.total = response.total;
+        this.loading = false;
+      });
+    },
+    // 取消按钮
+    cancel() {
+      this.open = false;
+      this.reset();
+    },
+    // 表单重置
+    reset() {
+      this.form = {
+        orderId: null,
+        orderCode: null,
+        userId: null,
+        userName: null,
+        userPhone: null,
+        userAddress: null,
+        itemJson: null,
+        integral: null,
+        status: null,
+        deliveryCode: null,
+        deliveryName: null,
+        deliverySn: null,
+        deliveryTime: null,
+        createTime: null,
+        remark: null,
+        sTime:null,
+        eTime:null,
+      };
+      this.resetForm("form");
+    },
+    /** 搜索按钮操作 */
+    handleQuery() {
+      this.queryParams.pageNum = 1;
+      this.getList();
+    },
+    /** 重置按钮操作 */
+    resetQuery() {
+      this.resetForm("queryForm");
+      this.createTime=null;
+      this.queryParams.sTime=null;
+      this.queryParams.eTime=null;
+      this.queryParams.qwUserId=null;
+      this.queryParams.companyId=null;
+      this.queryParams.companyUserId=null;
+      this.handleQuery();
+
+    },
+    // 多选框选中数据
+    handleSelectionChange(selection) {
+      this.ids = selection.map(item => item.orderId)
+      this.single = selection.length!==1
+      this.multiple = !selection.length
+    },
+    /** 新增按钮操作 */
+    handleAdd() {
+      this.reset();
+      this.open = true;
+      this.title = "添加积分商品订单";
+    },
+    /** 修改按钮操作 */
+    handleUpdate(row) {
+      this.reset();
+      const orderId = row.orderId || this.ids
+      getIntegralOrder(orderId).then(response => {
+        this.form = response.data;
+        this.open = true;
+        this.title = "修改积分商品订单";
+      });
+    },
+    /** 提交按钮 */
+    submitForm() {
+      this.$refs["form"].validate(valid => {
+        if (valid) {
+          if (this.form.orderId != null) {
+            updateIntegralOrder(this.form).then(response => {
+              this.msgSuccess("修改成功");
+              this.open = false;
+              this.getList();
+            });
+          } else {
+            addIntegralOrder(this.form).then(response => {
+              this.msgSuccess("新增成功");
+              this.open = false;
+              this.getList();
+            });
+          }
+        }
+      });
+    },
+    handleClickX(tab, event) {
+     if(tab.name=="10"){
+       this.queryParams.status=null;
+     }else{
+       this.queryParams.status=tab.name;
+     }
+      this.handleQuery();
+    },
+    /** 删除按钮操作 */
+    handleDelete(row) {
+      const orderIds = row.orderId || this.ids;
+      this.$confirm('是否确认删除积分商品订单编号为"' + orderIds + '"的数据项?', "警告", {
+          confirmButtonText: "确定",
+          cancelButtonText: "取消",
+          type: "warning"
+        }).then(function() {
+          return delIntegralOrder(orderIds);
+        }).then(() => {
+          this.getList();
+          this.msgSuccess("删除成功");
+        }).catch(() => {});
+    },
+    /** 导出按钮操作 */
+    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(() => {});
+    },
+    //选择企业后触发
+    getAllUserlist(companyId){
+      if(companyId){
+        getAllUserlist({companyId}).then(response => {
+          this.companyUserNameList=response.data;
+        });
+        //企业微信
+        getQwUserInfo({companyId}).then(response => {
+          this.qwUserList=response.data;
+        })
+      }
+    }
+  }
+};
+</script>

+ 112 - 0
src/views/hisStore/integralOrder/integralProductSelect.vue

@@ -0,0 +1,112 @@
+<template>
+  <div >
+    <el-form :model="queryParams" ref="queryForm" :inline="true" label-width="68px">
+      <el-form-item label="商品名称" prop="goodsName">
+        <el-input
+          style="width:200px"
+          v-model="queryParams.goodsName"
+          placeholder="请输入商品名称"
+          clearable
+          size="small"
+          @keyup.enter.native="handleQuery"
+        />
+      </el-form-item>
+      <el-form-item>
+        <el-button type="cyan" icon="el-icon-search" size="mini" @click="handleQuery">搜索</el-button>
+      </el-form-item>
+    </el-form>
+    <el-table border v-loading="loading" :data="list">
+      <el-table-column label="商品图片" align="center" width="100">
+        <template slot-scope="scope">
+          <el-popover
+            placement="right"
+            title=""
+            trigger="hover"
+          >
+            <img slot="reference" :src="scope.row.imgUrl" width="80">
+            <img :src="scope.row.imgUrl" style="max-width: 80px;">
+          </el-popover>
+        </template>
+      </el-table-column>
+      <el-table-column label="商品分类" align="center" prop="goodType">
+        <template slot-scope="scope">
+          <dict-tag :options="typeOptions" :value="scope.row.status"/>
+        </template>
+      </el-table-column>
+      <el-table-column label="商品名称" show-overflow-tooltip align="center" prop="goodsName" />
+      <el-table-column label="库存" align="center" prop="stock" />
+      <el-table-column label="所需积分" align="center" prop="integral" />
+      <el-table-column label="需支付金额" align="center" prop="cash" />
+      <el-table-column label="商品编号" align="center" prop="barCode" />
+
+      <el-table-column label="操作" align="center" width="100px" >
+        <template slot-scope="scope">
+          <el-button
+            size="mini"
+            type="text"
+            @click="handleSelect(scope.row)"
+          >选择</el-button>
+        </template>
+      </el-table-column>
+    </el-table>
+    <pagination
+      style="padding-bottom:10px;"
+      v-show="total>0"
+      :total="total"
+      :page.sync="queryParams.pageNum"
+      :limit.sync="queryParams.pageSize"
+      @pagination="getList"
+    />
+  </div>
+</template>
+
+<script>
+import { listIntegralGoods } from "@/api/hisStore/integralGoods";
+export default {
+  name: "selectProduct",
+  data() {
+    return {
+      loading: true,
+      list:[],
+      typeOptions:[],
+      total: 0,
+      queryParams: {
+        goodsName:"",
+        pageNum: 1,
+        pageSize: 10
+      }
+    };
+  },
+  created() {
+     this.getList();
+
+    this.getDicts("sys_integral_goods_type").then(response => {
+      this.typeOptions = response.data;
+    });
+
+  },
+
+  methods: {
+    handleSelect(row){
+      this.$emit('selectProduct',row);
+    },
+    /** 搜索按钮操作 */
+    handleQuery() {
+      this.queryParams.pageNum = 1;
+      this.getList();
+    },
+    getList(){
+      this.loading = true;
+      this.queryParams.status=1
+      listIntegralGoods(this.queryParams).then(response => {
+        this.list = response.rows;
+        this.total = response.total;
+        this.loading = false;
+      });
+    }
+  }
+};
+</script>
+<style scoped>
+
+</style>

+ 1 - 0
src/views/qw/contactWay/index.vue

@@ -110,6 +110,7 @@
         </el-row>
         <div style=" height: calc(100% - 40px); overflow-y: auto;">
           <el-table v-loading="loading" :data="contactWayList" @selection-change="handleSelectionChange" border>
+            <el-table-column label="id" align="center" prop="id" />
             <el-table-column label="名称" align="center" prop="name" />
             <el-table-column label="二维码" align="center" prop="qrCode" width="150px" >
               <template slot-scope="scope">

+ 1 - 0
src/views/qw/externalContact/deptIndex.vue

@@ -359,6 +359,7 @@
           <dict-tag :options="ratingType" :value="scope.row.level"/>
         </template>
       </el-table-column>
+      <el-table-column label="state参数" align="center" prop="state" width="100px" />
       <el-table-column label="等级状态" align="center" prop="levelType" width="120px" >
         <template slot-scope="scope">
           <dict-tag :options="ratingUpFall" :value="scope.row.levelType"/>

+ 36 - 1
src/views/qw/externalContact/index.vue

@@ -20,6 +20,15 @@
           @keyup.enter.native="handleQuery"
         />
       </el-form-item>
+      <el-form-item label="活码id" prop="wayId">
+        <el-input
+          v-model="queryParams.wayId"
+          placeholder="请输入活码id"
+          clearable
+          size="small"
+          @keyup.enter.native="handleQuery"
+        />
+      </el-form-item>
 
       <el-form-item label="销售企微昵称" prop="qwUserName">
         <el-input
@@ -382,6 +391,9 @@
           <dict-tag :options="ratingType" :value="scope.row.level"/>
         </template>
       </el-table-column>
+
+      <el-table-column label="state参数" align="center" prop="state" width="100px" />
+
       <el-table-column label="等级状态" align="center" prop="levelType" width="120px" >
         <template slot-scope="scope">
           <dict-tag :options="ratingUpFall" :value="scope.row.levelType"/>
@@ -480,6 +492,14 @@
              @click="handledetails(scope.row)"
              >AI获取用户信息
           </el-button>
+          <el-button
+             size="mini"
+             type="text"
+             @click="handleMemberdetails(scope.row)"
+             v-if="scope.row.fsUserId"
+             >
+             <span>会员详细</span>
+          </el-button>
         </template>
       </el-table-column>
     </el-table>
@@ -496,6 +516,13 @@
       <customer-details  ref="customerDetails" @refreshList="refreshList"/>
     </el-drawer>
 
+    <el-drawer
+        :with-header="false"
+        size="75%"
+          :title="show.title" :visible.sync="show.open">
+      <userDetails  ref="userDetails" />
+    </el-drawer>
+
 
     <!--  搜索标签   -->
     <el-dialog :title="changeTagDialog.title" :visible.sync="changeTagDialog.open" style="width:100%;height: 100%" append-to-body>
@@ -770,9 +797,10 @@ import  selectUser  from "@/views/qw/externalContact/selectUser.vue";
 import info from "@/views/qw/externalContact/info.vue";
 import { editTalk } from "@/api/qw/externalContactInfo";
 import PaginationMore from "../../../components/PaginationMore/index.vue";
+import userDetails from '@/views/store/components/userDetails.vue';
 export default {
   name: "ExternalContact",
-  components:{PaginationMore, mycustomer,customerDetails,SopDialog,selectUser,info},
+  components:{PaginationMore, mycustomer,customerDetails,SopDialog,selectUser,info,userDetails},
   data() {
     return {
       notesOpen: {
@@ -944,6 +972,7 @@ export default {
         eTime:null,
         createTime:null,
         level:null,
+        wayId:null,
         levelType:null,
         companyUser:null
       },
@@ -1005,6 +1034,12 @@ export default {
 
   },
   methods: {
+    handleMemberdetails(row){
+            this.show.open=true;
+            setTimeout(() => {
+                 this.$refs.userDetails.getDetails(row.fsUserId);
+            }, 1);
+    },
     onQwUserNameClear() {
       this.queryParams.qwUserId = null;  // 同时清空 qwUserId
     },

+ 3 - 2
src/views/qw/externalContact/myExternalContact.vue

@@ -258,7 +258,7 @@
           plain
           size="mini"
           @click="addUserTag"
-
+          v-hasPermi="['qw:externalContact:myAddTag']"
         >批量添加标签</el-button>
       </el-col>
       <el-col :span="1.5">
@@ -267,7 +267,7 @@
           plain
           size="mini"
           @click="delUserTag"
-
+          v-hasPermi="['qw:externalContact:myDelTag']"
         >批量移除标签</el-button>
       </el-col>
 	  <el-col :span="1.5">
@@ -369,6 +369,7 @@
           <dict-tag :options="ratingType" :value="scope.row.level"/>
         </template>
       </el-table-column>
+      <el-table-column label="state参数" align="center" prop="state" width="100px" />
       <el-table-column label="等级状态" align="center" prop="levelType" width="120px" >
         <template slot-scope="scope">
           <dict-tag :options="ratingUpFall" :value="scope.row.levelType"/>

+ 1 - 1
src/views/qw/sop/sop.vue

@@ -288,7 +288,7 @@
             type="text"
             style="color: green;"
             @click="handleQueryDetails(scope.row)"
-            v-hasPermi="['qw:sopTemp:info']"
+            v-hasPermi="['qw:sop:list']"
           >查看模板
           </el-button>
         </template>

+ 29 - 1
src/views/qw/sopTemp/index.vue

@@ -228,6 +228,18 @@
             />
           </el-select>
         </el-form-item>
+
+        <el-form-item label="归属部门" prop="createByDept">
+          <treeselect
+            style="width: 220px"
+            :clearable="false"
+            v-model="form.createByDept"
+            :options="deptOptions"
+            clearable
+            :show-count="true"
+            placeholder="请选择归属部门"
+          />
+        </el-form-item>
         <el-form-item label="课程" prop="courseId" v-if="form.sendType == 11 && !form.id">
           <el-select v-model="form.courseId"placeholder="请选择课程" style=" margin-right: 10px;" size="mini" filterable>
             <el-option
@@ -391,9 +403,12 @@ import {
 } from "@/api/qw/sopTemp";
 import { getCompanyList, listCompany } from '@/api/company/company'
 import {courseList, getRoles} from "@/api/qw/sop";
-
+import {treeselect} from "../../../api/company/companyDept";
+import Treeselect from "@riophae/vue-treeselect";
+import "@riophae/vue-treeselect/dist/vue-treeselect.css";
 export default {
   name: "SopTemp",
+  components: {Treeselect},
   data() {
     return {
       // 遮罩层
@@ -407,6 +422,7 @@ export default {
       roles: [],
       //选中的公司
       companys: [],
+      deptOptions: [],
       // 非单个禁用
       single: true,
       // 非多个禁用
@@ -486,6 +502,9 @@ export default {
         project:[{
           required: true, message: '所属项目不能为空', trigger: 'blur'
         }],
+        createByDept:[
+          { required: true, message: '归属部门不能为空', trigger: 'blur' }
+        ]
       },
       contentRules: {
         time: [{required: true, message: '时间不能为空', trigger: 'blur'}],
@@ -494,6 +513,9 @@ export default {
   },
   created() {
     this.getList();
+
+    this.getDeptTreeSelect();
+
     getRoles().then(res => {
       this.roles = res.data;
     })
@@ -536,6 +558,12 @@ export default {
       this.handleCompanyQuery();
     },
 
+    getDeptTreeSelect() {
+      treeselect().then((response) => {
+        this.deptOptions = response.data;
+      });
+    },
+
     /** 查询企业列表 */
     getCompanyList() {
       this.companysloading = true;

+ 118 - 51
src/views/qw/sopTemp/updateSopTemp.vue

@@ -109,7 +109,7 @@
                                     </el-time-picker>
                                   </el-form-item>
                                 </div>
-                                <el-form-item label="官方群发" v-if="contentIndex==0 && content.type==2">
+                                <el-form-item label="官方群发" v-if="contentIndex==0 && content.type==2  && form.sendType != 4">
                                   <el-switch
                                     v-model="content.isOfficial"
                                     active-color="#13ce66"
@@ -250,7 +250,7 @@
                                      v-if="content.type != 4 && content.type != 5">
                                   <el-row style="padding-bottom: 20px">
                                     <el-col :span="22">
-                                      <el-form v-if="form.sendType != 4" :model="setList" label-width="70px">
+                                      <el-form  :model="setList" label-width="70px">
                                         <el-form-item label="内容类别" style="margin: 2%">
                                           <div v-if="form.sendType == 1 ">
                                             <el-radio-group v-model="setList.contentType" :disabled="formType == 3 || !roles.includes('edit_sop_temp_content')">
@@ -276,6 +276,18 @@
                                               </el-radio>
                                             </el-radio-group>
                                           </div>
+                                          <div v-if=" form.sendType == 4">
+                                            <el-radio-group v-model="setList.contentType"
+                                                            :disabled="formType == 3"
+                                                            @change="handleContentTypeChange(content,index,contentIndex,setIndex)">
+                                              <el-radio
+                                                :key="item.dictValue"
+                                                :label="item.dictValue"
+                                                :disabled="((content.type!=2 || form.sendType == 4) && (item.dictValue === '8' || item.dictValue === '9') || (content.isOfficial==1 && ['5','6','7','8','9'].includes(item.dictValue)))"
+                                                v-for="item in sysQwSopAiContentType">{{ item.dictLabel }}
+                                              </el-radio>
+                                            </el-radio-group>
+                                          </div>
                                           <div v-if="form.sendType == 11">
                                             <el-radio-group v-model="setList.contentType"
                                                             :disabled="formType == 3 || (form.sendType == 11 && contentIndex != 0 && setIndex == 0)"
@@ -285,7 +297,7 @@
                                                 :label="item.dictValue"
                                                 :disabled="(content.type!=2 && item.dictValue === '9') || (content.isOfficial==1 && ['5','6','7','8','9'].includes(item.dictValue))"
                                                 v-for="item in sysQwSopAiContentType"
-                                                v-if="setIndex == 0 ? courseTypeList.includes(item.dictValue) : !courseTypeList.includes(item.dictValue)">{{ item.dictLabel }}
+                                                v-if="courseTypeList.includes(item.dictValue)">{{ item.dictLabel }}
                                               </el-radio>
                                             </el-radio-group>
                                           </div>
@@ -476,26 +488,26 @@
                                             </el-card>
                                           </div>
                                         </el-form-item>
-                                        <el-form-item label="添加短链"
-                                                      v-if="content.type == 2 && setList.contentType == 1  ">
-                                          <el-tooltip content="请先根据课程选定课程小节之后再添加" effect="dark"
-                                                      :disabled="!content.videoId">
-                                            <el-switch
-                                              @change="updateHtml"
-                                              v-model="setList.isBindUrl"
-                                              :disabled="!content.videoId && formType == 3 && !roles.includes('edit_sop_temp_content')"
-                                              active-color="#13ce66"
-                                              inactive-color="#DCDFE6"
-                                              active-value="1"
-                                              inactive-value="2">
-                                            </el-switch>
-                                          </el-tooltip>
-
-                                          <span v-if="setList.isBindUrl == '1'"
-                                                style="margin-left: 10px; color: #13ce66">添加URL</span>
-                                          <span v-if="setList.isBindUrl == '2'"
-                                                style="margin-left: 10px; color: #b1b4ba">不加URL</span>
-                                        </el-form-item>
+<!--                                        <el-form-item label="添加短链"-->
+<!--                                                      v-if="content.type == 2 && setList.contentType == 1  ">-->
+<!--                                          <el-tooltip content="请先根据课程选定课程小节之后再添加" effect="dark"-->
+<!--                                                      :disabled="!content.videoId">-->
+<!--                                            <el-switch-->
+<!--                                              @change="updateHtml"-->
+<!--                                              v-model="setList.isBindUrl"-->
+<!--                                              :disabled="!content.videoId && formType == 3 && !roles.includes('edit_sop_temp_content')"-->
+<!--                                              active-color="#13ce66"-->
+<!--                                              inactive-color="#DCDFE6"-->
+<!--                                              active-value="1"-->
+<!--                                              inactive-value="2">-->
+<!--                                            </el-switch>-->
+<!--                                          </el-tooltip>-->
+
+<!--                                          <span v-if="setList.isBindUrl == '1'"-->
+<!--                                                style="margin-left: 10px; color: #13ce66">添加URL</span>-->
+<!--                                          <span v-if="setList.isBindUrl == '2'"-->
+<!--                                                style="margin-left: 10px; color: #b1b4ba">不加URL</span>-->
+<!--                                        </el-form-item>-->
                                         <el-form-item label="课节过期时间"
                                                       v-if="content.type == 2 && (setList.isBindUrl == '1' || setList.contentType==4) && setList.contentType != 2  && setList.contentType != 5  && setList.contentType != 6 && setList.contentType != 8 && setList.contentType != 9 && setList.contentType != 10  ">
                                           <el-row>
@@ -518,30 +530,30 @@
                                             v-model="setList.intervalTime"
                                             :min="1"
                                             :max="1440"
-                                            style="width:100px;margin-top: 10px;"
+                                            style="width:150px;margin-top: 10px;"
                                           >
                                           </el-input-number>
                                           <span class="tip">单位:分钟,最大1440分钟(24小时)</span>
                                         </el-form-item>
-                                        <el-form-item label="内容" style="margin: 2%">
-                                          <el-input
-                                            v-model="setList.value"
-                                            type="textarea"
-                                            :rows="3"
-                                            placeholder="内容"
-                                            style="width: 90%;margin-top: 10px;"/>
-                                        </el-form-item>
-                                        <el-form-item label="交流状态" style="margin: 2%">
-                                          <el-select v-model="setList.talkType" placeholder="更改交流状态" size="mini"
-                                                     style=" margin-right: 10px;" clearable>
-                                            <el-option label="非首次交流" value="非首次交流"></el-option>
-                                            <el-option label="首次交流1" value="首次交流1"></el-option>
-                                            <el-option label="首次交流2" value="首次交流2"></el-option>
-                                            <el-option label="交流状态1" value="交流状态1"></el-option>
-                                            <el-option label="交流状态2" value="交流状态2"></el-option>
-                                            <el-option label="交流状态3" value="交流状态3"></el-option>
-                                          </el-select>
-                                        </el-form-item>
+<!--                                        <el-form-item label="内容" style="margin: 2%">-->
+<!--                                          <el-input-->
+<!--                                            v-model="setList.value"-->
+<!--                                            type="textarea"-->
+<!--                                            :rows="3"-->
+<!--                                            placeholder="内容"-->
+<!--                                            style="width: 90%;margin-top: 10px;"/>-->
+<!--                                        </el-form-item>-->
+<!--                                        <el-form-item label="交流状态" style="margin: 2%">-->
+<!--                                          <el-select v-model="setList.talkType" placeholder="更改交流状态" size="mini"-->
+<!--                                                     style=" margin-right: 10px;" clearable>-->
+<!--                                            <el-option label="非首次交流" value="非首次交流"></el-option>-->
+<!--                                            <el-option label="首次交流1" value="首次交流1"></el-option>-->
+<!--                                            <el-option label="首次交流2" value="首次交流2"></el-option>-->
+<!--                                            <el-option label="交流状态1" value="交流状态1"></el-option>-->
+<!--                                            <el-option label="交流状态2" value="交流状态2"></el-option>-->
+<!--                                            <el-option label="交流状态3" value="交流状态3"></el-option>-->
+<!--                                          </el-select>-->
+<!--                                        </el-form-item>-->
                                       </el-form>
                                     </el-col>
                                     <el-col :span="1" :offset="1">
@@ -1159,11 +1171,57 @@ export default {
           for (let content of day.content) {
             for (let set of content.setting) {
               if (!set.intervalTime) {
-                this.$message.error("客服数量不能为空");
+                this.$message.error("客服时间不能为空");
+                return false;
+              }
+              if (set.contentType == 1 && (set.value == null || set.value == "")) {
+                this.$message.error("内容不能为空")
+                return false;
+              }
+              if (set.contentType == 2 && (set.imgUrl == null || set.imgUrl == "")) {
+                this.$message.error("图片不能为空")
+                return false;
+              }
+              if ((set.contentType == 3 || set.contentType == 9) && (set.linkTitle == null || set.linkTitle == "")) {
+                this.$message.error("链接标题不能为空")
+                return false;
+              }
+              if ((set.contentType == 3 || set.contentType == 9) && (set.linkDescribe == null || set.linkDescribe == "")) {
+                this.$message.error("链接描述不能为空")
+                return false;
+              }
+              if ((set.contentType == 3 || set.contentType == 9) && (set.linkImageUrl == null || set.linkImageUrl == "")) {
+                this.$message.error("链接图片不能为空")
+                return false;
+              }
+              if (set.contentType == 3 && set.type == 1 && (set.linkUrl == null || set.linkUrl == "")) {
+                this.$message.error("链接地址不能为空")
                 return false;
               }
-              if (!set.value) {
-                this.$message.error("内容不能为空");
+
+              if (set.contentType == 4 && (set.miniprogramTitle == null || set.miniprogramTitle == "")) {
+                this.$message.error("小程序消息标题不能为空")
+                return false;
+              }
+              if (set.contentType == 4 && (set.miniprogramPicUrl == null || set.miniprogramPicUrl == "")) {
+                this.$message.error("小程序封面地址不能为空")
+                return false;
+              }
+
+              if (set.contentType == 5 && (set.fileUrl == null || set.fileUrl == "")) {
+                this.$message.error("文件不能为空")
+                return false;
+              }
+              if (set.contentType == 6 && (set.videoUrl == null || set.videoUrl == "")) {
+                this.$message.error("视频不能为空")
+                return false;
+              }
+              if (set.contentType == 7 && (set.value == null || set.value == "")) {
+                this.$message.error("语音文本不能为空")
+                return false;
+              }
+              if (set.contentType == 8 && (set.url == null || set.url == "")) {
+                this.$message.error("视频号信息不能为空")
                 return false;
               }
             }
@@ -1206,11 +1264,19 @@ export default {
           contentType: '1',
           value: '',
         };
-        if (this.form.sendType == 4) {
-          newSetting.intervalTime = 5;
+        if (this.form.sendType === 4) {
+          for (let i = 0; i < content.length; i++) {
+            if (content[i].setting.length < 5) {
+              // 将新设置项添加到 content.setting 数组中
+              content[contentIndex].setting.push(newSetting);
+            } else {
+              return this.$message.error("因为要求限制,新课对话模板一条消息只能设置最多~5个内容!!")
+            }
+          }
+        } else {
+          // 将新设置项添加到 content.setting 数组中
+          content[contentIndex].setting.push(newSetting);
         }
-        // 将新设置项添加到 content.setting 数组中
-        content[contentIndex].setting.push(newSetting);
       }
 
 
@@ -1258,6 +1324,7 @@ export default {
     addSetting() {
       let content = [{type: this.defaultContentType, contentType: '1', setting: [{contentType: '1', value: "",}]}];
       if (this.form.sendType == 4) {
+        content = [{type: 2, contentType: '1', setting: [{contentType: '1', value: "",}]}];
         content[0].setting[0].intervalTime = 5;
       }
       this.setting.push({
@@ -1513,7 +1580,7 @@ export default {
       for (let i = 0; i < content.setting.length; i++) {
         //课程消息-文本内容
         if (content.setting[i].contentType == 1 && content.type == 2) {
-          this.$set(content.setting[i], 'isBindUrl', '1');
+          this.$set(content.setting[i], 'isBindUrl', '2');
         }
         //如果是链接的才上
         if (selectedVideo && content.type == 2 && content.videoId != null) {

+ 306 - 254
src/views/store/components/userDetailsTemp.vue

@@ -1,268 +1,320 @@
 <template>
-    <div style="background-color: #f0f2f5; padding-bottom: 20px; min-height: 100%; " >
-      <div class="contentx" v-if="item!=null" >
-        <div class="desct">
-          基本信息
-        </div>
-            <el-descriptions title="" :column="3" border>
-    
-              <el-descriptions-item label="会员id" >
-                    <span v-if="item!=null">{{item.userId}}</span>
-                </el-descriptions-item>
-                <el-descriptions-item label="用户昵称" >
-                    <span v-if="item!=null">{{item.nickName}}</span>
-                </el-descriptions-item>
-                <el-descriptions-item label="用户头像" >
-                     <el-image v-if="item.avatar!=null"
-                              style="width: 50px;"
-                              :src="item.avatar">
-                          </el-image>
-                </el-descriptions-item>
-                <el-descriptions-item label="手机号码" >
-                    <span v-if="item!=null">{{item.phone}}</span>
-                </el-descriptions-item>
-                <el-descriptions-item label="用户积分" >
-                    <span v-if="item!=null">{{item.integral}}</span>
-                </el-descriptions-item>
-                <el-descriptions-item label="状态" >
+  <div style="background-color: #f0f2f5; padding-bottom: 20px; min-height: 100%; " >
+    <div class="contentx" v-if="item!=null" >
+      <div class="desct">
+        基本信息
+      </div>
+      <el-descriptions title="" :column="3" border>
+
+        <el-descriptions-item label="会员id" >
+          <span v-if="item!=null">{{item.userId}}</span>
+        </el-descriptions-item>
+        <el-descriptions-item label="用户昵称" >
+          <span v-if="item!=null">{{item.nickName}}</span>
+        </el-descriptions-item>
+        <el-descriptions-item label="用户头像" >
+          <el-image v-if="item.avatar!=null"
+                    style="width: 50px;"
+                    :src="item.avatar">
+          </el-image>
+        </el-descriptions-item>
+        <el-descriptions-item label="手机号码" >
+          <span v-if="item!=null">{{item.phone}}</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="userOptions" :value="item.status"/>
                  </span>
-                </el-descriptions-item>
-    
-                <el-descriptions-item label="上级昵称" >
-                    <span v-if="item!=null">{{item.tuiName}}</span>
-                </el-descriptions-item>
-                <el-descriptions-item label="上级手机号码" >
-                    <span v-if="item!=null">{{item.tuiPhone}}</span>
-                </el-descriptions-item>
-                <el-descriptions-item label="推广员关联时间" >
-                    <span v-if="item!=null">{{item.tuiTime}}</span>
-                </el-descriptions-item>
-                <el-descriptions-item label="下级人数" >
-                    <span v-if="item!=null">{{item.tuiUserCount}}</span>
-                </el-descriptions-item>
-                <el-descriptions-item label="最后一次登录ip" >
-                    <span v-if="item!=null">{{item.lastIp}}</span>
-                </el-descriptions-item>
-                <el-descriptions-item label="余额" >
-                    <span v-if="item!=null">{{item.balance}}</span>
-                </el-descriptions-item>
-                <el-descriptions-item label="创建时间" >
-                    <span v-if="item!=null">{{item.createTime}}</span>
-                </el-descriptions-item>
-    
-                <el-descriptions-item label="更新时间" >
-                    <span v-if="item!=null">{{item.updateTime}}</span>
-                </el-descriptions-item>
-            </el-descriptions>
+        </el-descriptions-item>
+
+        <el-descriptions-item label="上级昵称" >
+          <span v-if="item!=null">{{item.tuiName}}</span>
+        </el-descriptions-item>
+        <el-descriptions-item label="上级手机号码" >
+          <span v-if="item!=null">{{item.tuiPhone}}</span>
+        </el-descriptions-item>
+        <el-descriptions-item label="推广员关联时间" >
+          <span v-if="item!=null">{{item.tuiTime}}</span>
+        </el-descriptions-item>
+        <el-descriptions-item label="下级人数" >
+          <span v-if="item!=null">{{item.tuiUserCount}}</span>
+        </el-descriptions-item>
+        <el-descriptions-item label="最后一次登录ip" >
+          <span v-if="item!=null">{{item.lastIp}}</span>
+        </el-descriptions-item>
+        <el-descriptions-item label="余额" >
+          <span v-if="item!=null">{{item.balance}}</span>
+        </el-descriptions-item>
+        <el-descriptions-item label="创建时间" >
+          <span v-if="item!=null">{{item.createTime}}</span>
+        </el-descriptions-item>
+
+        <el-descriptions-item label="更新时间" >
+          <span v-if="item!=null">{{item.updateTime}}</span>
+        </el-descriptions-item>
+      </el-descriptions>
+    </div>
+    <!-- 积分记录 -->
+    <div class="contentx" v-if="item!=null" >
+      <div class="desct" style="display: flex; justify-content: space-between; align-items: center;">
+        <span>用户积分记录</span>
+        <el-button type="primary" @click="handleIntegralPurchase">积分购</el-button>
+      </div>
+      <userIntegralDetails  ref="userIntegralDetail" />
     </div>
-    
-        <div class="contentx" v-if="item!=null">
-                <div class="desct"> 优惠劵领取信息</div>
-                <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 couponStatusOptions" :label="item.dictLabel" :name="item.dictValue"></el-tab-pane>
-                </el-tabs>
-                <el-table v-loading="loading" :data="userCouponList">
-                  <el-table-column label="优惠劵标题" align="center" prop="title" />
-                  <el-table-column label="券号" align="center" prop="couponCode" />
-                  <el-table-column label="会员昵称" align="center" prop="nickName" />
-                  <el-table-column label="会员电话" align="center" prop="phone" />
-                  <el-table-column label="关联订单ID" align="center" prop="businessId" />
-                  <el-table-column label="订单类型" align="center" prop="businessType">
-                    <template slot-scope="scope">
-                      <dict-tag :options="businessTypeOptions" :value="scope.row.businessType"/>
-                    </template>
-                  </el-table-column>
-                  <el-table-column label="状态" align="center" prop="status">
-                    <template slot-scope="scope">
-                      <dict-tag :options="couponStatusOptions" :value="scope.row.status"/>
-                    </template>
-                  </el-table-column>
-                  <el-table-column label="领取时间" align="center" prop="createTime" width="180"/>
-                  <el-table-column label="使用时间" align="center" prop="useTime" width="180"/>
-                </el-table>
-                <pagination
-                  v-show="total>0"
-                  :total="total"
-                  :page.sync="queryParams.pageNum"
-                  :limit.sync="queryParams.pageSize"
-                  @pagination="getList"
-                />
-            </div>
-    
-    
-    
-      <div class="contentx" v-if="item!=null">
-            <div class="desct">
+
+    <div class="contentx" v-if="item!=null">
+      <div class="desct"> 优惠劵领取信息</div>
+      <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 couponStatusOptions" :label="item.dictLabel" :name="item.dictValue"></el-tab-pane>
+      </el-tabs>
+      <el-table v-loading="loading" :data="userCouponList">
+        <el-table-column label="优惠劵标题" align="center" prop="title" />
+        <el-table-column label="券号" align="center" prop="couponCode" />
+        <el-table-column label="会员昵称" align="center" prop="nickName" />
+        <el-table-column label="会员电话" align="center" prop="phone" />
+        <el-table-column label="关联订单ID" align="center" prop="businessId" />
+        <el-table-column label="订单类型" align="center" prop="businessType">
+          <template slot-scope="scope">
+            <dict-tag :options="businessTypeOptions" :value="scope.row.businessType"/>
+          </template>
+        </el-table-column>
+        <el-table-column label="状态" align="center" prop="status">
+          <template slot-scope="scope">
+            <dict-tag :options="couponStatusOptions" :value="scope.row.status"/>
+          </template>
+        </el-table-column>
+        <el-table-column label="领取时间" align="center" prop="createTime" width="180"/>
+        <el-table-column label="使用时间" align="center" prop="useTime" width="180"/>
+      </el-table>
+      <pagination
+        v-show="total>0"
+        :total="total"
+        :page.sync="queryParams.pageNum"
+        :limit.sync="queryParams.pageSize"
+        @pagination="getList"
+      />
+    </div>
+
+    <div class="contentx" v-if="item!=null">
+      <div class="desct">
               <span v-if="patientInfo">
                 {{ patientInfo }}
               </span>
-              <span v-else>
+        <span v-else>
                 患者信息
               </span>
-            </div>
-        <userPatietDetails  ref="userPatietDetail" />
-    
       </div>
-    
-      <div class="contentx" v-if="item!=null" >
-     <div class="desct">
-          用户地址
-     </div>
-     <userAddDetails  ref="userAddDetail" />
-    
-       </div>
-      <div class="contentx" v-if="item!=null" >
-     <div class="desct">
-          用户药品订单
-     </div>
-        <userStorerDetails  ref="userDetails" />
-       </div>
+      <userPatietDetails  ref="userPatietDetail" />
+
+    </div>
+
     <div class="contentx" v-if="item!=null" >
-     <div class="desct">
-          用户问诊订单
-     </div>
-        <userInquiryOrderDetails  ref="InquiryDetails" />
-       </div>
-     </div>
-    </template>
-    
-    
-    
-    <script>
-    import { listPatient, getPatient, delPatient, addPatient, updatePatient, exportPatient ,getPatientByUserId} from "@/api/store/patient";
-    import { listUser, getUser, delUser, addUser, updateUser, exportUser ,getUserAddr} from "@/api/store/user";
-    import { getListUserCoupon } from "@/api/store/userCoupon";
-    import userStorerDetails from "../components/userStorerDetails.vue";
-    import userPatietDetails from "../components/userPatietDetails.vue";
-    import userInquiryOrderDetails from "../components/userInquiryOrderDetails.vue";
-    import userAddDetails from "../components/userAddDetails.vue";
-      export default {
-        name: "storedet",
-        props:["data"],
-         components: { userStorerDetails ,userInquiryOrderDetails,userPatietDetails,userAddDetails},
-        data() {
-          return {
-            patientInfo: process.env.VUE_APP_PATIENT_INFO,
-            addr:[],
-            patient:[],
-            userOptions: [],
-            statusOptions: [],
-            sexOptions: [],
-            pOptions: [],
-            item:null,
-            total: 0,
-            loading: true,
-           // 会员优惠券表格数据
-            userCouponList: [],
-            queryParams: {
-             pageNum: 1,
-             pageSize: 10,
-             userId: null,
-             couponId: null,
-            },
-            actName:"10",
-            businessTypeOptions:[],
-            couponStatusOptions:[],
-          }
-        },
-        created() {
-          this.getDicts("sys_user_status").then(response => {
-            this.userOptions = response.data;
-          });
-          this.getDicts("sys_company_status").then(response => {
-            this.statusOptions = response.data;
-          });
-          this.getDicts("sys_patient_status").then(response => {
-           this.pOptions = response.data;
-          });
-          this.getDicts("sys_patient_sex").then(response => {
-             this.sexOptions = response.data;
-           });
-           this.getDicts("sys_coupon_business_type").then(response => {
-             this.businessTypeOptions = response.data;
-           });
-    
-           this.getDicts("sys_coupon_status").then(response => {
-             this.couponStatusOptions = response.data;
-           });
-        },
-        methods: {
-          handleClickX(tab, event) {
-           if(tab.name=="10"){
-             this.queryParams.status=null;
-           }else{
-             this.queryParams.status=tab.name;
-           }
-              this.queryParams.pageNum = 1;
-              this.getList();
-    
-          },
-          getList() {
-            this.loading = true;
-            getListUserCoupon(this.queryParams).then(response => {
-              this.userCouponList = response.rows;
-              this.total = response.total;
-              this.loading = false;
-            });
-          },
-    
-          getDetails(orderId) {
-              this.item=null;
-              getUser(orderId).then(response => {
-                  this.item = response.data;
-                  setTimeout(() => {
-                       this.$refs.userDetails.getUserDetails(orderId);
-                  }, 1);
-                  setTimeout(() => {
-                       this.$refs.InquiryDetails.getInquiryDetails(orderId,1);
-                  }, 1);
-                  setTimeout(() => {
-                       this.$refs.userPatietDetail.getPatList(orderId);
-                  }, 1);
-                  setTimeout(() => {
-                       this.$refs.userAddDetail.getAddList(orderId);
-                  }, 1);
-    
-              });
-              this.patient=null;
-              getPatientByUserId(orderId).then(response => {
-                  this.patient = response.data;
-              });
-              getUserAddr(orderId).then(response => {
-                  this.addr = response.data;
-              });
-               this.queryParams.userId=orderId;
-              this.getList();
-    
-          },
-        }
-      }
-    </script>
-    <style>
-    
-      .contentx{
-          height: 100%;
-          background-color: #fff;
-          padding: 0px 20px 20px;
-    
-    
-          margin: 20px;
-      }
-      .el-descriptions-item__label.is-bordered-label{
-        font-weight: normal;
+      <div class="desct">
+        用户地址
+      </div>
+      <userAddDetails  ref="userAddDetail" />
+
+    </div>
+    <div class="contentx" v-if="item!=null" >
+      <div class="desct">
+        用户药品订单
+      </div>
+      <userStorerDetails  ref="userDetails" />
+    </div>
+    <div class="contentx" v-if="item!=null" >
+      <div class="desct">
+        用户问诊订单
+      </div>
+      <userInquiryOrderDetails  ref="InquiryDetails" />
+    </div>
+
+    <!-- 积分购弹窗 -->
+    <el-dialog
+      title="积分购"
+      :visible.sync="integralPurchaseVisible"
+      width="60%"
+      append-to-body
+    >
+      <!-- 积分购弹窗 -->
+      <add-order-dialog
+        :key="currentUserId + '-' + refreshKey"
+        :userId="currentUserId"
+        @closePackage="integralPurchaseVisible = false"
+      />
+
+
+    </el-dialog>
+  </div>
+</template>
+
+<script>
+import { listPatient, getPatient, delPatient, addPatient, updatePatient, exportPatient ,getPatientByUserId} from "@/api/store/patient";
+import { listUser, getUser, delUser, addUser, updateUser, exportUser ,getUserAddr} from "@/api/store/user";
+import { getListUserCoupon } from "@/api/store/userCoupon";
+import userStorerDetails from "../components/userStorerDetails.vue";
+import userPatietDetails from "../components/userPatietDetails.vue";
+import userInquiryOrderDetails from "../components/userInquiryOrderDetails.vue";
+import userAddDetails from "../components/userAddDetails.vue";
+import userIntegralDetails from "../components/userIntegralDetails.vue";
+import AddOrderDialog from "../../hisStore/integralOrder/addOrder.vue"; // 导入积分购组件
+
+export default {
+  name: "storedet",
+  props:["data"],
+  components: {
+    userStorerDetails,
+    userInquiryOrderDetails,
+    userPatietDetails,
+    userAddDetails,
+    userIntegralDetails,
+    AddOrderDialog // 注册积分购组件
+  },
+  data() {
+    return {
+      refreshKey: 0, // 每次点击刷新用
+      patientInfo: process.env.VUE_APP_PATIENT_INFO,
+      addr:[],
+      patient:[],
+      userOptions: [],
+      statusOptions: [],
+      sexOptions: [],
+      pOptions: [],
+      item:null,
+      total: 0,
+      loading: true,
+      // 积分购相关
+      integralPurchaseVisible: false,
+      currentUserId: null,
+      // 会员优惠券表格数据
+      userCouponList: [],
+      queryParams: {
+        pageNum: 1,
+        pageSize: 10,
+        userId: null,
+        couponId: null,
+      },
+      actName:"10",
+      businessTypeOptions:[],
+      couponStatusOptions:[],
+    }
+  },
+  created() {
+    this.getDicts("sys_user_status").then(response => {
+      this.userOptions = response.data;
+    });
+    this.getDicts("sys_company_status").then(response => {
+      this.statusOptions = response.data;
+    });
+    this.getDicts("sys_patient_status").then(response => {
+      this.pOptions = response.data;
+    });
+    this.getDicts("sys_patient_sex").then(response => {
+      this.sexOptions = response.data;
+    });
+    this.getDicts("sys_coupon_business_type").then(response => {
+      this.businessTypeOptions = response.data;
+    });
+
+    this.getDicts("sys_coupon_status").then(response => {
+      this.couponStatusOptions = response.data;
+    });
+  },
+  methods: {
+    // 积分购相关方法
+    handleIntegralPurchase() {
+      if (this.item && this.item.userId) {
+        this.currentUserId = this.item.userId;
+        this.refreshKey++; // 每次点击都强制刷新
+        this.integralPurchaseVisible = true;
+      } else {
+        this.$message.warning('无法获取用户信息');
       }
-      .el-descriptions-item__content {
-        max-width: 150px;
-        min-width: 100px;
+    },
+
+    handleCloseIntegralPurchase() {
+      this.integralPurchaseVisible = false;
+      this.currentUserId = null;
+    },
+
+    handleClickX(tab, event) {
+      if(tab.name=="10"){
+        this.queryParams.status=null;
+      }else{
+        this.queryParams.status=tab.name;
       }
-      .desct{
-          padding-top: 20px;
-          padding-bottom: 20px;
-          color: #524b4a;
-          font-weight: bold;
-        }
-    </style>
-    
+      this.queryParams.pageNum = 1;
+      this.getList();
+    },
+
+    getList() {
+      this.loading = true;
+      getListUserCoupon(this.queryParams).then(response => {
+        this.userCouponList = response.rows;
+        this.total = response.total;
+        this.loading = false;
+      });
+    },
+
+    getDetails(orderId) {
+      this.item=null;
+      getUser(orderId).then(response => {
+        this.item = response.data;
+        setTimeout(() => {
+          this.$refs.userDetails.getUserDetails(orderId);
+        }, 1);
+        setTimeout(() => {
+          this.$refs.InquiryDetails.getInquiryDetails(orderId,1);
+        }, 1);
+        setTimeout(() => {
+          this.$refs.userPatietDetail.getPatList(orderId);
+        }, 1);
+        setTimeout(() => {
+          this.$refs.userAddDetail.getAddList(orderId);
+        }, 1);
+        setTimeout(() => {
+          this.$refs.userIntegralDetail.getIntegralLogs(orderId);
+        }, 1);
+      });
+
+      this.patient=null;
+      getPatientByUserId(orderId).then(response => {
+        this.patient = response.data;
+      });
+
+      getUserAddr(orderId).then(response => {
+        this.addr = response.data;
+      });
+
+      this.queryParams.userId=orderId;
+      this.getList();
+    },
+  }
+}
+</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;
+}
+</style>

+ 111 - 0
src/views/store/components/userIntegralDetails.vue

@@ -0,0 +1,111 @@
+<!-- UserIntegralLogs.vue -->
+<template>
+  <div class="integral-logs-container">
+    <el-table 
+      v-loading="loading" 
+      border 
+      :data="userIntegralLogsList" 
+      @selection-change="handleSelectionChange"
+    >
+      <el-table-column label="用户id" align="center" prop="userId" />
+      <el-table-column label="用户昵称" align="center" prop="nickName" />
+      <el-table-column label="用户电话" align="center" prop="phone" />
+      <el-table-column label="类别" align="center" prop="logType">
+        <template slot-scope="scope">
+          <dict-tag :options="intefralLogTypeOptions" :value="scope.row.logType"/>
+        </template>
+      </el-table-column>
+      <el-table-column label="积分" align="center" prop="integral" />
+      <el-table-column label="积分余额" align="center" prop="balance" />
+      <el-table-column label="订单关联id" align="center" prop="businessId" />
+      <el-table-column label="时间" align="center" prop="createTime" />
+    </el-table>
+    
+    <!-- 分页组件 -->
+    <pagination
+      v-show="total > 0"
+      :total="total"
+      :page.sync="queryParams.pageNum"
+      :limit.sync="queryParams.pageSize"
+      @pagination="getList"
+    />
+  </div>
+</template>
+
+<script>
+import { listUserIntegralLogs} from "@/api/company/userIntegralLogs";
+
+export default {
+  name: 'UserIntegralLogs',
+  props: {
+    fsUserId: {
+      type: [String, Number],
+      required: false
+    }
+  },
+  data() {
+    return {
+      loading: false,
+      userIntegralLogsList: [],
+      total: 0,
+      queryParams: {
+        pageNum: 1,
+        pageSize: 10,
+        userId: this.fsUserId
+      },
+      intefralLogTypeOptions: [],
+      selections: []
+    }
+  },
+  watch: {
+    fsUserId: {
+      handler(newVal) {
+        this.queryParams.userId = newVal;
+        this.getList();
+      },
+      immediate: true
+    }
+  },
+
+  created() {
+    this.getList();
+    this.getDictOptions();
+  },
+  methods: {
+    // 获取积分日志列表
+    getList() {
+
+      if (!this.queryParams.userId) return;
+      
+      this.loading = true;
+      listUserIntegralLogs(this.queryParams).then(response => {
+        this.userIntegralLogsList = response.rows;
+        this.total = response.total;
+        this.loading = false;
+      });
+    },
+    getIntegralLogs(fsUserId){
+        this.queryParams.userId=fsUserId;
+        this.getList();
+    },
+    // 获取字典选项
+    getDictOptions() {
+      // 获取积分日志类型字典
+        this.getDicts("sys_integral_log_type").then(response => {
+            this.intefralLogTypeOptions = response.data;
+        });
+    },
+    
+    // 处理选择变化
+    handleSelectionChange(selection) {
+      this.selections = selection;
+    }
+  }
+}
+</script>
+
+<style scoped>
+.integral-logs-container {
+  padding: 20px;
+}
+</style>