From e719d76f10d8b8b3a95437cd5f37458f36bb4abb Mon Sep 17 00:00:00 2001
From: wupengfei <834520024@qq.com>
Date: 星期四, 25 十二月 2025 16:27:57 +0800
Subject: [PATCH] feat: 订单

---
 src/views/EmploymentManage/StandardOrderDetail.vue |  295 +++++++++++++++++++++++++++++++++++++++++++---------------
 1 files changed, 216 insertions(+), 79 deletions(-)

diff --git a/src/views/EmploymentManage/StandardOrderDetail.vue b/src/views/EmploymentManage/StandardOrderDetail.vue
index 3ae7fae..d90ffdb 100644
--- a/src/views/EmploymentManage/StandardOrderDetail.vue
+++ b/src/views/EmploymentManage/StandardOrderDetail.vue
@@ -1,73 +1,113 @@
 <template>
-  <LoadingLayout :loading="state.loading">
+  <LoadingLayout :loading="isLoading">
     <AppScrollContainer>
       <ChunkCell title="鐘舵��">
         <ProForm :model="form" ref="formRef" label-width="120px" :is-read="true">
-          <ProFormItemV2 label="棰勭害鐘舵��:" prop="cooperationStatus">
-            <ProFormRadio v-model="form.access" :value-enum="EnumWalletTransactionStatusText" />
+          <ProFormItemV2 label="棰勭害鐘舵��:" prop="appointmentStatus">
+            <ProFormRadio
+              v-model="form.appointmentStatus"
+              :value-enum="EnumStandardOrderAppointmentStatusText"
+            />
           </ProFormItemV2>
-          <ProFormItemV2 label="璁㈠崟鐘舵��:" prop="cooperationStatus">
-            <ProFormRadio v-model="form.access" :value-enum="EnumWalletTransactionStatusText" />
+          <ProFormItemV2 label="璁㈠崟鐘舵��:" prop="payStatus">
+            <ProFormRadio v-model="form.payStatus" :value-enum="EnumStandardOrderPayStatusText" />
           </ProFormItemV2>
-          <ProFormItemV2 label="缁撶畻鐘舵��:" prop="cooperationStatus">
-            <ProFormRadio v-model="form.access" :value-enum="EnumWalletTransactionStatusText" />
+          <ProFormItemV2 label="缁撶畻鐘舵��:" prop="settlementStatus">
+            <ProFormRadio
+              v-model="form.settlementStatus"
+              :value-enum="EnumStandardOrderSettlementStatusText"
+            />
           </ProFormItemV2>
         </ProForm>
       </ChunkCell>
       <ChunkCell title="璁㈠崟淇℃伅">
         <ProForm :model="form" ref="formRef" label-width="120px" :is-read="true">
-          <ProFormItemV2 label="鏈嶅姟鍗曞彿:" prop="cooperationStatus">
-            <ProFormText v-model.trim="form.access" />
+          <ProFormItemV2 label="鏈嶅姟鍗曞彿:" prop="serviceCode">
+            <ProFormText v-model.trim="form.serviceCode" />
           </ProFormItemV2>
-          <ProFormItemV2 label="涓嬪崟鐢ㄦ埛:" prop="cooperationStatus">
-            <ProFormText v-model.trim="form.access" />
+          <ProFormItemV2 label="涓嬪崟鐢ㄦ埛:" prop="createdUserName">
+            <ProFormText v-model.trim="form.createdUserName" />
           </ProFormItemV2>
-          <ProFormItemV2 label="鏈嶅姟鏃堕棿:" prop="cooperationStatus">
+          <ProFormItemV2 label="鏈嶅姟鏃堕棿:" prop="time">
             <ProFormDatePicker
-              v-model="form.access"
+              v-model="form.time"
               type="date"
-              value-format="YYYY-MM-DD"
+              format="YYYY-MM-DD HH:mm:ss"
               placeholder="璇烽�夋嫨鏃ユ湡"
             ></ProFormDatePicker>
           </ProFormItemV2>
