Explorar el Código

服务订单、规则配置、

MS-IOHQJGHXZHQD\Administrator hace 2 meses
padre
commit
63bb13f00c

+ 19 - 0
src/api/order/rules.js

@@ -0,0 +1,19 @@
+import request from '@/utils/request'
+
+
+
+//保存订单流转与退款规则配置
+export function saveOrderRules(data) {
+    return request({
+        url: '/order/regulation/save',
+        method: 'post',
+        data
+    })
+}
+//获取当前配置(用于回显)
+export function regulationGet() {
+    return request({
+        url: '/order/regulation/get',
+        method: 'get'
+    })
+}

+ 34 - 0
src/api/order/serviceOrder.js

@@ -0,0 +1,34 @@
+import request from '@/utils/request'
+
+
+//查询服务分类选项
+export function serviceCategory(query) {
+    return request({
+        url: '/admin/order/serviceCategory/options',
+        method: 'get',
+        params: query
+    })
+}
+//分页查询服务订单
+export function orderPage(query) {
+    return request({
+        url: '/admin/order/page',
+        method: 'get',
+        params: query
+    })
+}
+//删除服务订单
+export function orderDetail(id) {
+    return request({
+        url: `/admin/order/${id}`,
+        method: 'delete'
+    })
+}
+//退款申请
+export function refundApply(id, data) {
+    return request({
+        url: `/admin/order/${id}/refund/apply`,
+        method: 'post',
+        data
+    })
+}

+ 17 - 0
src/api/tenant/attendance.js

@@ -10,3 +10,20 @@ export function rules(query) {
         data: query
     })
 }
+
+//分页查询考勤明细数据
+export function queryDailyAttendance(query) {
+    return request({
+        url: '/merchantDailyAttendance/queryDailyAttendance',
+        method: 'get',
+        params: query
+    })
+}
+//查询商户指定日期的工作时间明细
+export function queryDailyWorkTime(query) {
+    return request({
+        url: '/merchantDailyAttendance/queryDailyWorkTime',
+        method: 'get',
+        params: query
+    })
+}

+ 31 - 0
src/api/tenant/skillAudit.js

@@ -0,0 +1,31 @@
+import request from '@/utils/request'
+
+// 查询技能审核列表
+export function list(query) {
+    return request({
+        url: '/massage/project/audit/list',
+        method: 'get',
+        params: query
+    })
+}
+// 查询商户申请开通的项目列表
+export function projects(merchantId, query) {
+    return request({
+        url: `/massage/project/audit/${merchantId}/projects`,
+        method: 'get',
+        data: query
+    })
+}
+// 审核商户申请开通的项目
+
+export function submit(merchantId, query) {
+    return request({
+        url: `/massage/project/audit/project/${merchantId}/submit`,
+        method: 'put',
+        data: query
+    })
+}
+
+
+
+

+ 43 - 12
src/views/order/recycle/index.vue

@@ -8,14 +8,14 @@
             <el-row :gutter="20">
                 <el-col :span="6">
                     <el-form-item label="订单号">
-                        <el-input style="width: 280px" v-model="orderForm.a" clearable></el-input>
+                        <el-input style="width: 280px" v-model="orderForm.orderNo" clearable></el-input>
                     </el-form-item>
                 </el-col>
                 <el-col :span="6">
                     <el-form-item label="下单时间">
                         <el-date-picker
                             style="width: 280px"
-                            v-model="orderForm.b"
+                            v-model="orderForm.createTime"
                             type="daterange"
                             range-separator="至"
                             start-placeholder="开始日期"
@@ -27,8 +27,8 @@
                 </el-col>
                 <el-col :span="6">
                     <el-form-item label="用户信息">
-                        <el-input style="width: 280px" v-model="orderForm.d" placeholder="请填写" clearable >
-                            <el-select style="width: 100px" v-model="orderForm.c" slot="prepend" placeholder="请选择">
+                        <el-input style="width: 280px" v-model="orderForm.userKeyword" placeholder="请填写" clearable >
+                            <el-select style="width: 100px" v-model="orderForm.userSearchType" slot="prepend" placeholder="请选择">
                                 <el-option label="手机号" value="1"></el-option>
                                 <el-option label="昵称" value="2"></el-option>
                                 <el-option label="姓名" value="3"></el-option>
@@ -38,20 +38,20 @@
                 </el-col>
                 <el-col :span="6">
                     <el-form-item label="服务分类">
-                        <el-select style="width: 280px" v-model="orderForm.e" clearable>
-                            <el-option label="1" value="1"></el-option>
+                        <el-select style="width: 280px" v-model="orderForm.categoryId" clearable>
+                             <el-option v-for="item in serveTypes" :label="item.name" :value="item.id"></el-option>
                         </el-select>
                     </el-form-item>
                 </el-col>
                 <el-col :span="6">
                     <el-form-item label="项目名称">
-                        <el-input style="width: 280px" v-model="orderForm.f" clearable></el-input>
+                        <el-input style="width: 280px" v-model="orderForm.projectName" clearable></el-input>
                     </el-form-item>
                 </el-col>
                 <el-col :span="6">
                     <el-form-item label="商户信息">
-                        <el-input style="width: 280px" v-model="orderForm.d" placeholder="请填写" clearable >
-                            <el-select style="width: 100px" v-model="orderForm.c" slot="prepend" placeholder="请选择">
+                        <el-input style="width: 280px" v-model="orderForm.merchantSearchType" placeholder="请填写" clearable >
+                            <el-select style="width: 100px" v-model="orderForm.merchantKeyword" slot="prepend" placeholder="请选择">
                                 <el-option label="手机号" value="1"></el-option>
                                 <el-option label="昵称" value="2"></el-option>
                                 <el-option label="姓名" value="3"></el-option>
@@ -61,8 +61,9 @@
                 </el-col>
                 <el-col :span="6">
                     <el-form-item label="支付方式">
-                        <el-select style="width: 280px" v-model="orderForm.e" clearable>
-                            <el-option label="1" value="1"></el-option>
+                        <el-select style="width: 280px" v-model="orderForm.paymentMethod" clearable>
+                            <el-option label="0购物卡支付" value="0"></el-option>
+                            <el-option label="微信支付" value="1"></el-option>
                         </el-select>
                     </el-form-item>
                 </el-col>
@@ -159,7 +160,7 @@
 
 <script>
 import DispatchOrderDialog from '@/views/mapDemo/components/DispatchOrderDialog.vue'
