From 10a440fac0dd665bf4af78e1e3c913dcf893bf10 Mon Sep 17 00:00:00 2001
From: gaoluyang <2820782392@qq.com>
Date: 星期二, 02 六月 2026 10:00:28 +0800
Subject: [PATCH] 新疆马铃薯 1.设备保养、设备验收添加验收人

---
 src/views/equipmentManagement/upkeep/index.vue                 |   50 +++
 src/api/equipmentManagement/repair.js                          |   13 +
 src/views/equipmentManagement/repair/Modal/RepairModal.vue     |  203 ++++++++++-----
 src/views/equipmentManagement/repair/index.vue                 |  147 +++++++---
 src/views/equipmentManagement/repair/Modal/AcceptanceModal.vue |  140 ++++++++++
 src/api/equipmentManagement/upkeep.js                          |   13 +
 src/views/equipmentManagement/upkeep/Form/AcceptanceModal.vue  |  141 ++++++++++
 src/views/equipmentManagement/upkeep/Form/MaintenanceModal.vue |   29 -
 src/views/procurementManagement/paymentLedger/index.vue        |   18 
 9 files changed, 603 insertions(+), 151 deletions(-)

diff --git a/src/api/equipmentManagement/repair.js b/src/api/equipmentManagement/repair.js
index 0233ae6..16bfd28 100644
--- a/src/api/equipmentManagement/repair.js
+++ b/src/api/equipmentManagement/repair.js
@@ -70,3 +70,16 @@
     data,
   });
 };
+
+/**
+ * @desc 楠屾敹瀹℃壒
+ * @param {楠屾敹鍙傛暟} data
+ * @returns
+ */
+export const repairAcceptance = (data) => {
+  return request({
+    url: `/device/repair/acceptance`,
+    method: "post",
+    data,
+  });
+};
diff --git a/src/api/equipmentManagement/upkeep.js b/src/api/equipmentManagement/upkeep.js
index 5774654..4236afc 100644
--- a/src/api/equipmentManagement/upkeep.js
+++ b/src/api/equipmentManagement/upkeep.js
@@ -111,3 +111,16 @@
     data: params,
   });
 };