-          <ProFormItemV2 label="鏈嶅姟鍦板潃:" prop="cooperationStatus">
-            <ProFormText v-model.trim="form.access" />
+          <ProFormItemV2 label="鏈嶅姟鍦板潃:" prop="address">
+            <ProFormText v-model.trim="form.address" />
           </ProFormItemV2>
-          <ProFormItemV2 label="鏈嶅姟鏈烘瀯:" prop="cooperationStatus">
-            <ProFormText v-model.trim="form.access" />
+          <ProFormItemV2 label="鏈嶅姟鏈烘瀯:" prop="supplierEnterpriseName">
+            <ProFormText v-model.trim="form.supplierEnterpriseName" />
           </ProFormItemV2>
-          <ProFormItemV2 label="鏈嶅姟浜哄憳:" prop="cooperationStatus">
-            <ProFormText v-model.trim="form.access" />
+          <ProFormItemV2 label="鏈嶅姟浜哄憳:" prop="servers">
+            <ProFormText v-model.trim="form.servers" />
           </ProFormItemV2>
-          <ProFormItemV2 label="澶囨敞:" prop="cooperationStatus">
-            <ProFormText v-model.trim="form.access" />
+          <ProFormItemV2 label="澶囨敞:" prop="remark">
+            <ProFormText v-model.trim="form.remark" />
           </ProFormItemV2>
-          <ProFormItemV2 label="瀹炰粯娆�:" prop="invoiceTaxPointRate">
-            <ProFormInputNumber v-model="form.balance" :controls="false" :min="0" :precision="2" />
+          <ProFormItemV2 label="鏈嶅姟:" prop="remark">
+            <ProTableV2
+              v-bind="proTableProps"
+              :columns="column"
+              :show-operation-column="false"
+              :auto-height="false"
+              :table-props="{
+                height: '185px',
+              }"
+              :show-pagination="false"
+            >
+              <template #serviceName="{ row }">
+                <div class="service-name-wrapper">
+                  <img class="service-name-img" :src="setOSSLink(row.serviceFile)" alt="" />
+                  <div class="service-name-text">{{ row.serviceName }}</div>
+                </div>
+              </template>
+            </ProTableV2>
           </ProFormItemV2>
-          <ProFormItemV2 label="瀹炴敹娆�:" prop="cooperationStatus">
-            <ProFormInputNumber v-model="form.balance" :controls="false" :min="0" :precision="2" />
+
+          <ProFormItemV2 label="瀹炰粯娆�:" prop="payAmount">
+            <ProFormInputNumber
+              v-model="form.payAmount"
+              :controls="false"
+              :min="0"
+              :precision="2"
+            />
           </ProFormItemV2>
-          <ProFormItemV2 label="鏈嶅姟璐�:" prop="cooperationStatus">
-            <ProFormInputNumber v-model="form.balance" :controls="false" :min="0" :precision="2" />
+          <ProFormItemV2 label="瀹炴敹娆�:" prop="receiveAmount">
+            <ProFormInputNumber
+              v-model="form.receiveAmount"
+              :controls="false"
+              :min="0"
+              :precision="2"
+            />
           </ProFormItemV2>
-          <ProFormItemV2 label="缁撶畻娆�:" prop="cooperationStatus">
-            <ProFormInputNumber v-model="form.balance" :controls="false" :min="0" :precision="2" />
+          <ProFormItemV2 label="鏈嶅姟璐�:" prop="serviceFee">
+            <ProFormInputNumber
+              v-model="form.serviceFee"
+              :controls="false"
+              :min="0"
+              :precision="2"
+            />
+          </ProFormItemV2>
+          <ProFormItemV2 label="缁撶畻娆�:" prop="settlementAmount">
+            <ProFormInputNumber
+              v-model="form.settlementAmount"
+              :controls="false"
+              :min="0"
+              :precision="2"
+            />
           </ProFormItemV2>
         </ProForm>
