From f36f2f20bfb06dc3ca1b69c8a6d260d09d7d70ba Mon Sep 17 00:00:00 2001
From: 曹睿 <360930172@qq.com>
Date: 星期五, 27 六月 2025 17:29:13 +0800
Subject: [PATCH] feat: 新增设备报修模块。
---
src/views/procurementManagement/paymentHistory/index.vue | 2
src/views/procurementManagement/procurementInvoiceLedger/index.vue | 6
src/views/procurementManagement/invoiceEntry/components/ExpandTable.vue | 10
src/views/equipmentManagement/repair/Modal/MaintainModal.vue | 58 +++
src/views/equipmentManagement/repair/Modal/RepairModal.vue | 70 ++++
src/views/equipmentManagement/repair/index.vue | 207 ++++++++++++
src/views/procurementManagement/invoiceEntry/index.vue | 6
src/views/equipmentManagement/repair/Form/RepairForm.vue | 112 +++++++
src/views/procurementManagement/paymentEntry/index.vue | 6
src/views/salesManagement/invoiceRegistration/index.vue | 1
src/api/equipmentManagement/ledger.js | 7
src/store/modules/settings.js | 103 +++--
src/views/procurementManagement/paymentLedger/index.vue | 4
src/api/equipmentManagement/repair.js | 72 ++++
src/views/equipmentManagement/repair/Form/MaintainForm.vue | 53 +++
src/api/procurementManagement/paymentLedger.js | 20
src/views/equipmentManagement/ledger/Modal.vue | 2
src/layout/components/Settings/index.vue | 164 ++++++---
src/views/procurementManagement/invoiceEntry/components/Modal.vue | 5
src/views/salesManagement/receiptPaymentHistory/index.vue | 2
20 files changed, 783 insertions(+), 127 deletions(-)
diff --git a/src/api/equipmentManagement/ledger.js b/src/api/equipmentManagement/ledger.js
index 1eac3e7..d1b65b0 100644
--- a/src/api/equipmentManagement/ledger.js
+++ b/src/api/equipmentManagement/ledger.js
@@ -35,3 +35,10 @@
method: "delete",
});
};
+
+export const getDeviceLedger = () => {
+ return request({
+ url: "/device/ledger/getDeviceLedger",
+ method: "get",
+ });
+};
diff --git a/src/api/equipmentManagement/repair.js b/src/api/equipmentManagement/repair.js
new file mode 100644
index 0000000..0233ae6
--- /dev/null
+++ b/src/api/equipmentManagement/repair.js
@@ -0,0 +1,72 @@
+import request from "@/utils/request";
+
+/**
+ * @desc 璁惧鎶ヤ慨鍒楄〃
+ * @param {鍒嗛〉鏌ヨ} params
+ * @returns
+ */
+export const getRepairPage = (params) => {
+ return request({
+ url: "/device/repair/page",
+ method: "get",
+ params,
+ });
+};
+
+/**
+ * @desc 鏂板鎶ヤ慨
+ * @param {鎶ヤ慨鍙傛暟} data
+ * @returns
+ */
+export const addRepair = (data) => {
+ return request({
+ url: "/device/repair",
+ method: "post",
+ data,
+ });
+};
+
+/**
+ * @desc 缂栬緫鎶ヤ慨
+ * @param {鎶ヤ慨鍙傛暟} data
+ * @returns
+ */
+export const editRepair = (data) => {
+ return request({
+ url: "/device/repair",
+ method: "put",
+ data,
+ });
+};
+
+/**
+ * @desc 鏍规嵁id鏌ヨ涓�鏉℃姤淇�
+ * @param {鎶ヤ慨id} id
+ * @returns
+ */
+export const getRepairById = (id) => {
+ return request({
+ url: `/device/repair/${id}`,
+ method: "get",
+ });
+};
+
+/**
+ * @desc 鍒犻櫎鎶ヤ慨
+ * @param {缂栧彿} ids
+ * @returns
+ */
+export const delRepair = (ids) => {
+ return request({
+ url: `/device/repair/${ids}`,
+ method: "delete",
+ });
+};
+
+export const addMaintain = (data) => {
+ return request({
+ url: `/device/repair/repair`,
+ method: "post",
+ data,
+ });
+};
diff --git a/src/api/procurementManagement/paymentLedger.js b/src/api/procurementManagement/paymentLedger.js
index 250774b..3e20b78 100644
--- a/src/api/procurementManagement/paymentLedger.js
+++ b/src/api/procurementManagement/paymentLedger.js
@@ -1,19 +1,19 @@
// 閲囪喘鍙拌处椤甸潰鎺ュ彛
-import request from '@/utils/request'
+import request from "@/utils/request";
// 鍒嗛〉鏌ヨ
export function paymentLedgerList(query) {
- return request({
- url: '/purchase/paymentRegistration/paymentLedgerList',
- method: 'get',
- params: query
- })
+ return request({
+ url: "/purchase/paymentRegistration/paymentLedgerList",
+ method: "get",
+ params: query,
+ });
}
// 鍒嗛〉鏌ヨ
export function paymentRecordList(supplierId) {
- return request({
- url: '/purchase/paymentRegistration/getPaymentRecordList/'+ supplierId,
- method: 'get'
- })
+ return request({
+ url: "/purchase/paymentRegistration/getPaymentRecordList/" + supplierId,
+ method: "get",
+ });
}
diff --git a/src/layout/components/Settings/index.vue b/src/layout/components/Settings/index.vue
index 55ccec2..e107218 100644
--- a/src/layout/components/Settings/index.vue
+++ b/src/layout/components/Settings/index.vue
@@ -4,22 +4,58 @@
<h3 class="drawer-title">涓婚椋庢牸璁剧疆</h3>
</div>
<div class="setting-drawer-block-checbox">
- <div class="setting-drawer-block-checbox-item" @click="handleTheme('theme-dark')">
+ <div
+ class="setting-drawer-block-checbox-item"
+ @click="handleTheme('theme-dark')"
+ >
<img src="@/assets/images/dark.svg" alt="dark" />
- <div v-if="sideTheme === 'theme-dark'" class="setting-drawer-block-checbox-selectIcon" style="display: block;">
+ <div
+ v-if="sideTheme === 'theme-dark'"
+ class="setting-drawer-block-checbox-selectIcon"
+ style="display: block"
+ >
<i aria-label="鍥炬爣: check" class="anticon anticon-check">
- <svg viewBox="64 64 896 896" data-icon="check" width="1em" height="1em" :fill="theme" aria-hidden="true" focusable="false" class>
- <path d="M912 190h-69.9c-9.8 0-19.1 4.5-25.1 12.2L404.7 724.5 207 474a32 32 0 0 0-25.1-12.2H112c-6.7 0-10.4 7.7-6.3 12.9l273.9 347c12.8 16.2 37.4 16.2 50.3 0l488.4-618.9c4.1-5.1.4-12.8-6.3-12.8z" />
+ <svg
+ viewBox="64 64 896 896"
+ data-icon="check"
+ width="1em"
+ height="1em"
+ :fill="theme"
+ aria-hidden="true"
+ focusable="false"
+ class
+ >
+ <path
+ d="M912 190h-69.9c-9.8 0-19.1 4.5-25.1 12.2L404.7 724.5 207 474a32 32 0 0 0-25.1-12.2H112c-6.7 0-10.4 7.7-6.3 12.9l273.9 347c12.8 16.2 37.4 16.2 50.3 0l488.4-618.9c4.1-5.1.4-12.8-6.3-12.8z"
+ />
</svg>
</i>
</div>
</div>
- <div class="setting-drawer-block-checbox-item" @click="handleTheme('theme-light')">
+ <div
+ class="setting-drawer-block-checbox-item"
+ @click="handleTheme('theme-light')"
+ >
<img src="@/assets/images/light.svg" alt="light" />
- <div v-if="sideTheme === 'theme-light'" class="setting-drawer-block-checbox-selectIcon" style="display: block;">
+ <div
+ v-if="sideTheme === 'theme-light'"
+ class="setting-drawer-block-checbox-selectIcon"
+ style="display: block"
+ >
<i aria-label="鍥炬爣: check" class="anticon anticon-check">
- <svg viewBox="64 64 896 896" data-icon="check" width="1em" height="1em" :fill="theme" aria-hidden="true" focusable="false" class>
- <path d="M912 190h-69.9c-9.8 0-19.1 4.5-25.1 12.2L404.7 724.5 207 474a32 32 0 0 0-25.1-12.2H112c-6.7 0-10.4 7.7-6.3 12.9l273.9 347c12.8 16.2 37.4 16.2 50.3 0l488.4-618.9c4.1-5.1.4-12.8-6.3-12.8z" />
+ <svg
+ viewBox="64 64 896 896"
+ data-icon="check"
+ width="1em"
+ height="1em"
+ :fill="theme"
+ aria-hidden="true"
+ focusable="false"
+ class
+ >
+ <path
+ d="M912 190h-69.9c-9.8 0-19.1 4.5-25.1 12.2L404.7 724.5 207 474a32 32 0 0 0-25.1-12.2H112c-6.7 0-10.4 7.7-6.3 12.9l273.9 347c12.8 16.2 37.4 16.2 50.3 0l488.4-618.9c4.1-5.1.4-12.8-6.3-12.8z"
+ />
</svg>
</i>
</div>
@@ -28,7 +64,11 @@
<div class="drawer-item">
<span>涓婚棰滆壊</span>
<span class="comp-style">
- <el-color-picker v-model="theme" :predefine="predefineColors" @change="themeChange"/>
+ <el-color-picker
+ v-model="theme"
+ :predefine="predefineColors"
+ @change="themeChange"
+ />
</span>
</div>
<el-divider />
@@ -38,7 +78,11 @@
<div class="drawer-item">
<span>寮�鍚� TopNav</span>
<span class="comp-style">
- <el-switch v-model="settingsStore.topNav" @change="topNavChange" class="drawer-switch" />
+ <el-switch
+ v-model="settingsStore.topNav"
+ @change="topNavChange"
+ class="drawer-switch"
+ />
</span>
</div>
@@ -72,81 +116,93 @@
<el-divider />
- <el-button type="primary" plain icon="DocumentAdd" @click="saveSetting">淇濆瓨閰嶇疆</el-button>
+ <el-button type="primary" plain icon="DocumentAdd" @click="saveSetting"
+ >淇濆瓨閰嶇疆</el-button
+ >
<el-button plain icon="Refresh" @click="resetSetting">閲嶇疆閰嶇疆</el-button>
</el-drawer>
-
</template>
<script setup>
-import variables from '@/assets/styles/variables.module.scss'
-import axios from 'axios'
-import { ElLoading, ElMessage } from 'element-plus'
-import { useDynamicTitle } from '@/utils/dynamicTitle'
-import useAppStore from '@/store/modules/app'
-import useSettingsStore from '@/store/modules/settings'
-import usePermissionStore from '@/store/modules/permission'
-import { handleThemeStyle } from '@/utils/theme'
+import variables from "@/assets/styles/variables.module.scss";
+import axios from "axios";
+import { ElLoading, ElMessage } from "element-plus";
+import { useDynamicTitle } from "@/utils/dynamicTitle";
+import useAppStore from "@/store/modules/app";
+import useSettingsStore from "@/store/modules/settings";
+import usePermissionStore from "@/store/modules/permission";
+import { handleThemeStyle } from "@/utils/theme";
-const { proxy } = getCurrentInstance()
-const appStore = useAppStore()
-const settingsStore = useSettingsStore()
-const permissionStore = usePermissionStore()
-const showSettings = ref(false)
-const theme = ref(settingsStore.theme)
-const sideTheme = ref(settingsStore.sideTheme)
-const storeSettings = computed(() => settingsStore)
-const predefineColors = ref(["#800020", "#81D8D0", "#E85827", "#008C8C", "#002FA7", "#F9DC24", "#B05923", "#003153", "#8F4B28", "#4C0009"])
+const { proxy } = getCurrentInstance();
+const appStore = useAppStore();
+const settingsStore = useSettingsStore();
+const permissionStore = usePermissionStore();
+const showSettings = ref(false);
+const theme = ref(settingsStore.theme);
+const sideTheme = ref(settingsStore.sideTheme);
+const storeSettings = computed(() => settingsStore);
+const predefineColors = ref([
+ "#002fa7",
+ "#81D8D0",
+ "#E85827",
+ "#008C8C",
+ "#002FA7",
+ "#F9DC24",
+ "#B05923",
+ "#003153",
+ "#8F4B28",
+ "#4C0009",
+]);
/** 鏄惁闇�瑕乼opnav */
function topNavChange(val) {
if (!val) {
- appStore.toggleSideBarHide(false)
- permissionStore.setSidebarRouters(permissionStore.defaultRoutes)
+ appStore.toggleSideBarHide(false);
+ permissionStore.setSidebarRouters(permissionStore.defaultRoutes);
}
}
function themeChange(val) {
- settingsStore.theme = val
- handleThemeStyle(val)
+ settingsStore.theme = val;
+ handleThemeStyle(val);
}
function handleTheme(val) {
- settingsStore.sideTheme = val
- sideTheme.value = val
+ settingsStore.sideTheme = val;
+ sideTheme.value = val;
}
function saveSetting() {
- proxy.$modal.loading("姝e湪淇濆瓨鍒版湰鍦帮紝璇风◢鍊�...")
+ proxy.$modal.loading("姝e湪淇濆瓨鍒版湰鍦帮紝璇风◢鍊�...");
let layoutSetting = {
- "topNav": storeSettings.value.topNav,
- "tagsView": storeSettings.value.tagsView,
- "fixedHeader": storeSettings.value.fixedHeader,
- "sidebarLogo": storeSettings.value.sidebarLogo,
- "dynamicTitle": storeSettings.value.dynamicTitle,
- "sideTheme": storeSettings.value.sideTheme,
- "theme": storeSettings.value.theme
- }
- localStorage.setItem("layout-setting", JSON.stringify(layoutSetting))
- setTimeout(proxy.$modal.closeLoading(), 1000)
+ topNav: storeSettings.value.topNav,
+ tagsView: storeSettings.value.tagsView,
+ fixedHeader: storeSettings.value.fixedHeader,
+ sidebarLogo: storeSettings.value.sidebarLogo,
+ dynamicTitle: storeSettings.value.dynamicTitle,
+ sideTheme: storeSettings.value.sideTheme,
+ theme: storeSettings.value.theme,
+ };
+ localStorage.setItem("layout-setting", JSON.stringify(layoutSetting));
+ setTimeout(proxy.$modal.closeLoading(), 1000);
}
function resetSetting() {
- proxy.$modal.loading("姝e湪娓呴櫎璁剧疆缂撳瓨骞跺埛鏂帮紝璇风◢鍊�...")
- localStorage.removeItem("layout-setting")
- setTimeout("window.location.reload()", 1000)
+ proxy.$modal.loading("姝e湪娓呴櫎璁剧疆缂撳瓨骞跺埛鏂帮紝璇风◢鍊�...");
+ localStorage.removeItem("layout-setting");
+ setTimeout("window.location.reload()", 1000);
}
function openSetting() {
- showSettings.value = true
+ showSettings.value = true;
}
defineExpose({
- openSetting
-})
+ openSetting,
+});
</script>
-<style lang='scss' scoped>
+<style lang="scss" scoped>
.setting-drawer-title {
margin-bottom: 12px;
color: var(--el-text-color-primary, rgba(0, 0, 0, 0.85));
@@ -201,4 +257,4 @@
margin: -3px 8px 0px 0px;
}
}
-</style>
\ No newline at end of file
+</style>
diff --git a/src/store/modules/settings.js b/src/store/modules/settings.js
index 76a1136..e526da0 100644
--- a/src/store/modules/settings.js
+++ b/src/store/modules/settings.js
@@ -1,48 +1,67 @@
-import defaultSettings from '@/settings'
-import { useDark, useToggle } from '@vueuse/core'
-import { useDynamicTitle } from '@/utils/dynamicTitle'
+import defaultSettings from "@/settings";
+import { useDark, useToggle } from "@vueuse/core";
+import { useDynamicTitle } from "@/utils/dynamicTitle";
-const isDark = useDark()
-const toggleDark = useToggle(isDark)
+const isDark = useDark();
+const toggleDark = useToggle(isDark);
-const { sideTheme, showSettings, topNav, tagsView, fixedHeader, sidebarLogo, dynamicTitle } = defaultSettings
+const {
+ sideTheme,
+ showSettings,
+ topNav,
+ tagsView,
+ fixedHeader,
+ sidebarLogo,
+ dynamicTitle,
+} = defaultSettings;
-const storageSetting = JSON.parse(localStorage.getItem('layout-setting')) || ''
+const storageSetting = JSON.parse(localStorage.getItem("layout-setting")) || "";
-const useSettingsStore = defineStore(
- 'settings',
- {
- state: () => ({
- title: '',
- theme: storageSetting.theme || '#2C51D9',
- sideTheme: storageSetting.sideTheme || sideTheme,
- showSettings: showSettings,
- topNav: storageSetting.topNav === undefined ? topNav : storageSetting.topNav,
- tagsView: storageSetting.tagsView === undefined ? tagsView : storageSetting.tagsView,
- fixedHeader: storageSetting.fixedHeader === undefined ? fixedHeader : storageSetting.fixedHeader,
- sidebarLogo: storageSetting.sidebarLogo === undefined ? sidebarLogo : storageSetting.sidebarLogo,
- dynamicTitle: storageSetting.dynamicTitle === undefined ? dynamicTitle : storageSetting.dynamicTitle,
- isDark: isDark.value
- }),
- actions: {
- // 淇敼甯冨眬璁剧疆
- changeSetting(data) {
- const { key, value } = data
- if (this.hasOwnProperty(key)) {
- this[key] = value
- }
- },
- // 璁剧疆缃戦〉鏍囬
- setTitle(title) {
- this.title = title
- useDynamicTitle()
- },
- // 鍒囨崲鏆楅粦妯″紡
- toggleTheme() {
- this.isDark = !this.isDark
- toggleDark()
+const useSettingsStore = defineStore("settings", {
+ state: () => ({
+ title: "",
+ theme: storageSetting.theme || "#002fa7",
+ sideTheme: storageSetting.sideTheme || sideTheme,
+ showSettings: showSettings,
+ topNav:
+ storageSetting.topNav === undefined ? topNav : storageSetting.topNav,
+ tagsView:
+ storageSetting.tagsView === undefined
+ ? tagsView
+ : storageSetting.tagsView,
+ fixedHeader:
+ storageSetting.fixedHeader === undefined
+ ? fixedHeader
+ : storageSetting.fixedHeader,
+ sidebarLogo:
+ storageSetting.sidebarLogo === undefined
+ ? sidebarLogo
+ : storageSetting.sidebarLogo,
+ dynamicTitle:
+ storageSetting.dynamicTitle === undefined
+ ? dynamicTitle
+ : storageSetting.dynamicTitle,
+ isDark: isDark.value,
+ }),
+ actions: {
+ // 淇敼甯冨眬璁剧疆
+ changeSetting(data) {
+ const { key, value } = data;
+ if (this.hasOwnProperty(key)) {
+ this[key] = value;
}
- }
- })
+ },
+ // 璁剧疆缃戦〉鏍囬
+ setTitle(title) {
+ this.title = title;
+ useDynamicTitle();
+ },
+ // 鍒囨崲鏆楅粦妯″紡
+ toggleTheme() {
+ this.isDark = !this.isDark;
+ toggleDark();
+ },
+ },
+});
-export default useSettingsStore
+export default useSettingsStore;
diff --git a/src/views/equipmentManagement/ledger/Modal.vue b/src/views/equipmentManagement/ledger/Modal.vue
index d1562dd..7bfe46c 100644
--- a/src/views/equipmentManagement/ledger/Modal.vue
+++ b/src/views/equipmentManagement/ledger/Modal.vue
@@ -31,7 +31,7 @@
modalOptions,
handleConfirm,
closeModal,
-} = useModal();
+} = useModal({ title: "璁惧鍙拌处" });
const sendForm = async () => {
loading.value = true;
diff --git a/src/views/equipmentManagement/repair/Form/MaintainForm.vue b/src/views/equipmentManagement/repair/Form/MaintainForm.vue
new file mode 100644
index 0000000..f946e7e
--- /dev/null
+++ b/src/views/equipmentManagement/repair/Form/MaintainForm.vue
@@ -0,0 +1,53 @@
+<template>
+ <el-form :model="form" label-width="80px">
+ <el-form-item label="缁翠慨浜�">
+ <el-input v-model="form.maintenanceName" placeholder="璇疯緭鍏ョ淮淇汉" />
+ </el-form-item>
+ <el-form-item label="缁翠慨缁撴灉">
+ <el-input v-model="form.maintenanceResult" placeholder="璇疯緭鍏ョ淮淇粨鏋�" />
+ </el-form-item>
+ <el-form-item label="缁翠慨缁撴灉">
+ <el-date-picker
+ v-model="form.maintenanceTime"
+ placeholder="璇烽�夋嫨缁翠慨鏃ユ湡"
+ format="YYYY-MM-DD"
+ value-format="YYYY-MM-DD"
+ type="date"
+ clearable
+ style="width: 100%"
+ />
+ </el-form-item>
+ </el-form>
+</template>
+
+<script setup>
+import useFormData from "@/hooks/useFormData";
+
+defineOptions({
+ name: "璁惧缁翠慨琛ㄥ崟",
+});
+
+const { form, resetForm } = useFormData({
+ maintenanceName: undefined, // 缁翠慨鍚嶇О
+ maintenanceResult: undefined, // 缁翠慨缁撴灉
+ maintenanceTime: undefined, // 缁翠慨鏃ユ湡
+});
+
+const setForm = (data) => {
+ form.maintenanceName = data.maintenanceName;
+ form.maintenanceResult = data.maintenanceResult;
+ form.maintenanceTime = data.maintenanceTime;
+};
+
+const getForm = () => {
+ return form;
+};
+
+defineExpose({
+ getForm,
+ setForm,
+ resetForm,
+});
+</script>
+
+<style lang="scss" scoped></style>
diff --git a/src/views/equipmentManagement/repair/Form/RepairForm.vue b/src/views/equipmentManagement/repair/Form/RepairForm.vue
new file mode 100644
index 0000000..6ded5fe
--- /dev/null
+++ b/src/views/equipmentManagement/repair/Form/RepairForm.vue
@@ -0,0 +1,112 @@
+<template>
+ <el-form :model="form" label-width="100px">
+ <el-row>
+ <el-col :span="12">
+ <el-form-item label="璁惧鍚嶇О">
+ <el-select v-model="form.deviceLedgerId" @change="setDeviceModel">
+ <el-option
+ v-for="(item, index) in deviceOptions"
+ :key="index"
+ :label="item.deviceName"
+ :value="item.id"
+ ></el-option>
+ </el-select>
+ </el-form-item>
+ </el-col>
+ <el-col :span="12">
+ <el-form-item label="瑙勬牸鍨嬪彿">
+ <el-input
+ v-model="form.deviceModel"
+ placeholder="璇疯緭鍏ヨ鏍煎瀷鍙�"
+ disabled
+ />
+ </el-form-item>
+ </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-form-item>
+ </el-col>
+ <el-col :span="12">
+ <el-form-item label="鎶ヤ慨浜�">
+ <el-input v-model="form.repairName" placeholder="璇疯緭鍏ユ姤淇汉" />
+ </el-form-item>
+ </el-col>
+ <el-col :span="24">
+ <el-form-item label="鏁呴殰鐜拌薄">
+ <el-input
+ v-model="form.remark"
+ :rows="2"
+ type="textarea"
+ placeholder="璇疯緭鍏ユ晠闅滅幇璞�"
+ />
+ </el-form-item>
+ </el-col>
+ </el-row>
+ </el-form>
+</template>
+
+<script setup>
+import useFormData from "@/hooks/useFormData";
+import { getDeviceLedger } from "@/api/equipmentManagement/ledger";
+import { onMounted } from "vue";
+
+defineOptions({
+ name: "璁惧鎶ヤ慨琛ㄥ崟",
+});
+
+const deviceOptions = ref([]);
+
+const loadDeviceName = async () => {
+ const { data } = await getDeviceLedger();
+ deviceOptions.value = data;
+};
+
+const { form, resetForm } = useFormData({
+ deviceLedgerId: undefined, // 璁惧Id
+ deviceName: undefined, // 璁惧鍚嶇О
+ deviceModel: undefined, // 瑙勬牸鍨嬪彿
+ repairTime: undefined, // 鎶ヤ慨鏃ユ湡
+ repairName: undefined, // 鎶ヤ慨浜�
+ remark: undefined, // 鏁呴殰鐜拌薄
+});
+
+const setDeviceModel = (id) => {
+ const option = deviceOptions.value.find((item) => item.id === id);
+ form.deviceModel = option.deviceModel;
+};
+
+const getForm = () => {
+ return form;
+};
+
+const setForm = (data) => {
+ form.deviceLedgerId = data.deviceLedgerId;
+ form.deviceName = data.deviceName;
+ form.deviceModel = data.deviceModel;
+ form.repairTime = data.repairTime;
+ form.repairName = data.repairName;
+ form.remark = data.remark;
+};
+
+onMounted(() => {
+ loadDeviceName();
+});
+
+defineExpose({
+ loadDeviceName,
+ resetForm,
+ getForm,
+ setForm,
+});
+</script>
+
+<style lang="scss" scoped></style>
diff --git a/src/views/equipmentManagement/repair/Modal/MaintainModal.vue b/src/views/equipmentManagement/repair/Modal/MaintainModal.vue
new file mode 100644
index 0000000..695773e
--- /dev/null
+++ b/src/views/equipmentManagement/repair/Modal/MaintainModal.vue
@@ -0,0 +1,58 @@
+<template>
+ <el-drawer v-model="visible" :title="modalOptions.title" direction="ltr">
+ <MaintainForm ref="maintainFormRef" />
+ <template #footer>
+ <el-button @click="closeModal">{{ modalOptions.cancelText }}</el-button>
+ <el-button type="primary" @click="sendForm" :loading="loading">
+ {{ modalOptions.confirmText }}
+ </el-button>
+ </template>
+ </el-drawer>
+</template>
+
+<script setup>
+import { useModal } from "@/hooks/useModal";
+import MaintainForm from "../Form/MaintainForm.vue";
+import { addMaintain } from "@/api/equipmentManagement/repair";
+
+defineOptions({
+ name: "缁翠慨妯℃�佹",
+});
+
+const maintainFormRef = ref();
+const emits = defineEmits(["ok"]);
+
+const {
+ id,
+ visible,
+ loading,
+ openModal,
+ modalOptions,
+ handleConfirm,
+ closeModal,
+} = useModal({ title: "璁惧缁翠慨" });
+
+const sendForm = async () => {
+ loading.value = true;
+ const form = await maintainFormRef.value.getForm();
+ const { code } = await addMaintain({ id: id.value, ...form });
+ if (code == 200) {
+ emits("ok");
+ maintainFormRef.value.resetForm();
+ closeModal();
+ }
+ loading.value = false;
+};
+
+const open = async (id, row) => {
+ openModal(id);
+ await nextTick();
+ maintainFormRef.value.setForm(row);
+};
+
+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
new file mode 100644
index 0000000..586960d
--- /dev/null
+++ b/src/views/equipmentManagement/repair/Modal/RepairModal.vue
@@ -0,0 +1,70 @@
+<template>
+ <el-dialog v-model="visible" :title="modalOptions.title" @close="close">
+ <RepairForm ref="repairFormRef" />
+ <template #footer>
+ <el-button @click="closeModal">{{ modalOptions.cancelText }}</el-button>
+ <el-button type="primary" @click="sendForm" :loading="loading">
+ {{ modalOptions.confirmText }}
+ </el-button>
+ </template>
+ </el-dialog>
+</template>
+
+<script setup>
+import { useModal } from "@/hooks/useModal";
+import RepairForm from "../Form/RepairForm.vue";
+import {
+ addRepair,
+ editRepair,
+ getRepairById,
+} from "@/api/equipmentManagement/repair";
+import { ElMessage } from "element-plus";
+
+defineOptions({
+ name: "璁惧鎶ヤ慨寮圭獥",
+});
+
+const emits = defineEmits(["ok"]);
+
+const repairFormRef = ref();
+const {
+ id,
+ visible,
+ loading,
+ openModal,
+ modalOptions,
+ handleConfirm,
+ closeModal,
+} = useModal({ title: "璁惧鎶ヤ慨" });
+
+const sendForm = async () => {
+ loading.value = true;
+ const form = await repairFormRef.value.getForm();
+ const { code } = id.value
+ ? await editRepair({ id: unref(id), ...form })
+ : await addRepair(form);
+ if (code == 200) {
+ ElMessage.success(`${id ? "缂栬緫" : "鏂板"}鎶ヤ慨鎴愬姛`);
+ closeModal();
+ emits("ok");
+ }
+ loading.value = false;
+};
+
+const openEdit = async (id) => {
+ const { data } = await getRepairById(id);
+ openModal(id);
+ await nextTick();
+ await repairFormRef.value.setForm(data);
+};
+
+const close = () => {
+ repairFormRef.value.resetForm();
+ closeModal();
+};
+
+defineExpose({
+ openModal,
+ openEdit,
+});
+</script>
diff --git a/src/views/equipmentManagement/repair/index.vue b/src/views/equipmentManagement/repair/index.vue
new file mode 100644
index 0000000..96fb91b
--- /dev/null
+++ b/src/views/equipmentManagement/repair/index.vue
@@ -0,0 +1,207 @@
+<template>
+ <div class="app-container">
+ <div class="table_list">
+ <div class="actions">
+ <el-text class="mx-1" size="large">璁惧鎶ヤ慨</el-text>
+ <div>
+ <el-button
+ type="primary"
+ icon="Plus"
+ :disabled="multipleList.length !== 1"
+ @click="addMaintain"
+ >
+ 鏂板缁翠慨
+ </el-button>
+ <el-button type="success" icon="Van" @click="addRepair">
+ 鏂板鎶ヤ慨
+ </el-button>
+ <el-button
+ type="danger"
+ icon="Delete"
+ :disabled="multipleList.length <= 0"
+ @click="delRepairByIds(multipleList.map((item) => item.id))"
+ >
+ 鎵归噺鍒犻櫎
+ </el-button>
+ </div>
+ </div>
+ <PIMTable
+ rowKey="id"
+ isSelection
+ :column="columns"
+ :tableData="dataList"
+ :page="{
+ current: pagination.currentPage,
+ size: pagination.pageSize,
+ total: pagination.total,
+ }"
+ @selection-change="handleSelectionChange"
+ >
+ <template #statusRef="{ row }">
+ <el-tag v-if="row.status === 1" type="success">瀹岀粨</el-tag>
+ <el-tag v-if="row.status === 0" type="error">寰呯淮淇�</el-tag>
+ </template>
+ <template #operation="{ row }">
+ <el-button
+ type="primary"
+ text
+ icon="editPen"
+ @click="editRepair(row.id)"
+ >
+ 缂栬緫
+ </el-button>
+ <el-button
+ type="danger"
+ text
+ icon="delete"
+ @click="delRepairByIds(row.id)"
+ >
+ 鍒犻櫎
+ </el-button>
+ </template>
+ </PIMTable>
+ </div>
+ <RepairModal ref="repairModalRef" @ok="getTableData" />
+ <MaintainModal ref="maintainModalRef" @ok="getTableData" />
+ </div>
+</template>
+
+<script setup>
+import { usePaginationApi } from "@/hooks/usePaginationApi";
+import { getRepairPage, delRepair } from "@/api/equipmentManagement/repair";
+import { onMounted } from "vue";
+import RepairModal from "./Modal/RepairModal.vue";
+import { ElMessageBox, ElMessage } from "element-plus";
+import dayjs from "dayjs";
+import MaintainModal from "./Modal/MaintainModal.vue";
+
+defineOptions({
+ name: "璁惧鎶ヤ慨",
+});
+
+// 妯℃�佹瀹炰緥
+const repairModalRef = ref();
+const maintainModalRef = ref();
+
+// 琛ㄦ牸澶氶�夋閫変腑椤�
+const multipleList = ref([]);
+
+// 琛ㄦ牸閽╁瓙
+const { filters, columns, dataList, pagination, getTableData, resetFilters } =
+ usePaginationApi(
+ getRepairPage,
+ {
+ searchText: undefined,
+ },
+ [
+ {
+ label: "璁惧鍚嶇О",
+ align: "center",
+ prop: "deviceName",
+ },
+ {
+ label: "瑙勬牸鍨嬪彿",
+ align: "center",
+ prop: "deviceModel",
+ },
+ {
+ label: "鎶ヤ慨鏃ユ湡",
+ align: "center",
+ prop: "repairTime",
+ formatData: (cell) => dayjs(cell).format("YYYY-MM-DD"),
+ },
+ {
+ label: "鎶ヤ慨浜�",
+ align: "center",
+ prop: "repairName",
+ },
+ {
+ label: "鏁呴殰鐜拌薄",
+ align: "center",
+ prop: "remark",
+ },
+ {
+ label: "缁翠慨浜�",
+ align: "center",
+ prop: "maintenanceName",
+ },
+ {
+ label: "缁翠慨缁撴灉",
+ align: "center",
+ prop: "maintenanceResult",
+ },
+ {
+ label: "缁翠慨鏃ユ湡",
+ align: "center",
+ prop: "maintenanceTime",
+ formatData: (cell) => (cell ? dayjs(cell).format("YYYY-MM-DD") : ""),
+ },
+ {
+ label: "鐘舵��",
+ align: "center",
+ prop: "status",
+ dataType: "slot",
+ slot: "statusRef",
+ },
+ {
+ fixed: "right",
+ label: "鎿嶄綔",
+ dataType: "slot",
+ slot: "operation",
+ align: "center",
+ width: "200px",
+ },
+ ]
+ );
+
+// 澶氶�夊悗鍋氫粈涔�
+const handleSelectionChange = (selectionList) => {
+ multipleList.value = selectionList;
+};
+
+// 鏂板鎶ヤ慨
+const addRepair = () => {
+ repairModalRef.value.openModal();
+};
+
+// 缂栬緫鎶ヤ慨
+const editRepair = (id) => {
+ repairModalRef.value.openEdit(id);
+};
+
+// 鏂板缁翠慨
+const addMaintain = () => {
+ const row = multipleList.value[0];
+ maintainModalRef.value.open(row.id, row);
+};
+
+// 鍗曡鍒犻櫎
+const delRepairByIds = async (ids) => {
+ ElMessageBox.confirm("纭鍒犻櫎鎶ヤ慨鏁版嵁, 姝ゆ搷浣滀笉鍙��?", "璀﹀憡", {
+ confirmButtonText: "纭畾",
+ cancelButtonText: "鍙栨秷",
+ type: "warning",
+ }).then(async () => {
+ const { code } = await delRepair(ids);
+ if (code === 200) {
+ ElMessage.success("鍒犻櫎鎴愬姛");
+ getTableData();
+ }
+ });
+};
+
+onMounted(() => {
+ getTableData();
+});
+</script>
+
+<style lang="scss" scoped>
+.table_list {
+ margin-top: unset;
+}
+.actions {
+ display: flex;
+ justify-content: space-between;
+ margin-bottom: 10px;
+}
+</style>
diff --git a/src/views/procurementManagement/invoiceEntry/components/ExpandTable.vue b/src/views/procurementManagement/invoiceEntry/components/ExpandTable.vue
index 0523e40..7596e6d 100644
--- a/src/views/procurementManagement/invoiceEntry/components/ExpandTable.vue
+++ b/src/views/procurementManagement/invoiceEntry/components/ExpandTable.vue
@@ -55,28 +55,28 @@
label: "鍚◣鍗曚环(鍏�)",
prop: "taxInclusiveUnitPrice",
formatData: (val) => {
- return parseFloat(val).toFixed(2) ?? 0;
+ return val ? parseFloat(val).toFixed(2) : "-";
},
},
{
label: "鍚◣鎬讳环(鍏�)",
prop: "taxInclusiveTotalPrice",
formatData: (val) => {
- return parseFloat(val).toFixed(2) ?? 0;
+ return val ? parseFloat(val).toFixed(2) : "-";
},
},
{
label: "涓嶅惈绋庢�讳环(鍏�)",
prop: "taxExclusiveTotalPrice",
formatData: (val) => {
- return parseFloat(val).toFixed(2) ?? 0;
+ return val ? parseFloat(val).toFixed(2) : "-";
},
},
{
label: "鏈鏉ョエ閲戦(鍏�)",
prop: "ticketsAmount",
formatData: (val) => {
- return parseFloat(val).toFixed(2) ?? 0;
+ return val ? parseFloat(val).toFixed(2) : "-";
},
},
{
@@ -87,7 +87,7 @@
label: "鏈潵绁ㄩ噾棰�(鍏�)",
prop: "futureTicketsAmount",
formatData: (val) => {
- return parseFloat(val).toFixed(2) ?? 0;
+ return val ? parseFloat(val).toFixed(2) : "-";
},
},
],
diff --git a/src/views/procurementManagement/invoiceEntry/components/Modal.vue b/src/views/procurementManagement/invoiceEntry/components/Modal.vue
index 1fd32e9..2e0f3f3 100644
--- a/src/views/procurementManagement/invoiceEntry/components/Modal.vue
+++ b/src/views/procurementManagement/invoiceEntry/components/Modal.vue
@@ -235,7 +235,7 @@
prop: "taxInclusiveUnitPrice",
width: 150,
formatData: (val) => {
- return parseFloat(val).toFixed(2) ?? 0;
+ return val ? parseFloat(val).toFixed(2) : 0;
},
},
{
@@ -385,7 +385,8 @@
salesContractNo: form.salesContractNo,
projectName: form.projectName,
productData: form.productData,
- issUerId: form.issUerId, // 褰曞叆浜�
+ issueDate: form.entryDate,
+ issUerId: form.issUerId, // 褰曞叆浜篿d
issUer: form.issUer, // 褰曞叆浜�
salesContractNoId: form.salesContractNoId,
supplierName: form.supplierName,
diff --git a/src/views/procurementManagement/invoiceEntry/index.vue b/src/views/procurementManagement/invoiceEntry/index.vue
index 6de82f0..3f8fcf9 100644
--- a/src/views/procurementManagement/invoiceEntry/index.vue
+++ b/src/views/procurementManagement/invoiceEntry/index.vue
@@ -114,21 +114,21 @@
label: "鍚堝悓閲戦(鍏�)",
prop: "contractAmount",
formatData: (val) => {
- return parseFloat(val).toFixed(2) ?? 0;
+ return val ? parseFloat(val).toFixed(2) : 0;
},
},
{
label: "宸插紑绁ㄩ噾棰�(鍏�)",
prop: "receiptPaymentAmount",
formatData: (val) => {
- return parseFloat(val).toFixed(2) ?? 0;
+ return val ? parseFloat(val).toFixed(2) : 0;
},
},
{
label: "寰呭紑绁ㄩ噾棰�(鍏�)",
prop: "unReceiptPaymentAmount",
formatData: (val) => {
- return parseFloat(val).toFixed(2) ?? 0;
+ return val ? parseFloat(val).toFixed(2) : 0;
},
},
// {
diff --git a/src/views/procurementManagement/paymentEntry/index.vue b/src/views/procurementManagement/paymentEntry/index.vue
index 3dc9bb7..109200d 100644
--- a/src/views/procurementManagement/paymentEntry/index.vue
+++ b/src/views/procurementManagement/paymentEntry/index.vue
@@ -254,21 +254,21 @@
label: "鍙戠エ閲戦(鍏�)",
prop: "invoiceAmount",
formatData: (params) => {
- return parseFloat(params).toFixed(2);
+ return params ? parseFloat(params).toFixed(2) : 0;
},
},
{
label: "宸蹭粯娆鹃噾棰�(鍏�)",
prop: "paymentAmountTotal",
formatData: (params) => {
- return parseFloat(params).toFixed(2);
+ return params ? parseFloat(params).toFixed(2) : 0;
},
},
{
label: "寰呬粯娆鹃噾棰�(鍏�)",
prop: "unPaymentAmountTotal",
formatData: (params) => {
- return parseFloat(params).toFixed(2);
+ return params ? parseFloat(params).toFixed(2) : 0;
},
},
]);
diff --git a/src/views/procurementManagement/paymentHistory/index.vue b/src/views/procurementManagement/paymentHistory/index.vue
index 58e5f92..8811129 100644
--- a/src/views/procurementManagement/paymentHistory/index.vue
+++ b/src/views/procurementManagement/paymentHistory/index.vue
@@ -74,7 +74,7 @@
label: "浠樻閲戦",
prop: "currentPaymentAmount",
formatData: (params) => {
- return parseFloat(params).toFixed(2);
+ return params ? parseFloat(params).toFixed(2) : 0;
},
},
{
diff --git a/src/views/procurementManagement/paymentLedger/index.vue b/src/views/procurementManagement/paymentLedger/index.vue
index 665242c..61e6f98 100644
--- a/src/views/procurementManagement/paymentLedger/index.vue
+++ b/src/views/procurementManagement/paymentLedger/index.vue
@@ -168,14 +168,14 @@
label: "鍙戠エ閲戦(鍏�)",
prop: "invoiceAmount",
formatData: (params) => {
- return parseFloat(params).toFixed(2);
+ return params ? parseFloat(params).toFixed(2) : 0;
},
},
{
label: "浠樻閲戦(鍏�)",
prop: "currentPaymentAmount",
formatData: (params) => {
- return parseFloat(params).toFixed(2);
+ return params ? parseFloat(params).toFixed(2) : 0;
},
},
{
diff --git a/src/views/procurementManagement/procurementInvoiceLedger/index.vue b/src/views/procurementManagement/procurementInvoiceLedger/index.vue
index b71bec0..e5565a5 100644
--- a/src/views/procurementManagement/procurementInvoiceLedger/index.vue
+++ b/src/views/procurementManagement/procurementInvoiceLedger/index.vue
@@ -136,7 +136,7 @@
prop: "taxInclusiveTotalPrice",
align: "center",
formatData: (cell) => {
- return parseFloat(cell).toFixed(2);
+ return cell ? parseFloat(cell).toFixed(2) : 0;
},
},
{
@@ -149,7 +149,7 @@
prop: "ticketsAmount",
align: "center",
formatData: (cell) => {
- return parseFloat(cell).toFixed(2);
+ return cell ? parseFloat(cell).toFixed(2) : 0;
},
},
{
@@ -157,7 +157,7 @@
prop: "unTicketsPrice",
align: "center",
formatData: (cell) => {
- return parseFloat(cell).toFixed(2);
+ return cell ? parseFloat(cell).toFixed(2) : 0;
},
},
{
diff --git a/src/views/salesManagement/invoiceRegistration/index.vue b/src/views/salesManagement/invoiceRegistration/index.vue
index 528ba0c..25c2f01 100644
--- a/src/views/salesManagement/invoiceRegistration/index.vue
+++ b/src/views/salesManagement/invoiceRegistration/index.vue
@@ -424,6 +424,7 @@
productData: [],
invoiceNo: "",
createUer: "",
+ issueDate: "",
},
rules: {
salesLedgerId: [{ required: true, message: "璇烽�夋嫨", trigger: "change" }],
diff --git a/src/views/salesManagement/receiptPaymentHistory/index.vue b/src/views/salesManagement/receiptPaymentHistory/index.vue
index 7dd8f18..f240041 100644
--- a/src/views/salesManagement/receiptPaymentHistory/index.vue
+++ b/src/views/salesManagement/receiptPaymentHistory/index.vue
@@ -97,7 +97,7 @@
label: "鍥炴閲戦锛堝厓锛�",
prop: "receiptPaymentAmount",
formatData: (params) => {
- return parseFloat(params).toFixed(2);
+ return params ? parseFloat(params).toFixed(2) : 0;
},
},
{
--
Gitblit v1.9.3