Browse Source

退单管理+动态管理(测试)

lishanshan 7 months ago
parent
commit
892c44b0d4

+ 29 - 1
src/api/system/order.js

@@ -88,4 +88,32 @@ export function netTransferOrder(query) {
     method: 'post',
     data: query
   })
-}
+}
+
+// 查询退款订单列表
+export function refundOrderList(data) {
+  return request({
+    // url: '/api/order/v1/pc/getOrder',
+    url: '/api/order/cancelOrderApplication/list',
+    method: 'get',
+    params: data
+  })
+}
+
+// 查询退款订单详情
+export function refundOrderDetail(data) {
+  return request({
+    url: '/api/order/cancelOrderApplication/getByOrderId',
+    method: 'get',
+    params: data
+  })
+}
+
+// 订单退款审核
+export function refundOrderAudit(query) {
+  return request({
+    url: '/api/order/cancelOrderApplication/audit',
+    method: 'post',
+    params: query
+  })
+}

+ 16 - 3
src/components/ImageUpload/index.vue

@@ -15,13 +15,14 @@
       :headers="headers"
       :file-list="fileList"
       :on-preview="handlePictureCardPreview"
-      :class="{hide: this.fileList.length >= this.limit}"
+      :class="{hide: (this.fileList.length >= this.limit) || readonly}"
+      :disabled="readonly"
     >
       <i class="el-icon-plus"></i>
     </el-upload>
 
     <!-- 上传提示 -->
-    <div class="el-upload__tip" slot="tip" v-if="showTip">
+    <div class="el-upload__tip" slot="tip" v-if="showTip && !readonly">
       请上传
       <template v-if="fileSize"> 大小不超过 <b style="color: #f56c6c">{{ fileSize }}MB</b> </template>
       <template v-if="fileType"> 格式为 <b style="color: #f56c6c">{{ fileType.join("/") }}</b> </template>
