Parcourir la source

根据流程修改弹窗按钮显示
对接 生成小程序码接口
对接 线下消费订单修改接口
对接 线下消费订单退款接口
对接 线下消费订单确认订单接口
对接 线下消费订单回收站列表接口
增加 查看详情
增加 查看操作流程日志

suixueyan il y a 8 mois
Parent
commit
a2c2246e1e

+ 34 - 0
src/plugins/api/shopping/order.js

@@ -88,6 +88,23 @@ export function orderExpenseAddApi(data) {
     data,
   });
 }
+//店内订单创建
+export function getQRCode(data) {
+  return request({
+    url: "/wechat/wxapp/qrcode",
+    method: "post",
+    data,
+  });
+}
+
+//店内订单修改
+export function orderExpenseEditApi(data) {
+  return request({
+    url: "/shop/expense/edit",
+    method: "post",
+    data,
+  });
+}
 //店内订单列表
 export function orderExpenseListApi(data) {
   return request({
@@ -96,6 +113,14 @@ export function orderExpenseListApi(data) {
     data,
   });
 }
+//店内订单列表 回收
+export function orderExpenseTrashListApi(data) {
+  return request({
+    url: "/shop/expense/trash",
+    method: "post",
+    data,
+  });
+}
 
 //店内订单删除
 export function orderExpenseDelApi(data) {
@@ -104,4 +129,13 @@ export function orderExpenseDelApi(data) {
     method: "post",
     data,
   });
+}
+
+//店内订单确认支付
+export function orderExpensePayApi(data) {
+  return request({
+    url: "/shop/expense/pay",
+    method: "post",
+    data,
+  });
 }

+ 63 - 58
src/views/orders/Offline.vue

@@ -2,33 +2,32 @@
   <section v-loading="loading">
     <el-tabs
       type="border-card"
-      v-model="searchForm.payment_status"
+      v-model="searchForm.payment_type"
       class="manage-order"
       @tab-change="tabChange"
     >
       <el-tab-pane label="全部" name="all"> </el-tab-pane>
-      <el-tab-pane label="已付款" :name="1"> </el-tab-pane>
-      <el-tab-pane label="未付款" :name="0"> </el-tab-pane>
+      <el-tab-pane label="回收站" name="del"> </el-tab-pane>
     </el-tabs>
     <div class="manage-order-content">
       <div class="manage-shopping-title">
         <div class="manage-shopping-title-left" style="white-space: nowrap">
           <el-form inline>
-<!--            <el-form-item label="订单状态" prop="status" style="width: 240px">-->
-<!--              <el-select clearable-->
-<!--                         v-model="searchForm.status"-->
-<!--                         filterable-->
-<!--                         placeholder="请输入订单状态"-->
-
-<!--              >-->
-<!--                <el-option-->
-<!--                    v-for="item in statusList"-->
-<!--                    :key="item.value"-->
-<!--                    :label="item.name"-->
-<!--                    :value="item.value"-->
-<!--                />-->
-<!--              </el-select>-->
-<!--            </el-form-item>-->
+            <el-form-item label="订单状态" prop="status" style="width: 240px">
+              <el-select clearable
+                         v-model="searchForm.status"
+                         filterable
+                         placeholder="请输入订单状态"
+
+              >
+                <el-option
+                    v-for="item in statusList"
+                    :key="item.value"
+                    :label="item.name"
+                    :value="item.value"
+                />
+              </el-select>
+            </el-form-item>
 
               <el-form-item label="用户姓名" prop="customer_id"    style="width: 240px">
                 <el-select clearable
@@ -120,22 +119,6 @@
             </template>
           </el-table-column>
           <el-table-column prop="created_at" label="订单创建时间" width="170" />
-          <el-table-column prop="payment_status" label="收货信息">
-            <template #default="{ row }">
-              <div>
-                {{ row?.send?.address_name }}
-              </div>
-              <div>
-                {{ row?.send?.address_phone }}
-              </div>
-              <div>
-                {{ row?.send?.address_province }}
-                {{ row?.send?.address_city }}
-                {{ row?.send?.address_area }}
-                {{ row?.send?.address_content }}
-              </div>
-            </template>
-          </el-table-column>
           <el-table-column prop="" label="商品信息" show-overflow-tooltip>
             <template #default="{ row }">
               <div v-for="item in row.items">
@@ -148,17 +131,23 @@
 
           <el-table-column
               label="操作"