+
+/**
+ * @desc 璁惧淇濆吇楠屾敹瀹℃壒
+ * @param {楠屾敹瀹℃壒琛ㄥ崟} data
+ * @returns
+ */
+export const maintenanceAcceptance = (data) => {
+  return request({
+    url: "/device/maintenance/acceptance",
+    method: "post",
+    data,
+  });
+};
diff --git a/src/views/equipmentManagement/repair/Modal/AcceptanceModal.vue b/src/views/equipmentManagement/repair/Modal/AcceptanceModal.vue
new file mode 100644
index 0000000..8698945
--- /dev/null
+++ b/src/views/equipmentManagement/repair/Modal/AcceptanceModal.vue
@@ -0,0 +1,140 @@
+<template>
+  <FormDialog
+    v-model="visible"
+    title="楠屾敹瀹℃壒"
+    width="500px"
+    @confirm="submitForm"
+    @cancel="handleCancel"
+    @close="handleCancel"
+  >
+    <el-form :model="form" :rules="rules" label-width="100px">
+      <el-form-item label="楠屾敹浜�" prop="acceptanceName">
+        <el-select
+          v-model="form.acceptanceName"
+          placeholder="璇烽�夋嫨楠屾敹浜�"
+          filterable
+          style="width: 100%"
+        >
+          <el-option
+            v-for="item in userList"
+            :key="item.userId"
+            :label="item.nickName"
+            :value="item.nickName"
+          />
+        </el-select>
+      </el-form-item>
+      <el-form-item label="楠屾敹鏃堕棿" prop="acceptanceTime">
+        <el-date-picker
+          v-model="form.acceptanceTime"
+          type="datetime"
+          placeholder="璇烽�夋嫨楠屾敹鏃堕棿"
+          format="YYYY-MM-DD HH:mm:ss"
+          value-format="YYYY-MM-DD HH:mm:ss"
+          style="width: 100%"
+        />
+      </el-form-item>
+      <el-form-item label="楠屾敹澶囨敞" prop="acceptanceRemark">
+        <el-input
+          v-model="form.acceptanceRemark"
+          type="textarea"
+          :rows="3"
+          placeholder="璇疯緭鍏ラ獙鏀跺娉�"
+        />
+      </el-form-item>
+    </el-form>
+  </FormDialog>
+</template>
+
+<script setup>
+import FormDialog from "@/components/Dialog/FormDialog.vue";
+import { ref, reactive } from "vue";
+import { ElMessage } from "element-plus";
+import { userListNoPageByTenantId } from "@/api/system/user.js";
+import { repairAcceptance } from "@/api/equipmentManagement/repair";
+import dayjs from "dayjs";
+
+defineOptions({
+  name: "楠屾敹瀹℃壒寮圭獥",
+});
+
+const emits = defineEmits(["ok"]);
+
+const visible = ref(false);
+const loading = ref(false);
+const repairId = ref(null);
+const userList = ref([]);
+
+const form = reactive({
+  acceptanceName: undefined,
+  acceptanceTime: dayjs().format("YYYY-MM-DD HH:mm:ss"),
+  acceptanceRemark: undefined,
+});
+
+const rules = {
+  acceptanceName: [
+    { required: true, message: "璇烽�夋嫨楠屾敹浜�", trigger: "change" },
+  ],
+  acceptanceTime: [
+    { required: true, message: "璇烽�夋嫨楠屾敹鏃堕棿", trigger: "change" },
+  ],
+  acceptanceRemark: [
+    { required: false, message: "璇疯緭鍏ラ獙鏀跺娉�", trigger: "blur" },
+  ],
+};
+
+// 鍔犺浇鐢ㄦ埛鍒楄〃
+const loadUserList = async () => {
+  const { data } = await userListNoPageByTenantId();
+  userList.value = data;
+};
+
+// 鎵撳紑寮圭獥
+const open = async (row) => {
+  repairId.value = row.id;
+  visible.value = true;
+  // 閲嶇疆琛ㄥ崟
+  form.acceptanceName = undefined;
+  form.acceptanceTime = dayjs().format("YYYY-MM-DD HH:mm:ss");
+  form.acceptanceRemark = undefined;
+  await loadUserList();
+};
+
+// 鎻愪氦琛ㄥ崟
+const submitForm = async () => {
+  if (!form.acceptanceName) {
+    ElMessage.warning("璇烽�夋嫨楠屾敹浜�");
+    return;
+  }
+  if (!form.acceptanceTime) {
+    ElMessage.warning("璇烽�夋嫨楠屾敹鏃堕棿");
+    return;
+  }
+
+  loading.value = true;
+  try {
+    const { code } = await repairAcceptance({
+      id: repairId.value,
+      acceptanceName: form.acceptanceName,
+      acceptanceTime: form.acceptanceTime,
+      acceptanceRemark: form.acceptanceRemark,
+    });
+    if (code === 200) {
+      ElMessage.success("楠屾敹閫氳繃");
+      visible.value = false;
+      emits("ok");
+    }
+  } finally {
+    loading.value = false;
+  }
+};
+
+const handleCancel = () => {
+  visible.value = false;
+};
+
+defineExpose({
+  open,
+});
+</script>
+
+<style lang="scss" scoped></style>
diff --git a/src/views/equipmentManagement/repair/Modal/RepairModal.vue b/src/views/equipmentManagement/repair/Modal/RepairModal.vue
index 022ae6f..b7c3d35 100644
--- a/src/views/equipmentManagement/repair/Modal/RepairModal.vue
+++ b/src/views/equipmentManagement/repair/Modal/RepairModal.vue
@@ -59,43 +59,96 @@
         </el-col>
         <el-col :span="12">
           <el-form-item label="鎶ヤ慨鏃ユ湡">
-            <el-date-picker
-              v-model="form.repairTime"
-              placeholder="璇烽�夋嫨鎶ヤ慨鏃ユ湡"
-              format="YYYY-MM-DD"
-              value-format="YYYY-MM-DD"
-              type="date"
-              clearable
-              style="width: 100%"
-            />
+            <el-date-picker v-model="form.repairTime"
+                            placeholder="璇烽�夋嫨鎶ヤ慨鏃ユ湡"
+                            format="YYYY-MM-DD"
+                            value-format="YYYY-MM-DD"
+                            type="date"
+                            clearable
+                            style="width: 100%"
+                            :disabled="operationType === 'view'" />
           </el-form-item>
         </el-col>
         <el-col :span="12">
           <el-form-item label="鎶ヤ慨浜�">
-            <el-input v-model="form.repairName" placeholder="璇疯緭鍏ユ姤淇汉" />
+            <el-input v-model="form.repairName"
+                      placeholder="璇疯緭鍏ユ姤淇汉"
+                      :disabled="operationType === 'view'" />
+          </el-form-item>
+        </el-col>
+        <el-col :span="12">
+          <el-form-item label="鎶ヤ慨鎶ヤ慨椤圭洰">
+            <el-input v-model="form.machineryCategory"
+                      placeholder="璇疯緭鍏ユ姤淇姤淇」鐩�"
+                      :disabled="operationType === 'view'" />
+          </el-form-item>
+        </el-col>
+      </el-row>
+      <el-row>
+        <el-col :span="12">
+          <el-form-item label="缁翠慨浜�">
+            <el-input v-model="form.maintenanceName"
+                      placeholder="璇疯緭鍏ョ淮淇汉濮撳悕"
+                      :disabled="operationType === 'view'" />
           </el-form-item>
         </el-col>
       </el-row>
       <el-row v-if="id">
         <el-col :span="12">
           <el-form-item label="鎶ヤ慨鐘舵��">