@@ -73,6 +74,11 @@ export default {
     tipText: {
       type: String,
       default: ''
+    },
+    // 预览模式
+    readonly: {
+      type: Boolean,
+      default: false
     }
   },
   data() {
@@ -125,6 +131,10 @@ export default {
   methods: {
     // 上传前loading加载
     handleBeforeUpload(file) {
+      if (this.readonly) {
+        return false;
+      }
+
       let isImg = false;
       if (this.fileType.length) {
         let fileExtension = "";
@@ -173,6 +183,10 @@ export default {
     },
     // 删除图片
     handleDelete(file) {
+      if (this.readonly) {
+        return;
+      }
+
       const findex = this.fileList.map(f => f.name).indexOf(file.name);
       if (findex > -1) {
         this.fileList.splice(findex, 1);
@@ -237,4 +251,3 @@ export default {
   line-height: 1.4;
 }
 </style>
-

+ 31 - 1
src/router/index.js

@@ -167,6 +167,21 @@ export const constantRoutes = [
       }
     ]
   },
+  // 动态管理
+  {
+    path: '/dynamic',
+    component: Layout,
+    hidden: true,
+    redirect: 'noredirect',
+    children: [
+      {
+        path: '',
+        component: () => import('@/views/dynamic/index'),
+        name: 'Dynamic',
+        meta: { title: '动态管理' }
+      }
+    ]
+  },
   // // 技师审核
   // {
   //   path: '/technician/check',
@@ -197,6 +212,21 @@ export const constantRoutes = [
       }
     ]
   },
+  // 退单管理
+  {
+    path: '/cancelOrder',
+    component: Layout,
+    hidden: true,
+    redirect: 'noredirect',
+    children: [
+      {
+        path: '',
+        component: () => import('@/views/cancelOrder/index'),
+        name: 'CancelOrder',
+        meta: { title: '退单管理' }
+      }
+    ]
+  },
   // 评论
   {
     path: '/comment',
@@ -302,7 +332,7 @@ export const constantRoutes = [
       }
     ]
   },
- 
+
   // 报警工单
   {
     path: '/alarmWorksheet',

+ 15 - 0
src/utils/dict/LocalDicts.js

@@ -43,6 +43,21 @@ export default {
             { label: "未上岗", value: -1 },
         ],
     },
+    // 动态审核状态
+    local_dynamic_audit: {
+        values: [
+            { label: "待审核", value: '0' },
+            { label: "审核通过", value: '1' },
+            { label: "审核驳回", value: '2' },
+        ],
+    },
+    // 退款审核状态
+    local_refund_audit: {
+        values: [
+            { label: "待审核", value: '0' },
+            { label: "已审核", value: '1' },
+        ],
+    },
 
     /**
      * 虚拟订单相关

+ 394 - 0
src/views/cancelOrder/cancelOrderAudit.vue

@@ -0,0 +1,394 @@
+<template>
+  <div>
+    <ModalView
+      ref="mv"
+      cname="ElDialog"
+      :viewProps="{
+        width: '700px',
+        customClass: 'orderDetailModal',
+        appendToBody: true,
+      }"
+    >
+      <!-- 订单详情 -->
+      <el-form
+        v-if="!nextStep"
+        ref="form"
+        :inline="true"
+        :model="form"
+        label-width="90px"
+      >
+        <el-form-item label="订单号">
+          <el-input
+            v-model="form.orderNo"
+            disabled
+          />
+        </el-form-item>
+        <el-form-item label="下单时间">
+          <el-input v-model="form.dtCreateTime" disabled />
+        </el-form-item>
+        <el-form-item label="订单状态">
+          <el-input v-model="form.statusName" disabled />
+        </el-form-item>
+        <el-form-item label="用户姓名">
+          <el-input
+            v-model="form.cName"
+            disabled
+          />
+        </el-form-item>
+        <el-form-item label="用户电话">
+          <el-input
+            v-model="form.cPhone"
+            disabled
+          />
+        </el-form-item>
+        <el-form-item label="技师姓名">
+          <el-input
+            v-model="form.jsName"
+            disabled
+          />
+        </el-form-item>
+        <el-form-item label="技师昵称">
+          <el-input
+            v-model="form.cNickName"
+            disabled
+          />
+        </el-form-item>
+        <el-form-item label="技师电话">
+          <el-input
+            v-model="form.jsPhone"
+            disabled
+          />
+        </el-form-item>
+        <el-form-item label="总金额">
+          <el-input
+            v-model="form.totalPrice"
+            disabled
+          />
+        </el-form-item>
+        <el-form-item label="项目金额">
+          <el-input
+            v-model="form.dPrice"
+            disabled
+          />
+        </el-form-item>
+        <el-form-item label="车费">
+          <el-input v-model="form.fare" disabled />
+        </el-form-item>
+        <el-form-item label="优惠金额">
+          <el-input v-model="form.preferential" disabled />
+        </el-form-item>
+        <el-form-item label="服务地址">
+          <el-input type="textarea" v-model="form.address" disabled />
+        </el-form-item>
+        <el-form-item label="备注">
+          <el-input v-model="form.cNote" type="textarea" disabled />
+        </el-form-item>
+        <el-form-item label="订单明细">
+          <div class="orderDetails">
+            <el-table :data="form.cGoods" style="width: 100%">
+              <el-table-column prop="cTitle" label="标题"> </el-table-column>
+              <el-table-column
+                label="封面图"
+                align="center"
+                prop="cCover"
+                width="100"
+              >
+                <template slot-scope="scope">
+                  <image-preview
+                    :src="scope.row.cCover"
+                    :width="50"
+                    :height="50"
+                  />
+                </template>
+              </el-table-column>
+              <el-table-column prop="cLdList" label="亮点"> </el-table-column>
+              <el-table-column prop="nMinute" label="时长"> </el-table-column>
+              <el-table-column prop="dPrice" label="价格"> </el-table-column>
+              <el-table-column prop="number" label="项目个数">
+              </el-table-column>
+            </el-table>
+          </div>
+        </el-form-item>
+      </el-form>
+      <!-- 审核表单 -->
+      <el-form v-if="nextStep" ref="form" :model="form" label-width="90px">
+        <el-form-item label="申请信息">
+          <el-input
+            v-model="form.cancelReason"
+            type="textarea"
+            placeholder="申请退款,务必退款"
+            :rows="3"
+            disabled
+          />
+        </el-form-item>
+        <el-row>
+          <el-col :span="12">
+            <el-form-item label="项目名称">
+              <el-input
+                v-model="form.cTitle"
+                disabled
+              />
+            </el-form-item>
+          </el-col>
+          <el-col :span="12">
+            <el-form-item label="项目时长">
+              <el-input
+                v-model="form.nMinute"
+                disabled
+              />
+            </el-form-item>
+          </el-col>
+        </el-row>
+        <el-row>
+          <el-col :span="12">
+            <el-form-item label="总金额">
+              <el-input v-model="form.totalPrice" disabled />
+            </el-form-item>
+          </el-col>
+          <el-col :span="12">
+            <el-form-item label="项目金额">
+              <el-input v-model="form.dPrice" disabled />
+            </el-form-item>
+          </el-col>
+        </el-row>
+        <el-row>
+          <el-col :span="12">
+            <el-form-item label="车费">
+              <el-input v-model="form.fare" disabled />
+            </el-form-item>
+          </el-col>
+          <el-col :span="12">
+            <el-form-item label="优惠金额">
+              <el-input
+                v-model="form.preferential"
+                disabled
+              />
+            </el-form-item>
+          </el-col>
+        </el-row>
+        <el-row>
+          <el-col :span="12">
+            <el-form-item label="服务状态">
+              <el-input
+                v-model="form.nStatus"
+                disabled
+              />
+            </el-form-item>
+          </el-col>
+          <el-col :span="12">
+            <el-form-item label="服务时长">
+              <el-input
+                v-model="form.serviceDuration"
+                disabled
+              />
+            </el-form-item>
+          </el-col>
+        </el-row>
+        <el-form-item label="退款金额">
+          <el-input-number
+            v-model="form.refundAmount"
+            :min="0.01"
+            :max="form.dTotalMoney || 9999999.99"
+            :step="0.01"
+            :precision="2"
+            style="width: 42%"
+            :disabled="isDisabled"
+          />
+        </el-form-item>
+        <el-form-item label="审核备注">
+          <el-input
+            v-model="form.auditRemark"
+            type="textarea"
+            :rows="2"
+            maxlength="50"
+            show-word-limit
+            :disabled="isDisabled"
+          />
+        </el-form-item>
+      </el-form>
+      <!-- 操作按钮 -->
+      <div slot="footer" class="dialog-footer">
+        <!-- 详情 -->
+        <div v-if="isDisabled">
+          <el-button type="primary" @click="nextStep = !nextStep">{{
+            nextText
+          }}</el-button>
+          <el-button @click="close">关 闭</el-button>
+        </div>
+        <div v-else>
+          <!-- 订单 -->
+          <div v-if="!nextStep">
+            <el-button @click="close">取 消</el-button>
+            <el-button type="primary" @click="nextStep = !nextStep">{{
+              nextText
+            }}</el-button>
+          </div>
+          <!-- 审核 -->
+          <div v-if="nextStep">
+            <el-button type="primary" plain @click="nextStep = !nextStep">{{
+              nextText
+            }}</el-button>
+            <el-button type="primary" @click="reviewForm">确 认</el-button>
+          </div>
+        </div>
+      </div>
+    </ModalView>
+  </div>
+</template>
+
+<script>
+import { refundOrderDetail, refundOrderAudit } from '@/api/system/order'
+import ModalView from '@/components/ZModalView/index.vue'
+
+export default {
+  name: 'OrderDetail',
+  components: {
+    ModalView,
+  },
+  computed: {
+    nextText() {
+      if (this.isDisabled) {
+        return this.nextStep ? '上一页' : '下一页'
+      } else {
+        return this.nextStep ? '上一步' : '下一步'
+      }
+    },
+  },
+  data() {
+    return {
+      title: '详情',
+      isDisabled: false,
+      nextStep: false,
+      id: '', // 主键id
+      // 表单参数
+      form: {
+        js: {
+          cName: '',
+          cPhone: '',
+          cNickName: '',
+        },
+        oldJs: {
+          cName: '',
+          cPhone: '',
+        },
+        cGoods: [],
+      },
+      arrival: '',
+      depart: '',
+    }
+  },
+  methods: {
+    open(e) {
+      debugger
+      console.log(3);
+
+
+      this.id = e.id
+      this.form = {
+        js: {
+          cName: '',
+          cPhone: '',
+          cNickName: '',
+        },
+        oldJs: {
+          cName: '',
+          cPhone: '',
+        },
+        cGoods: [],
+      }
+      this.arrival = ''
+      this.depart = ''
+      this.$refs.mv.open(this.title)
+      if (e.auditStatus == '1') {
+        this.title = '详情'
+      }
+      this.isDisabled = e.auditStatus == '1'
+      this.loadOrderDetail(e.id)
+    },
+    loadOrderDetail(id) {
+      refundOrderDetail({ id: id }).then(res => {
+        if (res.code == 200 && res.data) {
+          this.form = res.data
+          let Longitude = this.form.arrivalLongitude
+          let numLatitude = +this.form.arrivalLatitude
+          let Latitude = numLatitude.toFixed(6)
+          let location = Longitude + `,` + Latitude
+          let arrival = 'arrival' //到达
+          this.fetchLocation(arrival, location)
+          let depart = 'depart' //出发
+          this.fetchLocation(depart, location)
+        }
+      })
+    },
+    /**解析经纬度 */
+    async fetchLocation(title, location) {
+      const key = '5457092e6c62b83c1b2e45dbe973d858'
+      const url = `https://restapi.amap.com/v3/geocode/regeo?output=JSON&location=${location}&key=${key}&radius=500&extensions=all`
+      try {
+        const response = await fetch(url)
+        const data = await response.json()
+        if (title == 'arrival') {
+          data.regeocode.formatted_address.length > 0
+            ? (this.arrival = data.regeocode.formatted_address)
+            : ''
+        } else if (title == 'depart') {
+          // this.depart = data.regeocode.formatted_address;
+          data.regeocode.formatted_address.length > 0
+            ? (this.depart = data.regeocode.formatted_address)
+            : (this.depart = '')
+        }
+      } catch (error) {
+        console.error('请求失败:', error)
+      }
+    },
+    reviewForm() {
+      if (!this.form.refundAmount) {
+        this.$message.error('请输入退款金额')
+        return
+      }
+      const params = {
+        id: this.id,
+        refundAmount: this.form.refundAmount,
+        auditRemark: this.form.auditRemark,
+      }
+      refundOrderAudit(params).then(response => {
+        if (response.code == 200) {
+          this.$message.success('审核成功')
+          this.$emit('refresh')
+          this.close()
+        } else {
+          this.$message.error(response.msg)
+        }
+      })
+    },
+    // 关闭对话框
+    close() {
+      this.nextStep = false
+      this.$refs.mv.close()
+      this.$emit('close')
+    },
+  },
+}
+</script>
+
+<style scoped>
+.orderDetailModal .el-dialog__body {
+  max-height: 600px;
+  overflow-y: auto;
+}
+
+.orderDetails {
+  margin-top: 10px;
+}
+
+.old_js {
+  margin-top: 10px;
+}
+
+::v-deep .el-input__inner {
+  color: #333 !important;
+}
+::v-deep .el-textarea__inner {
+  color: #333 !important;
+}
+</style>