-              width="100"
+              width="200"
               align="center"
               fixed="right"
           >
             <template #default="{ row }">
-              <el-button type="primary" link  @click="orderExpenseDel(row)">
+              <el-button type="primary" link  @click="orderExpenseDel(row)" v-if="searchForm.payment_type !== 'del'">
                 删除
               </el-button>
-              <el-button type="primary" link   @click="setDeptFun('set',row)">
+              <el-button type="primary" link   @click="setDeptFun('set',row)" v-if="searchForm.payment_type !== 'del'">
                 修改
               </el-button>
+              <el-button type="primary" link   @click="setDeptFun('init',row)" v-if="searchForm.payment_type === 'del'">
+                详情
+              </el-button>
+              <el-button type="warning" link @click="openDialog(row)" >
+                操作日志
+              </el-button>
             </template>
           </el-table-column>
         </el-table>
@@ -190,23 +179,22 @@
 
   <!-- 新增 -->
   <addDialog ref="addDialogRef" @refreshTable="refreshTable" />
+  <dialogLog ref="dialogPageRef" @refreshList="refreshTable" />
 </template>
 <script setup>
 import {
-  orderExpenseListApi,orderExpenseDelApi
+  orderExpenseListApi, orderExpenseDelApi, orderExpenseTrashListApi
 } from "@/plugins/api/shopping/order";
 import { useCounterStore } from "@/stores/counter.js";
-import { shopExportApi } from "@/plugins/api/down";
-import drawerPage from "../shopping/components/DrawerCustom.vue";
 import AddDialog from "@/views/orders/components/AddOffline.vue";
+import dialogLog from "./components/DialogLog.vue";
 import {Plus} from "@element-plus/icons-vue";
 import {ElMessage} from "element-plus";
 import {ref} from "vue";
 import {listApi} from "@/plugins/api/customer/manage/pool";
-
 const store = useCounterStore();
 let searchForm = ref({
-  payment_status: "all",
+  payment_type: "all",
 });
 
 //