-        <ProTableV2
-          v-bind="proTableProps"
-          :columns="column"
-          :show-operation-column="false"
-          :auto-height="false"
-          :table-props="{
-            height: '400px',
-          }"
+        <div
+          class="chuck-add-or-edit-actions"
+          v-if="form.appointmentStatus === EnumStandardOrderAppointmentStatus.WaitSure"
         >
-        </ProTableV2>
-
-        <div class="chuck-add-or-edit-actions">
-          <el-button class="chuck-add-or-edit-actions" @click="handleBack">鍙栨秷棰勭害</el-button>
+          <el-button class="chuck-add-or-edit-actions" @click="cancelStandardOrderAppointment"
+            >鍙栨秷棰勭害</el-button
+          >
           <el-button type="primary" class="chuck-add-or-edit-actions" @click="handleSubmit"
             >纭棰勭害</el-button
           >
@@ -90,25 +130,57 @@
   useTable,
   ProTableV2,
 } from '@bole-core/components';
-import { EnumWalletTransactionStatusText } from '@/constants';
-import * as userServices from '@/services/api/user';
-import { format, setOSSLink } from '@/utils';
-import { useRouteView } from '@/hooks';
+import {
+  EnumStandardOrderAppointmentStatus,
+  EnumStandardOrderAppointmentStatusText,
+  EnumStandardOrderPayStatusText,
+  EnumStandardOrderSettlementStatusText,
+} from '@/constants';
+import * as standardOrderServices from '@/services/api/standardOrder';
+import { format, paginateList, setOSSLink } from '@/utils';
+import { useQuery } from '@tanstack/vue-query';
+import { ModelValueType } from 'element-plus';
+import { Message } from '@bole-core/core';
 
 defineOptions({
   name: 'StandardOrderDetail',
 });
 
+type ServiceItem = {
+  serviceName: string;
+  serviceFile: string;
+  specName: string;
+  specNumber: number;
+  specPrice: number;
+  payAmount: number;
+};
+
 const { column, operationBtns } = useAccess({});
+const eventContext = useGlobalEventContext();
 
 const route = useRoute();
-const { closeViewPush } = useRouteView();
 const id = (route.params.id as string) ?? '';