+ 308 - 0
src/views/cancelOrder/index.vue

@@ -0,0 +1,308 @@
+<template>
+  <div class="app-container">
+    <el-form
+      :model="queryParams"
+      ref="queryForm"
+      size="small"
+      :inline="true"
+      v-show="showSearch"
+      label-width="100px"
+    >
+      <el-form-item label="订单号" prop="orderNo">
+        <el-input
+          v-model="queryParams.orderNo"
+          placeholder="请输入订单号"
+          clearable
+          @keyup.enter.native="handleQuery"
+        />
+      </el-form-item>
+      <el-form-item label="技师姓名" prop="cName">
+        <el-input
+          v-model="queryParams.cName"
+          placeholder="请输入技师姓名"
+          clearable
+          @keyup.enter.native="handleQuery"
+        />
+      </el-form-item>
+      <el-form-item label="技师电话" prop="cPhone">
+        <el-input
+          v-model="queryParams.cPhone"
+          placeholder="请输入技师电话"
+          clearable
+          @keyup.enter.native="handleQuery"
+        />
+      </el-form-item>
+      <el-form-item label="技师昵称" prop="cNickName">
+        <el-input
+          v-model="queryParams.cNickName"
+          placeholder="请输入技师昵称"
+          clearable
+          @keyup.enter.native="handleQuery"
+        />
+      </el-form-item>
+      <el-form-item label="用户电话" prop="userPhone">
+        <el-input
+          v-model="queryParams.userPhone"
+          placeholder="请输入用户电话"
+          clearable
+          @keyup.enter.native="handleQuery"
+        />
+      </el-form-item>
+      <el-form-item label="审核状态" prop="auditStatus">
+        <el-select
+          v-model="queryParams.auditStatus"
+          placeholder="请选择"
+          clearable
+        >
+          <el-option
+            v-for="item in dict.type.local_refund_audit"
+            :key="item.value"
+            :label="item.label"
+            :value="item.value"
+          >
+          </el-option>
+        </el-select>
+      </el-form-item>
+      <el-form-item label="申请时间" prop="dtCreateTime">
+        <el-date-picker
+          v-model="queryParams.dateRange"
+          type="daterange"
+          range-separator="至"
+          start-placeholder="开始日期"
+          end-placeholder="结束日期"
+          value-format="yyyy-MM-dd"
+          clearable
+        ></el-date-picker>
+      </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"
+          @click="handleExport"
+          v-hasPermi="['system:order:export']"
+          >导出</el-button
+        >
+      </el-col>
+      <right-toolbar
+        :showSearch.sync="showSearch"
+        @queryTable="getList"
+      ></right-toolbar>
+    </el-row>
+
+    <div style="flex: 1">
+      <el-table
+        v-loading="loading"
+        :data="orderList"
+        height="calc(100% - 68px)"
+      >
+        <el-table-column label="序号" type="index" align="center">
+          <template slot-scope="scope">
+            <span>{{
+              (queryParams.current - 1) * queryParams.size + scope.$index + 1
+            }}</span>
+          </template>
+        </el-table-column>
+        <el-table-column label="订单号" align="center" prop="orderNo" />
+        <el-table-column label="用户姓名" align="center" prop="userName" />
+        <el-table-column label="用户电话" align="center" prop="userPhone" />
+        <el-table-column label="技师姓名" align="center" prop="cName" />
+        <el-table-column label="技师昵称" align="center" prop="cNickName" />
+        <el-table-column label="技师电话" align="center" prop="cPhone" />
+        <el-table-column label="项目名称" align="center" prop="projectName" />
+        <el-table-column
+          label="服务时长"
+          align="center"
+          prop="serviceDuration"
+        />
+        <el-table-column label="订单金额" align="center" prop="orderAmount" />
+        <el-table-column label="退款金额" align="center" prop="refundAmount" />
+        <el-table-column label="审核状态" align="center" prop="auditStatus">
+          <template slot-scope="scope">
+            <span>{{ selectDictLabel('local_refund_audit', scope.row.auditStatus) }}</span>
+          </template>
+        </el-table-column>
+        <el-table-column
+          label="申请时间"
+          align="center"
+          prop="applicationTime"
+          width="180"
+        >
+          <template slot-scope="scope">
+            <span>{{
+              parseTime(scope.row.applicationTime, '{y}-{m}-{d} {h}:{i}')
+            }}</span>
+          </template>
+        </el-table-column>
+        <el-table-column
+          label="申请备注"
+          align="center"
+          prop="cancelOrderReason"
+        />
+        <el-table-column label="操作" align="center" width="200" fixed="right">
+          <template slot-scope="scope">
+            <el-button
+              size="mini"
+              type="text"
+              :icon="
+                scope.row.auditStatus == '1'
+                  ? 'el-icon-document'
+                  : 'el-icon-bell'
+              "
+              @click="handleReview(scope.row)"
+              >{{
+                scope.row.auditStatus == '1' ? '查看详情' : '审核'
+              }}</el-button
+            >
+          </template>
+        </el-table-column>
+      </el-table>
+      <pagination
+        v-show="total > 0"
+        :total="total"
+        :page.sync="queryParams.current"
+        :limit.sync="queryParams.size"
+        @pagination="getList"
+      />
+    </div>
+    <!-- 退单审核 -->
+    <CancelOrderAudit ref="cbr" />
+  </div>
+</template>
+
+<script>
+import { refundOrderList } from '@/api/system/order'
+import CancelOrderAudit from './cancelOrderAudit.vue'
+
+export default {
+  name: 'CancelOrder',
+  dicts: ['local_refund_audit'],
+  components: {
+    CancelOrderAudit,
+  },
+  data() {
+    return {
+      // 遮罩层
+      loading: true,
+      // 显示搜索条件
+      showSearch: true,
+      // 总条数
+      total: 0,
+      // 认领表格数据
+      orderList: [],
+      // 弹出层标题
+      title: '',
+      // 是否显示弹出层
+      open: false,
+      // 查询参数
+      queryParams: {
+        current: 1,
+        size: 10,
+        orderNo: null,
+        cName: null,
+        cPhone: null,
+        cNickName: null,
+        userPhone: null,
+        auditStatus: null,
+        dateRange: null,
+      },
+    }
+  },
+  created() {
+    this.getList()
+  },
+  methods: {
+    // 退款订单列表
+    getList() {
+      this.loading = true
+      // 处理日期区间
+      const params = { ...this.queryParams }
+      if (params.dateRange && params.dateRange.length === 2) {
+        params.startTime = params.dateRange[0]
+        params.endTime = params.dateRange[1]
+      }
+      delete params.dateRange // 删除前端使用的 dateRange 参数
+
+      refundOrderList(params)
+        .then(res => {
+          this.orderList = res.data.records
+          this.total = res.data.total
+        })
+        .finally(() => {
+          this.loading = false
+        })
+    },
+    // 表单重置
+    reset() {
+      this.queryParams = {
+        current: 1,
+        size: 10,
+        orderNo: null,
+        cName: null,
+        cPhone: null,
+        cNickName: null,
+        userPhone: null,
+        auditStatus: null,
+        dateRange: null,
+      }
+      // this.resetForm("form");
+    },
+    /** 搜索按钮操作 */
+    handleQuery() {
+      this.queryParams.current = 1
+      this.getList()
+    },
+    /** 重置按钮操作 */
+    resetQuery() {
+      this.reset()
+      this.handleQuery()
+    },
+    /** 导出按钮操作VUE_APP_BASE_API = 'https://city.baoxianzhanggui.com/nightFragrance' */
+    handleExport() {
+      this.download(
+        'https://city.baoxianzhanggui.com/nightFragrance/api/order/v1/wx/export',
+        {
+          ...this.queryParams,
+        },
+        `order_${new Date().getTime()}.xlsx`
+      )
+    },
+    // 审核
+    handleReview(row) {
+      this.$refs.cbr.open({
+        id: row.id,
+        auditStatus: row.auditStatus,
+      })
+    },
+  },
+}
+</script>
+
+<style lang="scss" scoped>
+.app-container {
+  height: calc(100vh - 84px);
+  display: flex;
+  flex-direction: column;
+}
+
+.el-pagination {
+  float: right;
+  padding: 30px 0;
+}
+</style>