@@ -232,13 +220,13 @@ const handleCurrentChange = (val) => {
 function refreshTable() {
   currentPage.value = 1;
   searchForm.value = {
-    payment_status: "all",
+    payment_type: "all",
   };
   tableData.value = [];
   selectData.value = [];
   getData();
 }
-let statusList = ref([{value:"0",name:"未支付"},{value:"1",name:"已付"}]);
+let statusList = ref([{value:"all",name:"全部"},{value:"0",name:"未支付"},{value:"1",name:"已付"}]);
 let poolList = ref({});
 function searchFun() {
   currentPage.value = 1;
@@ -249,7 +237,7 @@ function searchFun() {
 function resetFun() {
   currentPage.value = 1;
   searchForm.value = {
-    payment_status: "all",
+    payment_type: "all",
   };
   tableData.value = [];
   selectData.value = [];
@@ -262,6 +250,11 @@ function addDeptFun(type) {
 function setDeptFun(type,row) {
   addDialogRef.value.initFun(type,row);
 }
+//   操作日志
+let dialogPageRef = ref(null);
+function openDialog(row) {
+  dialogPageRef.value.initFun(row);
+}
 function refreshList() {
   getData();
 }
@@ -278,24 +271,36 @@ function getData() {
   obj.order_date_start = obj.timeArr ? obj.timeArr[0] : "";
   obj.order_date_end = obj.timeArr ? obj.timeArr[1] : "";
   delete obj.timeArr;
-  if (obj.payment_status == "all") obj.payment_status = "";
-  if (obj.payment_status!=''){
-    obj.status=obj.payment_status
-  }
+  if (obj.status === "all") obj.status = "";
+
+
   listApi().then((data) => {
     if (data != null && data.list != null) {
       poolList.value = data.list;
     }
   });
-  orderExpenseListApi(obj)
-    .then((data) => {
-      tableData.value = data.list;
-      total.value = data.page.total;
-      loading.value = false;
-    })
-    .catch(() => {
-      loading.value = false;
-    });
+  if (obj.payment_type === "all"){
+    orderExpenseListApi(obj)
+        .then((data) => {
+          tableData.value = data.list;
+          total.value = data.page.total;
+          loading.value = false;
+        })
+        .catch(() => {
+          loading.value = false;
+        });
+  }else if (obj.payment_type === "del"){
+    orderExpenseTrashListApi(obj)
+        .then((data) => {
+          tableData.value = data.list;
+          total.value = data.page.total;
+          loading.value = false;
+        })
+        .catch(() => {
+          loading.value = false;
+        });
+  }
+
 }
 
 function orderExpenseDel(val) {

+ 78 - 25
src/views/orders/components/AddOffline.vue

@@ -22,6 +22,7 @@
                 <el-form-item label="用户姓名:" prop="customer_id">
                   <el-select clearable
                              v-model="ruleForm.customer_id"
+                             :disabled="pageType==='init'"
                              filterable
                              placeholder="请输入用户姓名"
                              style="width: 240px"
@@ -39,7 +40,7 @@
             <el-row :gutter="20">
               <el-col :span="20">
                 <el-form-item label="房间:" prop="room_no">
-                  <el-input v-model="ruleForm.room_no" style="width: 240px" placeholder="房间"/>
+                  <el-input v-model="ruleForm.room_no" style="width: 240px" placeholder="房间" :disabled="pageType==='init'" />
                 </el-form-item>
               </el-col>
             </el-row>
@@ -97,8 +98,8 @@
               </el-table-column>
               <el-table-column label="数量" min-width="125">
                 <template #default="scope">
-                  <el-input-number
-                      v-model="scope.row.num"
+                  <el-input-number :disabled="pageType==='init'"
+                                   v-model="scope.row.num"
                       :min="0"
                       :max="100"
                       @change="handleChange(scope.row)"
@@ -131,7 +132,7 @@
                 &nbsp;元
               </el-form-item>
               <el-form-item label="折扣:" prop="discount">
-                <el-input-number v-model="discount" :min="0" :precision="2" :step="0.05" :max="1" size="large">
+                <el-input-number :disabled="pageType==='init'" v-model="discount" :min="0" :precision="2" :step="0.05" :max="1" size="large">
                 </el-input-number>
               </el-form-item>
               <el-form-item label="折扣后:" prop="discountedAmount">
@@ -144,11 +145,11 @@
                 &nbsp;元
               </el-form-item>
               <el-form-item label="实际支付:" prop="finalPayment">
-                <el-input-number v-model="finalPayment" :precision="2" :min="0" size="large">
+                <el-input-number v-model="finalPayment" :precision="2" :min="0" size="large" :disabled="pageType==='init'">
                 </el-input-number>
               </el-form-item>
               <el-form-item label="付款方式:" prop="paymentMethod">
-                <el-select clearable
+                <el-select clearable :disabled="pageType==='init'"
                            v-model="paymentMethod"
                            filterable
                            placeholder="请选择"
@@ -166,34 +167,36 @@
 
             </div>
             <div style="  margin-top: 20px;">
-              <div v-if="orderObj.status==0">
+              <div v-if="orderItem.status==null||orderItem.status==0">
                 <el-row>
 
                   <el-col :span="6" :offset="3">
-                    <el-button @click="save" style="width: 100%;" type="primary">保存</el-button>
+
+                    <el-button @click="save" style="width: 100%;" :disabled="pageType==='init'"  type="primary" v-if="!orderItem.id">保存</el-button>
+                    <el-button @click="save" style="width: 100%;" :disabled="pageType==='init'"   type="primary" v-else>修改</el-button>
                   </el-col>
                   <el-col :span="6" :offset="6">
-                    <el-button @click="markAsPaid" style="width: 100%;" type="primary">确认收款</el-button>
+                    <el-button @click="markAsPaid" :disabled="pageType==='init'"  style="width: 100%;" type="primary" v-if="orderItem.payment_type&&orderItem.payment_type!=='balance'">确认收款</el-button>
                   </el-col>
                 </el-row>
               </div>
               <div v-else>
                 <el-row>
                   <el-col :span="4" :offset="2">
-                    <el-button @click="save" style="width: 100%;" type="primary">保存</el-button>
+                    <el-button @click="save" style="width: 100%;"  :disabled="pageType==='init'"  type="primary">保存</el-button>
                   </el-col>
                   <el-col :span="4" :offset="4">
-                    <el-button @click="markAsPaid" style="width: 100%;" disabled type="primary">已收款</el-button>
+                    <el-button @click="markAsPaid" style="width: 100%;" :disabled="pageType==='init'" type="primary">已收款</el-button>
                   </el-col>
                   <el-col :span="4" :offset="4">
-                    <el-button @click="refund" style="width: 100%;" type="danger">退款</el-button>
+                    <el-button @click="refund" style="width: 100%;" :disabled="pageType==='init'"  type="danger">退款</el-button>
                   </el-col>
                 </el-row>
               </div>
             </div>
             <div style="  margin-top: 20px;">
-              <div style="margin: 0 auto ;width: 200px;height: 200px;" v-if="orderObj.id!=0">
-                <el-image style="width: 200px;height: 200px;" :src="404"/>
+              <div style="margin: 0 auto ;width: 200px;height: 200px;"  v-if="pageType!=='init' &&orderItem.payment_type==='balance' && paymentMethod==='1'">
+                <el-image style="width: 200px;height: 200px;" :src="erCodeImg"/>
               </div>
             </div>
           </el-col>
@@ -212,7 +215,13 @@ import {listApi as dictApi} from "@/plugins/api/system/dict";
 import {listApi} from "@/plugins/api/customer/manage/pool";
 import ProductList from "@/views/orders/components/ProductList.vue";
 import {useCounterStore} from "@/stores/counter";
-import {orderExpenseAddApi} from "@/plugins/api/shopping/order";
+import {
+  getQRCode,
+  orderExpenseAddApi,
+  orderExpenseDelApi,
+  orderExpenseEditApi,
+  orderExpensePayApi
+} from "@/plugins/api/shopping/order";
 
 const store = useCounterStore();
 
@@ -256,7 +265,7 @@ const handleClick = async (tab) => {
     addDialogRef = addDialogRefThird.value;
   }
   if (addDialogRef) {
-    addDialogRef.initFun(tab);
+    addDialogRef.initFun(tab,pageType.value);
   }
 }
 let itemList = ref([]);
@@ -349,6 +358,27 @@ const paymentOptions = [
 const paymentMethod = ref('');
 const emit = defineEmits([ 'refreshTable']);
 const orderItem = ref({});
+const erCodeImg = ref("");
+function getWcQrCode() {
+  erCodeImg.value=""
+  const pData = {
+    path: '/subPages/storeConsumption/storeConsumption?orderNo=' + orderItem.value.order_no,
+    type: 'file'
+    // ['api-name']: 'wxapp',
+    // ['api-token']: uni.getStorageSync(`token`)
+  }
+  console.log(pData)
+  getQRCode(pData).then(res => {
+    erCodeImg.value = res.url
+  })
+}
+function orderExpenseDel() {
+  orderExpenseDelApi({order_no:orderItem.value.order_no})
+      .then((res) => {
+        ElMessage.success("退款成功");
+        emit('refreshTable');
+      });
+}
 function save() {
   if (tableData.value.length<1){
     ElMessage.error('清先添加商品');
@@ -381,11 +411,22 @@ function save() {
           "code":item.code,
           "spec":item.selectSuitDisplay})
       })
-      orderExpenseAddApi(obj).then((data) => {
-        orderItem.value=data
-        ElMessage.success("订单创建成功");
-        emit('refreshTable');
-      });
+      if (orderItem.value.id){
+        obj.id=orderItem.value.id
+        orderExpenseEditApi(obj).then((data) => {
+          orderItem.value=data
+          ElMessage.success("订单修改成功");
+          getWcQrCode();
+          emit('refreshTable');
+        });
+      }else{
+        orderExpenseAddApi(obj).then((data) => {
+          orderItem.value=data
+          ElMessage.success("订单创建成功");
+          getWcQrCode();
+          emit('refreshTable');
+        });
+      }
 
     } else {
       // 验证失败
@@ -396,11 +437,19 @@ function save() {
 }
 
 function markAsPaid() {
+  if (!(orderItem.value.payment_type==='balance'  && ruleForm.value.paymentMethod==='1')){
+     ElMessage.error('请先点击修改订单');
+    return
+  }
   // 标记为已收款逻辑
+  orderExpensePayApi({order_no:orderItem.value.order_no,payment_type:orderItem.value.payment_type}).then((data) => {
+    ElMessage.success("确认成功");
+    emit('refreshTable');
+  })
 }
 
 function refund() {
-  // 退款逻辑
+  orderExpenseDel()
 }
 
 function handleClose(done) {
@@ -421,11 +470,12 @@ function handleClose(done) {
 
 let title = ref("");
 let ruleFormRef = ref(null);
+let pageType = ref(null);
 
-function initFun(type, row) {
 
+function initFun(type, row) {
+  erCodeImg.value=""
   console.log(row)
-
   if (ruleFormRef.value) {
     ruleFormRef.value.resetFields();
   }
@@ -441,12 +491,14 @@ function initFun(type, row) {
   handleClick(activeName.value)
   dialogVisible.value = true;
 
-  if (type==="set"){
+  if (type==="set"|| type==="init"){
+    pageType.value=type
     ruleForm.value.customer_id  =row.customer_id
     ruleForm.value.room_no  =row.room_no
     ruleForm.value.paymentMethod = row.payment_type  ==="balance" ? '1': '2'
     paymentMethod.value=ruleForm.value.paymentMethod
     orderItem.value=row
+    getWcQrCode();
   }
 }
 watch(orderItem, (newVal, oldVal) => {
@@ -478,6 +530,7 @@ watch(orderItem, (newVal, oldVal) => {
   }
 });
 
+
 function submit() {
   if (!ruleFormRef.value) return;
   ruleFormRef.value.validate((valid, fields) => {

+ 81 - 0
src/views/orders/components/DialogLog.vue

@@ -0,0 +1,81 @@
+<template>
+  <el-dialog
+    v-model="dialogVisible"
+    title="操作日志"
+    width="30%"
+    :before-close="handleClose"
+  >
+    <div class="sales-dialog">
+      <div style="padding: 20px 10px">
+        <el-timeline>
+          <el-timeline-item
+            v-for="(activity, index) in showForm?.logs"
+            :key="index"
+          >
+            <div style="font-size: 12px; color: rgb(143, 142, 140)">
+              {{ activity.op_username }}
+            </div>
+            <div style="font-size: 12px; color: rgb(143, 142, 140)">
+              {{ activity.op_action }}
+            </div>
+            <div style="font-size: 12px; color: rgb(143, 142, 140)">
+              {{ activity.created_at }}
+            </div>
+          </el-timeline-item>
+        </el-timeline>
+      </div>
+    </div>
+  </el-dialog>
+</template>
+<script setup>
+import {ElMessageBox} from "element-plus";
+let showForm = ref({});
+let dialogVisible = ref(false);
+function handleClose(done) {
+  // dialogVisible.value = false;
+  ElMessageBox.confirm("是否确定关闭此对话框?")
+    .then(() => {
+      done();
+    })
+    .catch(() => {
+      // catch error
+    });
+}
+function initFun(row) {
+  showForm.value = {};
+  showForm.value = { ...row };
+  dialogVisible.value = true;
+}
+
+const emit = defineEmits(["refreshList"]);
+
+onMounted(() => {});
+defineExpose({
+  initFun,
+});
+</script>
+<style scoped lang="scss">
+.sales-dialog {
+  :deep(.el-form-item) {
+    width: 50%;
+    margin-right: 0;
+    padding-right: 10px;
+    box-sizing: border-box;
+
+    .el-input {
+      width: 100%;
+    }
+  }
+
+  .img-box {
+    margin-bottom: 10px;
+
+    .el-image {
+      width: 100%;
+      height: 140px;
+      object-fit: cover;
+      margin-right: 10px;
+    }
+  }
+}
+</style>

+ 4 - 2
src/views/orders/components/ProductList.vue

@@ -32,7 +32,7 @@
               <el-col :span="24" class="product-info">
                 <span class="product-name">{{ item.goods_name }}</span>
                 <span class="product-price">{{ item.price_selling }}元</span>
-                <el-button class="add-to-cart-btn" type="primary" @click="openToCart(item)">添加购物车</el-button>
+                <el-button  :disabled="pageType==='init'" class="add-to-cart-btn" type="primary" @click="openToCart(item)">添加购物车</el-button>
               </el-col>
             </el-row>
           </div>
@@ -101,7 +101,8 @@ const pageSize = ref(12);
 const total = ref(0);
 let mark = ref(["店内服务","店内商品"]);
 let searchForm = ref({});
-function initFun(type, row) {
+let pageType = ref(null);
+function initFun(type,pageType2, row) {
   searchForm.value ={};
   if ("second"==type){
     mark.value = "店内商品";
@@ -110,6 +111,7 @@ function initFun(type, row) {
   }else{
     mark.value = ["店内服务","店内商品"];
   }
+  pageType.value=pageType2
   getData();
 }