-            <el-select v-model="form.status">
-              <el-option label="寰呯淮淇�" :value="0" />
-              <el-option label="瀹岀粨" :value="1" />
-              <el-option label="澶辫触" :value="2" />
+            <el-select v-model="form.status"
+                       disabled>
+              <el-option label="寰呯淮淇�"
+                         :value="0"></el-option>
+              <el-option label="宸查獙鏀�"
+                         :value="1"></el-option>
+              <el-option label="澶辫触"
+                         :value="2"></el-option>
             </el-select>
+          </el-form-item>
+        </el-col>
+      </el-row>
+      <!-- 楠屾敹淇℃伅灞曠ず -->
+      <el-row v-if="id && (form.status === 1 || form.status === 3)">
+        <el-col :span="12">
+          <el-form-item label="楠屾敹浜�">
+            <el-input v-model="form.acceptanceName"
+                      disabled />
+          </el-form-item>
+        </el-col>
+        <el-col :span="12">
+          <el-form-item label="楠屾敹鏃堕棿">
+            <el-input v-model="form.acceptanceTime"
+                      disabled />
+          </el-form-item>
+        </el-col>
+        <el-col :span="24">
+          <el-form-item label="楠屾敹澶囨敞">
+            <el-input v-model="form.acceptanceRemark"
+                      type="textarea"
+                      :rows="2"
+                      disabled />
           </el-form-item>
         </el-col>
       </el-row>
       <el-row>
         <el-col :span="24">
           <el-form-item label="鏁呴殰鐜拌薄">
-            <el-input
-              v-model="form.remark"
-              :rows="2"
-              type="textarea"
-              placeholder="璇疯緭鍏ユ晠闅滅幇璞�"
-            />
+            <el-input v-model="form.remark"
+                      :rows="2"
+                      type="textarea"
+                      placeholder="璇疯緭鍏ユ晠闅滅幇璞�"
+                      :disabled="operationType === 'view'" />
+          </el-form-item>
+        </el-col>
+      </el-row>
+      <el-row v-if="operationType !== 'view'"
+              :gutter="30">
+        <el-col :span="24">
+          <el-form-item label="闄勪欢"
+                        prop="attachmentIds">
+            <FileUpload v-model:file-list="form.storageBlobDTOs"
+                        :disabled="operationType === 'view'" />
           </el-form-item>
         </el-col>
       </el-row>
@@ -104,21 +157,18 @@
 </template>
 
 <script setup>