+ 196 - 0
src/views/dynamic/dynamicAudit.vue

@@ -0,0 +1,196 @@
+<template>
+  <ModalView
+    ref="mv"
+    cname="ElDialog"
+    :viewProps="{
+      width: '50%',
+      customClass: 'auditModal',
+    }"
+  >
+    <!-- 动态信息展示区域 -->
+    <div class="dynamic-info">
+      <div class="dynamic-title">{{ oForm.projectName }}</div>
+      <div class="dynamic-content">
+        {{ oForm.projectContent || '暂无内容' }}
+      </div>
+      <!-- 图片展示区域 -->
+      <div class="media-section" v-if="oForm.cImgList">
+        <ImageUpload v-model="oForm.cImgList" :limit="9" :readonly="true" />
+      </div>
+      <!-- 视频展示区域 -->
+      <div class="media-section" v-if="oForm.cVideoUrl">
+        <div class="video-container">
+          <video
+            class="video-preview"
+            v-if="oForm.cVideoUrl"
+            :src="getVideoUrl(oForm.cVideoUrl)"
+            controls
+          ></video>
+        </div>
+      </div>
+    </div>
+
+    <!-- 审核表单 -->
+    <el-form ref="uForm" :model="form" :rules="rules" label-width="80px">
+      <el-form-item label="审核状态" prop="auditStatus">
+        <el-radio-group v-model="form.auditStatus">
+          <el-radio :label="1">通过</el-radio>
+          <el-radio :label="2">拒绝</el-radio>
+        </el-radio-group>
+      </el-form-item>
+      <el-form-item label="审核备注" prop="auditReason">
+        <el-input
+          type="textarea"
+          placeholder="请输入审核备注/拒绝理由,审核拒绝时必填"
+          v-model="form.auditReason"
+          maxlength="50"
+          show-word-limit
+        >
+        </el-input>
+      </el-form-item>
+    </el-form>
+    <div slot="footer" class="dialog-footer">
+      <el-button type="primary" @click="submitForm('uForm')">确 定</el-button>
+      <el-button @click="resetForm('uForm')">取 消</el-button>
+    </div>
+  </ModalView>
+</template>
+
+<script>
+import ModalView from '@/components/ZModalView/index.vue'
+import { auditComment, batchAuditComment } from '@/api/system/comment'
+
+export default {
+  components: {
+    ModalView,
+  },
+  data() {
+    return {
+      title: '审核动态',
+      form: {},
+      oForm: {
+        id: 2323,
+        projectName: '测试项目',
+        projectContent: '这是一个测试项目',
+        cImgList: [
+          '/profile/upload/2025/04/29/66d42a234b578_20250429085118A009.jpg',
+          '/profile/upload/2025/04/29/66d42a234b578_20250429085118A009.jpg',
+          '/profile/upload/2025/04/29/66d42a234b578_20250429085118A009.jpg',
+          '/profile/upload/2025/04/29/66d42a234b578_20250429085118A009.jpg',
+          '/profile/upload/2025/04/29/66d42a234b578_20250429085118A009.jpg',
+          '/profile/upload/2025/04/29/66d42a234b578_20250429085118A009.jpg',
+        ],
+        cVideoUrl:
+          'https://test.baoxianzhanggui.com/nightFragrance/profile/upload/2025/05/23/WeChat_20250523101737_20250523151440A001.mp4',
+      },
+      loading: false,
+    }
+  },
+  computed: {
+    rules() {
+      return {
+        auditStatus: [
+          { required: true, message: '请选择审核状态', trigger: 'change' },
+        ],
+        auditReason: [
+          {
+            required: this.form.auditStatus === 2,
+            message: '请输入拒绝理由',
+            trigger: 'change',
+          },
+        ],
+      }
+    },
+  },
+  methods: {
+    /** 辅助函数:处理视频URL回显(如果是相对路径则加上base_api) */
+    getVideoUrl(url) {
+      if (!url) return ''
+      if (url.indexOf('http') === 0) return url
+      return process.env.VUE_APP_BASE_API + url
+    },
+    submitForm(formName) {
+      this.$refs[formName].validate(valid => {
+        if (valid) {
+          console.log(this.form)
+          let api = auditComment,
+            params = {
+              ...this.form,
+              commentId: this.oForm.id,
+            }
+          if (Array.isArray(this.oForm.id)) {
+            api = batchAuditComment
+            params = {
+              ...this.form,
+              commentIds: this.oForm.id,
+            }
+          }
+          api(params).then(res => {
+            this.$modal.msgSuccess(res.msg)
+            this.resetForm('uForm', true)
+          })
+        } else {
+          console.log('error submit!!')
+          return false
+        }
+      })
+    },
+    resetForm(n, f) {
+      this.$refs[n].resetFields()
+      this.close(f)
+    },
+    open(e) {
+      // if (e) {
+      //   this.oForm = e
+      // }
+      this.$refs.mv.open(this.title)
+    },
+    // 关闭弹窗
+    close(f = false) {
+      if (f) this.$emit('close')
+      this.$refs.mv.close()
+    },
+  },
+}
+</script>
+
+<style lang="scss" scoped>
+::v-deep .myModal {
+  .el-dialog__body {
+    max-height: 70vh;
+    overflow-y: auto;
+  }
+}
+
+.dynamic-info {
+  margin-bottom: 10px;
+  border-bottom: 1px solid #e5e5e5;
+
+  .dynamic-title {
+    font-size: 18px;
+    font-weight: bold;
+    margin-bottom: 10px;
+    color: #333;
+  }
+
+  .dynamic-content {
+    font-size: 14px;
+    line-height: 1.5;
+    color: #666;
+    margin-bottom: 20px;
+    white-space: pre-wrap;
+  }
+
+  .media-section {
+    margin-bottom: 20px;
+  }
+
+  .video-container {
+    .video-preview {
+      width: 240px;
+      height: 100%;
+      object-fit: contain;
+    }
+  }
+}
+</style>