+const { closeViewPush } = useRouteView();
 
 const form = reactive({
-  identity: '',
-  access: '' as any as EnumEnterpriseWalletAccess,
-  balance: 0,
+  appointmentStatus: '' as any as EnumStandardOrderAppointmentStatus,
+  payStatus: '' as any as EnumStandardOrderPayStatus,
+  settlementStatus: '' as any as EnumStandardOrderSettlementStatus,
+  serviceCode: '',
+  createdUserName: '',
+  time: [] as unknown as ModelValueType,
+  address: '',
+  supplierEnterpriseName: '',
+  serviceName: '',
+  servers: '',
+  remark: '',
+
+  payAmount: 0,
+  receiveAmount: 0,
+  serviceFee: 0,
+  settlementAmount: 0,
+
+  serviceItems: [] as ServiceItem[],
 });
 
 const BaseState = {
@@ -117,64 +189,129 @@
 
 const state = reactive({ ...BaseState });
 
+const { isLoading } = useQuery({
+  queryKey: ['standardOrderServices/getStandardOrder', id],
+  queryFn: async () => {
+    return await standardOrderServices.getStandardOrder(
+      { id: id },
+      {
+        showLoading: false,
+      }
+    );
+  },
+  placeholderData: () => ({} as API.GetStandardOrderQueryResult),
+  onSuccess(data) {
+    form.appointmentStatus = data.appointmentStatus;
+    form.payStatus = data.payStatus;
+    form.settlementStatus = data.settlementStatus;
+    form.serviceCode = data.serviceCode;
+    form.createdUserName = data.createdUserName;
+    form.time = [data.beginTime, data.endTime];
+    form.address = `${data.provinceContent}${data.cityContent}${data.addressName}${data.addressName}${data.addressDetail}\t${data.name}\t${data.contactPhoneNumber}`;
+    form.serviceName = data.serviceName;
+    form.supplierEnterpriseName = data.supplierEnterpriseName;
+    form.servers = data.servers?.length ? data.servers.map((x) => x.name).join(',') : '';
+    form.remark = data.remark;
+    form.payAmount = data.payAmount;
+    form.receiveAmount = data.receiveAmount;
+    form.serviceFee = data.serviceFee;
+    form.settlementAmount = data.settlementAmount;
+
+    form.serviceItems = [
+      {
+        serviceName: data.serviceName,
+        serviceFile: data.serviceFile,
+        specName: data.specName,
+        specNumber: data.specNumber,
+        specPrice: data.specPrice,
+        payAmount: data.payAmount,
+      },
+    ];
+    getList();
+  },
+  enabled: computed(() => !!id),
+});
+
 const {
   getDataSource: getList,
   proTableProps,
   paginationState,
   extraParamState,
-  reset,
 } = useTable(
   async ({ pageIndex, pageSize }, extraParamState) => {
     try {
-      let params: API.GetPersonalUserTransactionsQuery = {
+      let list = [...form.serviceItems];
+      return Promise.resolve({
         pageModel: {
           rows: pageSize,
           page: pageIndex,
-          orderInput: extraParamState.orderInput,
+          totalCount: list.length,
         },
-        enterpriseWalletId: id,
-      };
-      let res = await userServices.getPersonalUserTransactions(params);
-      if (res.objectData?.enterpriseWallet) {
-        form.identity = res.objectData.enterpriseWallet.identity;
-        form.access = res.objectData.enterpriseWallet.access;
-        form.balance = res.objectData.enterpriseWallet.balance;
-      }
-      return res;
-    } catch (error) {}
+        data: paginateList(list, pageIndex, pageSize),
+      });
+    } catch (error) {
+      console.log('error: ', error);
+    }
   },
   {
     defaultExtraParams: {
       orderInput: [{ property: 'id', order: EnumPagedListOrder.Desc }],
     },
     columnsRenderProps: {
-      transDate: { type: 'date' },
-      sendTime: { type: 'date' },
-      amount: { type: 'money' },
-      transactionStatus: { type: 'enum', valueEnum: EnumWalletTransactionStatusText },
-      ereceiptDownloadOssUrl: {
-        type: 'url',
-        formatter: (row: API.GetPersonalUserTransactionsQueryResultItem) =>
-          row.ereceiptDownloadOssUrl ? setOSSLink(row.ereceiptDownloadOssUrl) : '',
-      },
+      specPrice: { type: 'money' },
+      payAmount: { type: 'money' },
     },
   }
 );
 
-onMounted(() => {
-  state.loading = false;
-  getList();
-});
-
 function handleBack() {
   closeViewPush(route, {
-    name: 'TaskManageList',
+    name: 'StandardOrder',
   });
 }
 
-async function handleSubmit() {}
+async function cancelStandardOrderAppointment() {
+  try {
+    await Message.tipMessage('纭瑕佸彇娑堥绾﹀悧锛�');
+    let params: API.CancelStandardOrderAppointmentCommand = {
+      id: id,
+    };
+    let res = await standardOrderServices.cancelStandardOrderAppointment(params);
+    if (res) {
+      Message.successMessage('鎿嶄綔鎴愬姛');
+      eventContext.emit('standardOrder:confirm');
+      handleBack();
+    }
+  } catch (error) {}
+}
+
+async function handleSubmit() {
+  try {
+    let params: API.SureStandardOrderAppointmentCommand = {
+      id: id,
+    };
+    let res = await standardOrderServices.sureStandardOrderAppointment(params);
+    if (res) {
+      Message.successMessage('鎿嶄綔鎴愬姛');
+      eventContext.emit('standardOrder:confirm');
+      handleBack();
+    }
+  } catch (error) {}
+}
 </script>
 
 <style lang="scss" scoped>
 @use '@/style/common.scss' as *;
+
+.service-name-wrapper {
+  display: flex;
+  align-items: center;
+
+  .service-name-img {
+    margin-right: 10px;
+    width: 120px;
+    height: 120px;
+    object-fit: cover;
+  }
+}
 </style>

--
Gitblit v1.10.0