-import { nextTick, ref, unref } from "vue";
-import dayjs from "dayjs";
-import { ElMessage } from "element-plus";
-import FormDialog from "@/components/Dialog/FormDialog.vue";
-import useFormData from "@/hooks/useFormData";
-import useUserStore from "@/store/modules/user";
-import {
-  addRepair,
-  editRepair,
-  getRepairById,
-} from "@/api/equipmentManagement/repair";
-import {
-  getDeviceAreaTree,
-  getDeviceAreaTreeWithDevices,
-} from "@/api/equipmentManagement/deviceArea";
+  import FormDialog from "@/components/Dialog/FormDialog.vue";
+  import FileUpload from "@/components/AttachmentUpload/file/index.vue";
+  import {
+    addRepair,
+    editRepair,
+    getRepairById,
+  } from "@/api/equipmentManagement/repair";
+  import { ElMessage } from "element-plus";
+  import dayjs from "dayjs";
+  import useFormData from "@/hooks/useFormData";
+  import { getDeviceLedger } from "@/api/equipmentManagement/ledger";
+  import useUserStore from "@/store/modules/user";
 
 defineOptions({
   name: "璁惧鎶ヤ慨寮圭獥",
@@ -126,16 +176,26 @@
 
 const emits = defineEmits(["ok"]);
 
-const id = ref();
-const visible = ref(false);
-const loading = ref(false);
-const userStore = useUserStore();
-const areaOptions = ref([]);
-const deviceOptions = ref([]);
-const areaTreeProps = {
-  label: "areaName",
-  children: "children",
-};
+  const id = ref();
+  const visible = ref(false);
+  const loading = ref(false);
+  const operationType = ref(""); // add, edit, view
+
+  const computedTitle = computed(() => {
+    if (operationType.value === "add") return "鏂板璁惧鎶ヤ慨";
+    if (operationType.value === "edit") return "缂栬緫璁惧鎶ヤ慨";
+    if (operationType.value === "view") return "璁惧鎶ヤ慨璇︽儏";
+    return "";
+  });
+
+  const userStore = useUserStore();
+  const deviceOptions = ref([]);
+  const fileList = ref([]);
+
+  const loadDeviceName = async () => {
+    const { data } = await getDeviceLedger();
+    deviceOptions.value = data;
+  };
 
 const { form, resetForm } = useFormData({
   areaId: undefined,
@@ -314,29 +374,40 @@
   visible.value = false;
 };
 
-const openAdd = async () => {
-  id.value = undefined;
-  visible.value = true;
-  await nextTick();
-  await loadAreaTree();
-  deviceOptions.value = [];
-};
+  const openAdd = async () => {
+    id.value = undefined;
+    operationType.value = "add";
+    visible.value = true;
+    fileList.value = [];
+    await nextTick();
+    await loadDeviceName();
+  };
 
-const openEdit = async (editId) => {
-  const { data } = await getRepairById(editId);
-  id.value = editId;
-  visible.value = true;
-  await nextTick();
-  await loadAreaTree();
-  setForm(data);
-  await loadDevicesByArea(form.areaId);
-  syncDeviceFields(form.deviceLedgerIds);
-};
+  const openEdit = async editId => {
+    const { data } = await getRepairById(editId);
+    id.value = editId;
+    operationType.value = "edit";
+    visible.value = true;
+    await nextTick();
+    await loadDeviceName();
+    setForm(data);
+  };
 
-defineExpose({
-  openAdd,
-  openEdit,
-});
+  const openView = async viewId => {
+    const { data } = await getRepairById(viewId);
+    id.value = viewId;
+    operationType.value = "view";
+    visible.value = true;
+    await nextTick();
+    await loadDeviceName();
+    setForm(data);
+  };
+
+  defineExpose({
+    openAdd,
+    openEdit,
+    openView,
+  });
 </script>
 
 <style lang="scss" scoped></style>
diff --git a/src/views/equipmentManagement/repair/index.vue b/src/views/equipmentManagement/repair/index.vue
index 1699cff..edf459f 100644
--- a/src/views/equipmentManagement/repair/index.vue
+++ b/src/views/equipmentManagement/repair/index.vue
@@ -94,51 +94,84 @@
           @pagination="changePage"
       >
         <template #statusRef="{ row }">
-          <el-tag v-if="row.status === 2" type="danger">澶辫触</el-tag>
-          <el-tag v-if="row.status === 1" type="success">瀹岀粨</el-tag>
-          <el-tag v-if="row.status === 0" type="warning">寰呯淮淇�</el-tag>
+          <el-tag v-if="row.status === 2"
+                  type="danger">澶辫触</el-tag>
+          <el-tag v-if="row.status === 1"
+                  type="success">瀹岀粨</el-tag>
+          <el-tag v-if="row.status === 3"
+                  type="info">寰呴獙鏀�</el-tag>
+          <el-tag v-if="row.status === 0"
+                  type="warning">寰呯淮淇�</el-tag>
         </template>
         <template #operation="{ row }">
-          <el-button
-            type="primary"
-            link
-            :disabled="row.status === 1"
-            @click="editRepair(row.id)"
-          >
+          <el-button type="primary"
+                     link
+                     @click="viewRepair(row.id)">
+            璇︽儏
+          </el-button>
+          <el-button type="primary"
+                     link
+                     :disabled="row.status === 1 || row.status === 3"
+                     @click="editRepair(row.id)">
             缂栬緫
           </el-button>
-          <el-button
-            type="success"
-            link
-            :disabled="row.status === 1"
-            @click="addMaintain(row)"
-          >
+          <el-button type="success"
+                     link
+                     :disabled="row.status !== 0"
+                     @click="addMaintain(row)">
             缁翠慨
           </el-button>
-          <el-button
-            type="danger"
-            link
-            :disabled="row.status === 1"
-            @click="delRepairByIds(row.id)"
-          >
+          <el-button type="warning"
+                     link
+                     :disabled="row.status !== 3"
+                     @click="openAcceptance(row)">
+            楠屾敹
+          </el-button>
+          <el-button type="danger"
+                     link
+                     :disabled="row.status === 1 || row.status === 3"
+                     @click="delRepairByIds(row.id)">
             鍒犻櫎
+          </el-button>
+          <el-button type="primary"
+                     link
+                     @click="openFileDialog(row)">
+            闄勪欢
           </el-button>
         </template>
       </PIMTable>
     </div>
-    <RepairModal ref="repairModalRef" @ok="getTableData"/>
-    <MaintainModal ref="maintainModalRef" @ok="getTableData"/>
+    <RepairModal ref="repairModalRef"
+                 @ok="getTableData" />
+    <MaintainModal ref="maintainModalRef"
+                   @ok="getTableData" />
+    <AcceptanceModal ref="acceptanceModalRef"
+                     @ok="getTableData" />
+    <FileList v-if="fileDialogVisible"
+              v-model:visible="fileDialogVisible"
+              :record-type="'device_repair'"
+              :record-id="recordId" />
   </div>
 </template>
 
 <script setup>
-import { onMounted, getCurrentInstance, computed } from "vue";
-import {usePaginationApi} from "@/hooks/usePaginationApi";
-import {getRepairPage, delRepair} from "@/api/equipmentManagement/repair";
-import RepairModal from "./Modal/RepairModal.vue";
-import {ElMessageBox, ElMessage} from "element-plus";
-import dayjs from "dayjs";
-import MaintainModal from "./Modal/MaintainModal.vue";
+  import {
+    onMounted,
+    getCurrentInstance,
+    computed,
+    ref,
+    defineAsyncComponent,
+  } from "vue";
+  import { usePaginationApi } from "@/hooks/usePaginationApi";
+  import { getRepairPage, delRepair } from "@/api/equipmentManagement/repair";
+  import RepairModal from "./Modal/RepairModal.vue";
+  import { ElMessageBox, ElMessage } from "element-plus";
+  import dayjs from "dayjs";
+  import MaintainModal from "./Modal/MaintainModal.vue";
+  import AcceptanceModal from "./Modal/AcceptanceModal.vue";
+  const FileList = defineAsyncComponent(() =>
+    import("@/components/Dialog/FileList.vue")
+  );
 
 defineOptions({
   name: "璁惧鎶ヤ慨",
@@ -146,9 +179,10 @@
 
 const {proxy} = getCurrentInstance();
 
-// 妯℃�佹瀹炰緥
-const repairModalRef = ref();
-const maintainModalRef = ref();
+  // 妯℃�佹瀹炰緥
+  const repairModalRef = ref();
+  const maintainModalRef = ref();
+  const acceptanceModalRef = ref();
 
 // 琛ㄦ牸澶氶�夋閫変腑椤�
 const multipleList = ref([]);
@@ -232,7 +266,7 @@
         dataType: "slot",
         slot: "operation",
         align: "center",
-        width: "300px",
+        width: "320px",
       },
     ]
 );
@@ -253,10 +287,19 @@
   getTableData();
 };
 
-// 澶氶�夊悗鍋氫粈涔�
-const handleSelectionChange = (selectionList) => {
-  multipleList.value = selectionList;
-};
+  // 鎵撳紑闄勪欢寮圭獥
+  const recordId = ref(0);
+  const fileDialogVisible = ref(false);
+
+  const openFileDialog = async row => {
+    recordId.value = row.id;
+    fileDialogVisible.value = true;
+  };
+
+  // 澶氶�夊悗鍋氫粈涔�
+  const handleSelectionChange = selectionList => {
+    multipleList.value = selectionList;
+  };
 
 // 妫�鏌ラ�変腑鐨勮褰曚腑鏄惁鏈夊畬缁撶姸鎬佺殑
 const hasFinishedStatus = computed(() => {
@@ -268,21 +311,31 @@
   repairModalRef.value.openAdd();
 };
 
-// 缂栬緫鎶ヤ慨
-const editRepair = (id) => {
-  repairModalRef.value.openEdit(id);
-};
+  // 璇︽儏鏌ョ湅
+  const viewRepair = id => {
+    repairModalRef.value.openView(id);
+  };
+
+  // 缂栬緫鎶ヤ慨
+  const editRepair = id => {
+    repairModalRef.value.openEdit(id);
+  };
 
 // 鏂板缁翠慨
 const addMaintain = (row) => {
   maintainModalRef.value.open(row.id, row);
 };
 
-const changePage = ({page, limit}) => {
-  pagination.currentPage = page;
-  pagination.pageSize = limit;
-  onCurrentChange(page);
-};
+  // 鎵撳紑楠屾敹寮圭獥
+  const openAcceptance = row => {
+    acceptanceModalRef.value.open(row);
+  };
+
+  const changePage = ({ page, limit }) => {
+    pagination.currentPage = page;
+    pagination.pageSize = limit;
+    onCurrentChange(page);
+  };
 
 // 鍗曡鍒犻櫎
 const delRepairByIds = async (ids) => {
diff --git a/src/views/equipmentManagement/upkeep/Form/AcceptanceModal.vue b/src/views/equipmentManagement/upkeep/Form/AcceptanceModal.vue
new file mode 100644
index 0000000..bc22bd6
--- /dev/null
+++ b/src/views/equipmentManagement/upkeep/Form/AcceptanceModal.vue
@@ -0,0 +1,141 @@
+<template>
+  <FormDialog
+    v-model="visible"
+    title="楠屾敹瀹℃壒"
+    width="500px"
+    @confirm="sendForm"
+    @cancel="handleCancel"
+    @close="handleClose"
+  >
+    <el-form :model="form" label-width="100px">
+      <el-form-item label="楠屾敹浜�" required>
+        <el-select
+          v-model="form.acceptanceName"
+          filterable
+          placeholder="璇烽�夋嫨楠屾敹浜�"
+          style="width: 100%"
+        >
+          <el-option
+            v-for="item in userList"
+            :key="item.userId"
+            :label="item.nickName"
+            :value="item.userId"
+          />
+        </el-select>
+      </el-form-item>
+      <el-form-item label="楠屾敹鏃堕棿" required>
+        <el-date-picker
+          v-model="form.acceptanceTime"
+          placeholder="璇烽�夋嫨楠屾敹鏃堕棿"
+          format="YYYY-MM-DD HH:mm:ss"
+          value-format="YYYY-MM-DD HH:mm:ss"
+          type="datetime"
+          clearable
+          style="width: 100%"
+        />
+      </el-form-item>
+      <el-form-item label="楠屾敹澶囨敞">
+        <el-input
+          v-model="form.acceptanceRemark"
+          placeholder="璇疯緭鍏ラ獙鏀跺娉�"
+          type="textarea"
+          :rows="3"
+        />
+      </el-form-item>
+    </el-form>
+  </FormDialog>
+</template>
+
+<script setup>
+import FormDialog from "@/components/Dialog/FormDialog.vue";
+import { maintenanceAcceptance } from "@/api/equipmentManagement/upkeep";
+import { userListNoPage } from "@/api/system/user.js";
+import { ElMessage } from "element-plus";
+import { ref, reactive } from "vue";
+import dayjs from "dayjs";
+
+defineOptions({
+  name: "楠屾敹瀹℃壒寮圭獥",
+});
+
+const emits = defineEmits(["ok"]);
+
+const maintenanceId = ref();
+const visible = ref(false);
+const loading = ref(false);
+const userList = ref([]);
+
+const form = reactive({
+  acceptanceName: undefined,
+  acceptanceTime: undefined,
+  acceptanceRemark: undefined,
+});
+
+const loadUserList = () => {
+  userListNoPage().then((res) => {
+    userList.value = res.data || [];
+  });
+};
+
+const resetForm = () => {
+  form.acceptanceName = undefined;
+  form.acceptanceTime = undefined;
+  form.acceptanceRemark = undefined;
+};
+
+const sendForm = async () => {
+  if (!form.acceptanceName) {
+    ElMessage.error("楠屾敹浜轰笉鑳戒负绌�");
+    return;
+  }
+  if (!form.acceptanceTime) {
+    ElMessage.error("楠屾敹鏃堕棿涓嶈兘涓虹┖");
+    return;
+  }
+
+  loading.value = true;
+  try {
+    const selectedUser = userList.value.find(
+      (item) => item.userId === form.acceptanceName
+    );
+    const data = {
+      id: maintenanceId.value,
+      acceptanceName: selectedUser ? selectedUser.nickName : form.acceptanceName,
+      acceptanceTime: dayjs(form.acceptanceTime).format("YYYY-MM-DD HH:mm:ss"),
+      acceptanceRemark: form.acceptanceRemark,
+    };
+    const { code } = await maintenanceAcceptance(data);
+    if (code == 200) {
+      ElMessage.success("楠屾敹瀹℃壒鎴愬姛");
+      emits("ok");
+      resetForm();
+      visible.value = false;
+    }
+  } finally {
+    loading.value = false;
+  }
+};
+
+const handleCancel = () => {
+  resetForm();
+  visible.value = false;
+};
+
+const handleClose = () => {
+  resetForm();
+  visible.value = false;
+};
+
+const open = (id, row) => {
+  maintenanceId.value = id;
+  visible.value = true;
+  resetForm();
+  loadUserList();
+};
+
+defineExpose({
+  open,
+});
+</script>
+
+<style lang="scss" scoped></style>
diff --git a/src/views/equipmentManagement/upkeep/Form/MaintenanceModal.vue b/src/views/equipmentManagement/upkeep/Form/MaintenanceModal.vue
index e86b64a..b27d1e1 100644
--- a/src/views/equipmentManagement/upkeep/Form/MaintenanceModal.vue
+++ b/src/views/equipmentManagement/upkeep/Form/MaintenanceModal.vue
@@ -25,18 +25,11 @@
           style="width: 100%"
         />
       </el-form-item>
-      <el-form-item label="淇濆吇鐘舵��">
-        <el-select v-model="form.status">
-          <el-option label="寰呬繚鍏�" :value="0"></el-option>
-          <el-option label="瀹岀粨" :value="1"></el-option>
-          <el-option label="澶辫触" :value="2"></el-option>
-        </el-select>
-      </el-form-item>
       <el-form-item label="淇濆吇缁撴灉">
-        <el-input
-          v-model="form.maintenanceResult"
-          placeholder="璇疯緭鍏ヤ繚鍏荤粨鏋�"
-          type="text" />
+        <el-select v-model="form.maintenanceResult" placeholder="璇烽�夋嫨淇濆吇缁撴灉">
+          <el-option label="缁翠慨" value="0" />
+          <el-option label="瀹屽ソ" value="1" />
+        </el-select>
       </el-form-item>
       <el-form-item label="璁惧澶囦欢">
         <el-select v-model="form.sparePartsIds" :loading="loadingSparePartOptions" placeholder="璇烽�夋嫨璁惧澶囦欢" multiple filterable>
@@ -84,7 +77,7 @@
 import dayjs from "dayjs";
 import useUserStore from "@/store/modules/user";
 import { ElMessage } from "element-plus";
-import {computed, ref} from "vue";
+import {computed, getCurrentInstance, ref} from "vue";
 import {getSparePartsList} from "@/api/equipmentManagement/spareParts.js";
 
 defineOptions({
@@ -92,6 +85,7 @@
 });
 
 const emits = defineEmits(["ok"]);
+const { proxy } = getCurrentInstance();
 
 // 淇濆瓨璁″垝淇濆吇璁板綍鐨刬d
 const planId = ref();
@@ -100,10 +94,9 @@
 const userStore = useUserStore();
 
 const { form, resetForm } = useFormData({
-  maintenanceActuallyName: undefined, // 瀹為檯淇濆吇浜�
-  maintenanceActuallyTime: undefined, // 瀹為檯淇濆吇鏃ユ湡
-  maintenanceResult: undefined, // 淇濆吇缁撴灉
-  status: 0, // 淇濆吇鐘舵��
+  maintenanceActuallyName: undefined,
+  maintenanceActuallyTime: undefined,
+  maintenanceResult: undefined,
   sparePartsIds: [],
 });
 
@@ -121,12 +114,10 @@
   form.maintenanceActuallyName =
     data.maintenanceActuallyName ?? userStore.nickName;
   form.maintenanceActuallyTime =
-    data.maintenanceActuallyTime 
+    data.maintenanceActuallyTime
       ? dayjs(data.maintenanceActuallyTime).format("YYYY-MM-DD HH:mm:ss")
       : dayjs().format("YYYY-MM-DD HH:mm:ss");
   form.maintenanceResult = data.maintenanceResult;
-  form.status = 1; // 榛樿鐘舵�佷负瀹岀粨
-  // multiple 閫夋嫨鍣ㄨ姹傛暟缁勶紱鍚庣甯歌繑鍥� "1,2,3"
   if (Array.isArray(data?.sparePartsIds)) {
     form.sparePartsIds = data.sparePartsIds.map((v) => Number(v)).filter((v) => Number.isFinite(v));
   } else if (typeof data?.sparePartsIds === "string") {
diff --git a/src/views/equipmentManagement/upkeep/index.vue b/src/views/equipmentManagement/upkeep/index.vue
index 419e9aa..b2756d1 100644
--- a/src/views/equipmentManagement/upkeep/index.vue
+++ b/src/views/equipmentManagement/upkeep/index.vue
@@ -173,32 +173,33 @@
         <template #statusRef="{ row }">
           <el-tag v-if="row.status === 2" type="danger">澶辫触</el-tag>
           <el-tag v-if="row.status === 1" type="success">瀹岀粨</el-tag>
+          <el-tag v-if="row.status === 3" type="warning">寰呴獙鏀�</el-tag>
           <el-tag v-if="row.status === 0" type="warning">寰呬繚鍏�</el-tag>
         </template>
         <template #operation="{ row }">
-          <!-- 杩欎釜鍔熻兘璺熸柊澧炰繚鍏诲姛鑳戒竴妯′竴鏍凤紝鏈夊暐鎰忎箟锛� -->
-          <!-- <el-button
-              type="primary"
-              text
-              @click="addMaintain(row)"
-          >
-            鏂板淇濆吇
-          </el-button> -->
           <el-button
             type="primary"
             link
-            :disabled="row.status === 1"
+            :disabled="row.status === 1 || row.status === 3"
             @click="editPlan(row.id)"
           >
             缂栬緫
           </el-button>
           <el-button
+            v-if="row.status === 0"
             type="success"
             link
-            :disabled="row.status === 1"
             @click="addMaintain(row)"
           >
             淇濆吇
+          </el-button>
+          <el-button
+            v-if="row.status === 3"
+            type="success"
+            link
+            @click="openAcceptanceDialog(row)"
+          >
+            楠屾敹瀹℃壒
           </el-button>
           <el-button
             type="danger"
@@ -222,6 +223,7 @@
     </el-tabs>
     <PlanModal ref="planModalRef" @ok="getTableData" />
         <MaintenanceModal ref="maintainModalRef" @ok="getTableData" />
+        <AcceptanceModal ref="acceptanceModalRef" @ok="getTableData" />
         <FormDia ref="formDiaRef" @closeDia="getScheduledTableData" />
     <FileListDialog 
       ref="fileListDialogRef"
@@ -242,6 +244,7 @@
 import PlanModal from './Form/PlanModal.vue'
 import MaintenanceModal from './Form/MaintenanceModal.vue'
 import FormDia from './Form/formDia.vue'
+import AcceptanceModal from './Form/AcceptanceModal.vue'
 import FileListDialog from '@/components/Dialog/FileListDialog.vue'
 import {
   getUpkeepPage,
@@ -249,6 +252,7 @@
   deviceMaintenanceTaskList,
   deviceMaintenanceTaskDel,
   deviceMaintenanceTaskChangeEnable,
+  maintenanceAcceptance,
 } from '@/api/equipmentManagement/upkeep'
 import {
   listMaintenanceTaskFiles,
@@ -266,6 +270,8 @@
 const planModalRef = ref()
 // 淇濆吇寮圭獥鎺у埗鍣�
 const maintainModalRef = ref()
+// 楠屾敹瀹℃壒寮圭獥鎺у埗鍣�
+const acceptanceModalRef = ref()
 // 瀹氭椂浠诲姟寮圭獥鎺у埗鍣�
 const formDiaRef = ref()
 // 闄勪欢寮圭獥
@@ -427,6 +433,25 @@
 		prop: "status",
 		dataType: "slot",
 		slot: "statusRef",
+	},
+	{
+		label: "楠屾敹浜�",
+		align: "center",
+		prop: "acceptanceName",
+		formatData: (cell) => cell || "-",
+	},
+	{
+		label: "楠屾敹鏃堕棿",
+		align: "center",
+		prop: "acceptanceTime",
+		formatData: (cell) =>
+			cell ? dayjs(cell).format("YYYY-MM-DD HH:mm:ss") : "-",
+	},
+	{
+		label: "楠屾敹澶囨敞",
+		align: "center",
+		prop: "acceptanceRemark",
+		formatData: (cell) => cell || "-",
 	},
 	{
 		fixed: "right",
@@ -680,6 +705,11 @@
   await fetchMaintenanceTaskFiles(row.id)
 }
 
+// 鎵撳紑楠屾敹瀹℃壒寮圭獥
+const openAcceptanceDialog = (row) => {
+  acceptanceModalRef.value.open(row.id, row)
+}
+
 // 鍒锋柊闄勪欢鍒楄〃
 const refreshFileList = async () => {
   if (!currentMaintenanceTaskId.value) return
diff --git a/src/views/procurementManagement/paymentLedger/index.vue b/src/views/procurementManagement/paymentLedger/index.vue
index ba84a4c..8ec0dd9 100644
--- a/src/views/procurementManagement/paymentLedger/index.vue
+++ b/src/views/procurementManagement/paymentLedger/index.vue
@@ -42,15 +42,15 @@
                              prop="contractAmounts"
                              show-overflow-tooltip
                              :formatter="formattedNumber" />
-            <el-table-column label="搴斾粯閲戦(鍏�)"
-                             prop="payableAmount"
-                             show-overflow-tooltip>
-              <template #default="{ row, column }">
-                <el-text type="danger">
-                  {{ formattedNumber(row, column, row.payableAmount) }}
-                </el-text>
-              </template>
-            </el-table-column>
+<!--            <el-table-column label="搴斾粯閲戦(鍏�)"-->
+<!--                             prop="payableAmount"-->
+<!--                             show-overflow-tooltip>-->
+<!--              <template #default="{ row, column }">-->
+<!--                <el-text type="danger">-->
+<!--                  {{ formattedNumber(row, column, row.payableAmount) }}-->
+<!--                </el-text>-->
+<!--              </template>-->
+<!--            </el-table-column>-->
           </el-table>
           <pagination v-show="total > 0"
                       @pagination="paginationSearch"

--
Gitblit v1.9.3