+ 250 - 0
src/views/dynamic/index.vue

@@ -0,0 +1,250 @@
+<template>
+  <div class="app-container">
+    <el-form
+      :model="queryParams"
+      ref="queryForm"
+      size="small"
+      :inline="true"
+      v-show="showSearch"
+      label-width="100px"
+    >
+      <el-form-item label="技师姓名" prop="cName">
+        <el-input
+          v-model="queryParams.cName"
+          placeholder="请输入技师姓名"
+          clearable
+          @keyup.enter.native="handleQuery"
+        />
+      </el-form-item>
+      <el-form-item label="发布时间" prop="dtCreateTime">
+        <el-date-picker
+          v-model="queryParams.dateRange"
+          type="daterange"
+          range-separator="至"
+          start-placeholder="开始日期"
+          end-placeholder="结束日期"
+          value-format="yyyy-MM-dd"
+          clearable
+        ></el-date-picker>
+      </el-form-item>
+      <el-form-item label="审核状态" prop="auditStatus">
+        <el-select
+          v-model="queryParams.auditStatus"
+          placeholder="请选择"
+          clearable
+        >
+          <el-option
+            v-for="item in dict.type.local_dynamic_audit"
+            :key="item.value"
+            :label="item.label"
+            :value="item.value"
+          >
+          </el-option>
+        </el-select>
+      </el-form-item>
+      <el-form-item>
+        <el-button
+          type="primary"
+          icon="el-icon-search"
+          size="mini"
+          @click="handleQuery"
+          >搜索</el-button
+        >
+        <el-button icon="el-icon-refresh" size="mini" @click="resetQuery"
+          >重置</el-button
+        >
+      </el-form-item>
+    </el-form>
+
+    <el-row :gutter="10" class="mb8">
+      <right-toolbar
+        :showSearch.sync="showSearch"
+        @queryTable="getList"
+      ></right-toolbar>
+    </el-row>
+
+    <div style="flex: 1">
+      <el-table
+        v-loading="loading"
+        :data="orderList"
+        height="calc(100% - 68px)"
+      >
+        <el-table-column label="序号" type="index" align="center">
+          <template slot-scope="scope">
+            <span>{{
+              (queryParams.current - 1) * queryParams.size + scope.$index + 1
+            }}</span>
+          </template>
+        </el-table-column>
+        <el-table-column label="姓名" align="center" prop="userName" />
+        <el-table-column label="昵称" align="center" prop="cNickName" />
+        <el-table-column label="缩略图" align="center" width="60px">
+          <template slot-scope="scope">
+            <el-image
+              fit="contain"
+              :src="scope.row.cPortrait"
+              lazy
+              :preview-src-list="scope.row.cPortrait"
+              style="width: 50px; height: 50px;"
+            ></el-image>
+          </template>
+        </el-table-column>
+        <el-table-column label="动态标题" align="center" prop="cPhone" />
+        <el-table-column label="动态内容" align="center"  width="400" prop="projectName" />
+        <el-table-column
+          label="发布时间"
+          align="center"
+          prop="applicationTime"
+          width="180"
+        >
+          <template slot-scope="scope">
+            <span>{{
+              parseTime(scope.row.applicationTime, '{y}-{m}-{d} {h}:{i}')
+            }}</span>
+          </template>
+        </el-table-column>
+        <el-table-column label="审核状态" align="center" prop="auditStatus">
+          <template slot-scope="scope">
+            <span>{{ selectDictLabel('local_dynamic_audit', scope.row.auditStatus) }}</span>
+          </template>
+        </el-table-column>
+        <el-table-column label="操作" align="center" width="200" fixed="right">
+          <template slot-scope="scope">
+            <el-button
+              size="mini"
+              type="text"
+              :icon="
+                scope.row.auditStatus == '1'
+                  ? 'el-icon-document'
+                  : 'el-icon-bell'
+              "
+              @click="handleAudit(scope.row)"
+              >{{
+                scope.row.auditStatus == '1' ? '查看详情' : '审核'
+              }}</el-button
+            >
+          </template>
+        </el-table-column>
+      </el-table>
+      <pagination
+        v-show="total > 0"
+        :total="total"
+        :page.sync="queryParams.current"
+        :limit.sync="queryParams.size"
+        @pagination="getList"
+      />
+    </div>
+    <!-- 退单审核 -->
+    <DynamicAudit ref="dModal" @close="getList" />
+  </div>
+</template>
+
+<script>
+import { refundOrderList } from '@/api/system/order'
+import DynamicAudit from './dynamicAudit.vue'
+
+export default {
+  name: 'Dynamic',
+  dicts: ['local_dynamic_audit'],
+  components: {
+    DynamicAudit,
+  },
+  data() {
+    return {
+      // 遮罩层
+      loading: true,
+      // 显示搜索条件
+      showSearch: true,
+      // 总条数
+      total: 0,
+      // 认领表格数据
+      orderList: [],
+      // 弹出层标题
+      title: '',
+      // 是否显示弹出层
+      open: false,
+      // 查询参数
+      queryParams: {
+        current: 1,
+        size: 10,
+        orderNo: null,
+        cName: null,
+        cPhone: null,
+        cNickName: null,
+        userPhone: null,
+        auditStatus: null,
+        dateRange: null,
+      },
+    }
+  },
+  created() {
+    this.getList()
+  },
+  methods: {
+    // 退款订单列表
+    getList() {
+      this.orderList = [{id:2323}]
+
+      this.loading = true
+      // 处理日期区间
+      const params = { ...this.queryParams }
+      if (params.dateRange && params.dateRange.length === 2) {
+        params.startTime = params.dateRange[0]
+        params.endTime = params.dateRange[1]
+      }
+      delete params.dateRange // 删除前端使用的 dateRange 参数
+
+      refundOrderList(params)
+        .then(res => {
+          this.orderList = res.data.records
+          this.total = res.data.total
+        })
+        .finally(() => {
+          this.loading = false
+        })
+    },
+    // 表单重置
+    reset() {
+      this.queryParams = {
+        current: 1,
+        size: 10,
+        orderNo: null,
+        cName: null,
+        cPhone: null,
+        cNickName: null,
+        userPhone: null,
+        auditStatus: null,
+        dateRange: null,
+      }
+      // this.resetForm("form");
+    },
+    /** 搜索按钮操作 */
+    handleQuery() {
+      this.queryParams.current = 1
+      this.getList()
+    },
+    /** 重置按钮操作 */
+    resetQuery() {
+      this.reset()
+      this.handleQuery()
+    },
+    // 审核
+    handleAudit(row) {
+      this.$refs.dModal.open(row)
+    },
+  },
+}
+</script>
+
+<style lang="scss" scoped>
+.app-container {
+  height: calc(100vh - 84px);
+  display: flex;
+  flex-direction: column;
+}
+
+.el-pagination {
+  float: right;
+  padding: 30px 0;
+}
+</style>