-
+import { serviceCategory, orderPage } from '@/api/order/serviceOrder'
 const MOCK_ORDER = {
     cId: '1',
     orderNo: 'ORD20260601001',
@@ -177,6 +178,7 @@ export default {
     components: { DispatchOrderDialog },
     data() {
         return {
+          serveTypes: [],
             orderForm: {
                 current: 1,
                 size: 10,
@@ -190,8 +192,36 @@ export default {
     },
     methods: {
         initData() {
+          let params = {
+                current: this.orderForm.current,
+                size: this.orderForm.size,
+                orderNo: this.orderForm.orderNo,
+                projectName: this.orderForm.projectName,
+                merchantSearchType: this.orderForm.merchantSearchType,
+                merchantKeyword: this.orderForm.merchantKeyword,
+                startTime: this.orderForm.createTime?.[0],
+                endTime: this.orderForm.createTime?.[1],
+                userSearchType: this.orderForm.userSearchType,
+                userKeyword: this.orderForm.userKeyword,
+                categoryId: this.orderForm.categoryId,
+                paymentMethod: this.orderForm.paymentMethod,
+                status: this.orderForm.status,
+            }
+          orderPage(params).then(res => {
+                if (res.code === 200) {
+                    this.table = res.data.records
+                    this.total = res.data.total
+                }
+          })
 
         },
+        serviceCategoryFun() {
+            serviceCategory().then(res => {
+                if (res.code === 200) {
+                    this.serveTypes = res.data
+                }
+            })
+        },
         handleSearch() {
             this.orderForm.current = 1
             this.orderForm.size = 10
@@ -226,6 +256,7 @@ export default {
     },
     mounted() {
         this.initData();
+        this.serviceCategoryFun()
     }
 }
 </script>

+ 369 - 85
src/views/order/rules/index.vue

@@ -1,102 +1,386 @@
 <template>
-    <div class="app-container">
-        <el-form
-            :model="rulesForm"
-            label-width="150px"
-            :rules="rules"
-        >
-            <el-descriptions title="订单流转规则" :column="1"></el-descriptions>
-            <el-form-item prop="autoFlowEnabled" label="系统流转">
-                <el-switch v-model="rulesForm.autoFlowEnabled"></el-switch>
+  <div class="app-container">
+    <el-form :model="rulesForm" ref="rulesForm" label-width="150px" :rules="rules">
+      <el-descriptions title="订单流转规则" :column="1"></el-descriptions>
+      <el-form-item prop="autoFlowEnabled" label="系统流转">
+        <el-switch v-model="rulesForm.autoFlowEnabled"></el-switch>
+      </el-form-item>
+      <el-form-item prop="timeoutHours" label="自动流转时间">
+        用户下单超
+        <el-input style="width: 200px" placeholder="请填写" v-model="rulesForm.timeoutHours"
+          @input="(val) => handleRuleInput(val, rulesForm, 'timeoutHours', 1, 720)"
+          :disabled="!rulesForm.autoFlowEnabled" clearable>
+          <template #append>小时</template>
+        </el-input>
+        商户未接单
+      </el-form-item>
+      <el-form-item prop="defaultAction" label="系统自动处理流转">
+        <el-select style="width: 200px" v-model="rulesForm.defaultAction" placeholder="请选择"
+          :disabled="!rulesForm.autoFlowEnabled" clearable>
+          <el-option value="0" label="自动退款"></el-option>
+          <el-option value="1" label="转为待指派订单"></el-option>
+        </el-select>
+      </el-form-item>
+      <el-descriptions title="退款规则" :column="1"></el-descriptions>
+      <el-form-item prop="preDepartureStrategy" label="商户为出发前" class="moveErrText">
+        <el-radio-group v-model="rulesForm.preDepartureStrategy">
+          <el-radio :label="0">全额退款</el-radio>
+          <el-radio :label="1">部分退款</el-radio>
+        </el-radio-group>
+        <div class="list" style="position: absolute;">
+          <div class="item" v-for="(item, index) in rulesForm.preDepartureRules"
+            style="margin:10px 0 25px 0;display: flex;">
+            商户未出发前
+            <el-form-item :prop="`preDepartureRules.${index}.timeStartHours`"
+              :rules="rules.preDepartureRules.timeStartHours">
+              <el-input :disabled="rulesForm.preDepartureStrategy == 0" style="width: 200px"
+                v-model="item.timeStartHours"
+                @input="(val) => handleRuleInput(val, item, 'timeStartHours', 1, 720, 'preDepartureRules', index)">
+                <template #append>小时</template>
+              </el-input>
             </el-form-item>
-            <el-form-item prop="timeoutHours" label="自动流转时间">
-                用户下单超
-                <el-input style="width: 200px" placeholder="请填写" v-model="rulesForm.timeoutHours" :disabled="!rulesForm.autoFlowEnabled" clearable>
-                    <template #append>小时</template>
-                </el-input>
-                商户未接单
+            <span style="padding: 0 10px;"> 至 </span>
+            <el-form-item :prop="`preDepartureRules.${index}.timeEndHours`"
+              :rules="rules.preDepartureRules.timeEndHours">
+              <el-input :disabled="rulesForm.preDepartureStrategy == 0" style="width: 200px" v-model="item.timeEndHours"
+                @input="(val) => handleRuleInput(val, item, 'timeEndHours', 1, 720, 'preDepartureRules', index)">
+                <template #append>小时</template>
+              </el-input>
             </el-form-item>
-            <el-form-item prop="defaultAction" label="系统自动处理流转">
-                <el-select style="width: 200px" v-model="rulesForm.defaultAction" placeholder="请选择" :disabled="!rulesForm.autoFlowEnabled" clearable>
-                    <el-option value="1" label="自动退款"></el-option>
-                    <el-option value="2" label="转为待指派订单"></el-option>
-                </el-select>
+            ,
+            退款订单金额的
+            <el-form-item :prop="`preDepartureRules.${index}.refundPercent`"
+              :rules="rules.preDepartureRules.refundPercent">
+              <el-input :disabled="rulesForm.preDepartureStrategy == 0" style="width: 200px"
+                v-model="item.refundPercent"
+                @input="(val) => handleRuleInput(val, item, 'refundPercent', 0, 100, 'preDepartureRules', index)">
+                <template #append>%</template>
+              </el-input>
             </el-form-item>
-            <el-descriptions title="退款规则" :column="1"></el-descriptions>
-            <el-form-item prop="d" label="商户为出发前">
-                <el-radio-group v-model="rulesForm.preDepartureStrategy">
-                    <el-radio :label="0">全额退款</el-radio>
-                    <el-radio :label="1">部分退款</el-radio>
-                </el-radio-group>
-                <div class="list">
-                    <div class="item" v-for="item in rulesForm.list">
-                        商户未出发前
-                        <el-input :disabled="rulesForm.preDepartureStrategy == 0" style="width: 200px" v-model="item.timeStartHours">
-                            <template #append>小时</template>
-                        </el-input>
-                        至
-                        <el-input :disabled="rulesForm.preDepartureStrategy == 0" style="width: 200px" v-model="item.timeEndHours">
-                            <template #append>小时</template>
-                        </el-input>
-                        ,
-                        退款订单金额的
-                        <el-input :disabled="rulesForm.preDepartureStrategy == 0" style="width: 200px" v-model="item.refundPercent">
-                            <template #append>%</template>
-                        </el-input>
-                    </div>
-                </div>
-            </el-form-item>
-            <el-form-item prop="refundType" label="商户已出发">
-                <el-radio-group v-model="rulesForm.refundType1">
-                    <el-radio :label="0">全额退款</el-radio>
-                    <el-radio :label="1">部分退款</el-radio>
-                </el-radio-group>
-                <el-input style="width: 200px" v-model="rulesForm.refundPercent1" placeholder="请填写" clearable>
-                    <template #append>%</template>
-                </el-input>
-            </el-form-item>
-            <el-form-item prop="g" label="服务中订单">
-                <el-radio-group v-model="rulesForm.refundType2">
-                    <el-radio :label="0">全额退款</el-radio>
-                    <el-radio :label="1">部分退款</el-radio>
-                </el-radio-group>
-                <el-input style="width: 200px" v-model="rulesForm.refundPercent2" placeholder="请填写" clearable>
-                    <template #append>%</template>
-                </el-input>
-            </el-form-item>
-        </el-form>
+          </div>
+        </div>
+      </el-form-item>
+      <el-form-item prop="refundType1" label="商户已出发" style="margin-top: 200px;">
+        <div style="display: flex;align-items: center;">
+          <el-radio-group v-model="rulesForm.refundType1">
+            <el-radio :label="0">全额退款</el-radio>
+            <el-radio :label="1">部分退款</el-radio>
+          </el-radio-group>
+
+          <el-form-item prop="refundPercent1" style="margin-left: 10px;">
+            <el-input style="width: 200px" v-model="rulesForm.refundPercent1" placeholder="请填写" clearable
+              @input="(val) => handleRuleInput(val, rulesForm, 'refundPercent1', 0, 100)">
+              <template #append>%</template>
+            </el-input>
+          </el-form-item>
+        </div>
+
+
+      </el-form-item>
+      <el-form-item prop="refundType2" label="服务中订单">
+        <div style="display: flex;align-items: center;">
+          <el-radio-group v-model="rulesForm.refundType2">
+            <el-radio :label="0">全额退款</el-radio>
+            <el-radio :label="1">部分退款</el-radio>
+          </el-radio-group>
+
+          <el-form-item prop="refundPercent2" style="margin-left: 10px;">
+            <el-input style="width: 200px" v-model="rulesForm.refundPercent2" placeholder="请填写" clearable
+              @input="(val) => handleRuleInput(val, rulesForm, 'refundPercent2', 0, 100)">
+              <template #append>%</template>
+            </el-input>
+          </el-form-item>
+        </div>
+
+
+      </el-form-item>
+    </el-form>
+    <div style="position: fixed;bottom: 80px;left: 50%;transform: translateX(-50%);">
+      <el-button type="primary" @click="handleSubmit">保存</el-button>
     </div>
+
+  </div>
 </template>
 
 <script>
+import { saveOrderRules, regulationGet } from '@/api/order/rules'
+import { mount } from 'sortablejs';
 export default {
-    name: "rules",
-    data() {
-        return {
-            rulesForm: {
-                autoFlowEnabled: false,
-                list: [
-                    {}
-                ]
-            },
-            rules: {
-                autoFlowEnabled: [
-                    { required: true, message: '请填写', trigger: 'blur' }
-                ],
-                b: [
-                    { required: true, message: '请选择', trigger: 'change' },
-                    {
-                        pattern: /^(?:[1-9]|[1-9]\d|[1-6]\d{2}|7[01]\d|720)$/,
-                        message: '请输入1~720之间正整数',
-                        trigger: 'blur'
-                    }
-                ]
+  name: "rules",
+  data() {
+    return {
+      rulesForm: {
+        autoFlowEnabled: false,
+        preDepartureStrategy: null,
+        refundType1: null,
+        refundType2: null,
+        timeoutHours: null,
+        defaultAction: null,
+        refundPercent1: null,
+        refundPercent2: null,
+        preDepartureRules: [
+          { sortOrder: 1 },
+          { sortOrder: 2 },
+          { sortOrder: 3 }
+        ]
+      },
+      rules: {
+        autoFlowEnabled: [
+          { required: true, message: '请填写', trigger: 'blur' }
+        ],
+        preDepartureStrategy: [
+          { required: true, message: '请选择', trigger: 'blur' }
+        ],
+        refundType1: [
+          { required: true, message: '请选择', trigger: 'blur' }
+        ],
+        refundType2: [
+          { required: true, message: '请选择', trigger: 'blur' }
+        ],
+        timeoutHours: [
+          { required: true, message: '请选择', trigger: 'blur' },
+          {
+            pattern: /^(?:[1-9]|[1-9]\d|[1-6]\d{2}|7[01]\d|720)$/,
+            message: '请输入1~720之间正整数',
+            trigger: 'blur'
+          }
+        ],
+        defaultAction: [
+          { required: true, message: '请选择', trigger: 'blur' },
+        ],
+        refundPercent1: [
+          { required: true, message: '请输入退款比例', trigger: 'blur' },
+          {
+            pattern: /^(?:0|[1-9]|[1-9]\d|100)$/,
+            message: '请输入1~100之间正整数',
+            trigger: 'blur'
+          }
+        ], refundPercent2: [
+          { required: true, message: '请输入退款比例', trigger: 'blur' },
+          {
+            pattern: /^(?:0|[1-9]|[1-9]\d|100)$/,
+            message: '请输入1~100之间正整数',
+            trigger: 'blur'
+          }
+        ],
+        preDepartureRules: {
+          timeStartHours: [
+            { required: true, message: '请输入开始时间', trigger: 'blur' },
+            {
+              pattern: /^(?:[1-9]|[1-9]\d|[1-6]\d{2}|7[01]\d|720)$/,
+              message: '请输入1~720之间正整数',
+              trigger: 'blur'
+            }
+          ],
+          timeEndHours: [
+            { required: true, message: '请输入结束时间', trigger: 'blur' },
+            {
+              pattern: /^(?:[1-9]|[1-9]\d|[1-6]\d{2}|7[01]\d|720)$/,
+              message: '请输入1~720之间正整数',
+              trigger: 'blur'
+            }
+          ],
+          refundPercent: [
+            { required: true, message: '请输入退款比例', trigger: 'blur' },
+            {
+              pattern: /^(?:0|[1-9]|[1-9]\d|100)$/,
+              message: '请输入1~100之间正整数',
+              trigger: 'blur'
+            }
+          ]
+        }
+      }
+    }
+  },
+  watch: {
+    'rulesForm.autoFlowEnabled': {
+      //immediate: true,
+      handler(val) {
+        if (val) {
+          this.rules.timeoutHours[0].required = true;
+          this.rules.defaultAction[0].required = true;
+        } else {
+          this.$nextTick(() => {
+            this.$refs.rulesForm.clearValidate('timeoutHours');
+            this.$refs.rulesForm.clearValidate('defaultAction');
+          });
+          this.rules.timeoutHours[0].required = false;
+          this.rules.defaultAction[0].required = false;
+        }
+      }
+    },
+    'rulesForm.preDepartureStrategy': {
+      //immediate: true,
+      handler(val) {
+        if (val == 1) {
+          this.rules.preDepartureRules.timeStartHours[0].required = true;
+          this.rules.preDepartureRules.timeEndHours[0].required = true;
+          this.rules.preDepartureRules.refundPercent[0].required = true;
+        } else {
+
+          if (val !== 1 && this.$refs.rulesForm) {
+            this.rulesForm.preDepartureRules.forEach((item, index) => {
+              this.$refs.rulesForm.clearValidate(`preDepartureRules.${index}.timeStartHours`);
+              this.$refs.rulesForm.clearValidate(`preDepartureRules.${index}.timeEndHours`);
+              this.$refs.rulesForm.clearValidate(`preDepartureRules.${index}.refundPercent`);
+            });
+          }
+          this.rules.preDepartureRules.timeStartHours[0].required = false;
+          this.rules.preDepartureRules.timeEndHours[0].required = false;
+          this.rules.preDepartureRules.refundPercent[0].required = false;
+        }
+      }
+    },
+    'rulesForm.refundType1': {
+      //immediate: true,
+      handler(val) {
+        if (val == 1) {
+          this.rules.refundPercent1[0].required = true;
+        } else {
+          this.$nextTick(() => {
+            this.$refs.rulesForm.clearValidate('refundPercent1');
+          });
+          this.rules.refundPercent1[0].required = false;
+        }
+      }
+    },
+    'rulesForm.refundType2': {
+      //immediate: true,
+      handler(val) {
+        if (val == 1) {
+          this.rules.refundPercent2[0].required = true;
+        } else {
+          this.$nextTick(() => {
+            this.$refs.rulesForm.clearValidate('refundPercent2');
+          });
+          this.rules.refundPercent2[0].required = false;
+        }
+      }
+    },
+  },
+  mounted() {
+    this.regulationGetFun();
+  },
+  methods: {
+    regulationGetFun() {
+      regulationGet().then(res => {
+        if (res.code == 200) {
+          this.$refs.rulesForm.clearValidate();
+          this.rulesForm.autoFlowEnabled = res.data.autoFlowEnabled;
+          this.rulesForm.timeoutHours = res.data.timeoutHours;
+          this.rulesForm.defaultAction = res.data.defaultAction.toString();
+          this.rulesForm.preDepartureStrategy = res.data.preDepartureStrategy;
+          this.rulesForm.preDepartureRules = res.data.preDepartureRules;
+
+          this.rulesForm.refundType1 = res.data.onWayRules[0].refundType;
+          this.rulesForm.refundPercent1 = res.data.onWayRules[0].refundPercent;
+          this.rulesForm.refundType2 = res.data.inServiceRules[0].refundType;
+          this.rulesForm.refundPercent2 = res.data.inServiceRules[0].refundPercent;
+        }
+      })
+    },
+    handleRuleInput(value, target, prop, min, max, arrayName = '', index = -1) {
+      console.log(value, prop);
+
+      // 1. 只允许输入数字(过滤非数字字符)
+      let newValue = String(value).replace(/[^\d]/g, '');
+
+      // 2. 移除前导零(如 "0012" → "12")
+      newValue = newValue.replace(/^0+(?=\d)/, '');
+
+      // 3. 范围限制(确保在 1~720 之间)
+      if (newValue) {
+        const num = parseInt(newValue, 10);
+        if (num < min) {
+          newValue = String(min);
+        } else if (num > max) {
+          newValue = String(max);
+        }
+      }
+      let validateProp = prop;
+      if (arrayName && index >= 0) {
+        validateProp = `${arrayName}.${index}.${prop}`;
+      }
+      if (this.$refs.rulesForm) {
+        this.$refs.rulesForm.validateField(validateProp);
+      }
+
+
+      // 更新表单值(避免无限循环)
+      if (newValue !== String(target[prop])) {
+        target[prop] = newValue;
+      }
+
+    },
+    handleSubmit() {
+      console.log(this.rulesForm);
+      this.$refs.rulesForm.clearValidate();
+      this.$refs.rulesForm.validate((valid) => {
+        if (valid) {
+          if(this.rulesForm.preDepartureStrategy == 1){
+            if(this.rulesForm.preDepartureRules[0].timeEndHours!=this.rulesForm.preDepartureRules[1].timeStartHours || this.rulesForm.preDepartureRules[1].timeEndHours!=this.rulesForm.preDepartureRules[2].timeStartHours){
+              this.$message({
+                message: '时间区间必须连续无重叠,请检查配置',
+                type: 'warning'
+              });
+              return;
+            }
+            if(this.rulesForm.preDepartureRules[0].refundPercent<this.rulesForm.preDepartureRules[1].refundPercent
+            || this.rulesForm.preDepartureRules[1].refundPercent<this.rulesForm.preDepartureRules[2].refundPercent
+            || this.rulesForm.preDepartureRules[0].refundPercent<this.rulesForm.preDepartureRules[2].refundPercent){
+              this.$message({
+                message: '退款比例应随时间临近递减,提前越久退款比例越高',
+                type: 'warning'
+              });
+              return;
+            }
+          }
+
+          let params = {
+            autoFlowEnabled: this.rulesForm.autoFlowEnabled,
+            timeoutHours: this.rulesForm.timeoutHours,
+            defaultAction: this.rulesForm.defaultAction,
+            preDepartureStrategy: this.rulesForm.preDepartureStrategy,
+            preDepartureRules: this.rulesForm.preDepartureRules,
+            onWayRules: [{
+              refundType: this.rulesForm.refundType1,
+              refundPercent: this.rulesForm.refundPercent1,
             }
+            ],
+            inServiceRules: [{
+              refundType: this.rulesForm.refundType2,
+              refundPercent: this.rulesForm.refundPercent2,
+            }]
+          }
+
+          //调用保存接口
+          saveOrderRules(params).then(res => {
+            if (res.code == 200) {
+              this.$message({
+                message: res.msg,
+                type: 'success'
+              });
+            } else {
+              this.$message({
+                message: res.msg,
+                type: 'error'
+              });
+            }
+          });
+        } else {
+          this.$message({
+            message: '请填写完整信息',
+            type: 'warning'
+          });
         }
+      });
     }
+  }
 }
 </script>
 
 <style scoped lang="scss">
-
+::v-deep.el-form-item.is-error .el-input__inner {
+  border-color: #DCDFE6 !important;
+}
 </style>

+ 420 - 346
src/views/order/serviceOrder/index.vue

@@ -1,381 +1,455 @@
 <template>
-    <div class="app-container">
-        <el-form
-            :model="orderForm"
-            label-width="68px"
-            :inline="true"
-        >
-            <el-row :gutter="20">
-                <el-col :span="6">
-                    <el-form-item label="订单号">
-                        <el-input style="width: 280px" v-model="orderForm.a" clearable></el-input>
-                    </el-form-item>
-                </el-col>
-                <el-col :span="6">
-                    <el-form-item label="下单时间">
-                        <el-date-picker
-                            style="width: 280px"
-                            v-model="orderForm.b"
-                            type="daterange"
-                            range-separator="至"
-                            start-placeholder="开始日期"
-                            end-placeholder="结束日期"
-                            value-format="yyyy-MM-dd"
-                            clearable
-                        ></el-date-picker>
-                    </el-form-item>
-                </el-col>
-                <el-col :span="6">
-                    <el-form-item label="用户信息">
-                        <el-input style="width: 280px" v-model="orderForm.d" placeholder="请填写" clearable >
-                            <el-select style="width: 100px" v-model="orderForm.c" slot="prepend" placeholder="请选择">
-                                <el-option label="手机号" value="1"></el-option>
-                                <el-option label="昵称" value="2"></el-option>
-                                <el-option label="姓名" value="3"></el-option>
-                            </el-select>
-                        </el-input>
-                    </el-form-item>
-                </el-col>
-                <el-col :span="6">
-                    <el-form-item label="服务分类">
-                        <el-select style="width: 280px" v-model="orderForm.e" clearable>
-                            <el-option label="1" value="1"></el-option>
-                        </el-select>
-                    </el-form-item>
-                </el-col>
-                <el-col :span="6">
-                    <el-form-item label="项目名称">
-                        <el-input style="width: 280px" v-model="orderForm.f" clearable></el-input>
-                    </el-form-item>
-                </el-col>
-                <el-col :span="6">
-                    <el-form-item label="商户信息">
-                        <el-input style="width: 280px" v-model="orderForm.d" placeholder="请填写" clearable >
-                            <el-select style="width: 100px" v-model="orderForm.c" slot="prepend" placeholder="请选择">
-                                <el-option label="手机号" value="1"></el-option>
-                                <el-option label="昵称" value="2"></el-option>
-                                <el-option label="姓名" value="3"></el-option>
-                            </el-select>
-                        </el-input>
-                    </el-form-item>
-                </el-col>
-                <el-col :span="6">
-                    <el-form-item label="支付方式">
-                        <el-select style="width: 280px" v-model="orderForm.e" clearable>
-                            <el-option label="1" value="1"></el-option>
-                        </el-select>
-                    </el-form-item>
-                </el-col>
-                <el-col :span="6">
-                    <el-form-item label="订单归属">
-                        <el-select style="width: 280px" v-model="orderForm.e" clearable>
-                            <el-option label="1" value="1"></el-option>
-                        </el-select>
-                    </el-form-item>
-                </el-col>
-                <el-col :span="6">
-                    <el-button type="primary" @click="handleSearch">搜索</el-button>
-                    <el-button @click="handleReset">重置</el-button>
-                </el-col>
-            </el-row>
-        </el-form>
-        <div class="btns">
-            <div class="type">
-                <span class="typeItem" :class="{ 'active': typeIndex === index }" @click="handleTypeIndex(item, index)" v-for="(item, index) in typeList">{{ item.name }}</span>
-            </div>
-        </div>
-        <el-table
-            :data="table"
-        >
-            <el-table-column label="订单信息" width="200">
-                <template #default="{ row }">
-                    <div class="orderNum">订单号:20251201103742</div>
-                    <div class="orderTime">下单时间:2025.12.02 12:00:01</div>
-                </template>
-            </el-table-column>
-            <el-table-column label="服务项目" width="340">
-                <template #default="{ row }">
-                    <div class="serveProject">
-                        <div class="photo">
-                            <image-preview :src="row.ccover" :width="80" :height="80" />
-                        </div>
-                        <div class="message">
-                            <div class="title">斯诺克技术指导-个性化斯诺克技术指导-个性化</div>
-                            <div class="type">陪练(120分钟)</div>
-                            <div class="serveTime">服务时间:2025.12.02 12:00-13:00</div>
-                        </div>
-                    </div>
-                </template>
-            </el-table-column>
-            <el-table-column label="单价/数量" width="150">
-                <template #default="{ row }">
-                    <div class="orderNum">188.00/次</div>
-                    <div class="orderTime">×12</div>
-                </template>
-            </el-table-column>
-            <el-table-column label="订单金额" width="240">
-                <template #default="{ row }">
-                    <div class="orderNum">¥362(含出行费:¥0.00)</div>
-                    <div class="orderTime">余额支付</div>
-                </template>
-            </el-table-column>
-            <el-table-column label="联系信息">
-                <template #default="{ row }">
-                    <div class="connectMsg">用户:用户709514</div>
-                    <div class="connectMsg">联系人:好 178 **** 0334</div>
-                    <div class="connectMsg connectAddress">地址:云南省昆明市官渡区彩云辅路</div>
-                </template>
-            </el-table-column>
-            <el-table-column label="状态">
-                <template #default="{ row }">
-                    <div class="orderNum">状态</div>
-                    <div class="orderNum">关联的售后状态</div>
-                </template>
-            </el-table-column>
-            <el-table-column label="服务商户">
-                <template #default="{ row }">
-                    <div class="orderNum">姓名</div>
-                    <div class="orderNum">手机号</div>
-                </template>
-            </el-table-column>
-            <el-table-column label="操作" fixed="right" width="120">
-                <template #default="{ row }">
-                    <el-dropdown @command="(command) => clickMenuItem(command, row)">
-                        <span class="el-dropdown-link">
-                            <el-button size="small" type="text">操作<i class="el-icon-arrow-down el-icon--right"></i></el-button>
-                        </span>
-                        <el-dropdown-menu slot="dropdown">
-                            <el-dropdown-item command="view" @click="handleView(row)">详情</el-dropdown-item>
-                            <el-dropdown-item command="allot" @click="handleAllot(row)">分配</el-dropdown-item>
-                            <el-dropdown-item command="del" @click="handleDel(row)">删除</el-dropdown-item>
-                            <el-dropdown-item command="refund" @click="handleRefund(row)">退款</el-dropdown-item>
-                            <el-dropdown-item command="exchange" @click="handleExchange(row)">更换商户</el-dropdown-item>
-                        </el-dropdown-menu>
-                    </el-dropdown>
-                </template>
-            </el-table-column>
-        </el-table>
-        <div class="pagination">
-            <el-pagination
-                v-show="total > 0"
-                background
-                @size-change="handleSizeChange"
-                @current-change="handleCurrentChange"
-                :current-page="orderForm.current"
-                :page-size="orderForm.size"
-                layout="total, sizes, prev, pager, next, jumper"
-                :total="total"
-            />
-        </div>
+  <div class="app-container">
+    <el-form :model="orderForm" label-width="68px" :inline="true">
+      <el-row :gutter="20">
+        <el-col :span="6">
+          <el-form-item label="订单号">
+            <el-input style="width: 280px" v-model="orderForm.orderNo" clearable></el-input>
+          </el-form-item>
+        </el-col>
+        <el-col :span="6">
+          <el-form-item label="下单时间">
+            <el-date-picker style="width: 280px" v-model="orderForm.createTime" type="daterange" range-separator="至"
+              start-placeholder="开始日期" end-placeholder="结束日期" value-format="yyyy-MM-dd" clearable></el-date-picker>
+          </el-form-item>
+        </el-col>
+        <el-col :span="6">
+          <el-form-item label="用户信息">
+            <el-input style="width: 280px" v-model="orderForm.userKeyword" placeholder="请填写" clearable>
+              <el-select style="width: 100px" v-model="orderForm.userSearchType" slot="prepend" placeholder="请选择">
+                <el-option label="手机号" value="phone"></el-option>
+                <el-option label="昵称" value="nickName"></el-option>
+                <el-option label="姓名" value="name"></el-option>
+              </el-select>
+            </el-input>
+          </el-form-item>
+        </el-col>
+        <el-col :span="6">
+          <el-form-item label="服务分类">
+            <el-select style="width: 280px" v-model="orderForm.categoryId" clearable>
+              <el-option v-for="item in serveTypes" :label="item.name" :value="item.id"></el-option>
+            </el-select>
+          </el-form-item>
+        </el-col>
+        <el-col :span="6">
+          <el-form-item label="项目名称">
+            <el-input style="width: 280px" v-model="orderForm.projectName" clearable></el-input>
+          </el-form-item>
+        </el-col>
+        <el-col :span="6">
+          <el-form-item label="商户信息">
+            <el-input style="width: 280px" v-model="orderForm.merchantKeyword" placeholder="请填写" clearable>
+              <el-select style="width: 100px" v-model="orderForm.merchantSearchType" slot="prepend" placeholder="请选择">
+                <el-option label="手机号" value="phone"></el-option>
+                <el-option label="昵称" value="nickName"></el-option>
+                <el-option label="姓名" value="name"></el-option>
+              </el-select>
+            </el-input>
+          </el-form-item>
+        </el-col>
+        <el-col :span="6">
+          <el-form-item label="支付方式">
+            <el-select style="width: 280px" v-model="orderForm.paymentMethod" clearable>
+              <el-option label="购物卡支付" value="0"></el-option>
+              <el-option label="微信支付" value="1"></el-option>
+            </el-select>
+          </el-form-item>
+        </el-col>
+        <el-col :span="6">
+          <el-form-item label="订单归属">
+            <el-select style="width: 280px" v-model="orderForm.e" clearable>
+              <el-option label="1" value="1"></el-option>
+            </el-select>
+          </el-form-item>
+        </el-col>
 
-        <DispatchOrderDialog ref="dispatchDialogRefs" />
+        <el-col :span="6">
+          <el-button type="primary" @click="handleSearch">搜索</el-button>
+          <el-button @click="handleReset">重置</el-button>
+        </el-col>
+      </el-row>
+    </el-form>
+    <div class="btns">
+      <div class="type">
+        <span class="typeItem" :class="{ 'active': typeIndex === index }" @click="handleTypeIndex(item, index)"
+          v-for="(item, index) in typeList">{{ item.name }}</span>
+      </div>
+    </div>
+    <el-table :data="table">
+      <el-table-column label="订单信息" width="200">
+        <template #default="{ row }">
+          <div class="orderNum">{{ row.orderNo }}</div>
+          <div class="orderTime">下单时间:{{ row.orderTime }}</div>
+        </template>
+      </el-table-column>
+      <el-table-column label="服务项目" width="340">
+        <template #default="{ row }">
+          <div class="serveProject">
+            <div class="photo">
+              <image-preview :src="row.ccover" :width="80" :height="80" />
+            </div>
+            <div class="message">
+              <div class="title">{{ row.projectName }}</div>
+              <div class="type">{{ row.projectDuration }}分钟</div>
+              <div class="serveTime">服务时间:2025.12.02 12:00-13:00</div>
+            </div>
+          </div>
+        </template>
+      </el-table-column>
+      <el-table-column label="单价/数量" width="130">
+        <template #default="{ row }">
+          <div class="orderNum">{{ row.unitPrice }}/{{ row.unitName }}</div>
+          <div class="orderTime">×{{ row.quantity }}</div>
+        </template>
+      </el-table-column>
+      <el-table-column label="订单金额" width="240">
+        <template #default="{ row }">
+          <div class="orderNum">¥{{ row.orderAmount }}(含出行费:¥{{ row.trafficFee }})</div>
+          <div class="orderTime">{{ row.status == 0 ? '--' : row.paymentMethodName }}</div>
+        </template>
+      </el-table-column>
+      <el-table-column label="联系信息" width="200">
+        <template #default="{ row }">
+          <div class="connectMsg">用户:{{ row.userNickName }}</div>
+          <div class="connectMsg" v-if="row.contactPersonName">联系人:{{ row.contactPersonName[0] }} 男 {{
+            row.contactPhoneMasked }}</div>
+          <div class="connectMsg connectAddress">地址:{{ row.contactAddressInfo }}</div>
+        </template>
+      </el-table-column>
+      <el-table-column label="状态">
+        <template #default="{ row }">
+          <!-- <div class="orderNum">状态</div> -->
+          <div class="orderNum">{{ row.execStatusName }}</div>
+        </template>
+      </el-table-column>
+      <el-table-column label="服务商户">
+        <template #default="{ row }">
+          <div class="orderNum">姓名:{{ row.merchantName }}</div>
+          <div class="orderNum">手机号:{{ row.merchantPhone }}</div>
+        </template>
+      </el-table-column>
+      <el-table-column label="操作" fixed="right" width="120">
+        <template #default="{ row }">
+          <el-dropdown @command="(command) => clickMenuItem(command, row)">
+            <span class="el-dropdown-link">
+              <el-button size="small" type="text">操作<i class="el-icon-arrow-down el-icon--right"></i></el-button>
+            </span>
+            <el-dropdown-menu slot="dropdown">
+              <el-dropdown-item command="view" @click="handleView(row)">详情</el-dropdown-item>
+              <el-dropdown-item command="allot" v-if="row.status == 1" @click="handleAllot(row)">分配</el-dropdown-item>
+              <el-dropdown-item command="del" v-if="row.status == 0 || row.status == 1 || row.status == 6"
+                @click="handleDel(row)">删除</el-dropdown-item>
+              <el-dropdown-item command="refund" v-if="row.status == 2 || row.status == 3 || row.status == 4 || row.status == 5"
+                @click="handleRefund(row)">退款</el-dropdown-item>
+              <el-dropdown-item command="exchange" v-if="row.status == 2"
+                @click="handleExchange(row)">更换商户</el-dropdown-item>
+            </el-dropdown-menu>
+          </el-dropdown>
+        </template>
+      </el-table-column>
+    </el-table>
+    <div class="pagination">
+      <el-pagination v-show="total > 0" background @size-change="handleSizeChange" @current-change="handleCurrentChange"
+        :current-page="orderForm.current" :page-size="orderForm.size" layout="total, sizes, prev, pager, next, jumper"
+        :total="total" />
     </div>
+
+    <DispatchOrderDialog ref="dispatchDialogRefs" />
+  </div>
 </template>
 
 <script>
 import DispatchOrderDialog from '@/views/mapDemo/components/DispatchOrderDialog.vue'
-
+import { serviceCategory, orderPage, orderDetail } from '@/api/order/serviceOrder'
 const MOCK_ORDER = {
-    cId: '1',
-    orderNo: 'ORD20260601001',
-    cName: '张三',
-    cPhone: '13800138001',
-    cAddress: '北京市东城区王府井大街88号',
-    category: '按摩',
-    region: 'city',
-    arrivalLongitude: 116.297428,
-    arrivalLatitude: 39.90923,
-    dispatchStatus: 'pending'
+  cId: '1',
+  orderNo: 'ORD20260601001',
+  cName: '张三',
+  cPhone: '13800138001',
+  cAddress: '北京市东城区王府井大街88号',
+  category: '按摩',
+  region: 'city',
+  arrivalLongitude: 116.297428,
+  arrivalLatitude: 39.90923,
+  dispatchStatus: 'pending'
 }
 export default {
-    name: "serveOrder",
-    components: { DispatchOrderDialog },
-    data() {
-        return {
-            orderForm: {
-                current: 1,
-                size: 10,
-            },
-            total: 1,
-            typeIndex: 0,
-            typeList: [
-                {
-                    name: '全部'
-                },
-                {
-                    name: '待派单'
-                }
-            ],
-            table: [
-                {}
-            ],
-            allotDialogShow: false
+  name: "serveOrder",
+  components: { DispatchOrderDialog },
+  data() {
+    return {
+      serveTypes: [],
+      orderForm: {
+        current: 1,
+        size: 10,
+        userSearchType: 'phone',
+        merchantSearchType: 'nickName',
+      },
+      orderStatus: [
+        { value: 0, label: "待支付" },
+        { value: 1, label: "待派单" },
+        { value: 2, label: "待接单" },
+        { value: 3, label: "待服务" },
+        { value: 4, label: "服务中" },
+        { value: 5, label: "已完成" },
+        { value: 6, label: "已取消" },
+      ],
+      total: 1,
+      typeIndex: 0,
+      typeList: [
+        { name: '全部' },
+        { value: 0, name: "待接单" },
+        { value: 1, name: "待派单" },
+        { value: 2, name: "待接单" },
+        { value: 3, name: "待服务" },
+        { value: 4, name: "服务中" },
+        { value: 5, name: "已完成" },
+        { value: 6, name: "已取消" },
+      ],
+      table: [
+        {}
+      ],
+      allotDialogShow: false
+    }
+  },
+  methods: {
+    //初始化数据
+    initData() {
+      let params = {
+        current: this.orderForm.current,
+        size: this.orderForm.size,
+        orderNo: this.orderForm.orderNo,
+        projectName: this.orderForm.projectName,
+        merchantSearchType: this.orderForm.merchantSearchType,
+        merchantKeyword: this.orderForm.merchantKeyword,
+        startTime: this.orderForm.createTime?.[0],
+        endTime: this.orderForm.createTime?.[1],
+        userSearchType: this.orderForm.userSearchType,
+        userKeyword: this.orderForm.userKeyword,
+        categoryId: this.orderForm.categoryId,
+        paymentMethod: this.orderForm.paymentMethod,
+        status: this.typeList[this.typeIndex].value || null,
+      }
+      orderPage(params).then(res => {
+        if (res.code === 200) {
+          this.table = res.data.records
+          this.total = res.data.total
         }
-    },
-    methods: {
-        initData() {
-
-        },
-        handleSearch() {
-            this.orderForm.current = 1
-            this.orderForm.size = 10
-            this.initData();
-        },
-        handleReset() {
-            this.orderForm.current = 1
-            this.orderForm.size = 10
-            this.initData();
-        },
-        handleTypeIndex(item, index) {
-            this.typeIndex = index
-        },
-        handleSizeChange(size) {
-            this.orderForm.size = size
-            this.initData();
-        },
-        handleCurrentChange(page) {
-            this.orderForm.current = page
-            this.initData();
-        },
-        handleView(row) {
-            this.$router.push({
-                path: '/order/orderDetail',
-                query: {
-                    id: row.id
-                }
-            })
-        },
-        handleAllot(row) {
-            this.allotDialogShow = true
-            this.$nextTick(() => {
-                this.$refs.dispatchDialogRefs.open(MOCK_ORDER)
-            })
-        },
-        handleDel(row) {
-            this.$confirm('被删除的订单可以通过「订单回收站」查找并恢复', '是否确认删除?', {
-                type: 'warning',
-                confirmButtonText: '确认删除'
-            })
-                .then(() => {
-                    this.$modal.msgSuccess("删除成功");
-                })
-                .catch(() => {
+      })
 
-                });
-        },
-        handleRefund(row) {
-            this.$confirm('是否确认退款?', '系统提示', {
-                type: 'warning',
-                confirmButtonText: '确认'
-            })
-                .then(() => {
-                    this.$modal.msgSuccess("申请退款中...");
-                })
-                .catch(() => {
+    },
+    //删除服务订单
+    handleDel(row) {
+      orderDetail(row.id).then(res => {
+        if (res.code == 200) {
+          this.$message({
+            message: res.msg,
+            type: 'success'
+          });
+          this.initData();
+        } else {
+          this.$message({
+            message: res.msg,
+            type: 'error'
+          });
+        }
+      })
+    },
+    //获取服务类型
+    serviceCategoryFun() {
+      serviceCategory().then(res => {
+        if (res.code === 200) {
+          this.serveTypes = res.data
+        }
+      })
+    },
+    handleSearch() {
+      this.orderForm.current = 1
+      this.orderForm.size = 10
+      this.initData();
+    },
+    handleReset() {
+      this.orderForm.current = 1
+      this.orderForm.size = 10
+      this.initData();
+    },
+    handleTypeIndex(item, index) {
+      this.typeIndex = index
+    },
+    handleSizeChange(size) {
+      this.orderForm.size = size
+      this.initData();
+    },
+    handleCurrentChange(page) {
+      this.orderForm.current = page
+      this.initData();
+    },
+    handleView(row) {
+      this.$router.push({
+        path: '/order/orderDetail',
+        query: {
+          id: row.id
+        }
+      })
+    },
+    handleAllot(row) {
+      this.allotDialogShow = true
+      this.$nextTick(() => {
+        this.$refs.dispatchDialogRefs.open(MOCK_ORDER)
+      })
+    },
+    handleDel(row) {
+      this.$confirm('被删除的订单可以通过「订单回收站」查找并恢复', '是否确认删除?', {
+        type: 'warning',
+        confirmButtonText: '确认删除'
+      })
+        .then(() => {
+          this.$modal.msgSuccess("删除成功");
+        })
+        .catch(() => {
 
-                });
-        },
-        handleExchange(row) {
-            this.allotDialogShow = true
-            this.$nextTick(() => {
-                this.$refs.dispatchDialogRefs.open(MOCK_ORDER)
-            })
-        },
-        clickMenuItem(command, row) {
-            switch (command) {
-                case 'view':
-                    this.handleView(row)
-                    break;
-                case 'allot':
-                    this.handleAllot(row)
-                    break;
-                case 'del':
-                    this.handleDel(row)
-                    break;
-                case 'refund':
-                    this.handleRefund(row)
-                    break;
-                case 'exchange':
-                    this.handleExchange(row)
-                    break;
+        });
+    },
+    handleRefund(row) {
+      this.$confirm('是否确认退款?', '系统提示', {
+        type: 'warning',
+        confirmButtonText: '确认'
+      })
+        .then(() => {
+          refundApply(row.id).then(res => {
+            if (res.code == 200) {
+              this.$message({
+                message: res.msg,
+                type: 'success'
+              });
+              this.initData();
+            } else {
+              this.$message({
+                message: res.msg,
+                type: 'error'
+              });
             }
-        }
+          })
+        })
+        .catch(() => {
+
+        });
+    },
+    handleExchange(row) {
+      this.allotDialogShow = true
+      this.$nextTick(() => {
+        this.$refs.dispatchDialogRefs.open(MOCK_ORDER)
+      })
     },
-    mounted() {
-        this.initData();
+    clickMenuItem(command, row) {
+      switch (command) {
+        case 'view':
+          this.handleView(row)
+          break;
+        case 'allot':
+          this.handleAllot(row)
+          break;
+        case 'del':
+          this.handleDel(row)
+          break;
+        case 'refund':
+          this.handleRefund(row)
+          break;
+        case 'exchange':
+          this.handleExchange(row)
+          break;
+      }
     }
+  },
+  mounted() {
+    this.initData();
+    this.serviceCategoryFun();
+  }
 }
 </script>
 
 <style scoped lang="scss">
-.btns{
-    margin: 20px 0;
+.btns {
+  margin: 20px 0;
+  display: flex;
+  align-items: center;
+  justify-content: flex-start;
+
+  .type {
     display: flex;
     align-items: center;
     justify-content: flex-start;
-    .type{
-        display: flex;
-        align-items: center;
-        justify-content: flex-start;
-        .typeItem{
-            padding: 5px 15px;
-            font-size: 14px;
-            margin: 0 10px 0 0;
-            cursor: pointer;
-            border-bottom: 1px solid #ffffff;
-        }
-        .active{
-            border-bottom: 1px solid #1890ff;
-        }
+
+    .typeItem {
+      padding: 5px 15px;
+      font-size: 14px;
+      margin: 0 10px 0 0;
+      cursor: pointer;
+      border-bottom: 1px solid #ffffff;
     }
+
+    .active {
+      border-bottom: 1px solid #1890ff;
+    }
+  }
 }
-.orderNum{
-    font-size: 14px;
-    color: black;
+
+.orderNum {
+  font-size: 14px;
+  color: black;
 }
-.orderTime{
-    font-size: 12px;
+
+.orderTime {
+  font-size: 12px;
 }
-.serveProject{
-    display: flex;
-    align-items: center;
-    justify-content: flex-start;
-    .photo{
-        margin-right: 10px;
+
+.serveProject {
+  display: flex;
+  align-items: center;
+  justify-content: flex-start;
+
+  .photo {
+    margin-right: 10px;
+  }
+
+  .message {
+    width: calc(100% - 90px);
+    color: black;
+
+    .title {
+      width: 100%;
+      overflow: hidden;
+      white-space: nowrap;
+      text-overflow: ellipsis;
+      font-size: 14px;
     }
-    .message{
-        width: calc(100% - 90px);
-        color: black;
-        .title{
-            width: 100%;
-            overflow: hidden;
-            white-space: nowrap;
-            text-overflow: ellipsis;
-            font-size: 14px;
-        }
-        .type{
-            font-size: 14px;
-        }
-        .serveTime{
-            font-size: 12px;
-        }
+
+    .type {
+      font-size: 14px;
     }
+
+    .serveTime {
+      font-size: 12px;
+    }
+  }
 }
-.connectMsg{
-    width: 100%;
-    color: black;
-    font-size: 14px;
+
+.connectMsg {
+  width: 100%;
+  color: black;
+  font-size: 14px;
 }
-.connectAddress{
-    overflow: hidden;
-    white-space: nowrap;
-    text-overflow: ellipsis;
+
+.connectAddress {
+  overflow: hidden;
+  white-space: nowrap;
+  text-overflow: ellipsis;
 }
 
-.pagination{
-    margin-top: 20px;
-    display: flex;
-    align-items: center;
-    justify-content: flex-end;
+.pagination {
+  margin-top: 20px;
+  display: flex;
+  align-items: center;
+  justify-content: flex-end;
 }
 </style>

+ 1 - 1
src/views/serve/category.vue

@@ -93,7 +93,7 @@
             >
                 <el-form-item label="服务标签" prop="serviceTag">
                     <el-select style="width: 240px" v-model="addForm.serviceTag" clearable>
-                        <el-option v-for="item in dict.type.service_tag" :label="item.label" :value="item.value"></el-option>
+                        <el-option v-for="item in dict.type.service_tag" :label="item.label" :value="Number(item.value)"></el-option>
                     </el-select>
                 </el-form-item>
                 <el-form-item label="服务名称" prop="name">

+ 3 - 3
src/views/serve/project.vue

@@ -35,10 +35,10 @@
             :data="table"
         >
             <el-table-column prop="id" label="项目编号" width="150"></el-table-column>
-            <el-table-column prop="ctitle" label="标题" width="150"></el-table-column>
-            <el-table-column prop="ccover" label="图片" width="150">
+            <el-table-column prop="title" label="标题" width="150"></el-table-column>
+            <el-table-column prop="cover" label="图片" width="150">
                 <template #default="{ row }">
-                    <image-preview :src="row.ccover" :width="120" :height="120" />
+                    <image-preview :src="row.cover" :width="120" :height="120" />
                 </template>
             </el-table-column>
             <el-table-column prop="priceMin" label="最低价" width="80"></el-table-column>

+ 43 - 12
src/views/tenant/attendance/index.vue

@@ -8,7 +8,7 @@
             <el-row :gutter="20">
                 <el-col :span="6">
                     <el-form-item label="商户姓名">
-                        <el-input style="width: 240px" v-model="attendanceForm.name" clearable></el-input>
+                        <el-input style="width: 240px" v-model="attendanceForm.merchantName" clearable></el-input>
                     </el-form-item>
                 </el-col>
                 <el-col :span="6">
@@ -27,8 +27,9 @@
                 </el-col>
                 <el-col :span="6">
                     <el-form-item label="考勤状态">
-                        <el-select style="width: 240px" v-model="attendanceForm.sex" clearable>
-                            <el-option label="1" value="1"></el-option>
+                        <el-select style="width: 240px" v-model="attendanceForm.attendanceStatus" clearable>
+                            <el-option label="正常" value="1"></el-option>
+                            <el-option label="异常" value="2"></el-option>
                         </el-select>
                     </el-form-item>
                 </el-col>
@@ -41,20 +42,20 @@
         <el-table
             :data="table"
         >
-            <el-table-column prop="id" label="日期"></el-table-column>
-            <el-table-column prop="ctitle" label="商户姓名"></el-table-column>
-            <el-table-column prop="ctitle" label="工作时间">
+            <el-table-column prop="attendanceDate" label="日期"></el-table-column>
+            <el-table-column prop="merchantName" label="商户姓名"></el-table-column>
+            <el-table-column prop="totalWorkDurationText" label="工作时间">
                 <template #default="{ row }">
                     <el-button type="text" @click="handleView(row)">查看</el-button>
                 </template>
             </el-table-column>
             <el-table-column prop="priceMin" label="考勤状态">
                 <template #default="{ row }">
-
+                    {{ row.attendanceStatus == 1 ? '正常' : '异常' }}
                 </template>
             </el-table-column>
-            <el-table-column prop="dprice" label="日累计工作时长"></el-table-column>
-            <el-table-column prop="dprice" label="扣款金额"></el-table-column>
+            <el-table-column prop="totalWorkDurationText" label="日累计工作时长"></el-table-column>
+            <el-table-column prop="deductionAmount" label="扣款金额"></el-table-column>
         </el-table>
         <div class="pagination">
             <el-pagination
@@ -76,15 +77,16 @@
             <el-table
                 :data="workTable"
             >
-                <el-table-column prop="a" label="上班时间"></el-table-column>
-                <el-table-column prop="a" label="下班时间"></el-table-column>
-                <el-table-column prop="a" label="工作时长"></el-table-column>
+                <el-table-column prop="attendanceStartTime" label="上班时间"></el-table-column>
+                <el-table-column prop="attendanceEndTime" label="下班时间"></el-table-column>
+                <el-table-column prop="totalWorkDurationText" label="工作时长"></el-table-column>
             </el-table>
         </el-dialog>
     </div>
 </template>
 
 <script>
+import { queryDailyAttendance, queryDailyWorkTime } from '@/api/tenant/attendance'
 export default {
     name: "attendance",
     data() {
@@ -105,6 +107,24 @@ export default {
     },
     methods: {
         initData() {
+          let params = {
+                current: this.attendanceForm.current,
+                size: this.attendanceForm.size,
+                merchantName: this.attendanceForm.merchantName,
+                beginDate: this.attendanceForm.dateRange?.[0],
+                endDate: this.attendanceForm.dateRange?.[1],
+                attendanceStatus: this.attendanceForm.attendanceStatus
+            }
+          queryDailyAttendance({
+            ...params
+          }).then(res => {
+            if(res.code == 200) {
+              this.table = res.data.records
+              this.total = res.data.total
+            } else {
+              this.$message.error(res.msg)
+            }
+          })
 
         },
         handleSizeChange(size) {
@@ -123,9 +143,20 @@ export default {
         },
         handleView(row) {
             this.dialogShow = true
+            queryDailyWorkTime({
+                merchantId: row.merchantId,
+                attendanceDate: row.attendanceDate
+            }).then(res => {
+                if(res.code == 200) {
+                    this.workTable = res.data
+                } else {
+                    this.$message.error(res.msg)
+                }
+            })
         },
     },
     mounted() {
+      this.initData();
 
     }
 }

+ 1 - 1
src/views/tenant/enterAudit/index.vue

@@ -69,7 +69,7 @@
             <el-table-column prop="teNickName" label="昵称" width="150"></el-table-column>
             <el-table-column prop="teSex" label="性别">
                 <template #default="{ row }">
-                    <dict-tag :options="dict.type.sys_user_sex" :value="`${row.sex}`"/>
+                    <dict-tag :options="dict.type.sys_user_sex" :value="`${row.teSex}`"/>
                 </template>
             </el-table-column>
             <el-table-column prop="tePhone" label="电话"></el-table-column>

+ 90 - 35
src/views/tenant/skillAudit/index.vue

@@ -5,34 +5,35 @@
             label-width="68px"
             :inline="true"
         >
-            <el-row :gutter="20">
+            <el-row :gutter="10">
                 <el-col :span="6">
                     <el-form-item label="姓名">
-                        <el-input style="width: 240px" v-model="auditForm.name" clearable></el-input>
+                        <el-input style="width: 240px" v-model="auditForm.merchantName" clearable></el-input>
                     </el-form-item>
                 </el-col>
                 <el-col :span="6">
                     <el-form-item label="昵称">
-                        <el-input style="width: 240px" v-model="auditForm.nickName" clearable></el-input>
+                        <el-input style="width: 240px" v-model="auditForm.merchantNickName" clearable></el-input>
                     </el-form-item>
                 </el-col>
                 <el-col :span="6">
                     <el-form-item label="用户类型">
-                        <el-select style="width: 240px" v-model="auditForm.type" clearable>
-                            <el-option label="1" value="1"></el-option>
+                        <el-select style="width: 240px" v-model="auditForm.techType" clearable>
+                            <el-option label="虚拟用户" value="1"></el-option>
+                            <el-option label="正式用户" value="0"></el-option>
                         </el-select>
                     </el-form-item>
                 </el-col>
                 <el-col :span="6">
                     <el-form-item label="商户电话">
-                        <el-input style="width: 240px" v-model="auditForm.phone" clearable></el-input>
+                        <el-input style="width: 240px" v-model="auditForm.merchantPhone" clearable></el-input>
                     </el-form-item>
                 </el-col>
                 <el-col :span="6">
                     <el-form-item label="申请时间">
                         <el-date-picker
                             style="width: 240px"
-                            v-model="auditForm.dateRange"
+                            v-model="auditForm.applyTime"
                             type="daterange"
                             range-separator="至"
                             start-placeholder="开始日期"
@@ -44,12 +45,12 @@
                 </el-col>
                 <el-col :span="6">
                     <el-form-item label="性别">
-                        <el-select style="width: 240px" v-model="auditForm.sex" clearable>
+                        <el-select style="width: 240px" v-model="auditForm.merchantSex" clearable>
                             <el-option v-for="item in dict.type.sys_user_sex" :label="item.label" :value="item.value"></el-option>
                         </el-select>
                     </el-form-item>
                 </el-col>
-                <el-col :span="6">
+                <!-- <el-col :span="6">
                     <el-form-item label="审批时间">
                         <el-date-picker
                             style="width: 240px"
@@ -62,7 +63,7 @@
                             clearable
                         ></el-date-picker>
                     </el-form-item>
-                </el-col>
+                </el-col> -->
                 <el-col :span="6">
                     <el-button type="primary" @click="handleSearch">搜索</el-button>
                     <el-button @click="handleReset">重置</el-button>
@@ -77,23 +78,23 @@
         <el-table
             :data="table"
         >
-            <el-table-column prop="id" label="商户ID" width="150"></el-table-column>
-            <el-table-column prop="ctitle" label="姓名" width="150"></el-table-column>
-            <el-table-column prop="ctitle" label="昵称" width="150"></el-table-column>
-            <el-table-column prop="ccover" label="性别">
+            <el-table-column prop="merchantId" label="商户ID" width="150"></el-table-column>
+            <el-table-column prop="merchantName" label="姓名" width="150"></el-table-column>
+            <el-table-column prop="merchantNickName" label="昵称" width="150"></el-table-column>
+            <el-table-column prop="merchantSex" label="性别">
                 <template #default="{ row }">
-                    <dict-tag :options="dict.type.sys_user_sex" :value="`${row.sex}`"/>
+                    <dict-tag :options="dict.type.sys_user_sex" :value="`${row.merchantSex}`"/>
                 </template>
             </el-table-column>
-            <el-table-column prop="priceMin" label="电话"></el-table-column>
-            <el-table-column prop="priceMax" label="形象照">
+            <el-table-column prop="merchantPhone" label="电话"></el-table-column>
+            <el-table-column prop="merchantAvatar" label="形象照">
                 <template #default="{ row }">
-                    <image-preview :src="row.ccover" :width="120" :height="120" />
+                    <image-preview :src="row.merchantAvatar" :width="120" :height="120" />
                 </template>
             </el-table-column>
-            <el-table-column prop="dprice" label="用户类型"></el-table-column>
-            <el-table-column prop="createTime" label="申请时间"></el-table-column>
-            <el-table-column prop="createTime" label="注册时间"></el-table-column>
+            <el-table-column prop="techTypeName" label="用户类型"></el-table-column>
+            <el-table-column prop="applyTime" label="申请时间"></el-table-column>
+            <el-table-column prop="registerTime" label="注册时间"></el-table-column>
             <el-table-column label="操作" fixed="right" width="120">
                 <template #default="{ row }">
                     <el-button size="small" type="text" icon="el-icon-document-checked" @click="handleAudit(row)">审核</el-button>
@@ -120,14 +121,14 @@
             <el-table
                 :data="projectTable"
             >
-                <el-table-column prop="a" label="项目名称"></el-table-column>
-                <el-table-column prop="a" label="开通理由"></el-table-column>
-                <el-table-column prop="a" label="申请时间"></el-table-column>
-                <el-table-column prop="a" label="审核结果"></el-table-column>
-                <el-table-column prop="a" label="备注"></el-table-column>
-                <el-table-column prop="a" label="操作" width="80">
+                <el-table-column prop="projectName" label="项目名称"></el-table-column>
+                <el-table-column prop="applyReason" label="开通理由"></el-table-column>
+                <el-table-column prop="applyTime" label="申请时间"></el-table-column>
+                <el-table-column prop="auditStatusName" label="审核结果"></el-table-column>
+                <el-table-column prop="remark" label="备注"></el-table-column>
+                <el-table-column  label="操作" width="80">
                     <template #default="{ row }">
-                        <el-button type="text" @click="handleProjectAudit(row)">审核</el-button>
+                        <el-button type="text" v-if="row.auditStatus != 1" @click="handleProjectAudit(row)">审核</el-button>
                     </template>
                 </el-table-column>
             </el-table>
@@ -143,14 +144,14 @@
                 label-width="120px"
                 :rules="addRules"
             >
-                <el-form-item label="审核意见" prop="a">
-                    <el-radio-group v-model="addForm.a">
+                <el-form-item label="审核意见" prop="auditStatus">
+                    <el-radio-group v-model="addForm.auditStatus">
                         <el-radio label="1">审核通过</el-radio>
                         <el-radio label="2">审核驳回</el-radio>
                     </el-radio-group>
                 </el-form-item>
-                <el-form-item label="审核备注" prop="b">
-                    <el-input type="textarea" show-word-limit maxlength="200" v-model="addForm.b" clearable></el-input>
+                <el-form-item label="审核备注" prop="auditRemark">
+                    <el-input type="textarea" show-word-limit maxlength="200" v-model="addForm.auditRemark" clearable></el-input>
                 </el-form-item>
             </el-form>
             <template #footer>
@@ -162,6 +163,7 @@
 </template>
 
 <script>
+import { list, projects,submit } from '@/api/tenant/skillAudit'
 export default {
     name: "audit",
     dicts: ['sys_user_sex'],
@@ -169,7 +171,7 @@ export default {
         return {
             auditForm: {
                 current: 1,
-                size: 10
+                size: 10,
             },
             typeList: [
                 {
@@ -196,6 +198,29 @@ export default {
     },
     methods: {
         initData() {
+          let params = {
+                current: this.auditForm.current,
+                size: this.auditForm.size,
+                merchantName: this.auditForm.merchantName,
+                techType: this.auditForm.techType,
+                merchantPhone: this.auditForm.merchantPhone,
+                techType: this.auditForm.techType,
+                merchantSex: this.auditForm.merchantSex,
+
+                beginApplyTime: this.auditForm.applyTime?.[0],
+                endApplyTime: this.auditForm.applyTime?.[1],
+                teSex: this.auditForm.teSex,
+            }
+            list({
+                ...params
+            }).then(res => {
+                if(res.code == 200) {
+                    this.table = res.data.records
+                    this.total = res.data.total
+                } else {
+                    this.$message.error(res.msg)
+                }
+            })
 
         },
         handleSizeChange(size) {
@@ -217,19 +242,49 @@ export default {
         },
         handleAudit(row) {
             this.dialogProjectShow = true
+            projects(row.merchantId).then(res => {
+                if(res.code == 200) {
+                    this.projectTable = res.data
+                } else {
+                    this.$message.error(res.msg)
+                }
+            })
         },
         handleProjectAudit(row) {
             this.dialogShow = true
+            this.addForm={}
+            this.addForm.projectAuditId = row.projectAuditId
+
         },
         handleCancel() {
             this.dialogShow = false
         },
         handleSave() {
-            this.dialogShow = false
+            if(!this.addForm.auditStatus) {
+                this.$message.error('请选择审核意见')
+                return
+            }
+            if(!this.addForm.auditRemark) {
+                this.$message.error('请输入审核备注')
+                return
+            }
+
+            submit(this.addForm.projectAuditId,{
+              auditStatus: this.addForm.auditStatus,
+              auditRemark: this.addForm.auditRemark
+            }).then(res => {
+                if(res.code == 200) {
+                  this.dialogShow = false
+                    this.$message.success(res.msg)
+                    this.initData();
+                } else {
+                    this.$message.error(res.msg)
+                }
+            })
         }
     },
     mounted() {
-
+        this.initData();
     }
 }
 </script>