From 8c04f7a021496b0dc0d08c8fd4580ef8f3e1dd49 Mon Sep 17 00:00:00 2001
From: zouyu <2723363702@qq.com>
Date: 星期二, 16 十二月 2025 14:31:58 +0800
Subject: [PATCH] 代码调整
---
src/views/index.vue | 968 ++++++----------
src/views/alarmManagement/alarmAnalysis/alarmTrend.vue | 176 +++
src/views/alarmManagement/alarmConfig/alarmRule.vue | 173 +++
src/router/index.js | 30
src/api/alarmManagement/alarmConfig.js | 66 +
src/api/alarmManagement/alarmStatistics.js | 55 +
.env.development | 2
/dev/null | 1016 ------------------
src/views/alarmManagement/alarmReport/alarmStats.vue | 260 ++++
src/views/alarmManagement/alarmMonitor/realTimeAlarm.vue | 271 ++++
src/api/alarmManagement/alarmHistory.js | 27
.env.production | 2
src/views/alarmManagement/alarmKnowledge/alarmHandle.vue | 180 +++
src/api/alarmManagement/alarmMonitor.js | 36
vite.config.js | 4
15 files changed, 1,636 insertions(+), 1,630 deletions(-)
diff --git a/.env.development b/.env.development
index 1a63995..284742d 100644
--- a/.env.development
+++ b/.env.development
@@ -1,5 +1,5 @@
# 椤甸潰鏍囬
-VITE_APP_TITLE = 鑺浜戯紙绠$悊淇℃伅绯荤粺锛�
+VITE_APP_TITLE = 宸ヨ壓鎶ヨ浼樺寲绠$悊绯荤粺
# 寮�鍙戠幆澧冮厤缃�
VITE_APP_ENV = 'development'
diff --git a/.env.production b/.env.production
index b8edcc8..62f61ed 100644
--- a/.env.production
+++ b/.env.production
@@ -1,5 +1,5 @@
# 椤甸潰鏍囬
-VITE_APP_TITLE = MIS锛堢鐞嗕俊鎭郴缁燂級
+VITE_APP_TITLE = 宸ヨ壓鎶ヨ浼樺寲绠$悊绯荤粺
# 鐢熶骇鐜閰嶇疆
VITE_APP_ENV = 'production'
diff --git a/src/api/alarmManagement/alarmConfig.js b/src/api/alarmManagement/alarmConfig.js
new file mode 100644
index 0000000..a6f4900
--- /dev/null
+++ b/src/api/alarmManagement/alarmConfig.js
@@ -0,0 +1,66 @@
+import request from '@/utils/request';
+
+// 鏌ヨ鎶ヨ閰嶇疆鍒楄〃
+export function listAlarmConfig(query) {
+ return request({
+ url: '/alarm/config/list',
+ method: 'get',
+ params: query
+ });
+}
+
+// 鑾峰彇鎶ヨ閰嶇疆璇︾粏淇℃伅
+export function getAlarmConfig(configId) {
+ return request({
+ url: '/alarm/config/' + configId,
+ method: 'get'
+ });
+}
+
+// 鏂板鎶ヨ閰嶇疆
+export function addAlarmConfig(data) {
+ return request({
+ url: '/alarm/config',
+ method: 'post',
+ data: data
+ });
+}
+
+// 淇敼鎶ヨ閰嶇疆
+export function updateAlarmConfig(data) {
+ return request({
+ url: '/alarm/config',
+ method: 'put',
+ data: data
+ });
+}
+
+// 鍒犻櫎鎶ヨ閰嶇疆
+export function delAlarmConfig(configIds) {
+ return request({
+ url: '/alarm/config/' + configIds,
+ method: 'delete'
+ });
+}
+
+// 淇敼鎶ヨ閰嶇疆鐘舵��
+export function changeStatus(configId, status) {
+ const data = {
+ configId,
+ status
+ };
+ return request({
+ url: '/alarm/config/changeStatus',
+ method: 'put',
+ data: data
+ });
+}
+
+// 瀵煎嚭鎶ヨ閰嶇疆
+export function exportAlarmConfig(query) {
+ return request({
+ url: '/alarm/config/export',
+ method: 'get',
+ params: query
+ });
+}
\ No newline at end of file
diff --git a/src/api/alarmManagement/alarmHistory.js b/src/api/alarmManagement/alarmHistory.js
new file mode 100644
index 0000000..3e116f9
--- /dev/null
+++ b/src/api/alarmManagement/alarmHistory.js
@@ -0,0 +1,27 @@
+import request from '@/utils/request';
+
+// 鏌ヨ鎶ヨ鍘嗗彶鍒楄〃
+export function listAlarmHistory(query) {
+ return request({
+ url: '/alarm/history/list',
+ method: 'get',
+ params: query
+ });
+}
+
+// 鑾峰彇鎶ヨ鍘嗗彶璇︽儏
+export function getAlarmHistoryDetail(alarmId) {
+ return request({
+ url: '/alarm/history/detail/' + alarmId,
+ method: 'get'
+ });
+}
+
+// 瀵煎嚭鎶ヨ鍘嗗彶
+export function exportAlarmHistory(query) {
+ return request({
+ url: '/alarm/history/export',
+ method: 'get',
+ params: query
+ });
+}
\ No newline at end of file
diff --git a/src/api/alarmManagement/alarmMonitor.js b/src/api/alarmManagement/alarmMonitor.js
new file mode 100644
index 0000000..4693693
--- /dev/null
+++ b/src/api/alarmManagement/alarmMonitor.js
@@ -0,0 +1,36 @@
+import request from '@/utils/request';
+
+// 鏌ヨ鎶ヨ鐩戞帶鍒楄〃
+export function listAlarmMonitor(query) {
+ return request({
+ url: '/alarm/monitor/list',
+ method: 'get',
+ params: query
+ });
+}
+
+// 纭鎶ヨ
+export function confirmAlarm(data) {
+ return request({
+ url: '/alarm/monitor/confirm',
+ method: 'post',
+ data: data
+ });
+}
+
+// 瑙e喅鎶ヨ
+export function resolveAlarm(data) {
+ return request({
+ url: '/alarm/monitor/resolve',
+ method: 'post',
+ data: data
+ });
+}
+
+// 鑾峰彇鎶ヨ璇︽儏
+export function getAlarmDetail(alarmId) {
+ return request({
+ url: '/alarm/monitor/detail/' + alarmId,
+ method: 'get'
+ });
+}
\ No newline at end of file
diff --git a/src/api/alarmManagement/alarmStatistics.js b/src/api/alarmManagement/alarmStatistics.js
new file mode 100644
index 0000000..e4da5d8
--- /dev/null
+++ b/src/api/alarmManagement/alarmStatistics.js
@@ -0,0 +1,55 @@
+import request from '@/utils/request';
+
+// 鑾峰彇鎶ヨ缁熻鏁版嵁
+export function getAlarmStatistics(query) {
+ return request({
+ url: '/alarm/statistics',
+ method: 'get',
+ params: query
+ });
+}
+
+// 鑾峰彇鎶ヨ绫诲瀷鍒嗗竷
+export function getAlarmTypeDistribution(query) {
+ return request({
+ url: '/alarm/statistics/typeDistribution',
+ method: 'get',
+ params: query
+ });
+}
+
+// 鑾峰彇鎶ヨ绛夌骇鍒嗗竷
+export function getAlarmLevelDistribution(query) {
+ return request({
+ url: '/alarm/statistics/levelDistribution',
+ method: 'get',
+ params: query
+ });
+}
+
+// 鑾峰彇鎶ヨ瓒嬪娍鍒嗘瀽
+export function getAlarmTrend(query) {
+ return request({
+ url: '/alarm/statistics/trend',
+ method: 'get',
+ params: query
+ });
+}
+
+// 鑾峰彇璁惧鎶ヨ鎺掕姒�
+export function getDeviceAlarmRank(query) {
+ return request({
+ url: '/alarm/statistics/deviceRank',
+ method: 'get',
+ params: query
+ });
+}
+
+// 鑾峰彇鎶ヨ澶勭悊鑰楁椂缁熻
+export function getHandleTimeStatistics(query) {
+ return request({
+ url: '/alarm/statistics/handleTime',
+ method: 'get',
+ params: query
+ });
+}
\ No newline at end of file
diff --git a/src/router/index.js b/src/router/index.js
index d190347..0458873 100644
--- a/src/router/index.js
+++ b/src/router/index.js
@@ -108,21 +108,21 @@
}
]
},
- {
- path: '/main/MobileChat',
- component: Layout,
- redirect: '',
- hidden: true,
- permissions: ['MobileChat:edit'],
- children: [
- {
- path: '',
- component: () => import('@/views/chatHome/chatHomeIndex/MobileChat'),
- name: 'MobileChat',
- meta: { title: 'AI瀵硅瘽', activeMenu: '/chatHome/chatHomeIndex'}
- }
- ]
- },
+ // {
+ // path: '/main/MobileChat',
+ // component: Layout,
+ // redirect: '',
+ // hidden: true,
+ // permissions: ['MobileChat:edit'],
+ // children: [
+ // {
+ // path: '',
+ // component: () => import('@/views/chatHome/chatHomeIndex/MobileChat'),
+ // name: 'MobileChat',
+ // meta: { title: 'AI瀵硅瘽', activeMenu: '/chatHome/chatHomeIndex'}
+ // }
+ // ]
+ // },
{
path: '/system/role-auth',
component: Layout,
diff --git a/src/views/alarmManagement/alarmAnalysis/alarmTrend.vue b/src/views/alarmManagement/alarmAnalysis/alarmTrend.vue
new file mode 100644
index 0000000..4c2d7ac
--- /dev/null
+++ b/src/views/alarmManagement/alarmAnalysis/alarmTrend.vue
@@ -0,0 +1,176 @@
+<template>
+ <div class="alarm-trend-analysis">
+ <el-card shadow="never" class="search-card">
+ <el-form :inline="true" :model="searchForm" class="demo-form-inline">
+ <el-form-item label="鏃堕棿鑼冨洿">
+ <el-date-picker
+ v-model="searchForm.dateRange"
+ type="daterange"
+ range-separator="鑷�"
+ start-placeholder="寮�濮嬫棩鏈�"
+ end-placeholder="缁撴潫鏃ユ湡"
+ format="yyyy-MM-dd"
+ value-format="yyyy-MM-dd"
+ />
+ </el-form-item>
+ <el-form-item label="鎶ヨ绾у埆">
+ <el-select v-model="searchForm.alarmLevel" placeholder="璇烽�夋嫨鎶ヨ绾у埆" clearable>
+ <el-option label="涓ラ噸" value="涓ラ噸" />
+ <el-option label="涓瓑" value="涓瓑" />
+ <el-option label="杞诲井" value="杞诲井" />
+ </el-select>
+ </el-form-item>
+ <el-form-item label="璁惧绫诲瀷">
+ <el-select v-model="searchForm.equipmentType" placeholder="璇烽�夋嫨璁惧绫诲瀷" clearable>
+ <el-option label="宸ヨ壓璁惧" value="宸ヨ壓璁惧" />
+ <el-option label="妫�娴嬭澶�" value="妫�娴嬭澶�" />
+ <el-option label="鍏朵粬璁惧" value="鍏朵粬璁惧" />
+ </el-select>
+ </el-form-item>
+ <el-form-item>
+ <el-button type="primary" icon="el-icon-search" @click="handleSearch">鏌ヨ</el-button>
+ </el-form-item>
+ </el-form>
+ </el-card>
+
+ <el-row :gutter="20">
+ <el-col :span="24">
+ <el-card shadow="never" class="chart-card">
+ <template #header>
+ <span>鎶ヨ瓒嬪娍鍒嗘瀽</span>
+ </template>
+ <div ref="chartContainer" class="chart-container"></div>
+ </el-card>
+ </el-col>
+ </el-row>
+
+ <el-row :gutter="20" style="margin-top: 20px;">
+ <el-col :span="12">
+ <el-card shadow="never" class="chart-card">
+ <template #header>
+ <span>鎶ヨ绾у埆鍒嗗竷</span>
+ </template>
+ <div ref="levelChartContainer" class="chart-container"></div>
+ </el-card>
+ </el-col>
+ <el-col :span="12">
+ <el-card shadow="never" class="chart-card">
+ <template #header>
+ <span>鎶ヨ璁惧绫诲瀷鍒嗗竷</span>
+ </template>
+ <div ref="equipmentChartContainer" class="chart-container"></div>
+ </el-card>
+ </el-col>
+ </el-row>
+ </div>
+</template>
+
+<script>
+export default {
+ name: 'AlarmTrendAnalysis',
+ data() {
+ return {
+ searchForm: {
+ dateRange: [],
+ alarmLevel: '',
+ equipmentType: ''
+ },
+ trendData: {
+ categories: ['12-01', '12-02', '12-03', '12-04', '12-05', '12-06', '12-07'],
+ severe: [8, 12, 9, 15, 11, 13, 10],
+ moderate: [22, 25, 20, 28, 24, 26, 23],
+ minor: [35, 38, 32, 40, 36, 39, 34]
+ },
+ levelData: [
+ { name: '涓ラ噸', value: 78 },
+ { name: '涓瓑', value: 178 },
+ { name: '杞诲井', value: 272 }
+ ],
+ equipmentData: [
+ { name: '宸ヨ壓璁惧', value: 280 },
+ { name: '妫�娴嬭澶�', value: 120 },
+ { name: '鍏朵粬璁惧', value: 128 }
+ ]
+ }
+ },
+ mounted() {
+ this.initCharts()
+ },
+ methods: {
+ handleSearch() {
+ console.log('鏌ヨ鏁版嵁', this.searchForm)
+ this.initCharts()
+ },
+ initCharts() {
+ this.renderTrendChart()
+ this.renderLevelChart()
+ this.renderEquipmentChart()
+ },
+ renderTrendChart() {
+ console.log('娓叉煋鎶ヨ瓒嬪娍鍥捐〃', this.trendData)
+ },
+ renderLevelChart() {
+ console.log('娓叉煋鎶ヨ绾у埆鍒嗗竷鍥捐〃', this.levelData)
+ },
+ renderEquipmentChart() {
+ console.log('娓叉煋鎶ヨ璁惧绫诲瀷鍒嗗竷鍥捐〃', this.equipmentData)
+ }
+ }
+}
+</script>
+
+<style scoped>
+.alarm-trend-analysis {
+ padding: 16px;
+ background-color: #f0f2f5;
+ min-height: 100vh;
+}
+
+.search-card {
+ margin-bottom: 16px;
+ border-radius: 8px;
+ box-shadow: 0 2px 12px 0 rgba(0, 0, 0, 0.1);
+}
+
+.chart-card {
+ margin-bottom: 16px;
+ border-radius: 8px;
+ box-shadow: 0 2px 12px 0 rgba(0, 0, 0, 0.1);
+}
+
+.chart-container {
+ height: 400px;
+ background-color: #ffffff;
+ border-radius: 8px;
+ display: flex;
+ align-items: center;
+ justify-content: center;
+ color: #909399;
+ font-size: 16px;
+ border: 1px solid #e4e7ed;
+}
+
+/* 鎸夐挳鏍峰紡浼樺寲 */
+:deep(.el-button) {
+ border-radius: 6px;
+ padding: 8px 16px;
+ text-align: center;
+ white-space: nowrap;
+}
+
+/* 琛ㄥ崟鎺т欢鏍峰紡浼樺寲 */
+:deep(.el-input__inner),
+:deep(.el-select__input) {
+ border-radius: 6px;
+}
+
+:deep(.el-date-editor) {
+ border-radius: 6px;
+}
+
+/* 鍗$墖澶撮儴鏍峰紡 */
+:deep(.el-card__header) {
+ background-color: #fafafa;
+ border-bottom: 1px solid #e4e7ed;
+}
+</style>
\ No newline at end of file
diff --git a/src/views/alarmManagement/alarmConfig/alarmRule.vue b/src/views/alarmManagement/alarmConfig/alarmRule.vue
new file mode 100644
index 0000000..ef90a36
--- /dev/null
+++ b/src/views/alarmManagement/alarmConfig/alarmRule.vue
@@ -0,0 +1,173 @@
+<template>
+ <div class="alarm-rule-config">
+ <el-card shadow="never" class="search-card">
+ <el-form :inline="true" :model="searchForm" class="demo-form-inline">
+ <el-form-item label="瑙勫垯鍚嶇О">
+ <el-input v-model="searchForm.ruleName" placeholder="璇疯緭鍏ヨ鍒欏悕绉�" />
+ </el-form-item>
+ <el-form-item label="璁惧绫诲瀷">
+ <el-select v-model="searchForm.equipmentType" placeholder="璇烽�夋嫨璁惧绫诲瀷">
+ <el-option label="宸ヨ壓璁惧" value="宸ヨ壓璁惧" />
+ <el-option label="妫�娴嬭澶�" value="妫�娴嬭澶�" />
+ <el-option label="鍏朵粬璁惧" value="鍏朵粬璁惧" />
+ </el-select>
+ </el-form-item>
+ <el-form-item>
+ <el-button type="primary" icon="el-icon-search" @click="handleSearch">鎼滅储</el-button>
+ <el-button icon="el-icon-refresh" @click="handleReset">閲嶇疆</el-button>
+ </el-form-item>
+ </el-form>
+ </el-card>
+
+ <el-card shadow="never" class="table-card">
+ <template #header>
+ <div class="card-header">
+ <span>鎶ヨ瑙勫垯閰嶇疆</span>
+ <el-button type="primary" icon="el-icon-plus" @click="handleAdd">鏂板瑙勫垯</el-button>
+ </div>
+ </template>
+ <el-table :data="ruleList" style="width: 100%" :header-cell-style="{textAlign: 'center'}" :cell-style="{textAlign: 'center'}">
+ <el-table-column type="index" label="搴忓彿" width="80" />
+ <el-table-column prop="ruleName" label="瑙勫垯鍚嶇О" />
+ <el-table-column prop="equipmentType" label="璁惧绫诲瀷" />
+ <el-table-column prop="parameter" label="鐩戞帶鍙傛暟" />
+ <el-table-column prop="alarmLevel" label="鎶ヨ绾у埆" />
+ <el-table-column prop="createTime" label="鍒涘缓鏃堕棿" width="180" show-overflow-tooltip/>
+ <el-table-column prop="status" label="鐘舵��" width="150">
+ <template #default="scope">
+ <el-switch v-model="scope.row.status" active-text="鍚敤" inactive-text="绂佺敤" />
+ </template>
+ </el-table-column>
+ <el-table-column label="鎿嶄綔" width="150" fixed="right">
+ <template #default="scope">
+ <el-button size="small" type="text" @click="handleEdit(scope.row)">缂栬緫</el-button>
+ <el-button size="small" type="text" @click="handleDelete(scope.row)">鍒犻櫎</el-button>
+ </template>
+ </el-table-column>
+ </el-table>
+ <div class="pagination">
+ <el-pagination
+ layout="total, sizes, prev, pager, next, jumper"
+ :total="ruleList.length"
+ :page-size="10"
+ :page-sizes="[10, 20, 30, 50]"
+ />
+ </div>
+ </el-card>
+ </div>
+</template>
+
+<script>
+export default {
+ name: 'AlarmRule',
+ data() {
+ return {
+ searchForm: {
+ ruleName: '',
+ equipmentType: ''
+ },
+ ruleList: [
+ {
+ id: 1,
+ ruleName: '娓╁害杩囬珮鎶ヨ',
+ equipmentType: '宸ヨ壓璁惧',
+ parameter: '娓╁害',
+ alarmLevel: '涓ラ噸',
+ createTime: '2025-12-01 10:30:00',
+ status: true
+ },
+ {
+ id: 2,
+ ruleName: '鍘嬪姏寮傚父鎶ヨ',
+ equipmentType: '宸ヨ壓璁惧',
+ parameter: '鍘嬪姏',
+ alarmLevel: '涓瓑',
+ createTime: '2025-12-02 14:20:00',
+ status: true
+ },
+ {
+ id: 3,
+ ruleName: '娴侀噺杩囦綆鎶ヨ',
+ equipmentType: '妫�娴嬭澶�',
+ parameter: '娴侀噺',
+ alarmLevel: '杞诲井',
+ createTime: '2025-12-03 09:15:00',
+ status: false
+ },
+ {
+ id: 4,
+ ruleName: '鐢靛帇涓嶇ǔ瀹氭姤璀�',
+ equipmentType: '鍏朵粬璁惧',
+ parameter: '鐢靛帇',
+ alarmLevel: '涓瓑',
+ createTime: '2025-12-04 16:45:00',
+ status: true
+ },
+ {
+ id: 5,
+ ruleName: '娑蹭綅寮傚父鎶ヨ',
+ equipmentType: '宸ヨ壓璁惧',
+ parameter: '娑蹭綅',
+ alarmLevel: '涓ラ噸',
+ createTime: '2025-12-05 11:20:00',
+ status: true
+ }
+ ]
+ }
+ },
+ methods: {
+ handleSearch() {
+ console.log('鎼滅储', this.searchForm)
+ },
+ handleReset() {
+ this.searchForm = {
+ ruleName: '',
+ equipmentType: ''
+ }
+ },
+ handleAdd() {
+ console.log('鏂板瑙勫垯')
+ },
+ handleEdit(row) {
+ console.log('缂栬緫瑙勫垯', row)
+ },
+ handleDelete(row) {
+ console.log('鍒犻櫎瑙勫垯', row)
+ }
+ }
+}
+</script>
+
+<style scoped>
+.alarm-rule-config {
+ padding: 16px;
+ background-color: #f0f2f5;
+ min-height: 100vh;
+}
+
+.search-card {
+ margin-bottom: 16px;
+ border-radius: 8px;
+ box-shadow: 0 2px 12px 0 rgba(0, 0, 0, 0.1);
+}
+
+.table-card {
+ border-radius: 8px;
+ box-shadow: 0 2px 12px 0 rgba(0, 0, 0, 0.1);
+}
+
+.card-header {
+ display: flex;
+ justify-content: space-between;
+ align-items: center;
+ padding: 0 20px;
+}
+
+.pagination {
+ margin-top: 16px;
+ display: flex;
+ justify-content: flex-end;
+ padding-right: 20px;
+}
+
+</style>
diff --git a/src/views/alarmManagement/alarmKnowledge/alarmHandle.vue b/src/views/alarmManagement/alarmKnowledge/alarmHandle.vue
new file mode 100644
index 0000000..fa0a8f8
--- /dev/null
+++ b/src/views/alarmManagement/alarmKnowledge/alarmHandle.vue
@@ -0,0 +1,180 @@
+<template>
+ <div class="alarm-handle-knowledge">
+ <el-card shadow="never" class="search-card">
+ <el-form :inline="true" :model="searchForm" class="demo-form-inline">
+ <el-form-item label="鐭ヨ瘑搴撴爣棰�">
+ <el-input v-model="searchForm.title" placeholder="璇疯緭鍏ョ煡璇嗗簱鏍囬" />
+ </el-form-item>
+ <el-form-item label="鎶ヨ绫诲瀷">
+ <el-select v-model="searchForm.alarmType" placeholder="璇烽�夋嫨鎶ヨ绫诲瀷" clearable>
+ <el-option label="娓╁害鎶ヨ" value="娓╁害鎶ヨ" />
+ <el-option label="鍘嬪姏鎶ヨ" value="鍘嬪姏鎶ヨ" />
+ <el-option label="鎸姩鎶ヨ" value="鎸姩鎶ヨ" />
+ <el-option label="娑蹭綅鎶ヨ" value="娑蹭綅鎶ヨ" />
+ </el-select>
+ </el-form-item>
+ <el-form-item>
+ <el-button type="primary" icon="el-icon-search" @click="handleSearch">鎼滅储</el-button>
+ <el-button icon="el-icon-plus" @click="handleAdd">鏂板</el-button>
+ </el-form-item>
+ </el-form>
+ </el-card>
+
+ <el-card shadow="never" class="table-card" >
+ <el-table :data="knowledgeList" style="width: 100%" :header-cell-style="{textAlign: 'center'}" :cell-style="{textAlign: 'center'}">
+ <el-table-column type="index" label="搴忓彿" width="80" />
+ <el-table-column prop="title" label="鐭ヨ瘑搴撴爣棰�" min-width="200" />
+ <el-table-column prop="alarmType" label="鎶ヨ绫诲瀷" width="120" />
+ <el-table-column prop="alarmLevel" label="鎶ヨ绾у埆" width="100">
+ <template #default="scope">
+ <el-tag :type="getAlarmLevelType(scope.row.alarmLevel)">
+ {{ scope.row.alarmLevel }}
+ </el-tag>
+ </template>
+ </el-table-column>
+ <el-table-column prop="createTime" label="鍒涘缓鏃堕棿" width="180" />
+ <el-table-column prop="creator" label="鍒涘缓浜�" width="100" />
+ <el-table-column prop="status" label="鐘舵��" width="100">
+ <template #default="scope">
+ <el-tag :type="scope.row.status === '鍚敤' ? 'success' : 'info'">
+ {{ scope.row.status }}
+ </el-tag>
+ </template>
+ </el-table-column>
+ <el-table-column label="鎿嶄綔" width="250" fixed="right">
+ <template #default="scope">
+ <el-button size="small" type="text" icon="el-icon-view" @click="handleView(scope.row)">鏌ョ湅</el-button>
+ <el-button size="small" type="text" icon="el-icon-edit" @click="handleEdit(scope.row)">缂栬緫</el-button>
+ <el-button size="small" type="text" icon="el-icon-delete" @click="handleDelete(scope.row)">鍒犻櫎</el-button>
+ </template>
+ </el-table-column>
+ </el-table>
+ <div class="pagination">
+ <el-pagination
+ layout="total, sizes, prev, pager, next, jumper"
+ :total="knowledgeList.length"
+ :page-size="10"
+ :page-sizes="[10, 20, 30, 50]"
+ />
+ </div>
+ </el-card>
+ </div>
+</template>
+
+<script>
+export default {
+ name: 'AlarmHandleKnowledge',
+ data() {
+ return {
+ searchForm: {
+ title: '',
+ alarmType: ''
+ },
+ knowledgeList: [
+ {
+ id: 1,
+ title: '鍙嶅簲閲滄俯搴﹁繃楂樻姤璀﹀鐞嗘祦绋�',
+ alarmType: '娓╁害鎶ヨ',
+ alarmLevel: '涓ラ噸',
+ createTime: '2025-12-01 14:30:00',
+ creator: '绠$悊鍛�',
+ status: '鍚敤'
+ },
+ {
+ id: 2,
+ title: '绂诲績娉垫尟鍔ㄥ紓甯告姤璀﹀鐞嗘寚鍗�',
+ alarmType: '鎸姩鎶ヨ',
+ alarmLevel: '涓瓑',
+ createTime: '2025-12-02 09:15:00',
+ creator: '璁惧宸ョ▼甯�',
+ status: '鍚敤'
+ },
+ {
+ id: 3,
+ title: '鍌ㄧ綈娑蹭綅杩囦綆鎶ヨ澶勭悊鏂规硶',
+ alarmType: '娑蹭綅鎶ヨ',
+ alarmLevel: '杞诲井',
+ createTime: '2025-12-03 16:45:00',
+ creator: '宸ヨ壓宸ョ▼甯�',
+ status: '鍚敤'
+ },
+ {
+ id: 4,
+ title: '鍘嬬缉鏈哄帇鍔涜繃楂樻姤璀﹀簲鎬ラ妗�',
+ alarmType: '鍘嬪姏鎶ヨ',
+ alarmLevel: '涓ラ噸',
+ createTime: '2025-12-04 11:20:00',
+ creator: '瀹夊叏涓荤',
+ status: '鍚敤'
+ },
+ {
+ id: 5,
+ title: '骞茬嚗鏈烘箍搴﹀紓甯告姤璀﹀鐞嗘祦绋�',
+ alarmType: '婀垮害鎶ヨ',
+ alarmLevel: '涓瓑',
+ createTime: '2025-12-05 15:10:00',
+ creator: '宸ヨ壓宸ョ▼甯�',
+ status: '绂佺敤'
+ }
+ ]
+ }
+ },
+ methods: {
+ getAlarmLevelType(level) {
+ switch (level) {
+ case '涓ラ噸':
+ return 'danger'
+ case '涓瓑':
+ return 'warning'
+ case '杞诲井':
+ return 'info'
+ default:
+ return 'info'
+ }
+ },
+ handleSearch() {
+ console.log('鎼滅储鐭ヨ瘑搴�', this.searchForm)
+ },
+ handleAdd() {
+ console.log('鏂板鐭ヨ瘑搴�')
+ },
+ handleView(row) {
+ console.log('鏌ョ湅鐭ヨ瘑搴撹鎯�', row)
+ },
+ handleEdit(row) {
+ console.log('缂栬緫鐭ヨ瘑搴�', row)
+ },
+ handleDelete(row) {
+ console.log('鍒犻櫎鐭ヨ瘑搴�', row)
+ }
+ }
+}
+</script>
+
+<style scoped>
+.alarm-handle-knowledge {
+ padding: 16px;
+ background-color: #f0f2f5;
+ min-height: 100vh;
+}
+
+.search-card {
+ margin-bottom: 16px;
+ border-radius: 8px;
+ box-shadow: 0 2px 12px 0 rgba(0, 0, 0, 0.1);
+}
+
+.table-card {
+ margin-top: 16px;
+ border-radius: 8px;
+ box-shadow: 0 2px 12px 0 rgba(0, 0, 0, 0.1);
+}
+
+.pagination {
+ margin-top: 16px;
+ display: flex;
+ justify-content: flex-end;
+ padding-right: 20px;
+}
+
+</style>
diff --git a/src/views/alarmManagement/alarmMonitor/realTimeAlarm.vue b/src/views/alarmManagement/alarmMonitor/realTimeAlarm.vue
new file mode 100644
index 0000000..dc87547
--- /dev/null
+++ b/src/views/alarmManagement/alarmMonitor/realTimeAlarm.vue
@@ -0,0 +1,271 @@
+<template>
+ <div class="real-time-alarm">
+ <el-card shadow="never" class="alarm-stats-card">
+ <el-row :gutter="20">
+ <el-col :span="6">
+ <div class="stat-item">
+ <div class="stat-number severe">12</div>
+ <div class="stat-label">涓ラ噸鎶ヨ</div>
+ </div>
+ </el-col>
+ <el-col :span="6">
+ <div class="stat-item">
+ <div class="stat-number moderate">28</div>
+ <div class="stat-label">涓瓑鎶ヨ</div>
+ </div>
+ </el-col>
+ <el-col :span="6">
+ <div class="stat-item">
+ <div class="stat-number minor">45</div>
+ <div class="stat-label">杞诲井鎶ヨ</div>
+ </div>
+ </el-col>
+ <el-col :span="6">
+ <div class="stat-item">
+ <div class="stat-number total">85</div>
+ <div class="stat-label">浠婃棩鎬绘姤璀�</div>
+ </div>
+ </el-col>
+ </el-row>
+ </el-card>
+
+ <el-card shadow="never" class="table-card">
+ <template #header>
+ <div class="card-header">
+ <span>瀹炴椂鎶ヨ鐩戞帶</span>
+ <el-button type="primary" icon="el-icon-refresh" @click="handleRefresh">鍒锋柊</el-button>
+ </div>
+ </template>
+ <el-table :data="alarmList" style="width: 100%" height="500" :header-cell-style="{textAlign: 'center'}" :cell-style="{textAlign: 'center'}">
+ <el-table-column type="index" label="搴忓彿" width="80" />
+ <el-table-column prop="alarmTime" label="鎶ヨ鏃堕棿" width="180" />
+ <el-table-column prop="equipmentName" label="璁惧鍚嶇О" />
+ <el-table-column prop="parameter" label="鎶ヨ鍙傛暟" />
+ <el-table-column prop="alarmValue" label="鎶ヨ鍊�" />
+ <el-table-column prop="threshold" label="闃堝��" />
+ <el-table-column prop="alarmLevel" label="鎶ヨ绾у埆" width="100">
+ <template #default="scope">
+ <el-tag :type="getAlarmLevelType(scope.row.alarmLevel)">
+ {{ scope.row.alarmLevel }}
+ </el-tag>
+ </template>
+ </el-table-column>
+ <el-table-column prop="status" label="澶勭悊鐘舵��" width="120">
+ <template #default="scope">
+ <el-tag :type="scope.row.status === '宸插鐞�' ? 'success' : 'warning'">
+ {{ scope.row.status }}
+ </el-tag>
+ </template>
+ </el-table-column>
+ <el-table-column label="鎿嶄綔" width="200" fixed="right">
+ <template #default="scope">
+ <el-button size="small" type="text" icon="el-icon-view" @click="handleView(scope.row)">鏌ョ湅</el-button>
+ <el-button size="small" type="text" icon="el-icon-check" @click="handleProcess(scope.row)">澶勭悊</el-button>
+ </template>
+ </el-table-column>
+ </el-table>
+ </el-card>
+ </div>
+</template>
+
+<script>
+export default {
+ name: 'RealTimeAlarm',
+ data() {
+ return {
+ alarmList: [
+ {
+ id: 1,
+ alarmTime: '2025-12-16 11:50:23',
+ equipmentName: '鍙嶅簲閲淎',
+ parameter: '娓╁害',
+ alarmValue: '185掳C',
+ threshold: '鈮�180掳C',
+ alarmLevel: '涓ラ噸',
+ status: '鏈鐞�'
+ },
+ {
+ id: 2,
+ alarmTime: '2025-12-16 11:48:15',
+ equipmentName: '绂诲績鏈築',
+ parameter: '鎸姩',
+ alarmValue: '0.8mm/s',
+ threshold: '鈮�0.5mm/s',
+ alarmLevel: '涓瓑',
+ status: '鏈鐞�'
+ },
+ {
+ id: 3,
+ alarmTime: '2025-12-16 11:45:30',
+ equipmentName: '杈撻�佹车C',
+ parameter: '鍘嬪姏',
+ alarmValue: '4.2MPa',
+ threshold: '鈮�4.0MPa',
+ alarmLevel: '杞诲井',
+ status: '宸插鐞�'
+ },
+ {
+ id: 4,
+ alarmTime: '2025-12-16 11:42:18',
+ equipmentName: '鍙嶅簲閲淒',
+ parameter: 'pH鍊�',
+ alarmValue: '4.2',
+ threshold: '5.0-7.0',
+ alarmLevel: '涓瓑',
+ status: '鏈鐞�'
+ },
+ {
+ id: 5,
+ alarmTime: '2025-12-16 11:38:55',
+ equipmentName: '骞茬嚗鏈篍',
+ parameter: '婀垮害',
+ alarmValue: '15%',
+ threshold: '鈮�10%',
+ alarmLevel: '杞诲井',
+ status: '宸插鐞�'
+ }
+ ]
+ }
+ },
+ methods: {
+ getAlarmLevelType(level) {
+ switch (level) {
+ case '涓ラ噸':
+ return 'danger'
+ case '涓瓑':
+ return 'warning'
+ case '杞诲井':
+ return 'info'
+ default:
+ return 'info'
+ }
+ },
+ handleRefresh() {
+ console.log('鍒锋柊鎶ヨ鏁版嵁')
+ },
+ handleView(row) {
+ console.log('鏌ョ湅鎶ヨ璇︽儏', row)
+ },
+ handleProcess(row) {
+ console.log('澶勭悊鎶ヨ', row)
+ }
+ }
+}
+</script>
+
+<style scoped>
+.real-time-alarm {
+ padding: 16px;
+ background-color: #f0f2f5;
+ min-height: 100vh;
+}
+
+.alarm-stats-card {
+ margin-bottom: 16px;
+ border-radius: 8px;
+ box-shadow: 0 2px 12px 0 rgba(0, 0, 0, 0.1);
+}
+
+.table-card {
+ border-radius: 8px;
+ box-shadow: 0 2px 12px 0 rgba(0, 0, 0, 0.1);
+}
+
+.stat-item {
+ text-align: center;
+ padding: 24px 16px;
+ background-color: #ffffff;
+ border-radius: 12px;
+ box-shadow: 0 1px 4px rgba(0, 0, 0, 0.1);
+ transition: all 0.3s ease;
+}
+
+.stat-item:hover {
+ transform: translateY(-2px);
+ box-shadow: 0 4px 12px rgba(0, 0, 0, 0.15);
+}
+
+.stat-number {
+ font-size: 36px;
+ font-weight: bold;
+ margin-bottom: 12px;
+ letter-spacing: 1px;
+}
+
+.stat-number.severe {
+ color: #f56c6c;
+ text-shadow: 0 2px 4px rgba(245, 108, 108, 0.1);
+}
+
+.stat-number.moderate {
+ color: #e6a23c;
+ text-shadow: 0 2px 4px rgba(230, 162, 60, 0.1);
+}
+
+.stat-number.minor {
+ color: #67c23a;
+ text-shadow: 0 2px 4px rgba(103, 194, 58, 0.1);
+}
+
+.stat-number.total {
+ color: #409eff;
+ text-shadow: 0 2px 4px rgba(64, 158, 255, 0.1);
+}
+
+.stat-label {
+ font-size: 14px;
+ color: #606266;
+ font-weight: 500;
+}
+
+.card-header {
+ display: flex;
+ justify-content: space-between;
+ align-items: center;
+ padding: 0 20px;
+}
+
+/* 琛ㄦ牸鏍峰紡浼樺寲 */
+:deep(.el-table) {
+ border-radius: 8px;
+ overflow: hidden;
+}
+
+:deep(.el-table__header-wrapper) {
+ background-color: #f5f7fa;
+}
+
+:deep(.el-table__header th) {
+ font-weight: 600;
+ background-color: #f5f7fa;
+}
+
+:deep(.el-table__body tr:hover) {
+ background-color: #f5f7fa;
+}
+
+/* 鎸夐挳鏍峰紡浼樺寲 */
+:deep(.el-button) {
+ border-radius: 6px;
+ padding: 8px 16px;
+ text-align: center;
+ white-space: nowrap;
+}
+
+/* 鎿嶄綔鏍忎笉鎹㈣ */
+:deep(.el-table__column--fixed-right) {
+ white-space: nowrap;
+}
+
+:deep(.el-table__fixed-right) {
+ height: 100% !important;
+}
+
+/* 鏍囩鏍峰紡浼樺寲 */
+:deep(.el-tag) {
+ border-radius: 12px;
+ padding: 4px 12px;
+ font-size: 12px;
+ font-weight: 500;
+}
+</style>
diff --git a/src/views/alarmManagement/alarmReport/alarmStats.vue b/src/views/alarmManagement/alarmReport/alarmStats.vue
new file mode 100644
index 0000000..490846c
--- /dev/null
+++ b/src/views/alarmManagement/alarmReport/alarmStats.vue
@@ -0,0 +1,260 @@
+<template>
+ <div class="alarm-stats-report">
+ <el-card shadow="never" class="search-card">
+ <el-form :inline="true" :model="searchForm" class="demo-form-inline">
+ <el-form-item label="鎶ヨ〃绫诲瀷">
+ <el-select v-model="searchForm.reportType" placeholder="璇烽�夋嫨鎶ヨ〃绫诲瀷">
+ <el-option label="鏃ユ姤" value="鏃ユ姤" />
+ <el-option label="鍛ㄦ姤" value="鍛ㄦ姤" />
+ <el-option label="鏈堟姤" value="鏈堟姤" />
+ <el-option label="瀛f姤" value="瀛f姤" />
+ <el-option label="骞存姤" value="骞存姤" />
+ </el-select>
+ </el-form-item>
+ <el-form-item label="缁熻鏃堕棿">
+ <el-date-picker
+ v-model="searchForm.statsDate"
+ type="date"
+ placeholder="閫夋嫨缁熻鏃ユ湡"
+ format="yyyy-MM-dd"
+ value-format="yyyy-MM-dd"
+ />
+ </el-form-item>
+ <el-form-item>
+ <el-button type="primary" icon="el-icon-search" @click="handleSearch">鐢熸垚鎶ヨ〃</el-button>
+ <el-button type="success" icon="el-icon-download" @click="handleExport">瀵煎嚭鎶ヨ〃</el-button>
+ </el-form-item>
+ </el-form>
+ </el-card>
+
+ <el-card shadow="never" class="report-card">
+ <template #header>
+ <span>鎶ヨ缁熻鎶ヨ〃 - 2025骞�12鏈�</span>
+ </template>
+
+ <div class="report-summary">
+ <el-row :gutter="20">
+ <el-col :span="8">
+ <div class="summary-item">
+ <div class="summary-label">鎬绘姤璀︽暟</div>
+ <div class="summary-value">425</div>
+ </div>
+ </el-col>
+ <el-col :span="8">
+ <div class="summary-item">
+ <div class="summary-label">宸插鐞嗘姤璀�</div>
+ <div class="summary-value handled">398</div>
+ </div>
+ </el-col>
+ <el-col :span="8">
+ <div class="summary-item">
+ <div class="summary-label">鏈鐞嗘姤璀�</div>
+ <div class="summary-value pending">27</div>
+ </div>
+ </el-col>
+ </el-row>
+ </div>
+
+ <div class="report-content">
+ <h3>1. 鎶ヨ绾у埆缁熻</h3>
+ <el-table :data="levelStats" style="width: 100%; margin-bottom: 20px;">
+ <el-table-column prop="level" label="鎶ヨ绾у埆" />
+ <el-table-column prop="count" label="鏁伴噺" />
+ <el-table-column prop="percentage" label="鍗犳瘮" />
+ <el-table-column prop="handled" label="宸插鐞�" />
+ <el-table-column prop="pending" label="鏈鐞�" />
+ </el-table>
+
+ <h3>2. 璁惧绫诲瀷鎶ヨ缁熻</h3>
+ <el-table :data="equipmentStats" style="width: 100%; margin-bottom: 20px;">
+ <el-table-column prop="type" label="璁惧绫诲瀷" />
+ <el-table-column prop="count" label="鎶ヨ鏁伴噺" />
+ <el-table-column prop="percentage" label="鍗犳瘮" />
+ </el-table>
+
+ <h3>3. 鎶ヨ澶勭悊鏃舵晥缁熻</h3>
+ <el-table :data="handlingTimeStats" style="width: 100%; margin-bottom: 20px;">
+ <el-table-column prop="range" label="澶勭悊鏃堕暱鑼冨洿" />
+ <el-table-column prop="count" label="鎶ヨ鏁伴噺" />
+ <el-table-column prop="percentage" label="鍗犳瘮" />
+ </el-table>
+
+ <h3>4. 鏈堝害鎶ヨ瓒嬪娍</h3>
+ <div ref="trendChart" class="trend-chart-container"></div>
+ </div>
+ </el-card>
+ </div>
+</template>
+
+<script>
+export default {
+ name: 'AlarmStatsReport',
+ data() {
+ return {
+ searchForm: {
+ reportType: '鏈堟姤',
+ statsDate: '2025-12-01'
+ },
+ levelStats: [
+ { level: '涓ラ噸', count: 78, percentage: '18.35%', handled: 75, pending: 3 },
+ { level: '涓瓑', count: 178, percentage: '41.88%', handled: 170, pending: 8 },
+ { level: '杞诲井', count: 169, percentage: '39.76%', handled: 153, pending: 16 }
+ ],
+ equipmentStats: [
+ { type: '宸ヨ壓璁惧', count: 280, percentage: '65.88%' },
+ { type: '妫�娴嬭澶�', count: 85, percentage: '20.00%' },
+ { type: '鍏朵粬璁惧', count: 60, percentage: '14.12%' }
+ ],
+ handlingTimeStats: [
+ { range: '0-30鍒嗛挓', count: 280, percentage: '65.88%' },
+ { range: '30-60鍒嗛挓', count: 75, percentage: '17.65%' },
+ { range: '1-2灏忔椂', count: 45, percentage: '10.59%' },
+ { range: '2灏忔椂浠ヤ笂', count: 25, percentage: '5.88%' }
+ ]
+ }
+ },
+ mounted() {
+ this.initTrendChart()
+ },
+ methods: {
+ handleSearch() {
+ console.log('鐢熸垚鎶ヨ〃', this.searchForm)
+ },
+ handleExport() {
+ console.log('瀵煎嚭鎶ヨ〃')
+ },
+ initTrendChart() {
+ console.log('鍒濆鍖栬秼鍔垮浘琛�')
+ }
+ }
+}
+</script>
+
+<style scoped>
+.alarm-stats-report {
+ padding: 16px;
+ background-color: #f0f2f5;
+ min-height: 100vh;
+}
+
+.search-card {
+ margin-bottom: 16px;
+ border-radius: 8px;
+ box-shadow: 0 2px 12px 0 rgba(0, 0, 0, 0.1);
+}
+
+.report-card {
+ margin-top: 16px;
+ border-radius: 8px;
+ box-shadow: 0 2px 12px 0 rgba(0, 0, 0, 0.1);
+ overflow: hidden;
+}
+
+.report-summary {
+ margin: 20px;
+ padding: 20px;
+ background-color: #fafafa;
+ border-radius: 8px;
+ border: 1px solid #e4e7ed;
+}
+
+.summary-item {
+ background-color: #ffffff;
+ padding: 24px 16px;
+ border-radius: 12px;
+ text-align: center;
+ box-shadow: 0 1px 4px rgba(0, 0, 0, 0.1);
+ transition: all 0.3s ease;
+}
+
+.summary-item:hover {
+ transform: translateY(-2px);
+ box-shadow: 0 4px 12px rgba(0, 0, 0, 0.15);
+}
+
+.summary-label {
+ font-size: 14px;
+ color: #606266;
+ margin-bottom: 12px;
+ font-weight: 500;
+}
+
+.summary-value {
+ font-size: 32px;
+ font-weight: bold;
+ color: #409eff;
+ letter-spacing: 1px;
+}
+
+.summary-value.handled {
+ color: #67c23a;
+}
+
+.summary-value.pending {
+ color: #e6a23c;
+}
+
+.report-content {
+ margin: 20px;
+}
+
+.report-content h3 {
+ margin-bottom: 16px;
+ color: #303133;
+ font-size: 18px;
+ font-weight: 600;
+ padding-bottom: 8px;
+ border-bottom: 2px solid #409eff;
+ display: inline-block;
+}
+
+.trend-chart-container {
+ height: 350px;
+ background-color: #ffffff;
+ border-radius: 8px;
+ margin-top: 20px;
+ display: flex;
+ align-items: center;
+ justify-content: center;
+ color: #909399;
+ border: 1px solid #e4e7ed;
+}
+
+/* 琛ㄦ牸鏍峰紡浼樺寲 */
+:deep(.el-table) {
+ border-radius: 8px;
+ overflow: hidden;
+ margin-bottom: 20px;
+}
+
+:deep(.el-table__header-wrapper) {
+ background-color: #f5f7fa;
+}
+
+:deep(.el-table__header th) {
+ font-weight: 600;
+ background-color: #f5f7fa;
+}
+
+:deep(.el-table__body tr:hover) {
+ background-color: #f5f7fa;
+}
+
+/* 鎸夐挳鏍峰紡浼樺寲 */
+:deep(.el-button) {
+ border-radius: 6px;
+ padding: 8px 16px;
+ text-align: center;
+ white-space: nowrap;
+}
+
+/* 琛ㄥ崟鎺т欢鏍峰紡浼樺寲 */
+:deep(.el-input__inner),
+:deep(.el-select__input) {
+ border-radius: 6px;
+}
+
+:deep(.el-date-editor) {
+ border-radius: 6px;
+}
+</style>
\ No newline at end of file
diff --git a/src/views/basicData/customerFile/index.vue b/src/views/basicData/customerFile/index.vue
deleted file mode 100644
index 8043d1a..0000000
--- a/src/views/basicData/customerFile/index.vue
+++ /dev/null
@@ -1,598 +0,0 @@
-<template>
- <div class="app-container">
- <div class="search_form">
- <div>
- <span class="search_title">瀹㈡埛鍚嶇О锛�</span>
- <el-input
- v-model="searchForm.customerName"
- style="width: 240px"
- placeholder="璇疯緭鍏�"
- @change="handleQuery"
- clearable
- :prefix-icon="Search"
- />
- <el-button type="primary" @click="handleQuery" style="margin-left: 10px"
- >鎼滅储</el-button
- >
- </div>
- <div>
- <el-button type="primary" @click="openForm('add')">鏂板瀹㈡埛</el-button>
- <el-button @click="handleOut">瀵煎嚭</el-button>
- <el-button type="info" plain icon="Upload" @click="handleImport"
- >瀵煎叆</el-button
- >
- <el-button type="danger" plain @click="handleDelete">鍒犻櫎</el-button>
- </div>
- </div>
- <div class="table_list">
- <PIMTable
- rowKey="id"
- :column="tableColumn"
- :tableData="tableData"
- :page="page"
- :isSelection="true"
- @selection-change="handleSelectionChange"
- :tableLoading="tableLoading"
- @pagination="pagination"
- ></PIMTable>
- </div>
- <el-dialog
- v-model="dialogFormVisible"
- :title="operationType === 'add' ? '鏂板瀹㈡埛淇℃伅' : '缂栬緫瀹㈡埛淇℃伅'"
- width="70%"
- @close="closeDia"
- >
- <el-form
- :model="form"
- label-width="140px"
- label-position="top"
- :rules="rules"
- ref="formRef"
- >
- <el-row :gutter="30">
- <el-col :span="12">
- <el-form-item label="瀹㈡埛鍚嶇О锛�" prop="customerName">
- <el-input
- v-model="form.customerName"
- placeholder="璇疯緭鍏�"
- clearable
- />
- </el-form-item>
- </el-col>
- <el-col :span="12">
- <el-form-item
- label="绾崇◣浜鸿瘑鍒彿锛�"
- prop="taxpayerIdentificationNumber"
- >
- <el-input
- v-model="form.taxpayerIdentificationNumber"
- placeholder="璇疯緭鍏�"
- clearable
- />
- </el-form-item>
- </el-col>
- </el-row>
- <el-row :gutter="30">
- <el-col :span="12">
- <el-form-item label="鍏徃鍦板潃锛�" prop="companyAddress">
- <el-input
- v-model="form.companyAddress"
- placeholder="璇疯緭鍏�"
- clearable
- />
- </el-form-item>
- </el-col>
- <el-col :span="12">
- <el-form-item label="鍏徃鐢佃瘽锛�" prop="companyPhone">
- <el-input
- v-model="form.companyPhone"
- placeholder="璇疯緭鍏�"
- clearable
- />
- </el-form-item>
- </el-col>
- </el-row>
- <el-row :gutter="30">
- <el-col :span="12">
- <el-form-item label="閾惰鍩烘湰鎴凤細" prop="basicBankAccount">
- <el-input
- v-model="form.basicBankAccount"
- placeholder="璇疯緭鍏�"
- clearable
- />
- </el-form-item>
- </el-col>
- <el-col :span="12">
- <el-form-item label="閾惰璐﹀彿锛�" prop="bankAccount">
- <el-input
- v-model="form.bankAccount"
- placeholder="璇疯緭鍏�"
- clearable
- />
- </el-form-item>
- </el-col>
- </el-row>
- <el-row :gutter="30">
- <el-col :span="12">
- <el-form-item label="寮�鎴疯鍙凤細" prop="bankCode">
- <el-input
- v-model="form.bankCode"
- placeholder="璇疯緭鍏�"
- clearable
- />
- </el-form-item>
- </el-col>
- </el-row>
- <el-row :gutter="30" v-for="(contact, index) in formYYs.contactList" :key="index">
- <el-col :span="12">
- <el-form-item label="鑱旂郴浜猴細" prop="contactPerson">
- <el-input v-model="contact.contactPerson" placeholder="璇疯緭鍏�" clearable />
- </el-form-item>
- </el-col>
- <el-col :span="12">
- <el-form-item label="鑱旂郴鐢佃瘽锛�" prop="contactPhone">
- <div style="display: flex; align-items: center;width: 100%;">
- <el-input v-model="contact.contactPhone" placeholder="璇疯緭鍏�" clearable />
- <el-button @click="removeContact(index)" type="danger" circle style="margin-left: 5px;">
- <el-icon><Close /></el-icon>
- </el-button>
- </div>
- </el-form-item>
- </el-col>
- </el-row>
- <el-button @click="addNewContact" style="margin-bottom: 10px;">+ 鏂板鑱旂郴浜�</el-button>
- <el-row :gutter="30">
- <el-col :span="12">
- <el-form-item label="缁存姢浜猴細" prop="maintainer">
- <el-select
- v-model="form.maintainer"
- placeholder="璇烽�夋嫨"
- clearable
- disabled
- >
- <el-option
- v-for="item in userList"
- :key="item.nickName"
- :label="item.nickName"
- :value="item.nickName"
- />
- </el-select>
- </el-form-item>
- </el-col>
- <el-col :span="12">
- <el-form-item label="缁存姢鏃堕棿锛�" prop="maintenanceTime">
- <el-date-picker
- style="width: 100%"
- v-model="form.maintenanceTime"
- value-format="YYYY-MM-DD"
- format="YYYY-MM-DD"
- type="date"
- placeholder="璇烽�夋嫨"
- clearable
- disabled
- />
- </el-form-item>
- </el-col>
- </el-row>
- </el-form>
- <template #footer>
- <div class="dialog-footer">
- <el-button type="primary" @click="submitForm">纭</el-button>
- <el-button @click="closeDia">鍙栨秷</el-button>
- </div>
- </template>
- </el-dialog>
- <!-- 鐢ㄦ埛瀵煎叆瀵硅瘽妗� -->
- <el-dialog
- :title="upload.title"
- v-model="upload.open"
- width="400px"
- append-to-body
- >
- <el-upload
- ref="uploadRef"
- :limit="1"
- accept=".xlsx, .xls"
- :headers="upload.headers"
- :action="upload.url + '?updateSupport=' + upload.updateSupport"
- :disabled="upload.isUploading"
- :before-upload="upload.beforeUpload"
- :on-progress="upload.onProgress"
- :on-success="upload.onSuccess"
- :on-error="upload.onError"
- :on-change="upload.onChange"
- :auto-upload="false"
- drag
- >
- <el-icon class="el-icon--upload"><upload-filled /></el-icon>
- <div class="el-upload__text">灏嗘枃浠舵嫋鍒版澶勶紝鎴�<em>鐐瑰嚮涓婁紶</em></div>
- <template #tip>
- <div class="el-upload__tip text-center">
- <span>浠呭厑璁稿鍏ls銆亁lsx鏍煎紡鏂囦欢銆�</span>
-<!-- <el-link-->
-<!-- type="primary"-->
-<!-- :underline="false"-->
-<!-- style="font-size: 12px; vertical-align: baseline"-->
-<!-- @click="importTemplate"-->
-<!-- >涓嬭浇妯℃澘</el-link-->
-<!-- >-->
- </div>
- </template>
- </el-upload>
- <template #footer>
- <div class="dialog-footer">
- <el-button type="primary" @click="submitFileForm">纭� 瀹�</el-button>
- <el-button @click="upload.open = false">鍙� 娑�</el-button>
- </div>
- </template>
- </el-dialog>
- </div>
-</template>
-
-<script setup>
-import {onMounted, ref} from "vue";
-import { Search } from "@element-plus/icons-vue";
-import {
- addCustomer,
- delCustomer,
- getCustomer,
- listCustomer,
- updateCustomer,
-} from "@/api/basicData/customerFile.js";
-import { ElMessageBox } from "element-plus";
-import { userListNoPage } from "@/api/system/user.js";
-import useUserStore from "@/store/modules/user";
-import { getToken } from "@/utils/auth.js";
-const { proxy } = getCurrentInstance();
-const userStore = useUserStore();
-
-const tableColumn = ref([
- {
- label: "瀹㈡埛鍚嶇О",
- prop: "customerName",
- width: 220,
- },
- {
- label: "绾崇◣浜鸿瘑鍒爜",
- prop: "taxpayerIdentificationNumber",
- width: 220,
- },
- {
- label: "鍦板潃鍙婅仈绯绘柟寮�",
- prop: "addressPhone",
- width: 250,
- },
- {
- label: "鑱旂郴浜�",
- prop: "contactPerson",
- },
- {
- label: "鑱旂郴鐢佃瘽",
- prop: "contactPhone",
- width:150
- },
- {
- label: "閾惰鍩烘湰鎴�",
- prop: "basicBankAccount",
- width: 220,
- },
- {
- label: "閾惰璐﹀彿",
- prop: "bankAccount",
- width: 220,
- },
- {
- label: "寮�鎴疯鍙�",
- prop: "bankCode",
- width:220
- },
- {
- label: "缁存姢浜�",
- prop: "maintainer",
- },
- {
- label: "缁存姢鏃堕棿",
- prop: "maintenanceTime",
- width: 100,
- },
- {
- dataType: "action",
- label: "鎿嶄綔",
- align: "center",
- fixed: 'right',
- operation: [
- {
- name: "缂栬緫",
- type: "text",
- clickFun: (row) => {
- openForm("edit", row);
- },
- disabled: (row) => {
- return row.maintainer !== userStore.nickName
- }
- },
- ],
- },
-]);
-const tableData = ref([]);
-const selectedRows = ref([]);
-const userList = ref([]);
-const tableLoading = ref(false);
-const page = reactive({
- current: 1,
- size: 100,
- total: 0,
-});
-const total = ref(0);
-
-// 鐢ㄦ埛淇℃伅琛ㄥ崟寮规鏁版嵁
-const operationType = ref("");
-const dialogFormVisible = ref(false);
-const formYYs = ref({ // 鍏朵粬瀛楁...
- contactList: [
- {
- contactPerson: "",
- contactPhone: ""
- }
- ]
-});
-const data = reactive({
- searchForm: {
- customerName: "",
- },
- form: {
- customerName: "",
- taxpayerIdentificationNumber: "",
- companyAddress: "",
- companyPhone: "",
- contactPerson: "",
- contactPhone: "",
- maintainer: "",
- maintenanceTime: "",
- basicBankAccount: "",
- bankAccount: "",
- bankCode: "",
- },
- rules: {
- customerName: [{ required: true, message: "璇疯緭鍏�", trigger: "blur" }],
- taxpayerIdentificationNumber: [
- { required: true, message: "璇疯緭鍏�", trigger: "blur" },
- ],
- companyAddress: [{ required: true, message: "璇疯緭鍏�", trigger: "blur" }],
- companyPhone: [{ required: true, message: "璇疯緭鍏�", trigger: "blur" }],
- // contactPerson: [{ required: true, message: "璇疯緭鍏�", trigger: "blur" }],
- // contactPhone: [{ required: true, message: "璇疯緭鍏�", trigger: "blur" }],
- maintainer: [{ required: false, message: "璇烽�夋嫨", trigger: "change" }],
- maintenanceTime: [
- { required: false, message: "璇烽�夋嫨", trigger: "change" },
- ],
- basicBankAccount: [{ required: true, message: "璇疯緭鍏�", trigger: "blur" }],
- bankAccount: [{ required: true, message: "璇疯緭鍏�", trigger: "blur" }],
- bankCode: [{ required: true, message: "璇疯緭鍏�", trigger: "blur" }],
- },
-});
-const upload = reactive({
- // 鏄惁鏄剧ず寮瑰嚭灞傦紙瀹㈡埛瀵煎叆锛�
- open: false,
- // 寮瑰嚭灞傛爣棰橈紙瀹㈡埛瀵煎叆锛�
- title: "",
- // 鏄惁绂佺敤涓婁紶
- isUploading: false,
- // 璁剧疆涓婁紶鐨勮姹傚ご閮�
- headers: { Authorization: "Bearer " + getToken() },
- // 涓婁紶鐨勫湴鍧�
- url: import.meta.env.VITE_APP_BASE_API + "/basic/customer/importData",
- // 鏂囦欢涓婁紶鍓嶇殑鍥炶皟
- beforeUpload: (file) => {
- console.log('鏂囦欢鍗冲皢涓婁紶', file);
- // 鍙互鍦ㄦ澶勫仛鏂囦欢绫诲瀷鎴栧ぇ灏忔牎楠�
- const isValid = file.type === 'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet' || file.name.endsWith('.xlsx') || file.name.endsWith('.xls');
- if (!isValid) {
- proxy.$modal.msgError("鍙兘涓婁紶 Excel 鏂囦欢");
- }
- return isValid;
- },
- // 鏂囦欢鐘舵�佹敼鍙樻椂鐨勫洖璋�
- onChange: (file, fileList) => {
- console.log('鏂囦欢鐘舵�佹敼鍙�', file, fileList);
- },
- // 鏂囦欢涓婁紶鎴愬姛鏃剁殑鍥炶皟
- onSuccess: (response, file, fileList) => {
- console.log('涓婁紶鎴愬姛', response, file, fileList);
- if(response.code === 200){
- proxy.$modal.msgSuccess("鏂囦欢涓婁紶鎴愬姛");
- }else if(response.code === 500){
- proxy.$modal.msgError(response.msg);
- }else{
- proxy.$modal.msgWarning(response.msg);
- }
- },
- // 鏂囦欢涓婁紶澶辫触鏃剁殑鍥炶皟
- onError: (error, file, fileList) => {
- console.error('涓婁紶澶辫触', error, file, fileList);
- proxy.$modal.msgError("鏂囦欢涓婁紶澶辫触");
- },
- // 鏂囦欢涓婁紶杩涘害鍥炶皟
- onProgress: (event, file, fileList) => {
- console.log('涓婁紶涓�...', event.percent);
- }
-});
-const { searchForm, form, rules } = toRefs(data);
-const addNewContact = () => {
- formYYs.value.contactList.push({
- contactPerson: "",
- contactPhone: ""
- });
-};
-
-const removeContact = (index) => {
- if (formYYs.value.contactList.length > 1) {
- formYYs.value.contactList.splice(index, 1);
- }
-};
-// 鏌ヨ鍒楄〃
-/** 鎼滅储鎸夐挳鎿嶄綔 */
-const handleQuery = () => {
- page.current = 1;
- getList();
-};
-const pagination = (obj) => {
- page.current = obj.page;
- page.size = obj.limit;
- getList();
-};
-const getList = () => {
- tableLoading.value = true;
- listCustomer({ ...searchForm.value, ...page }).then((res) => {
- tableLoading.value = false;
- tableData.value = res.records;
- page.total = res.total;
- });
-};
-// 琛ㄦ牸閫夋嫨鏁版嵁
-const handleSelectionChange = (selection) => {
- selectedRows.value = selection;
-};
-/** 鎻愪氦涓婁紶鏂囦欢 */
-function submitFileForm() {
- proxy.$refs["uploadRef"].submit();
-}
-/** 瀵煎叆鎸夐挳鎿嶄綔 */
-function handleImport() {
- upload.title = "瀹㈡埛瀵煎叆";
- upload.open = true;
-}
-// 鎵撳紑寮规
-const openForm = (type, row) => {
- operationType.value = type;
- form.value = {};
- form.value.maintainer = userStore.nickName;
- formYYs.value.contactList = [
- {
- contactPerson: "",
- contactPhone: ""
- }
- ];
- form.value.maintenanceTime = getCurrentDate();
- userListNoPage().then((res) => {
- userList.value = res.data;
- });
- if (type === "edit") {
- getCustomer(row.id).then((res) => {
- form.value = { ...res.data };
- formYYs.value.contactList = res.data.contactPerson.split(",").map((item, index) => {
- return {
- contactPerson: item,
- contactPhone: res.data.contactPhone.split(",")[index]
- }
- });
-
- });
- }
- dialogFormVisible.value = true;
-};
-// 鎻愪氦琛ㄥ崟
-const submitForm = () => {
- proxy.$refs["formRef"].validate((valid) => {
- if (valid) {
- if (operationType.value === "edit") {
- submitEdit();
- } else {
- submitAdd();
- }
- }
- });
-};
-// 鎻愪氦鏂板
-const submitAdd = () => {
- if(formYYs.value.contactList.length < 1){
- return proxy.$modal.msgWarning("璇疯嚦灏戞坊鍔犱竴涓仈绯讳汉");
- }
- form.value.contactPerson = formYYs.value.contactList.map(item => item.contactPerson).join(",");
- form.value.contactPhone = formYYs.value.contactList.map(item => item.contactPhone).join(",");
- addCustomer(form.value).then((res) => {
- proxy.$modal.msgSuccess("鎻愪氦鎴愬姛");
- closeDia();
- getList();
- });
-};
-// 鎻愪氦淇敼
-const submitEdit = () => {
- form.value.contactPerson = formYYs.value.contactList.map(item => item.contactPerson).join(",");
- form.value.contactPhone = formYYs.value.contactList.map(item => item.contactPhone).join(",");
- updateCustomer(form.value).then((res) => {
- proxy.$modal.msgSuccess("鎻愪氦鎴愬姛");
- closeDia();
- getList();
- });
-};
-// 鍏抽棴寮规
-const closeDia = () => {
- proxy.resetForm("formRef");
- dialogFormVisible.value = false;
-};
-// 瀵煎嚭
-const handleOut = () => {
- ElMessageBox.confirm("閫変腑鐨勫唴瀹瑰皢琚鍑猴紝鏄惁纭瀵煎嚭锛�", "瀵煎嚭", {
- confirmButtonText: "纭",
- cancelButtonText: "鍙栨秷",
- type: "warning",
- })
- .then(() => {
- proxy.download("/basic/customer/export", {}, "瀹㈡埛妗f.xlsx");
- })
- .catch(() => {
- proxy.$modal.msg("宸插彇娑�");
- });
-};
-// 鍒犻櫎
-const handleDelete = () => {
- let ids = [];
- if (selectedRows.value.length > 0) {
- // 妫�鏌ユ槸鍚︽湁浠栦汉缁存姢鐨勬暟鎹�
- const unauthorizedData = selectedRows.value.filter(item => item.maintainer !== userStore.nickName);
- if (unauthorizedData.length > 0) {
- proxy.$modal.msgWarning("涓嶅彲鍒犻櫎浠栦汉缁存姢鐨勬暟鎹�");
- return;
- }
- ids = selectedRows.value.map((item) => item.id);
- } else {
- proxy.$modal.msgWarning("璇烽�夋嫨鏁版嵁");
- return;
- }
- ElMessageBox.confirm("閫変腑鐨勫唴瀹瑰皢琚垹闄わ紝鏄惁纭鍒犻櫎锛�", "鍒犻櫎鎻愮ず", {
- confirmButtonText: "纭",
- cancelButtonText: "鍙栨秷",
- type: "warning",
- })
- .then(() => {
- tableLoading.value = true;
- delCustomer(ids)
- .then((res) => {
- proxy.$modal.msgSuccess("鍒犻櫎鎴愬姛");
- getList();
- })
- .finally(() => {
- tableLoading.value = false;
- });
- })
- .catch(() => {
- proxy.$modal.msg("宸插彇娑�");
- });
-};
-
-// 鑾峰彇褰撳墠鏃ユ湡骞舵牸寮忓寲涓� YYYY-MM-DD
-function getCurrentDate() {
- const today = new Date();
- const year = today.getFullYear();
- const month = String(today.getMonth() + 1).padStart(2, "0"); // 鏈堜唤浠�0寮�濮�
- const day = String(today.getDate()).padStart(2, "0");
- return `${year}-${month}-${day}`;
-}
-
-onMounted(() => {
- getList();
-});
-</script>
-
-<style scoped lang="scss"></style>
diff --git a/src/views/basicData/product/ImportExcel/index.vue b/src/views/basicData/product/ImportExcel/index.vue
deleted file mode 100644
index c25d254..0000000
--- a/src/views/basicData/product/ImportExcel/index.vue
+++ /dev/null
@@ -1,68 +0,0 @@
-<template>
- <el-button type="info" plain icon="Upload" @click="handleImport">
- 瀵煎叆
- </el-button>
- <el-dialog v-model="upload.open" :title="upload.title">
- <FileUpload
- ref="fileUploadRef"
- accept=".xlsx, .xls"
- :headers="upload.headers"
- :action="upload.url + '?updateSupport=' + upload.updateSupport"
- :disabled="upload.isUploading"
- :showTip="false"
- @success="handleFileSuccess"
- />
- <template #footer>
- <div class="dialog-footer">
- <el-button type="primary" @click="submitFileForm">纭� 瀹�</el-button>
- <el-button @click="upload.open = false">鍙� 娑�</el-button>
- </div>
- </template>
- </el-dialog>
-</template>
-
-<script setup>
-import { reactive } from "vue";
-import { getToken } from "@/utils/auth.js";
-import { FileUpload } from "@/components/Upload";
-import { ElMessage } from "element-plus";
-
-defineOptions({
- name: "浜у搧缁存姢瀵煎叆",
-});
-
-const emits = defineEmits(["uploadSuccess"]);
-const fileUploadRef = ref();
-const upload = reactive({
- // 鏄惁鏄剧ず寮瑰嚭灞傦紙渚涘簲鍟嗗鍏ワ級
- open: false,
- // 寮瑰嚭灞傛爣棰橈紙渚涘簲鍟嗗鍏ワ級
- title: "",
- // 鏄惁绂佺敤涓婁紶
- isUploading: false,
- // 璁剧疆涓婁紶鐨勮姹傚ご閮�
- headers: { Authorization: "Bearer " + getToken() },
- // 涓婁紶鐨勫湴鍧�
- url: import.meta.env.VITE_APP_BASE_API + "/system/supplier/import",
-});
-// 鐐瑰嚮瀵煎叆
-const handleImport = () => {
- upload.open = true;
- upload.title = "浜у搧瀵煎叆";
-};
-
-const submitFileForm = () => {
- fileUploadRef.value.uploadApi();
-};
-
-const handleFileSuccess = (response) => {
- const { code, msg } = response;
- if (code == 200) {
- ElMessage({ message: "瀵煎叆鎴愬姛", type: "success" });
- upload.open = false;
- emits("uploadSuccess");
- } else {
- ElMessage({ message: msg, type: "error" });
- }
-};
-</script>
diff --git a/src/views/basicData/product/index.vue b/src/views/basicData/product/index.vue
deleted file mode 100644
index b88d678..0000000
--- a/src/views/basicData/product/index.vue
+++ /dev/null
@@ -1,500 +0,0 @@
-<template>
- <div class="app-container product-view">
- <div class="left">
- <div>
- <el-input
- v-model="search"
- style="width: 210px"
- placeholder="杈撳叆鍏抽敭瀛楄繘琛屾悳绱�"
- @change="searchFilter"
- @clear="searchFilter"
- clearable
- prefix-icon="Search"
- />
- <el-button
- type="primary"
- @click="openProDia('addOne')"
- style="margin-left: 10px"
- >鏂板浜у搧澶х被</el-button
- >
- </div>
- <div ref="containerRef">
- <el-tree
- ref="tree"
- v-loading="treeLoad"
- :data="list"
- @node-click="handleNodeClick"
- :expand-on-click-node="false"
- default-expand-all
- :default-expanded-keys="expandedKeys"
- :draggable="true"
- :filter-node-method="filterNode"
- :props="{ children: 'children', label: 'label' }"
- highlight-current
- node-key="id"
- style="
- height: calc(100vh - 190px);
- overflow-y: scroll;
- scrollbar-width: none;
- "
- >
- <template #default="{ node, data }">
- <div class="custom-tree-node">
- <span class="tree-node-content">
- <el-icon class="orange-icon">
- <component :is="data.children && data.children.length > 0
- ? node.expanded ? 'FolderOpened' : 'Folder' : 'Tickets'" />
- </el-icon>
- {{ data.label }}
- </span>
- <div>
- <el-button
- type="primary"
- link
- @click="openProDia('edit', data)"
- >
- 缂栬緫
- </el-button>
- <el-button type="primary" link @click="openProDia('add', data)" :disabled="node.level >= 3">
- 娣诲姞浜у搧
- </el-button>
- <el-button
- v-if="!node.childNodes.length"
- style="margin-left: 4px"
- type="danger"
- link
- @click="remove(node, data)"
- >
- 鍒犻櫎
- </el-button>
- </div>
- </div>
- </template>
- </el-tree>
- </div>
- </div>
- <div class="right">
- <div style="margin-bottom: 10px" v-if="isShowButton">
- <el-button type="primary" @click="openModelDia('add')">
- 鏂板瑙勬牸鍨嬪彿
- </el-button>
- <ImportExcel @uploadSuccess="getModelList" />
- <el-button
- type="danger"
- @click="handleDelete"
- style="margin-left: 10px"
- plain
- >
- 鍒犻櫎
- </el-button>
- </div>
- <PIMTable
- rowKey="id"
- :column="tableColumn"
- :tableData="tableData"
- :page="page"
- :isSelection="true"
- @selection-change="handleSelectionChange"
- :tableLoading="tableLoading"
- @pagination="pagination"
- ></PIMTable>
- </div>
- <el-dialog v-model="productDia" title="浜у搧" width="400px" @keydown.enter.prevent>
- <el-form
- :model="form"
- label-width="140px"
- label-position="top"
- :rules="rules"
- ref="formRef"
- >
- <el-row :gutter="30">
- <el-col :span="24">
- <el-form-item label="浜у搧鍚嶇О锛�" prop="productName">
- <el-input
- v-model="form.productName"
- placeholder="璇疯緭鍏ヤ骇鍝佸悕绉�"
- clearable
- @keydown.enter.prevent
- />
- </el-form-item>
- </el-col>
- </el-row>
- </el-form>
- <template #footer>
- <div class="dialog-footer">
- <el-button type="primary" @click="submitForm">纭</el-button>
- <el-button @click="closeProDia">鍙栨秷</el-button>
- </div>
- </template>
- </el-dialog>
- <el-dialog
- v-model="modelDia"
- title="瑙勬牸鍨嬪彿"
- width="400px"
- @close="closeModelDia"
- @keydown.enter.prevent
- >
- <el-form
- :model="modelForm"
- label-width="140px"
- label-position="top"
- :rules="modelRules"
- ref="modelFormRef"
- >
- <el-row>
- <el-col :span="24">
- <el-form-item label="瑙勬牸鍨嬪彿锛�" prop="model">
- <el-input
- v-model="modelForm.model"
- placeholder="璇疯緭鍏ヨ鏍煎瀷鍙�"
- clearable
- @keydown.enter.prevent
- />
- </el-form-item>
- </el-col>
- </el-row>
- <el-row>
- <el-col :span="24">
- <el-form-item label="鍗曚綅锛�" prop="unit">
- <el-input
- v-model="modelForm.unit"
- placeholder="璇疯緭鍏ュ崟浣�"
- clearable
- @keydown.enter.prevent
- />
- </el-form-item>
- </el-col>
- </el-row>
- </el-form>
- <template #footer>
- <div class="dialog-footer">
- <el-button type="primary" @click="submitModelForm">纭</el-button>
- <el-button @click="closeModelDia">鍙栨秷</el-button>
- </div>
- </template>
- </el-dialog>
- </div>
-</template>
-
-<script setup>
-import { ref } from "vue";
-import { ElMessageBox } from "element-plus";
-import {
- addOrEditProduct,
- addOrEditProductModel,
- delProduct,
- delProductModel,
- modelListPage,
- productTreeList,
-} from "@/api/basicData/product.js";
-import ImportExcel from "./ImportExcel/index.vue";
-
-const { proxy } = getCurrentInstance();
-const tree = ref(null);
-const containerRef = ref(null);
-
-const productDia = ref(false);
-const modelDia = ref(false);
-const modelOperationType = ref("");
-const search = ref("");
-const currentId = ref("");
-const currentParentId = ref("");
-const operationType = ref("");
-const treeLoad = ref(false);
-const list = ref([]);
-const expandedKeys = ref([]);
-const tableColumn = ref([
- {
- label: "瑙勬牸鍨嬪彿",
- prop: "model",
- },
- {
- label: "鍗曚綅",
- prop: "unit",
- },
- {
- dataType: "action",
- label: "鎿嶄綔",
- align: "center",
- operation: [
- {
- name: "缂栬緫",
- type: "text",
- clickFun: (row) => {
- openModelDia("edit", row);
- },
- },
- ],
- },
-]);
-const tableData = ref([]);
-const tableLoading = ref(false);
-const isShowButton = ref(false);
-const selectedRows = ref([]);
-const page = reactive({
- current: 1,
- size: 10,
- total: 0,
-});
-const data = reactive({
- form: {
- productName: "",
- },
- rules: {
- productName: [{ required: true, message: "璇疯緭鍏�", trigger: "blur" }],
- },
- modelForm: {
- model: "",
- unit: "",
- },
- modelRules: {
- model: [{ required: true, message: "璇疯緭鍏�", trigger: "blur" }],
- unit: [{ required: true, message: "璇疯緭鍏�", trigger: "blur" }],
- },
-});
-const { form, rules, modelForm, modelRules } = toRefs(data);
-// 鏌ヨ浜у搧鏍�
-const getProductTreeList = () => {
- treeLoad.value = true;
- productTreeList()
- .then((res) => {
- list.value = res;
- list.value.forEach((a) => {
- expandedKeys.value.push(a.label);
- });
- treeLoad.value = false;
- })
- .catch((err) => {
- treeLoad.value = false;
- });
-};
-// 杩囨护浜у搧鏍�
-const searchFilter = () => {
- proxy.$refs.tree.filter(search.value);
-};
-// 鎵撳紑浜у搧寮规
-const openProDia = (type, data) => {
- operationType.value = type;
- productDia.value = true;
- form.value.productName = "";
- if (type === "edit") {
- form.value.productName = data.productName;
- }
-};
-// 鎵撳紑瑙勬牸鍨嬪彿寮规
-const openModelDia = (type, data) => {
- modelOperationType.value = type;
- modelDia.value = true;
- modelForm.value.model = "";
- modelForm.value.model = "";
- modelForm.value.id = "";
- if (type === "edit") {
- modelForm.value = { ...data };
- }
-};
-// 鎻愪氦浜у搧鍚嶇О淇敼
-const submitForm = () => {
- proxy.$refs.formRef.validate((valid) => {
- if (valid) {
- if (operationType.value === "add") {
- form.value.parentId = currentId.value;
- form.value.id = "";
- } else if (operationType.value === "addOne") {
- form.value.id = "";
- form.value.parentId = "";
- } else {
- form.value.id = currentId.value;
- form.value.parentId = "";
- }
- addOrEditProduct(form.value).then((res) => {
- proxy.$modal.msgSuccess("鎻愪氦鎴愬姛");
- closeProDia();
- getProductTreeList();
- });
- }
- });
-};
-// 鍏抽棴浜у搧寮规
-const closeProDia = () => {
- proxy.$refs.formRef.resetFields();
- productDia.value = false;
-};
-
-// 鍒犻櫎浜у搧
-const remove = (node, data) => {
- let ids = [];
- ids.push(data.id);
- ElMessageBox.confirm("閫変腑鐨勫唴瀹瑰皢琚垹闄わ紝鏄惁纭鍒犻櫎锛�", "鍒犻櫎鎻愮ず", {
- confirmButtonText: "纭",
- cancelButtonText: "鍙栨秷",
- type: "warning",
- })
- .then(() => {
- tableLoading.value = true;
- delProduct(ids)
- .then((res) => {
- proxy.$modal.msgSuccess("鍒犻櫎鎴愬姛");
- getProductTreeList();
- })
- .finally(() => {
- tableLoading.value = false;
- });
- })
- .catch(() => {
- proxy.$modal.msg("宸插彇娑�");
- });
-};
-// 閫夋嫨浜у搧
-const handleNodeClick = (val, node, el) => {
- // 鍒ゆ柇鏄惁涓哄彾瀛愯妭鐐�
- isShowButton.value = !(val.children && val.children.length > 0);
- // 鍙湁鍙跺瓙鑺傜偣鎵嶆墽琛屼互涓嬮�昏緫
- currentId.value = val.id;
- currentParentId.value = val.parentId;
- getModelList();
-};
-
-// 鎻愪氦瑙勬牸鍨嬪彿淇敼
-const submitModelForm = () => {
- proxy.$refs.modelFormRef.validate((valid) => {
- if (valid) {
- modelForm.value.productId = currentId.value;
- addOrEditProductModel(modelForm.value).then((res) => {
- proxy.$modal.msgSuccess("鎻愪氦鎴愬姛");
- closeModelDia();
- getModelList();
- });
- }
- });
-};
-// 鍏抽棴鍨嬪彿寮规
-const closeModelDia = () => {
- proxy.$refs.modelFormRef.resetFields();
- modelDia.value = false;
-};
-// 琛ㄦ牸閫夋嫨鏁版嵁
-const handleSelectionChange = (selection) => {
- selectedRows.value = selection;
-};
-
-// 鏌ヨ瑙勬牸鍨嬪彿
-const pagination = (obj) => {
- page.current = obj.page;
- page.size = obj.limit;
- getModelList();
-};
-const getModelList = () => {
- tableLoading.value = true;
- modelListPage({
- id: currentId.value,
- current: page.current,
- size: page.size,
- }).then((res) => {
- console.log("res", res);
- tableData.value = res.records;
- page.total = res.total;
- tableLoading.value = false;
- });
-};
-// 鍒犻櫎瑙勬牸鍨嬪彿
-const handleDelete = () => {
- let ids = [];
- if (selectedRows.value.length > 0) {
- ids = selectedRows.value.map((item) => item.id);
- } else {
- proxy.$modal.msgWarning("璇烽�夋嫨鏁版嵁");
- return;
- }
- ElMessageBox.confirm("閫変腑鐨勫唴瀹瑰皢琚垹闄わ紝鏄惁纭鍒犻櫎锛�", "鍒犻櫎鎻愮ず", {
- confirmButtonText: "纭",
- cancelButtonText: "鍙栨秷",
- type: "warning",
- })
- .then(() => {
- tableLoading.value = true;
- delProductModel(ids)
- .then((res) => {
- proxy.$modal.msgSuccess("鍒犻櫎鎴愬姛");
- getModelList();
- })
- .finally(() => {
- tableLoading.value = false;
- });
- })
- .catch(() => {
- proxy.$modal.msg("宸插彇娑�");
- });
-};
-// 璋冪敤tree杩囨护鏂规硶 涓枃鑻辫繃婊�
-const filterNode = (value, data, node) => {
- if (!value) {
- //濡傛灉鏁版嵁涓虹┖锛屽垯杩斿洖true,鏄剧ず鎵�鏈夌殑鏁版嵁椤�
- return true;
- }
- // 鏌ヨ鍒楄〃鏄惁鏈夊尮閰嶆暟鎹紝灏嗗�煎皬鍐欙紝鍖归厤鑻辨枃鏁版嵁
- let val = value.toLowerCase();
- return chooseNode(val, data, node); // 璋冪敤杩囨护浜屽眰鏂规硶
-};
-// 杩囨护鐖惰妭鐐� / 瀛愯妭鐐� (濡傛灉杈撳叆鐨勫弬鏁版槸鐖惰妭鐐逛笖鑳藉尮閰嶏紝鍒欒繑鍥炶鑺傜偣浠ュ強鍏朵笅鐨勬墍鏈夊瓙鑺傜偣锛涘鏋滃弬鏁版槸瀛愯妭鐐癸紝鍒欒繑鍥炶鑺傜偣鐨勭埗鑺傜偣銆俷ame鏄腑鏂囧瓧绗︼紝enName鏄嫳鏂囧瓧绗�.
-const chooseNode = (value, data, node) => {
- if (data.label.indexOf(value) !== -1) {
- return true;
- }
- const level = node.level;
- // 濡傛灉浼犲叆鐨勮妭鐐规湰韬氨鏄竴绾ц妭鐐瑰氨涓嶇敤鏍¢獙浜�
- if (level === 1) {
- return false;
- }
- // 鍏堝彇褰撳墠鑺傜偣鐨勭埗鑺傜偣
- let parentData = node.parent;
- // 閬嶅巻褰撳墠鑺傜偣鐨勭埗鑺傜偣
- let index = 0;
- while (index < level - 1) {
- // 濡傛灉鍖归厤鍒扮洿鎺ヨ繑鍥烇紝姝ゅname鍊兼槸涓枃瀛楃锛宔nName鏄嫳鏂囧瓧绗︺�傚垽鏂尮閰嶄腑鑻辨枃杩囨护
- if (parentData.data.label.indexOf(value) !== -1) {
- return true;
- }
- // 鍚﹀垯鐨勮瘽鍐嶅線涓婁竴灞傚仛鍖归厤
- parentData = parentData.parent;
- index++;
- }
- // 娌″尮閰嶅埌杩斿洖false
- return false;
-};
-getProductTreeList();
-</script>
-
-<style scoped>
-.product-view {
- display: flex;
-}
-.left {
- width: 380px;
- padding: 16px;
- background: #ffffff;
-}
-.right {
- width: calc(100% - 380px);
- padding: 16px;
- margin-left: 20px;
- background: #ffffff;
-}
-.custom-tree-node {
- flex: 1;
- display: flex;
- align-items: center;
- justify-content: space-between;
- font-size: 14px;
- padding-right: 8px;
-}
-.tree-node-content {
- display: flex;
- align-items: center; /* 鍨傜洿灞呬腑 */
- height: 100%;
-}
-.orange-icon {
- color: orange;
- font-size: 18px;
- margin-right: 8px; /* 鍥炬爣涓庢枃瀛椾箣闂村姞鐐归棿璺� */
-}
-</style>
diff --git a/src/views/basicData/supplierManage/index.vue b/src/views/basicData/supplierManage/index.vue
deleted file mode 100644
index 68c51d3..0000000
--- a/src/views/basicData/supplierManage/index.vue
+++ /dev/null
@@ -1,528 +0,0 @@
-<template>
- <div class="app-container">
- <div class="search_form">
- <div>
- <span class="search_title">渚涘簲鍟嗘。妗堬細</span>
- <el-input
- v-model="searchForm.supplierName"
- style="width: 240px"
- placeholder="杈撳叆渚涘簲鍟嗗悕绉版悳绱�"
- @change="handleQuery"
- clearable
- :prefix-icon="Search"
- />
- <el-button type="primary" @click="handleQuery" style="margin-left: 10px"
- >鎼滅储</el-button
- >
- </div>
- <div>
- <el-button type="primary" @click="openForm('add')"
- >鏂板渚涘簲鍟�</el-button
- >
- <el-button @click="handleOut">瀵煎嚭</el-button>
- <el-button type="info" plain icon="Upload" @click="handleImport"
- >瀵煎叆</el-button
- >
- <el-button type="danger" plain @click="handleDelete">鍒犻櫎</el-button>
- </div>
- </div>
- <div class="table_list">
- <PIMTable
- rowKey="id"
- :column="tableColumn"
- :tableData="tableData"
- :page="page"
- :isSelection="true"
- @selection-change="handleSelectionChange"
- :tableLoading="tableLoading"
- @pagination="pagination"
- ></PIMTable>
- </div>
- <el-dialog
- v-model="dialogFormVisible"
- :title="operationType === 'add' ? '鏂板渚涘簲鍟嗕俊鎭�' : '缂栬緫渚涘簲鍟嗕俊鎭�'"
- width="70%"
- @close="closeDia"
- >
- <el-form
- :model="form"
- label-width="140px"
- label-position="top"
- :rules="rules"
- ref="formRef"
- >
- <el-row :gutter="30">
- <el-col :span="12">
- <el-form-item label="渚涘簲鍟嗗悕绉帮細" prop="supplierName">
- <el-input
- v-model="form.supplierName"
- placeholder="璇疯緭鍏�"
- clearable
- />
- </el-form-item>
- </el-col>
- <el-col :span="12">
- <el-form-item
- label="绾崇◣浜鸿瘑鍒彿锛�"
- prop="taxpayerIdentificationNum"
- >
- <el-input
- v-model="form.taxpayerIdentificationNum"
- placeholder="璇疯緭鍏�"
- clearable
- />
- </el-form-item>
- </el-col>
- </el-row>
- <el-row :gutter="30">
- <el-col :span="12">
- <el-form-item label="鍏徃鍦板潃锛�" prop="companyAddress">
- <el-input
- v-model="form.companyAddress"
- placeholder="璇疯緭鍏�"
- clearable
- />
- </el-form-item>
- </el-col>
- <el-col :span="12">
- <el-form-item label="鍏徃鐢佃瘽锛�" prop="companyPhone">
- <el-input
- v-model="form.companyPhone"
- placeholder="璇疯緭鍏�"
- clearable
- />
- </el-form-item>
- </el-col>
- </el-row>
- <el-row :gutter="30">
- <el-col :span="12">
- <el-form-item label="寮�鎴疯锛�" prop="bankAccountName">
- <el-input
- v-model="form.bankAccountName"
- placeholder="璇疯緭鍏�"
- clearable
- />
- </el-form-item>
- </el-col>
- <el-col :span="12">
- <el-form-item label="璐﹀彿锛�" prop="bankAccountNum">
- <el-input
- v-model="form.bankAccountNum"
- placeholder="璇疯緭鍏�"
- clearable
- />
- </el-form-item>
- </el-col>
- </el-row>
- <el-row :gutter="30">
- <el-col :span="12">
- <el-form-item label="鑱旂郴浜猴細" prop="contactUserName">
- <el-input
- v-model="form.contactUserName"
- placeholder="璇疯緭鍏�"
- clearable
- />
- </el-form-item>
- </el-col>
- <el-col :span="12">
- <el-form-item label="鑱旂郴鐢佃瘽锛�" prop="contactUserPhone">
- <el-input
- v-model="form.contactUserPhone"
- placeholder="璇疯緭鍏�"
- clearable
- />
- </el-form-item>
- </el-col>
- </el-row>
- <el-row :gutter="30">
- <el-col :span="12">
- <el-form-item label="缁存姢浜猴細" prop="maintainUserId">
- <el-select
- v-model="form.maintainUserId"
- placeholder="璇烽�夋嫨"
- clearable
- disabled
- >
- <el-option
- v-for="item in userList"
- :key="item.nickName"
- :label="item.nickName"
- :value="item.userId"
- />
- </el-select>
- </el-form-item>
- </el-col>
- <el-col :span="12">
- <el-form-item label="缁存姢鏃堕棿锛�" prop="maintainTime">
- <el-date-picker
- style="width: 100%"
- v-model="form.maintainTime"
- value-format="YYYY-MM-DD"
- format="YYYY-MM-DD"
- type="date"
- placeholder="璇烽�夋嫨"
- clearable
- disabled
- />
- </el-form-item>
- </el-col>
- </el-row>
- </el-form>
- <template #footer>
- <div class="dialog-footer">
- <el-button type="primary" @click="submitForm">纭</el-button>
- <el-button @click="closeDia">鍙栨秷</el-button>
- </div>
- </template>
- </el-dialog>
-
- <!-- 渚涘簲鍟嗗鍏ュ璇濇 -->
- <el-dialog
- :title="upload.title"
- v-model="upload.open"
- width="400px"
- append-to-body
- >
- <el-upload
- ref="uploadRef"
- :limit="1"
- accept=".xlsx, .xls"
- :headers="upload.headers"
- :action="upload.url + '?updateSupport=' + upload.updateSupport"
- :disabled="upload.isUploading"
- :on-progress="handleFileUploadProgress"
- :on-success="handleFileSuccess"
- :auto-upload="false"
- drag
- >
- <el-icon class="el-icon--upload"><upload-filled /></el-icon>
- <div class="el-upload__text">灏嗘枃浠舵嫋鍒版澶勶紝鎴�<em>鐐瑰嚮涓婁紶</em></div>
- <template #tip>
- <div class="el-upload__tip text-center">
- <span>浠呭厑璁稿鍏ls銆亁lsx鏍煎紡鏂囦欢銆�</span>
- <!-- <el-link
- type="primary"
- :underline="false"
- style="font-size: 12px; vertical-align: baseline"
- @click="importTemplate"
- >涓嬭浇妯℃澘</el-link
- > -->
- </div>
- </template>
- </el-upload>
- <template #footer>
- <div class="dialog-footer">
- <el-button type="primary" @click="submitFileForm">纭� 瀹�</el-button>
- <el-button @click="upload.open = false">鍙� 娑�</el-button>
- </div>
- </template>
- </el-dialog>
- </div>
-</template>
-
-<script setup>
-import { onMounted, ref } from "vue";
-import { Search } from "@element-plus/icons-vue";
-import { delSupplier } from "@/api/basicData/supplierManageFile.js";
-import { ElMessageBox } from "element-plus";
-import { userListNoPage } from "@/api/system/user.js";
-import {
- addSupplier,
- getSupplier,
- listSupplier,
- updateSupplier,
-} from "@/api/basicData/supplierManageFile.js";
-import useUserStore from "@/store/modules/user";
-import { getToken } from "@/utils/auth.js";
-const { proxy } = getCurrentInstance();
-const userStore = useUserStore();
-
-const tableColumn = ref([
- {
- label: "渚涘簲鍟嗗悕绉�",
- prop: "supplierName",
- width: 250,
- },
- {
- label: "绾崇◣浜鸿瘑鍒彿",
- prop: "taxpayerIdentificationNum",
- width: 230,
- },
- {
- label: "鍏徃鍦板潃",
- prop: "companyAddress",
- width: 220,
- },
- {
- label: "鑱旂郴鏂瑰紡",
- prop: "companyPhone",
- width:150
- },
- {
- label: "寮�鎴疯",
- prop: "bankAccountName",
- width: 220,
- },
- {
- label: "璐﹀彿",
- prop: "bankAccountNum",
- width: 220,
- },
- {
- label: "鑱旂郴浜�",
- prop: "contactUserName",
- },
- {
- label: "鑱旂郴鐢佃瘽",
- prop: "contactUserPhone",
- width: 150,
- },
- {
- label: "缁存姢浜�",
- prop: "maintainUserName",
- },
-
- {
- label: "缁存姢鏃堕棿",
- prop: "maintainTime",
- width:100
- },
- {
- dataType: "action",
- label: "鎿嶄綔",
- align: "center",
- fixed: 'right',
- operation: [
- {
- name: "缂栬緫",
- type: "text",
- clickFun: (row) => {
- openForm("edit", row);
- },
- disabled: (row) => {
- return row.maintainUserName !== userStore.nickName
- }
- },
- ],
- },
-]);
-const tableData = ref([]);
-const selectedRows = ref([]);
-const userList = ref([]);
-const tableLoading = ref(false);
-const page = reactive({
- current: 1,
- size: 100,
- total: 0,
-});
-
-// 鐢ㄦ埛淇℃伅琛ㄥ崟寮规鏁版嵁
-const operationType = ref("");
-const dialogFormVisible = ref(false);
-const data = reactive({
- searchForm: {
- supplierName: "",
- },
- form: {
- supplierName: "",
- taxpayerIdentificationNum: "",
- companyAddress: "",
- companyPhone: "",
- bankAccountName: "",
- bankAccountNum: "",
- contactUserName: "",
- contactUserPhone: "",
- maintainUserId: "",
- maintainTime: "",
- },
- rules: {
- supplierName: [{ required: true, message: "璇疯緭鍏�", trigger: "blur" }],
- taxpayerIdentificationNum: [
- { required: true, message: "璇疯緭鍏�", trigger: "blur" },
- ],
- companyAddress: [{ required: true, message: "璇疯緭鍏�", trigger: "blur" }],
- companyPhone: [{ required: true, message: "璇疯緭鍏�", trigger: "blur" }],
- bankAccountName: [{ required: true, message: "璇疯緭鍏�", trigger: "blur" }],
- bankAccountNum: [{ required: true, message: "璇疯緭鍏�", trigger: "blur" }],
- contactUserName: [{ required: false, message: "璇疯緭鍏�", trigger: "blur" }],
- contactUserPhone: [{ required: false, message: "璇疯緭鍏�", trigger: "blur" }],
- maintainUserId: [{ required: false, message: "璇烽�夋嫨", trigger: "change" }],
- maintainTime: [{ required: false, message: "璇烽�夋嫨", trigger: "change" }],
- },
-});
-const { searchForm, form, rules } = toRefs(data);
-
-// 鏌ヨ鍒楄〃
-/** 鎼滅储鎸夐挳鎿嶄綔 */
-const handleQuery = () => {
- page.current = 1;
- getList();
-};
-const pagination = (obj) => {
- page.current = obj.page;
- page.size = obj.limit;
- getList();
-};
-/** 鎻愪氦涓婁紶鏂囦欢 */
-function submitFileForm() {
- console.log(upload.url + '?updateSupport=' + upload.updateSupport)
- proxy.$refs["uploadRef"].submit();
-}
-const getList = () => {
- tableLoading.value = true;
- listSupplier({ ...searchForm.value, ...page }).then((res) => {
- tableLoading.value = false;
- tableData.value = res.data.records;
- page.total = res.data.total;
- });
-};
-const upload = reactive({
- // 鏄惁鏄剧ず寮瑰嚭灞傦紙渚涘簲鍟嗗鍏ワ級
- open: false,
- // 寮瑰嚭灞傛爣棰橈紙渚涘簲鍟嗗鍏ワ級
- title: "",
- // 鏄惁绂佺敤涓婁紶
- isUploading: false,
- // 鏄惁鏇存柊宸茬粡瀛樺湪鐨勭敤鎴锋暟鎹�
- updateSupport: 1,
- // 璁剧疆涓婁紶鐨勮姹傚ご閮�
- headers: { Authorization: "Bearer " + getToken() },
- // 涓婁紶鐨勫湴鍧�
- url: import.meta.env.VITE_APP_BASE_API + "/system/supplier/import",
-});
-/** 瀵煎叆鎸夐挳鎿嶄綔 */
-function handleImport() {
- upload.title = "渚涘簲鍟嗗鍏�";
- upload.open = true;
-}
-
-/**鏂囦欢涓婁紶涓鐞� */
-const handleFileUploadProgress = (event, file, fileList) => {
- upload.isUploading = true;
-};
-
-/** 鏂囦欢涓婁紶鎴愬姛澶勭悊 */
-const handleFileSuccess = (response, file, fileList) => {
- upload.open = false;
- upload.isUploading = false;
- proxy.$refs["uploadRef"].handleRemove(file);
- getList();
-};
-// 琛ㄦ牸閫夋嫨鏁版嵁
-const handleSelectionChange = (selection) => {
- selectedRows.value = selection;
-};
-// 鎵撳紑寮规
-const openForm = (type, row) => {
- operationType.value = type;
- form.value = {};
- form.value.maintainUserId = userStore.id;
- form.value.maintainTime = getCurrentDate();
- userListNoPage().then((res) => {
- userList.value = res.data;
- });
- if (type === "edit") {
- getSupplier(row.id).then((res) => {
- form.value = { ...res.data };
- });
- }
- dialogFormVisible.value = true;
-};
-// 鎻愪氦琛ㄥ崟
-const submitForm = () => {
- proxy.$refs["formRef"].validate((valid) => {
- if (valid) {
- if (operationType.value === "edit") {
- submitEdit();
- } else {
- submitAdd();
- }
- }
- });
-};
-// 鎻愪氦鏂板
-const submitAdd = () => {
- addSupplier(form.value).then((res) => {
- proxy.$modal.msgSuccess("鎻愪氦鎴愬姛");
- closeDia();
- getList();
- });
-};
-// 鎻愪氦淇敼
-const submitEdit = () => {
- updateSupplier(form.value).then((res) => {
- proxy.$modal.msgSuccess("鎻愪氦鎴愬姛");
- closeDia();
- getList();
- });
-};
-// 鍏抽棴寮规
-const closeDia = () => {
- proxy.resetForm("formRef");
- dialogFormVisible.value = false;
-};
-// 瀵煎嚭
-const handleOut = () => {
- ElMessageBox.confirm("閫変腑鐨勫唴瀹瑰皢琚鍑猴紝鏄惁纭瀵煎嚭锛�", "瀵煎嚭", {
- confirmButtonText: "纭",
- cancelButtonText: "鍙栨秷",
- type: "warning",
- })
- .then(() => {
- proxy.download("/system/supplier/export", {}, "渚涘簲鍟嗘。妗�.xlsx");
- })
- .catch(() => {
- proxy.$modal.msg("宸插彇娑�");
- });
-};
-// 鍒犻櫎
-const handleDelete = () => {
- let ids = [];
- if (selectedRows.value.length > 0) {
- // 妫�鏌ユ槸鍚︽湁浠栦汉缁存姢鐨勬暟鎹�
- const unauthorizedData = selectedRows.value.filter(item => item.maintainUserName !== userStore.nickName);
- if (unauthorizedData.length > 0) {
- proxy.$modal.msgWarning("涓嶅彲鍒犻櫎浠栦汉缁存姢鐨勬暟鎹�");
- return;
- }
- ids = selectedRows.value.map((item) => item.id);
- } else {
- proxy.$modal.msgWarning("璇烽�夋嫨鏁版嵁");
- return;
- }
- ElMessageBox.confirm("閫変腑鐨勫唴瀹瑰皢琚垹闄わ紝鏄惁纭鍒犻櫎锛�", "鍒犻櫎鎻愮ず", {
- confirmButtonText: "纭",
- cancelButtonText: "鍙栨秷",
- type: "warning",
- })
- .then(() => {
- tableLoading.value = true;
- delSupplier(ids)
- .then((res) => {
- proxy.$modal.msgSuccess("鍒犻櫎鎴愬姛");
- getList();
- })
- .finally(() => {
- tableLoading.value = false;
- });
- })
- .catch(() => {
- proxy.$modal.msg("宸插彇娑�");
- });
-};
-
-// 鑾峰彇褰撳墠鏃ユ湡骞舵牸寮忓寲涓� YYYY-MM-DD
-function getCurrentDate() {
- const today = new Date();
- const year = today.getFullYear();
- const month = String(today.getMonth() + 1).padStart(2, "0"); // 鏈堜唤浠�0寮�濮�
- const day = String(today.getDate()).padStart(2, "0");
- return `${year}-${month}-${day}`;
-}
-
-onMounted(() => {
- getList();
-});
-</script>
-
-<style scoped lang="scss"></style>
diff --git a/src/views/chatHome/chatHomeIndex/MobileChat.vue b/src/views/chatHome/chatHomeIndex/MobileChat.vue
deleted file mode 100644
index 5b06e76..0000000
--- a/src/views/chatHome/chatHomeIndex/MobileChat.vue
+++ /dev/null
@@ -1,461 +0,0 @@
-<template>
- <div class="mobile-chat-wrapper" style="height: 91vh;">
- <div class="chat-history">
- <div class="chat-content" ref="chatContent">
- <div class="chat-wrapper" v-for="(item, index) in chatList" :key="index">
- <div class="chat-friend" v-if="item.uid !== '1001'">
- <div class="info-time">
- <img :src="item.headImg" alt="" />
- <span>{{ item.name }}</span>
- <span>{{ item.time }}</span>
- </div>
- <div class="chat-text" v-if="item.chatType == 0">
- <template v-if="isSend && index === chatList.length - 1">
- <span class="flash_cursor"></span>
- </template>
- <template v-else>
- <pre>{{ item.msg }}</pre>
- </template>
- </div>
- <div class="chat-img" v-if="item.chatType == 1">
- <img :src="item.msg" alt="琛ㄦ儏" v-if="item.extend.imgType == 1" style="width: 100px; height: 100px" />
- <el-image :src="item.msg" :preview-src-list="srcImgList" v-else> </el-image>
- </div>
- <div class="chat-img" v-if="item.chatType == 2">
- <div class="word-file">
- <FileCard :fileType="item.extend.fileType" :file="item.msg"></FileCard>
- </div>
- </div>
- </div>
- <div class="chat-me" v-else>
- <div class="info-time">
- <span>{{ item.name }}</span>
- <span>{{ item.time }}</span>
- <img :src="item.headImg" alt="" />
- </div>
- <div class="chat-text" v-if="item.chatType == 0">
- {{ item.msg }}
- </div>
- <div class="chat-img" v-if="item.chatType == 1">
- <img :src="item.msg" alt="琛ㄦ儏" v-if="item.extend.imgType == 1" style="width: 100px; height: 100px" />
- <el-image style="max-width: 300px; border-radius: 10px" :src="item.msg" :preview-src-list="srcImgList" v-else> </el-image>
- </div>
- <div class="chat-img" v-if="item.chatType == 2">
- <div class="word-file">
- <FileCard :fileType="item.extend.fileType" :file="item.msg"></FileCard>
- </div>
- </div>
- </div>
- </div>
- </div>
- </div>
- <div class="chat-input-wrapper">
- <div style="display: flex; align-items: center">
- <input v-model="inputMsg" @change="sendText" :disabled="loading" class="input-text" autofocus placeholder="缁欏皬鏅哄彂閫佹秷鎭�" />
- <img class="send-icon" src="@/assets/img/emoji/rocket.png" alt="" @click="sendText" />
-
- </div>
- </div>
- </div>
-</template>
-
-<script setup>
-import { ref, reactive, onMounted, nextTick,onActivated } from 'vue'
-import { useRoute } from 'vue-router'
-import { animation } from '@/utils/util'
-import chatGPTHeadImg from '@/assets/img/head_portrait1.png'
-import headPortrait from '@/assets/img/head_portrait.jpg'
-import FileCard from '@/components/FileCard.vue'
-import { ElMessage } from "element-plus"
-import {checking} from './ai-wd.js'
-
-// 瀹氫箟鍝嶅簲寮忔暟鎹�
-const route = useRoute()
-const chatContent = ref(null)
-const ws = ref(null)
-const chatList = ref([
- {
- headImg: chatGPTHeadImg,
- name: '灏忔櫤',
- time: new Date().toLocaleTimeString(),
- msg: ' 灏忔櫤涓烘偍鏈嶅姟',
- chatType: 0,
- uid: '1002'
- }
-])
-const inputMsg = ref('')
-const isSend = ref(false)
-const fileList = ref([])
-const isProcessing = ref(false)
-const loading = ref(true)
-const srcImgList = ref([])
-
-// 鍒犻櫎鍥剧墖
-const deleteImg = (index) => {
- if (index >= 0 && index < fileList.value.length) {
- fileList.value.splice(index, 1)
- }
-}
-
-// WebSocket娑堟伅鎺ユ敹
-const websocketonmessage = (e) => {
- const redata = JSON.parse(e.data)
- //鏁版嵁鎺ユ敹
- let chatGPT = {
- headImg: headPortrait,
- name: 'DeepSeek',
- time: new Date().toLocaleTimeString(),
- msg: redata[0].text,
- chatType: 0, //淇℃伅绫诲瀷锛�0鏂囧瓧锛�1鍥剧墖
- uid: '1002' //uid
- }
- sendMsg(chatGPT)
- isSend.value = false
-}
-
-// WebSocket鍙戦�佹秷鎭�
-const websocketsend = (Data) => {
- console.log("鍗冲皢鍙戦�佹秷鎭�", Data)
- if (ws.value && ws.value.readyState === WebSocket.OPEN) {
- console.log("鍙戦�佹秷鎭�", ws.value)
- console.log("鍙戦�佹秷鎭�", Data)
- let fileUrls = fileList.value.map(item => item.file.fileUrl)
- //鏁版嵁鍙戦��
- ws.value.send(Data + ":" + fileUrls.join(","))
- fileList.value = []
- inputMsg.value = ''
- }
-}
-
-// 鍙戦�佹枃鏈秷鎭�
-const sendText = () => {
- if (inputMsg.value) {
- let chatMsg = {
- headImg: headPortrait,
- name: '鍗ч緳',
- time: new Date().toLocaleTimeString(),
- msg: inputMsg.value,
- chatType: 0, //淇℃伅绫诲瀷锛�0鏂囧瓧锛�1鍥剧墖
- uid: '1001' //uid
- }
- chatList.value.push(chatMsg)
- let chatGPT = {
- headImg: headPortrait,
- name: '灏忔櫤',
- time: new Date().toLocaleTimeString(),
- msg: "",
- chatType: 0, //淇℃伅绫诲瀷锛�0鏂囧瓧锛�1鍥剧墖
- uid: '1002' //uid
- }
- chatList.value.push(chatGPT) // 灏嗘帴鏀跺埌鐨勬秷鎭瓨鍌ㄥ埌 messages 鏁扮粍
- simulateStreamingOutput(chatGPT, inputMsg.value)
- inputMsg.value = ''
-
- } else {
- ElMessage({
- message: '娑堟伅涓嶈兘涓虹┖鍝',
- type: 'warning'
- })
- }
-}
-
-// 鍙戦�佷俊鎭�
-const sendMsg = (msgList) => {
- chatList.value.push(msgList)
- scrollBottom()
-}
-
-// 鑾峰彇绐楀彛楂樺害骞舵粴鍔ㄨ嚦鏈�搴曞眰
-const scrollBottom = () => {
- nextTick(() => {
- const scrollDom = chatContent.value
- animation(scrollDom, scrollDom.scrollHeight - scrollDom.offsetHeight)
- })
-}
-
-// 缁勪欢鎸傝浇鏃舵墽琛�
-onActivated(() => {
- chatList.value = []
- chatList.value.push({
- headImg: chatGPTHeadImg,
- name: '灏忔櫤',
- time: new Date().toLocaleTimeString(),
- msg: '灏忔櫤涓烘偍鏈嶅姟',
- chatType: 0,
- uid: '1002'
- })
- chatList.value.push({
- headImg: chatGPTHeadImg,
- name: '鍗ч緳',
- time: new Date().toLocaleTimeString(),
- msg: route.query.keyWord,
- chatType: 0,
- uid: '1001'
- })
- // 娣诲姞涓�涓┖鐨勫洖澶嶆秷鎭崰浣�
- const replyMsg = {
- headImg: chatGPTHeadImg,
- name: '灏忔櫤',
- time: new Date().toLocaleTimeString(),
- msg: '',
- chatType: 0,
- uid: '1002'
- }
- chatList.value.push(replyMsg)
- scrollBottom()
- loading.value = false
- // 濡傛灉鏈夋煡璇㈠叧閿瓧锛屽垯妯℃嫙娴佸紡杈撳嚭
- if (route.query.keyWord) {
- simulateStreamingOutput(replyMsg, route.query.keyWord)
- }
-})
-// 妯℃嫙娴佸紡杈撳嚭
-const simulateStreamingOutput = async (msgObj, keyWord) => {
- loading.value = true
- // 鐢熸垚0.8-1.3绉掍箣闂寸殑闅忔満寤惰繜
- const delay = Math.random() * 500 + 800
-
- // 妯℃嫙鍥炲鍐呭锛堝疄闄呭簲鐢ㄤ腑搴斾粠API鑾峰彇锛�
- const responseText = `鍏充簬"${keyWord}"鐨勯棶棰橈紝鎴戞潵涓烘偍瑙g瓟锛歕n` + checking(keyWord)
-
- isSend.value = true
-
- let index = 0
- setTimeout(() => {
- const interval = setInterval(() => {
- isSend.value = true
- if (index < responseText.length) {
- msgObj.msg += responseText.charAt(index)
- index++
- isSend.value = false
- scrollBottom()
- } else {
- clearInterval(interval)
- isSend.value = false
- loading.value = false
- }
- }, 50) // 姣�50ms杈撳嚭涓�涓瓧绗︼紝妯℃嫙娴佸紡鏁堟灉
- }, delay)
-
-}
-</script>
-
-<style lang="scss" scoped>
-.mobile-chat-wrapper {
- display: flex;
- flex-direction: column;
- overflow: hidden;
- height: 91vh;
- position: relative;
- background-color: white;
-
- .chat-history {
- flex: 1 1 0;
- overflow-y: auto;
- }
-
- .chat-input-wrapper {
- padding: 8px 16px 8px 8px;
- position: absolute;
- left: 0;
- right: 0;
- bottom: 0;
- .file-tt{
- flex-direction: column;
- width: 200px;
- display: flex;
- padding: 5px;
- border-radius: 5px;
- margin-right: 5px;
- background: #cacaca;
- .file-item{
- width: 200px;
- overflow:hidden;
- word-wrap: break-word;
- text-overflow:ellipsis;
- display:-webkit-box;
- -webkit-box-orient:vertical;
- -webkit-line-clamp:2;
- }
- }
-
- .send-icon {
- height: 40px;
- margin-left: 16px;
- }
- .input-text{
- font-size: 18px;
- width: 100%;
- border-radius: 20px;
- height: 80px;
- padding-left: 10px;
- //padding-top: 10px;
- border: none;
- color: black; /* 淇敼鏂囨湰棰滆壊涓虹櫧鑹� */
- background-color: #f5f4f4; /* 淇敼鑳屾櫙棰滆壊涓烘繁鐏拌壊 */
- }
- }
-
- .chat-content {
- width: 100%;
- height: 80%;
- overflow-y: scroll;
- padding: 20px;
- box-sizing: border-box;
-
- &::-webkit-scrollbar {
- width: 0;
- /* Safari,Chrome 闅愯棌婊氬姩鏉� */
- height: 0;
- /* Safari,Chrome 闅愯棌婊氬姩鏉� */
- display: none;
- /* 绉诲姩绔�乸ad 涓奡afari锛孋hrome锛岄殣钘忔粴鍔ㄦ潯 */
- }
-
- .chat-wrapper {
- position: relative;
- word-break: break-all;
-
- .chat-friend {
- width: 100%;
- float: left;
- margin-bottom: 20px;
- display: flex;
- flex-direction: column;
- justify-content: flex-start;
- align-items: flex-start;
-
- .chat-text {
- max-width: 90%;
- padding: 20px;
- border-radius: 20px 20px 20px 5px;
- background-color: rgb(245, 248, 248);
- color: black;
-
- &:hover {
- background-color: rgb(232, 232, 232);
- }
-
- pre {
- white-space: break-spaces;
- }
- }
-
- .chat-img {
- img {
- width: 100px;
- height: 100px;
- }
- }
-
- .info-time {
- margin: 10px 0;
- color: black;
- font-size: 14px;
-
- img {
- width: 30px;
- height: 30px;
- border-radius: 50%;
- vertical-align: middle;
- margin-right: 10px;
- }
-
- span:last-child {
- color: rgb(101, 104, 115);
- margin-left: 10px;
- vertical-align: middle;
- }
- }
- }
-
- .chat-me {
- width: 100%;
- float: right;
- margin-bottom: 20px;
- position: relative;
- display: flex;
- flex-direction: column;
- justify-content: flex-end;
- align-items: flex-end;
-
- .chat-text {
- float: right;
- max-width: 90%;
- padding: 20px;
- border-radius: 20px 20px 5px 20px;
- background-color: rgb(29, 144, 245);
- color: #fff;
-
- &:hover {
- background-color: rgb(26, 129, 219);
- }
- }
-
- .chat-img {
- img {
- max-width: 300px;
- max-height: 200px;
- border-radius: 10px;
- }
- }
-
- .info-time {
- margin: 10px 0;
- color: black;
- font-size: 14px;
- display: flex;
- justify-content: flex-end;
-
- img {
- width: 30px;
- height: 30px;
- border-radius: 50%;
- vertical-align: middle;
- margin-left: 10px;
- }
-
- span {
- line-height: 30px;
- }
-
- span:first-child {
- color: rgb(101, 104, 115);
- margin-right: 10px;
- vertical-align: middle;
- }
- }
- }
- }
- }
- .flash_cursor {
- width: 20px;
- height: 30px;
- display: inline-block;
- background: #d6e3f5;
- opacity: 1;
- animation: glow 800ms ease-out infinite alternate;
- }
- @keyframes glow {
- 0% {
- opacity: 1;
- }
-
- 25% {
- opacity: 0.5;
- }
-
- 50% {
- opacity: 0;
- }
-
- 75% {
- opacity: 0.5;
- }
-
- 100% {
- opacity: 1;
- }
- }
-}
-</style>
diff --git a/src/views/chatHome/chatHomeIndex/home.vue b/src/views/chatHome/chatHomeIndex/home.vue
deleted file mode 100644
index 7796284..0000000
--- a/src/views/chatHome/chatHomeIndex/home.vue
+++ /dev/null
@@ -1,175 +0,0 @@
-<template>
-<div class="home">
- <div style="background: white;color: black;font-size: 30px;" class="logo">
- <div class="logo-one" style="font-weight: bold">
-<!-- <img src="/src/assets/img/logo.png" style="width: 50px;height: 50px;margin: 0 10px" />-->
- <div><i>澶фā鍨婣I灏忔櫤姝e湪涓烘偍鏈嶅姟</i></div>
- </div>
- <div class="input">
- <input type="text" v-model="keyWord" class="input-text" placeholder="缁欏皬鏅哄彂閫佹秷鎭�" @keyup.enter="sendMsg" />
- <div style="font-size: 13px;color: #808080;display: flex;justify-content: space-between;padding: 10px;">
- <div style="display: flex;justify-content: center;align-items: center;">
-<!-- <div style="display: flex;justify-content: center;align-items: center;">-->
-<!-- <img src="/src/assets/img/logo.png" style="width: 15px;height: 15px;margin: 0 5px" />-->
-<!-- <span>娣卞害鎬濊��(R1)</span>-->
-<!-- </div>-->
-<!-- <div style="display: flex;justify-content: center;align-items: center;">-->
-<!-- <img src="/src/assets/img/logo.png" style="width: 15px;height: 15px;margin: 0 5px" />-->
-<!-- <span>鑱旂綉鎼滅储</span>-->
-<!-- </div>-->
- </div>
- <div style="display: flex;justify-content: center;align-items: center;margin-right: 5px;">
-<!-- <img src="/src/assets/img/logo.png" style="width: 25px;height: 25px;margin: 0 5px" />-->
- <img src="@/assets/img/emoji/rocket.png" style="width: 25px;height: 25px;margin: 0 5px" @click="sendMsg"/>
- </div>
- </div>
- </div>
- <div style="width: 780px;">
- <div style="font-weight: bold;margin: 30px 0;">鐑棬鎺ㄨ崘</div>
- <div class="keywords">
- <div class="keywordss" @click="sendMsgDefault(keyWordOne)">
- <p class="fontSize aaa">{{keyWordOne}}</p>
- <p class="fontSize">闃�闂ㄣ�佺閬撴垨瀹瑰櫒瀵嗗皝澶辨晥瀵艰嚧姘斾綋娉勬紡锛堝姘皵銆佹皑姘旓級銆�</p>
- <p class="fontSize">鍚庢灉锛氫腑姣掋�佺垎鐐搞�佺幆澧冩薄鏌撱��</p>
- </div>
- <div class="keywordss" @click="sendMsgDefault(keyWordTwo)">
- <p class="fontSize aaa">{{keyWordTwo}}</p>
- <p class="fontSize">閽㈢摱鎴栫綈浣撳洜鏉愭枡鐤插姵銆佽厫铓�鎴栬秴鍘嬬牬瑁�</p>
- <p class="fontSize">鍘熷洜锛氭湭瀹氭湡妫�娴嬨�佽繚瑙勫厖瑁呮垨澶栭儴鎾炲嚮銆傘��</p>
- </div>
- </div>
- <div class="keywords">
- <div class="keywordss" @click="sendMsgDefault(keyWordFive)">
- <p class="fontSize aaa">{{keyWordFive}}</p>
- <p class="fontSize">瑁呭嵏杩囩▼涓繚瑙勬搷浣滐紙濡傞噹铔惉杩愩�佹贩瑁呯蹇岀墿璐級銆�</p>
- <p class="fontSize">杩愯緭閫斾腑鏈浐瀹氬鍣紝瀵艰嚧纰版挒鎴栧�惧�掋��</p>
- </div>
- <div class="keywordss" @click="sendMsgDefault(keyWordSix)">
- <p class="fontSize aaa">{{keyWordSix}}</p>
- <p class="fontSize">缂轰箯娉勬紡搴旀�ラ妗堬紝浜哄憳鍩硅涓嶈冻銆�</p>
- <p class="fontSize">鏁戞彺璁惧锛堝闃叉瘨闈㈠叿銆佸牭婕忓伐鍏凤級缂哄け鎴栧け鏁堛��</p>
- </div>
- </div>
- <div class="keywords">
- <div class="keywordss" @click="sendMsgDefault(keyWordServen)">
- <p class="fontSize aaa">{{keyWordServen}}</p>
- <p class="fontSize">鏈彇寰楄繍杈撹祫璐紙濡侫DR/RID绛夊浗闄呰鑼冿級銆�</p>
- <p class="fontSize">璺嚎瑙勫垝涓嶅悎瑙勶紙濡傜┛瓒婁汉鍙e瘑闆嗗尯锛夈��</p>
- </div>
- <div class="keywordss" @click="sendMsgDefault(keyWordEight)">
- <p class="fontSize aaa">{{keyWordEight}}</p>
- <p class="fontSize">浼犳劅鍣ㄩ儴缃诧紙濡傜孩澶栨皵浣撴帰娴嬪櫒銆佺數鍖栧浼犳劅鍣級銆�</p>
- <p class="fontSize">瀹炴椂鏁版嵁浼犺緭鑷崇洃鎺у钩鍙帮紝瑙﹀彂鎶ヨ銆�</p>
- </div>
- </div>
- </div>
- </div>
-
- <div></div>
-</div>
-</template>
-
-<script setup>
-import { ref,onMounted } from "vue";
-import {useRoute,useRouter} from "vue-router"
-const route = useRoute();
-const router = useRouter();
-const keyWord = ref('');
-const keyWordOne = ref('鍗遍櫓姘斾綋娉勬紡鎬庝箞鍔�');
-const keyWordTwo = ref('杩愯緭瀹瑰櫒澶辨晥鎬庝箞鍔�');
-const keyWordFive = ref('鎿嶄綔涓嶅綋鎬庝箞鍔�');
-const keyWordSix = ref('搴旀�ュ搷搴斾笉瓒虫�庝箞鍔�');
-const keyWordServen = ref('鍚堣鎬ч棶棰�');
-const keyWordEight = ref('娉勬紡鐩戞祴鎶�鏈湁鍝簺');
-
-const sendMsg = () => {
- router.push({ path: '/main/MobileChat',query:{ keyWord: keyWord.value} })
-}
-
-const sendMsgDefault = (value) => {
- router.push({ path: '/main/MobileChat',query:{ keyWord: value} })
-}
-
-</script>
-
-<style lang="scss" scoped>
-.home {
- width: 100%;
- height: 91vh;
- display: flex;
- flex-direction: column;
- align-items: center;
-
- .logo {
- display: flex;
- justify-content: center;
- align-items: center;
- flex-direction: column;
- z-index: 99;
- width: 100%;
- height: 100%;
- color: #fff;
- cursor: pointer;
- overflow: hidden;
- background-color: #F0F6F9;
-
- .keywords {
- display: flex;
- width: 100%;
- height: 90px;
- line-height: 80px;
- justify-content: space-between;
- margin: 10px 0;
-
- .keywordss {
- box-shadow: 0px 2px 5px #b8b8b8;
- width: 48%;
- background: #e0edfc;
- border-radius: 10px;
-
- .aaa {
- font-weight: bold;
- font-size: 15px !important;
- }
-
- .fontSize {
- font-size: 13px;
- height: 20px;
- line-height: 20px;
- margin: 6px;
- }
- }
- }
-
- .logo-one {
- display: flex;
- justify-content: center;
- align-items: center;
- margin-bottom: 20px;
- }
-
- .input {
- width: 780px;
- height: 150px;
- background: #f5f4f4;
- border-radius: 20px;
-
- .input-text {
- font-size: 18px;
- width: 568px;
- border-radius: 20px 20px 0 0;
- height: 90px;
- padding-left: 10px;
- border: none;
- color: black;
- background-color: #f5f4f4;
- }
-
- .input-text:focus {
- outline: none;
- border: none;
- }
- }
- }
-}
-</style>
diff --git a/src/views/collaborativeApproval/approvalProcess/components/approvalDia.vue b/src/views/collaborativeApproval/approvalProcess/components/approvalDia.vue
deleted file mode 100644
index 403cab6..0000000
--- a/src/views/collaborativeApproval/approvalProcess/components/approvalDia.vue
+++ /dev/null
@@ -1,371 +0,0 @@
-<template>
- <div>
- <el-dialog
- v-model="dialogFormVisible"
- :title="operationType === 'add' ? '鏂板瀹℃壒娴佺▼' : '缂栬緫瀹℃壒娴佺▼'"
- width="700px"
- @close="closeDia"
- >
- <el-form :model="form" label-width="140px" label-position="top" ref="formRef">
- <el-row>
- <el-col :span="24">
- <el-form-item label="娴佺▼缂栧彿锛�" prop="approveId">
- <el-input v-model="form.approveId" placeholder="鑷姩缂栧彿" clearable disabled/>
- </el-form-item>
- </el-col>
- </el-row>
- <el-row>
- <el-col :span="24">
- <el-form-item label="鐢宠閮ㄩ棬锛�" prop="approveDeptId">
- <el-select
- disabled
- v-model="form.approveDeptId"
- placeholder="閫夋嫨閮ㄩ棬"
- >
- <el-option
- v-for="user in productOptions"
- :key="user.deptId"
- :label="user.deptName"
- :value="user.deptId"
- />
- </el-select>
- </el-form-item>
- </el-col>
- </el-row>
- <el-row>
- <el-col :span="24">
- <el-form-item label="瀹℃壒浜嬬敱锛�" prop="approveReason">
- <el-input v-model="form.approveReason" placeholder="璇疯緭鍏�" clearable type="textarea" disabled/>
- </el-form-item>
- </el-col>
- </el-row>
- <!-- 瀹℃壒浜洪�夋嫨锛堝姩鎬佽妭鐐癸級 -->
- <el-row :gutter="30">
- <el-col :span="12">
- <el-form-item label="鐢宠浜猴細" prop="approveUser">
- <el-select
- v-model="form.approveUser"
- placeholder="閫夋嫨浜哄憳"
- disabled
- >
- <el-option
- v-for="user in userList"
- :key="user.userId"
- :label="user.nickName"
- :value="user.userId"
- />
- </el-select>
- </el-form-item>
- </el-col>
- <el-col :span="12">
- <el-form-item label="鐢宠鏃ユ湡锛�" prop="approveTime">
- <el-date-picker
- v-model="form.approveTime"
- type="date"
- placeholder="璇烽�夋嫨鏃ユ湡"
- value-format="YYYY-MM-DD"
- format="YYYY-MM-DD"
- clearable
- style="width: 100%"
- disabled
- />
- </el-form-item>
- </el-col>
- </el-row>
- </el-form>
- <el-form :model="{ activities }" ref="formRef" label-position="top">
- <el-steps :active="getActiveStep()" finish-status="success" process-status="process" align-center direction="vertical">
- <el-step
- v-for="(activity, index) in activities"
- :key="index"
- finish-status="success"
- :title="getNodeTitle(index, activities.length)"
- :description="activity.approveNodeUser"
- :icon="getNodeIcon(activity, index)"
- >
- <template #icon>
- <el-icon v-if="activity.approveNodeStatus === 2" color="red" :size="22"><WarningFilled /></el-icon>
- <el-icon v-else-if="activity.isShen" color="#1890ff" :size="22"><Edit /></el-icon>
- <el-icon v-else-if="activity.approveNodeStatus === 1" color="#67C23A" :size="26"><Check /></el-icon>
- <el-icon v-else color="#C0C4CC" :size="22"><MoreFilled /></el-icon>
- </template>
- <template #title>
- <span style="color: #000000">{{ getNodeTitle(index, activities.length) }}</span>
- </template>
- <template #description>
- <div class="node-user">
- <div class="avatar-wrapper">
- <img :src="userStore.avatar" class="user-avatar" alt=""/>
- </div>
- <span style="color: #000000">{{ activity.approveNodeUser }}-{{activity.isApproval}}</span>
- </div>
- <div v-if="!activity.isShen" class="node-reason">
- <span>瀹℃壒鎰忚锛�</span>{{ activity.approveNodeReason }}
- </div>
- <div v-if="!activity.isShen" class="node-reason">
- <span>绛惧悕锛�</span>
- <img :src="activity.urlTem" class="signImg" alt="" v-if="activity.urlTem"/>
- </div>
- <div v-else-if="activity.isShen">
- <el-form-item
- :prop="'activities.' + index + '.approveNodeReason'"
- :rules="[{ required: true, message: '瀹℃壒鎰忚涓嶈兘涓虹┖', trigger: 'blur' }]"
- >
- <el-input v-model="activity.approveNodeReason" clearable type="textarea" :disabled="operationType === 'view'"></el-input>
- </el-form-item>
- </div>
- </template>
- </el-step>
- </el-steps>
- </el-form>
- <template #footer v-if="operationType === 'approval'">
- <div class="dialog-footer">
- <el-button type="primary" @click="submitForm(2)">涓嶉�氳繃</el-button>
- <el-button type="primary" @click="openSignatureDialog(1)">閫氳繃</el-button>
- <el-button @click="closeDia">鍙栨秷</el-button>
- </div>
- </template>
- </el-dialog>
- <!-- 鐢靛瓙绛惧悕寮圭獥锛坴ue3-signature-pad锛� -->
- <el-dialog v-model="signatureDialogVisible" title="鐢靛瓙绛惧悕" width="600px" append-to-body>
- <vueEsign
- ref="esign"
- class="mySign"
- :width="800"
- :height="300"
- :isCrop="isCrop"
- :lineWidth="lineWidth"
- :lineColor="lineColor"
- />
- <div style="margin-top:10px;">
- <el-button @click="clearSignature">娓呴櫎</el-button>
- <el-button type="primary" @click="confirmSignature">纭畾</el-button>
- </div>
- </el-dialog>
- </div>
-</template>
-
-<script setup>
-import { getCurrentInstance, reactive, ref, toRefs } from "vue";
-import vueEsign from "vue-esign";
-import {
- approveProcessDetails,
- getDept,
- updateApproveNode
-} from "@/api/collaborativeApproval/approvalProcess.js";
-import useUserStore from "@/store/modules/user.js";
-import {userListNoPageByTenantId} from "@/api/system/user.js";
-import { WarningFilled, Edit, Check, MoreFilled } from '@element-plus/icons-vue'
-import { getToken } from "@/utils/auth";
-const emit = defineEmits(['close'])
-const { proxy } = getCurrentInstance()
-
-const dialogFormVisible = ref(false);
-const operationType = ref('')
-const activities = ref([])
-const formRef = ref(null);
-const userStore = useUserStore()
-const productOptions = ref([]);
-const userList = ref([])
-const data = reactive({
- form: {
- approveTime: "",
- approveId: "",
- approveUser: "",
- approveDeptId: "",
- approveReason: "",
- checkResult: "",
- },
-});
-const { form } = toRefs(data);
-const signatureDialogVisible = ref(false);
-const signatureImg = ref('');
-let submitStatus = null; // 涓存椂瀛樺偍閫氳繃/涓嶉�氳繃鐘舵��
-const isCrop = ref("");
-const esign = ref(null);
-const lineWidth = ref(0);
-const lineColor = ref("#000000");
-
-// 涓婁紶閰嶇疆
-const upload = reactive({
- // 涓婁紶鐨勫湴鍧�
- url: import.meta.env.VITE_APP_BASE_API + "/file/upload",
- // 璁剧疆涓婁紶鐨勮姹傚ご閮�
- headers: { Authorization: "Bearer " + getToken() },
-});
-
-// 鑺傜偣鏍囬
-const getNodeTitle = (index, len) => {
- if (index === len - 1) return '缁撴潫';
- return '瀹℃壒';
-};
-
-// 鑾峰彇褰撳墠婵�娲绘楠�
-const getActiveStep = () => {
- // 濡傛灉鎵�鏈� isShen 閮戒负 false锛岃繑鍥炴渶鍚庝竴涓楠わ紙鍏ㄩ儴瀹屾垚锛�
- const hasActive = activities.value.some(a => a.isShen === true);
- if (!hasActive) return activities.value.length;
- // 褰撳墠鑺傜偣绱㈠紩
- return activities.value.findIndex(a => a.isShen == true);
-};
-// 姝ラicon
-const getNodeIcon = (activity, index) => {
- if (activity.approveNodeStatus === 2) return 'el-icon-warning'; // 涓嶉�氳繃
- if (activity.isShen) return 'Edit';
- return '';
-};
-
-// 鎵撳紑寮规
-const openDialog = (type, row) => {
- operationType.value = type;
- dialogFormVisible.value = true;
- userListNoPageByTenantId().then((res) => {
- userList.value = res.data;
- });
- form.value = {...row}
- getProductOptions()
- approveProcessDetails(row.approveId).then((res) => {
- activities.value = res.data
- // 澧炲姞isApproval瀛楁
- activities.value.forEach(item => {
- if (item.url && item.url.includes('word')) {
- item.urlTem = item.url.replaceAll('word', 'img')
- } else {
- item.urlTem = item.url
- }
- if (item.approveNodeStatus === 2) {
- item.isApproval = '宸查┏鍥�';
- } else if (item.approveNodeStatus === 1) {
- item.isApproval = '宸插悓鎰�';
- } else {
- item.isApproval = '鏈鎵�';
- }
- })
- })
-}
-const getProductOptions = () => {
- getDept().then((res) => {
- productOptions.value = res.data;
- });
-};
-// 鎵撳紑绛惧悕寮圭獥
-const openSignatureDialog = (status) => {
- submitStatus = status;
- signatureDialogVisible.value = true;
-};
-// 娓呴櫎绛惧悕
-const clearSignature = () => {
- esign.value.reset();
-};
-// 纭绛惧悕
-const confirmSignature = () => {
- esign.value.generate().then((res) => {
- console.log(res);
- // 灏哹ase64杞崲涓轰簩杩涘埗
- const base64Data = res.split(',')[1]; // 绉婚櫎data:image/png;base64,鍓嶇紑
- const binaryString = atob(base64Data);
- const bytes = new Uint8Array(binaryString.length);
- for (let i = 0; i < binaryString.length; i++) {
- bytes[i] = binaryString.charCodeAt(i);
- }
- signatureImg.value = bytes;
-
- // 鍒涘缓鏂囦欢瀵硅薄鐢ㄤ簬涓婁紶
- const blob = new Blob([bytes], { type: 'image/png' });
- const file = new File([blob], 'signature.png', { type: 'image/png' });
-
- // 鍒涘缓FormData
- const formData = new FormData();
- formData.append('file', file);
-
- // 涓婁紶绛惧悕鍥剧墖
- fetch(upload.url, {
- method: 'POST',
- headers: upload.headers,
- body: formData
- })
- .then(response => response.json())
- .then(data => {
- if (data.code === 200) {
- console.log('data---', data)
- let tempFileIds = [];
- tempFileIds.push(data.data.tempId);
- signatureDialogVisible.value = false;
- clearSignature();
- // 鍙湁閫氳繃鏃舵墠浼犻�掔鍚嶆枃浠禝D
- if (submitStatus === 1) {
- submitForm(submitStatus, tempFileIds);
- } else {
- submitForm(submitStatus);
- }
- } else {
- proxy.$modal.msgError("绛惧悕鍥剧墖涓婁紶澶辫触锛�" + data.msg);
- }
- })
- .catch(error => {
- console.error('涓婁紶澶辫触:', error);
- proxy.$modal.msgError("绛惧悕鍥剧墖涓婁紶澶辫触");
- });
- }).catch((err) => {
- console.log(err);
- proxy.$modal.msgWarning("璇峰厛绛惧悕锛�");
- })
-};
-// 鎻愪氦瀹℃壒
-const submitForm = (status, tempFileIds) => {
- const filteredActivities = activities.value.filter(activity => activity.isShen);
- filteredActivities[0].approveNodeStatus = status;
- // 鍙湁閫氳繃鏃舵墠闇�瑕佺鍚�
- if (status === 1 && tempFileIds) {
- filteredActivities[0].tempFileIds = tempFileIds;
- }
- // 鍒ゆ柇鏄惁涓烘渶鍚庝竴姝�
- const isLast = activities.value.findIndex(a => a.isShen) === activities.value.length-1;
- updateApproveNode({ ...filteredActivities[0], isLast }).then(() => {
- proxy.$modal.msgSuccess("鎻愪氦鎴愬姛");
- closeDia();
- });
-};
-// 鍏抽棴寮规
-const closeDia = () => {
- proxy.resetForm("formRef");
- dialogFormVisible.value = false;
- emit('close')
-};
-defineExpose({
- openDialog,
-});
-</script>
-
-<style scoped>
-
-.node-user {
- margin: 10px 0;
- font-size: 16px;
- font-weight: 600;
- display: flex;
- align-items: center;
- gap: 8px;
-}
-.node-status {
- color: #1890ff;
- margin-left: 8px;
- font-size: 14px;
-}
-.node-reason {
- font-size: 15px;
- color: #333;
- margin: 10px 0;
-}
-.user-avatar {
- cursor: pointer;
- width: 30px;
- height: 30px;
- border-radius: 50px;
-}
-.signImg {
- cursor: pointer;
- width: 200px;
- height: 60px;
-}
-</style>
\ No newline at end of file
diff --git a/src/views/collaborativeApproval/approvalProcess/components/infoFormDia.vue b/src/views/collaborativeApproval/approvalProcess/components/infoFormDia.vue
deleted file mode 100644
index 83585a1..0000000
--- a/src/views/collaborativeApproval/approvalProcess/components/infoFormDia.vue
+++ /dev/null
@@ -1,361 +0,0 @@
-<template>
- <div>
- <el-dialog
- v-model="dialogFormVisible"
- :title="operationType === 'add' ? '鏂板瀹℃壒娴佺▼' : '缂栬緫瀹℃壒娴佺▼'"
- width="50%"
- @close="closeDia"
- >
- <el-form :model="form" label-width="140px" label-position="top" :rules="rules" ref="formRef">
- <el-row>
- <el-col :span="24">
- <el-form-item label="娴佺▼缂栧彿锛�" prop="approveId">
- <el-input v-model="form.approveId" placeholder="鑷姩缂栧彿" clearable disabled/>
- </el-form-item>
- </el-col>
- </el-row>
- <el-row>
- <el-col :span="24">
- <el-form-item label="鐢宠閮ㄩ棬锛�" prop="approveDeptId">
- <el-select
- disabled
- v-model="form.approveDeptId"
- placeholder="閫夋嫨閮ㄩ棬"
- >
- <el-option
- v-for="user in productOptions"
- :key="user.deptId"
- :label="user.deptName"
- :value="user.deptId"
- />
- </el-select>
- </el-form-item>
- </el-col>
- </el-row>
- <el-row>
- <el-col :span="24">
- <el-form-item label="瀹℃壒浜嬬敱锛�" prop="approveReason">
- <el-input v-model="form.approveReason" placeholder="璇疯緭鍏�" clearable type="textarea" />
- </el-form-item>
- </el-col>
- </el-row>
- <!-- 瀹℃壒浜洪�夋嫨锛堝姩鎬佽妭鐐癸級 -->
- <el-row>
- <el-col :span="24">
- <el-form-item>
- <template #label>
- <span>瀹℃壒浜洪�夋嫨锛�</span>
- <el-button type="primary" @click="addApproverNode" style="margin-left: 8px;">鏂板鑺傜偣</el-button>
- </template>
- <div style="display: flex; align-items: flex-end; flex-wrap: wrap;">
- <div
- v-for="(node, index) in approverNodes"
- :key="node.id"
- style="margin-right: 30px; text-align: center; margin-bottom: 10px;"
- >
- <div>
- <span>瀹℃壒浜�</span>
- 鈫�
- </div>
- <el-select
- v-model="node.userId"
- placeholder="閫夋嫨浜哄憳"
- style="width: 120px; margin-bottom: 8px;"
- >
- <el-option
- v-for="user in userList"
- :key="user.userId"
- :label="user.nickName"
- :value="user.userId"
- />
- </el-select>
- <div>
- <el-button
- type="danger"
- size="small"
- @click="removeApproverNode(index)"
- v-if="approverNodes.length > 1"
- >鍒犻櫎</el-button>
- </div>
- </div>
- </div>
- </el-form-item>
- </el-col>
- </el-row>
- <el-row :gutter="30">
- <el-col :span="12">
- <el-form-item label="鐢宠浜猴細" prop="approveUser">
- <el-select
- v-model="form.approveUser"
- placeholder="閫夋嫨浜哄憳"
- >
- <el-option
- v-for="user in userList"
- :key="user.userId"
- :label="user.nickName"
- :value="user.userId"
- />
- </el-select>
- </el-form-item>
- </el-col>
- <el-col :span="12">
- <el-form-item label="鐢宠鏃ユ湡锛�" prop="approveTime">
- <el-date-picker
- v-model="form.approveTime"
- type="date"
- placeholder="璇烽�夋嫨鏃ユ湡"
- value-format="YYYY-MM-DD"
- format="YYYY-MM-DD"
- clearable
- style="width: 100%"
- />
- </el-form-item>
- </el-col>
- </el-row>
- <el-row :gutter="30">
- <el-col :span="24">
- <el-form-item label="闄勪欢鏉愭枡锛�" prop="remark">
- <el-upload v-model:file-list="fileList" :action="upload.url" multiple ref="fileUpload" auto-upload
- :headers="upload.headers" :before-upload="handleBeforeUpload" :on-error="handleUploadError"
- :on-success="handleUploadSuccess" :on-remove="handleRemove">
- <el-button type="primary" v-if="operationType !== 'view'">涓婁紶</el-button>
- <template #tip v-if="operationType !== 'view'">
- <div class="el-upload__tip">
- 鏂囦欢鏍煎紡鏀寔
- doc锛宒ocx锛寈ls锛寈lsx锛宲pt锛宲ptx锛宲df锛宼xt锛寈ml锛宩pg锛宩peg锛宲ng锛実if锛宐mp锛宺ar锛寊ip锛�7z
- </div>
- </template>
- </el-upload>
- </el-form-item>
- </el-col>
- </el-row>
- </el-form>
- <template #footer>
- <div class="dialog-footer">
- <el-button type="primary" @click="submitForm">纭</el-button>
- <el-button @click="closeDia">鍙栨秷</el-button>
- </div>
- </template>
- </el-dialog>
- </div>
-</template>
-
-<script setup>
-import {ref, reactive, toRefs, getCurrentInstance} from "vue";
-import {
- approveProcessAdd, approveProcessGetInfo,
- approveProcessUpdate,
- getDept
-} from "@/api/collaborativeApproval/approvalProcess.js";
-import {
- delLedgerFile,
-} from "@/api/salesManagement/salesLedger.js";
-import {userListNoPageByTenantId} from "@/api/system/user.js";
-import { getToken } from "@/utils/auth";
-const { proxy } = getCurrentInstance()
-const emit = defineEmits(['close'])
-import useUserStore from "@/store/modules/user";
-const userStore = useUserStore();
-
-const dialogFormVisible = ref(false);
-const operationType = ref('')
-const fileList = ref([]);
-const upload = reactive({
- // 涓婁紶鐨勫湴鍧�
- url: import.meta.env.VITE_APP_BASE_API + "/file/upload",
- // 璁剧疆涓婁紶鐨勮姹傚ご閮�
- headers: { Authorization: "Bearer " + getToken() },
-});
-const data = reactive({
- form: {
- approveTime: "",
- approveId: "",
- approveUser: "",
- approveDeptId: "",
- approveReason: "",
- checkResult: "",
- tempFileIds: [],
- approverList: [] // 鏂板瀛楁锛屽瓨鍌ㄦ墍鏈夎妭鐐圭殑瀹℃壒浜篿d
- },
- rules: {
- approveTime: [{ required: false, message: "璇疯緭鍏�", trigger: "change" },],
- approveId: [{ required: false, message: "璇疯緭鍏�", trigger: "blur" }],
- approveUser: [{ required: false, message: "璇疯緭鍏�", trigger: "blur" }],
- approveDeptId: [{ required: true, message: "璇疯緭鍏�", trigger: "blur" }],
- approveReason: [{ required: true, message: "璇疯緭鍏�", trigger: "blur" }],
- checkResult: [{ required: false, message: "璇疯緭鍏�", trigger: "blur" }],
- },
-});
-const { form, rules } = toRefs(data);
-const productOptions = ref([]);
-const currentApproveStatus = ref(0)
-const props = defineProps({
- approveType: {
- type: [Number, String],
- default: 0
- }
-})
-
-// 瀹℃壒浜鸿妭鐐圭浉鍏�
-const approverNodes = ref([
- { id: 1, userId: null }
-])
-let nextApproverId = 2
-const userList = ref([])
-function addApproverNode() {
- approverNodes.value.push({ id: nextApproverId++, userId: null })
-}
-function removeApproverNode(index) {
- approverNodes.value.splice(index, 1)
-}
-
-// 鎵撳紑寮规
-const openDialog = (type, row) => {
- console.log('openDialog', type, row)
- operationType.value = type;
- dialogFormVisible.value = true;
- userListNoPageByTenantId().then((res) => {
- userList.value = res.data;
- });
- getProductOptions();
- form.value = {}
- approverNodes.value = [
- { id: 1, userId: null }
- ]
- form.value.approveUser = userStore.id;
- form.value.approveTime = getCurrentDate();
-
- // 鑾峰彇褰撳墠鐢ㄦ埛淇℃伅骞惰缃儴闂↖D
- form.value.approveDeptId = userStore.currentDeptId
- if (operationType.value === 'edit') {
- fileList.value = row.commonFileList
- form.value.tempFileIds = fileList.value.map(file => file.id)
- currentApproveStatus.value = row.approveStatus
- approveProcessGetInfo({id: row.approveId,approveReason: '1'}).then(res => {
- form.value = {...res.data}
- // 鍙嶆樉瀹℃壒浜�
- if (res.data && res.data.approveUserIds) {
- const userIds = res.data.approveUserIds.split(',')
- approverNodes.value = userIds.map((userId, idx) => ({
- id: idx + 1,
- userId: parseInt(userId.trim())
- }))
- nextApproverId = userIds.length + 1
- } else {
- approverNodes.value = [{ id: 1, userId: null }]
- nextApproverId = 2
- }
- })
- }
-}
-const getProductOptions = () => {
- getDept().then((res) => {
- productOptions.value = res.data;
- });
-};
-function convertIdToValue(data) {
- return data.map((item) => {
- const { id, children, ...rest } = item;
- const newItem = {
- ...rest,
- value: id, // 灏� id 鏀逛负 value
- };
- if (children && children.length > 0) {
- newItem.children = convertIdToValue(children);
- }
-
- return newItem;
- });
-}
-// 鎻愪氦浜у搧琛ㄥ崟
-const submitForm = () => {
- // 鏀堕泦鎵�鏈夎妭鐐圭殑瀹℃壒浜篿d
- form.value.approveUserIds = approverNodes.value.map(node => node.userId).join(',')
- form.value.approveType = props.approveType
- // 瀹℃壒浜哄繀濉牎楠�
- const hasEmptyApprover = approverNodes.value.some(node => !node.userId)
- if (hasEmptyApprover) {
- proxy.$modal.msgError("璇蜂负鎵�鏈夊鎵硅妭鐐归�夋嫨瀹℃壒浜猴紒")
- return
- }
- proxy.$refs.formRef.validate(valid => {
- if (valid) {
- if (operationType.value === "add" || currentApproveStatus.value == 3) {
- approveProcessAdd(form.value).then(res => {
- proxy.$modal.msgSuccess("鎻愪氦鎴愬姛");
- closeDia();
- })
- } else {
- approveProcessUpdate(form.value).then(res => {
- proxy.$modal.msgSuccess("鎻愪氦鎴愬姛");
- closeDia();
- })
- }
- }
- })
-}
-// 鍏抽棴寮规
-const closeDia = () => {
- fileList.value = []
- proxy.resetForm("formRef");
- dialogFormVisible.value = false;
- emit('close')
-};
-// 鑾峰彇褰撳墠鏃ユ湡骞舵牸寮忓寲涓� YYYY-MM-DD
-function getCurrentDate() {
- const today = new Date();
- const year = today.getFullYear();
- const month = String(today.getMonth() + 1).padStart(2, "0"); // 鏈堜唤浠�0寮�濮�
- const day = String(today.getDate()).padStart(2, "0");
- return `${year}-${month}-${day}`;
-}
-
-// 涓婁紶鍓嶆牎妫�
-function handleBeforeUpload(file) {
- // 鏍℃鏂囦欢澶у皬
- // if (file.size > 1024 * 1024 * 10) {
- // proxy.$modal.msgError("涓婁紶鏂囦欢澶у皬涓嶈兘瓒呰繃10MB!");
- // return false;
- // }
- proxy.$modal.loading("姝e湪涓婁紶鏂囦欢锛岃绋嶅��...");
- return true;
-}
-// 涓婁紶澶辫触
-function handleUploadError(err) {
- proxy.$modal.msgError("涓婁紶鏂囦欢澶辫触");
- proxy.$modal.closeLoading();
-}
-// 涓婁紶鎴愬姛鍥炶皟
-function handleUploadSuccess(res, file, uploadFiles) {
- proxy.$modal.closeLoading();
- if (res.code === 200) {
- // 纭繚 tempFileIds 瀛樺湪涓斾负鏁扮粍
- if (!form.value.tempFileIds) {
- form.value.tempFileIds = [];
- }
- form.value.tempFileIds.push(res.data.tempId);
- proxy.$modal.msgSuccess("涓婁紶鎴愬姛");
- } else {
- proxy.$modal.msgError(res.msg);
- proxy.$refs.fileUpload.handleRemove(file);
- }
-}
-// 绉婚櫎鏂囦欢
-function handleRemove(file) {
- if (operationType.value === "edit") {
- let ids = [];
- ids.push(file.id);
- delLedgerFile(ids).then((res) => {
- proxy.$modal.msgSuccess("鍒犻櫎鎴愬姛");
- });
- }
-}
-
-defineExpose({
- openDialog,
-});
-</script>
-
-<style scoped>
-
-</style>
\ No newline at end of file
diff --git a/src/views/collaborativeApproval/approvalProcess/fileList.vue b/src/views/collaborativeApproval/approvalProcess/fileList.vue
deleted file mode 100644
index e9e3b87..0000000
--- a/src/views/collaborativeApproval/approvalProcess/fileList.vue
+++ /dev/null
@@ -1,43 +0,0 @@
-<template>
- <el-dialog v-model="dialogVisible" title="闄勪欢" width="40%" :before-close="handleClose">
- <el-table :data="tableData" border height="40vh" stripe>
- <el-table-column label="闄勪欢鍚嶇О" prop="name" min-width="400" show-overflow-tooltip />
- <el-table-column fixed="right" label="鎿嶄綔" width="100" align="center">
- <template #default="scope">
- <el-button link type="primary" size="small" @click="downLoadFile(scope.row)">涓嬭浇</el-button>
- <el-button link type="primary" size="small" @click="lookFile(scope.row)">棰勮</el-button>
- </template>
- </el-table-column>
- </el-table>
- </el-dialog>
- <filePreview ref="filePreviewRef" />
-</template>
-
-<script setup>
-import { ref } from 'vue'
-import filePreview from '@/components/filePreview/index.vue'
-
-const dialogVisible = ref(false)
-const tableData = ref([])
-const { proxy } = getCurrentInstance();
-const filePreviewRef = ref()
-const handleClose = () => {
- dialogVisible.value = false
-}
-const open = (list) => {
- dialogVisible.value = true
- tableData.value = list
-}
-const downLoadFile = (row) => {
- proxy.$download.name(row.url);
-
-}
-const lookFile = (row) => {
- filePreviewRef.value.open(row.url)
-}
-defineExpose({
- open
-})
-</script>
-
-<style></style>
\ No newline at end of file
diff --git a/src/views/collaborativeApproval/approvalProcess/index.vue b/src/views/collaborativeApproval/approvalProcess/index.vue
deleted file mode 100644
index c3b713e..0000000
--- a/src/views/collaborativeApproval/approvalProcess/index.vue
+++ /dev/null
@@ -1,272 +0,0 @@
-<template>
- <div class="app-container">
- <div class="search_form">
- <div>
- <span class="search_title">娴佺▼缂栧彿锛�</span>
- <el-input
- v-model="searchForm.approveId"
- style="width: 240px"
- placeholder="璇疯緭鍏ユ祦绋嬬紪鍙锋悳绱�"
- @change="handleQuery"
- clearable
- :prefix-icon="Search"
- />
- <span class="search_title ml10">瀹℃壒鐘舵�侊細</span>
- <el-select v-model="searchForm.approveStatus" clearable @change="handleQuery" style="width: 240px">
- <el-option label="寰呭鏍�" :value="0" />
- <el-option label="瀹℃牳涓�" :value="1" />
- <el-option label="瀹℃牳瀹屾垚" :value="2" />
- <el-option label="瀹℃牳鏈�氳繃" :value="3" />
- <el-option label="宸查噸鏂版彁浜�" :value="4" />
- </el-select>
- <el-button type="primary" @click="handleQuery" style="margin-left: 10px"
- >鎼滅储</el-button
- >
- </div>
- <div>
- <el-button type="primary" @click="openForm('add')">鏂板</el-button>
-<!-- <el-button @click="handleOut">瀵煎嚭</el-button>-->
- <el-button type="danger" plain @click="handleDelete">鍒犻櫎</el-button>
- </div>
- </div>
- <div class="table_list">
- <PIMTable
- rowKey="id"
- :column="tableColumn"
- :tableData="tableData"
- :page="page"
- :isSelection="true"
- @selection-change="handleSelectionChange"
- :tableLoading="tableLoading"
- @pagination="pagination"
- :total="page.total"
- ></PIMTable>
- </div>
- <info-form-dia ref="infoFormDia" @close="handleQuery" :approveType="approveType"></info-form-dia>
- <approval-dia ref="approvalDia" @close="handleQuery"></approval-dia>
- <FileList ref="fileListRef" />
- </div>
-</template>
-
-<script setup>
-import FileList from "./fileList.vue";
-import { Search } from "@element-plus/icons-vue";
-import {onMounted, ref} from "vue";
-import {ElMessageBox} from "element-plus";
-import InfoFormDia from "@/views/collaborativeApproval/approvalProcess/components/infoFormDia.vue";
-import ApprovalDia from "@/views/collaborativeApproval/approvalProcess/components/approvalDia.vue";
-import {approveProcessDelete, approveProcessListPage} from "@/api/collaborativeApproval/approvalProcess.js";
-import useUserStore from "@/store/modules/user";
-
-// 瀹氫箟缁勪欢鎺ユ敹鐨刾rops
-const props = defineProps({
- approveType: {
- type: [Number, String],
- default: 0
- }
-});
-
-const userStore = useUserStore();
-
-
-const data = reactive({
- searchForm: {
- approveId: "",
- approveStatus: "",
- },
-});
-const { searchForm } = toRefs(data);
-const tableColumn = ref([
- {
- label: "瀹℃壒鐘舵��",
- prop: "approveStatus",
- dataType: "tag",
- width: 100,
- formatData: (params) => {
- if (params == 0) {
- return "寰呭鏍�";
- } else if (params == 1) {
- return "瀹℃牳涓�";
- } else if (params == 2) {
- return "瀹℃牳瀹屾垚";
- } else if (params == 4) {
- return "宸查噸鏂版彁浜�";
- } else {
- return '涓嶉�氳繃';
- }
- },
- formatType: (params) => {
- if (params == 0) {
- return "warning";
- } else if (params == 1) {
- return "primary";
- } else if (params == 2) {
- return "success";
- } else if (params == 4) {
- return "";
- } else {
- return 'danger';
- }
- },
- },
- {
- label: "娴佺▼缂栧彿",
- prop: "approveId",
- width: 170
- },
- {
- label: "鐢宠閮ㄩ棬",
- prop: "approveDeptName",
- width: 220
- },
- {
- label: "瀹℃壒浜嬬敱",
- prop: "approveReason",
- width: 200
- },
- {
- label: "鐢宠浜�",
- prop: "approveUserName",
- width: 120
- },
- {
- label: "鐢宠鏃ユ湡",
- prop: "approveTime",
- width: 200
- },
- {
- label: "缁撴潫鏃ユ湡",
- prop: "approveOverTime",
- width: 120
- },
- {
- label: "褰撳墠瀹℃壒浜�",
- prop: "approveUserCurrentName",
- width: 120
- },
- {
- dataType: "action",
- label: "鎿嶄綔",
- align: "center",
- fixed: "right",
- width: 230,
- operation: [
- {
- name: "缂栬緫",
- type: "text",
- clickFun: (row) => {
- openForm("edit", row);
- },
- disabled: (row) => row.approveStatus == 2 || row.approveStatus == 1 || row.approveStatus == 4
- },
- {
- name: "瀹℃牳",
- type: "text",
- clickFun: (row) => {
- openApprovalDia("approval", row);
- },
- disabled: (row) => row.approveUserCurrentId == null || row.approveStatus == 2 || row.approveStatus == 3 || row.approveStatus == 4 || row.approveUserCurrentId !== userStore.id
- },
- {
- name: "璇︽儏",
- type: "text",
- clickFun: (row) => {
- openApprovalDia('view', row);
- },
- },
- {
- name: "闄勪欢",
- type: "text",
- clickFun: (row) => {
- downLoadFile(row);
- },
- },
- ],
- },
-]);
-const tableData = ref([]);
-const selectedRows = ref([]);
-const tableLoading = ref(false);
-const page = reactive({
- current: 1,
- size: 100,
- total: 0
-});
-const infoFormDia = ref()
-const approvalDia = ref()
-const { proxy } = getCurrentInstance()
-
-// 鏌ヨ鍒楄〃
-/** 鎼滅储鎸夐挳鎿嶄綔 */
-const handleQuery = () => {
- page.current = 1;
- getList();
-};
-const fileListRef = ref(null)
-const downLoadFile = (row) => {
- fileListRef.value.open(row.commonFileList)
-
-}
-const pagination = (obj) => {
- page.current = obj.page;
- page.size = obj.limit;
- getList();
-};
-const getList = () => {
- tableLoading.value = true;
- approveProcessListPage({...page, ...searchForm.value,approveType:props.approveType}).then(res => {
- tableLoading.value = false;
- tableData.value = res.data.records
- page.total = res.data.total;
- }).catch(err => {
- tableLoading.value = false;
- })
-};
-// 琛ㄦ牸閫夋嫨鏁版嵁
-const handleSelectionChange = (selection) => {
- selectedRows.value = selection;
-};
-
-// 鎵撳紑鏂板銆佺紪杈戝脊妗�
-const openForm = (type, row) => {
- nextTick(() => {
- infoFormDia.value?.openDialog(type, row)
- })
-};
-// 鎵撳紑鏂板妫�楠屽脊妗�
-const openApprovalDia = (type, row) => {
- nextTick(() => {
- approvalDia.value?.openDialog(type, row)
- })
-};
-
-// 鍒犻櫎
-const handleDelete = () => {
- let ids = [];
- if (selectedRows.value.length > 0) {
- ids = selectedRows.value.map((item) => item.approveId);
- } else {
- proxy.$modal.msgWarning("璇烽�夋嫨鏁版嵁");
- return;
- }
- ElMessageBox.confirm("閫変腑鐨勫唴瀹瑰皢琚垹闄わ紝鏄惁纭鍒犻櫎锛�", "瀵煎嚭", {
- confirmButtonText: "纭",
- cancelButtonText: "鍙栨秷",
- type: "warning",
- })
- .then(() => {
- approveProcessDelete(ids).then((res) => {
- proxy.$modal.msgSuccess("鍒犻櫎鎴愬姛");
- getList();
- });
- })
- .catch(() => {
- proxy.$modal.msg("宸插彇娑�");
- });
-};
-onMounted(() => {
- getList();
-});
-</script>
-
-<style scoped></style>
diff --git a/src/views/collaborativeApproval/approvalProcess/index1.vue b/src/views/collaborativeApproval/approvalProcess/index1.vue
deleted file mode 100644
index c46c68a..0000000
--- a/src/views/collaborativeApproval/approvalProcess/index1.vue
+++ /dev/null
@@ -1,22 +0,0 @@
-<template>
- <div class="container">
- <!-- 寮曞叆index.vue缁勪欢骞朵紶閫掑弬鏁� -->
- <ApprovalProcessIndex :approveType="1" />
- </div>
-</template>
-
-<script setup>
-import ApprovalProcessIndex from './index.vue'
-
-// 瀹氫箟缁勪欢鍚嶇О
-defineOptions({
- name: 'ApprovalProcessIndex1'
-})
-</script>
-
-<style scoped>
-.container {
- width: 100%;
- height: 100%;
-}
-</style>
diff --git a/src/views/collaborativeApproval/approvalProcess/index2.vue b/src/views/collaborativeApproval/approvalProcess/index2.vue
deleted file mode 100644
index 7c15c3e..0000000
--- a/src/views/collaborativeApproval/approvalProcess/index2.vue
+++ /dev/null
@@ -1,22 +0,0 @@
-<template>
- <div class="container">
- <!-- 寮曞叆index.vue缁勪欢骞朵紶閫掑弬鏁� -->
- <ApprovalProcessIndex :approveType="2" />
- </div>
-</template>
-
-<script setup>
-import ApprovalProcessIndex from './index.vue'
-
-// 瀹氫箟缁勪欢鍚嶇О
-defineOptions({
- name: 'ApprovalProcessIndex1'
-})
-</script>
-
-<style scoped>
-.container {
- width: 100%;
- height: 100%;
-}
-</style>
\ No newline at end of file
diff --git a/src/views/collaborativeApproval/approvalProcess/index3.vue b/src/views/collaborativeApproval/approvalProcess/index3.vue
deleted file mode 100644
index 3afb6f5..0000000
--- a/src/views/collaborativeApproval/approvalProcess/index3.vue
+++ /dev/null
@@ -1,22 +0,0 @@
-<template>
- <div class="container">
- <!-- 寮曞叆index.vue缁勪欢骞朵紶閫掑弬鏁� -->
- <ApprovalProcessIndex :approveType="3" />
- </div>
-</template>
-
-<script setup>
-import ApprovalProcessIndex from './index.vue'
-
-// 瀹氫箟缁勪欢鍚嶇О
-defineOptions({
- name: 'ApprovalProcessIndex1'
-})
-</script>
-
-<style scoped>
-.container {
- width: 100%;
- height: 100%;
-}
-</style>
\ No newline at end of file
diff --git a/src/views/collaborativeApproval/approvalProcess/index4.vue b/src/views/collaborativeApproval/approvalProcess/index4.vue
deleted file mode 100644
index 77236af..0000000
--- a/src/views/collaborativeApproval/approvalProcess/index4.vue
+++ /dev/null
@@ -1,22 +0,0 @@
-<template>
- <div class="container">
- <!-- 寮曞叆index.vue缁勪欢骞朵紶閫掑弬鏁� -->
- <ApprovalProcessIndex :approveType="4" />
- </div>
-</template>
-
-<script setup>
-import ApprovalProcessIndex from './index.vue'
-
-// 瀹氫箟缁勪欢鍚嶇О
-defineOptions({
- name: 'ApprovalProcessIndex1'
-})
-</script>
-
-<style scoped>
-.container {
- width: 100%;
- height: 100%;
-}
-</style>
\ No newline at end of file
diff --git a/src/views/collaborativeApproval/attendanceManagement/index.vue b/src/views/collaborativeApproval/attendanceManagement/index.vue
deleted file mode 100644
index 8db29fc..0000000
--- a/src/views/collaborativeApproval/attendanceManagement/index.vue
+++ /dev/null
@@ -1,714 +0,0 @@
-<template>
- <div class="app-container">
- <el-tabs v-model="activeTab" type="border-card">
- <!-- 鍋囨湡璁剧疆 -->
- <el-tab-pane label="鍋囨湡璁剧疆" name="holiday">
- <div class="tab-content">
- <el-button type="primary" @click="openDialog('holiday', 'add')">鏂板鍋囨湡</el-button>
-
- <el-table :data="holidayData" border style="width: 100%; margin-top: 20px;" stripe>
- <el-table-column prop="name" label="鍋囨湡鍚嶇О" />
- <el-table-column prop="type" label="鍋囨湡绫诲瀷">
- <template #default="scope">
- <el-tag :type="getTagType(scope.row.type)">{{ getTypeLabel(scope.row.type) }}</el-tag>
- </template>
- </el-table-column>
- <el-table-column prop="startDate" label="寮�濮嬫棩鏈�" />
- <el-table-column prop="endDate" label="缁撴潫鏃ユ湡" />
- <el-table-column prop="days" label="澶╂暟" align="center" />
- <el-table-column prop="status" label="鐘舵��" >
- <template #default="scope">
- <el-tag :type="scope.row.status === 'active' ? 'success' : 'info'">
- {{ scope.row.status === 'active' ? '鍚敤' : '鍋滅敤' }}
- </el-tag>
- </template>
- </el-table-column>
- <el-table-column label="鎿嶄綔" fixed="right">
- <template #default="scope">
- <el-button type="primary" size="small" @click="openDialog('holiday', 'edit', scope.row)">缂栬緫</el-button>
- <el-button type="danger" size="small" @click="deleteItem('holiday', scope.row)">鍒犻櫎</el-button>
- </template>
- </el-table-column>
- </el-table>
- </div>
- </el-tab-pane>
-
- <!-- 骞村亣璁剧疆 -->
- <el-tab-pane label="骞村亣璁剧疆" name="annual">
- <div class="tab-content">
- <el-button type="primary" @click="openDialog('annual', 'add')">鏂板骞村亣瑙勫垯</el-button>
-
- <el-table :data="annualData" border style="width: 100%; margin-top: 20px;" stripe>
- <el-table-column prop="employeeType" label="鍛樺伐绫诲瀷"/>
- <el-table-column prop="workYears" label="宸ヤ綔骞撮檺" />
- <el-table-column prop="annualDays" label="骞村亣澶╂暟" align="center" />
- <el-table-column prop="maxCarryOver" label="鏈�澶х粨杞ぉ鏁�" align="center" />
- <el-table-column prop="status" label="鐘舵��">
- <template #default="scope">
- <el-tag :type="scope.row.status === 'active' ? 'success' : 'info'">
- {{ scope.row.status === 'active' ? '鍚敤' : '鍋滅敤' }}
- </el-tag>
- </template>
- </el-table-column>
- <el-table-column label="鎿嶄綔" fixed="right">
- <template #default="scope">
- <el-button type="primary" size="small" @click="openDialog('annual', 'edit', scope.row)">缂栬緫</el-button>
- <el-button type="danger" size="small" @click="deleteItem('annual', scope.row)">鍒犻櫎</el-button>
- </template>
- </el-table-column>
- </el-table>
- </div>
- </el-tab-pane>
-
- <!-- 鍔犵彮璁剧疆 -->
- <el-tab-pane label="鍔犵彮璁剧疆" name="overtime">
- <div class="tab-content">
- <el-button type="primary" @click="openDialog('overtime', 'add')">鏂板鍔犵彮瑙勫垯</el-button>
-
- <el-table :data="overtimeData" border style="width: 100%; margin-top: 20px;" stripe>
- <el-table-column prop="name" label="瑙勫垯鍚嶇О" />
- <el-table-column prop="type" label="鍔犵彮绫诲瀷" >
- <template #default="scope">
- <el-tag :type="getTagType(scope.row.type)">{{ getTypeLabel(scope.row.type) }}</el-tag>
- </template>
- </el-table-column>
- <el-table-column prop="startTime" label="寮�濮嬫椂闂�" />
- <el-table-column prop="endTime" label="缁撴潫鏃堕棿" />
- <el-table-column prop="rate" label="鍊嶇巼" align="center" />
- <el-table-column prop="status" label="鐘舵��" >
- <template #default="scope">
- <el-tag :type="scope.row.status === 'active' ? 'success' : 'info'">
- {{ scope.row.status === 'active' ? '鍚敤' : '鍋滅敤' }}
- </el-tag>
- </template>
- </el-table-column>
- <el-table-column label="鎿嶄綔" fixed="right">
- <template #default="scope">
- <el-button type="primary" size="small" @click="openDialog('overtime', 'edit', scope.row)">缂栬緫</el-button>
- <el-button type="danger" size="small" @click="deleteItem('overtime', scope.row)">鍒犻櫎</el-button>
- </template>
- </el-table-column>
- </el-table>
- </div>
- </el-tab-pane>
-
- <!-- 涓婄彮鏃堕棿璁剧疆 -->
- <el-tab-pane label="涓婄彮鏃堕棿璁剧疆" name="worktime">
- <div class="tab-content">
- <el-button type="primary" @click="openDialog('worktime', 'add')">鏂板鏃堕棿娈�</el-button>
-
- <el-table :data="worktimeData" border style="width: 100%; margin-top: 20px;" stripe>
- <el-table-column prop="name" label="鏃堕棿娈靛悕绉�" />
- <el-table-column prop="startTime" label="涓婄彮鏃堕棿"/>
- <el-table-column prop="endTime" label="涓嬬彮鏃堕棿" />
- <el-table-column prop="flexibleStart" label="寮规�т笂鐝�">
- <template #default="scope">
- <el-tag :type="scope.row.flexibleStart ? 'success' : 'info'">
- {{ scope.row.flexibleStart ? '鏄�' : '鍚�' }}
- </el-tag>
- </template>
- </el-table-column>
- <el-table-column prop="flexibleMinutes" label="寮规�ф椂闂�(鍒嗛挓)" width="120" align="center" />
- <el-table-column prop="status" label="鐘舵��" >
- <template #default="scope">
- <el-tag :type="scope.row.status === 'active' ? 'success' : 'info'">
- {{ scope.row.status === 'active' ? '鍚敤' : '鍋滅敤' }}
- </el-tag>
- </template>
- </el-table-column>
- <el-table-column label="鎿嶄綔" fixed="right">
- <template #default="scope">
- <el-button type="primary" size="small" @click="openDialog('worktime', 'edit', scope.row)">缂栬緫</el-button>
- <el-button type="danger" size="small" @click="deleteItem('worktime', scope.row)">鍒犻櫎</el-button>
- </template>
- </el-table-column>
- </el-table>
- </div>
- </el-tab-pane>
- </el-tabs>
-
- <!-- 閫氱敤寮圭獥 -->
- <el-dialog v-model="dialogVisible" :title="dialogTitle" width="600px">
- <el-form ref="formRef" :model="form" :rules="rules" label-width="100px">
- <el-form-item label="鍚嶇О" prop="name" v-if="currentType !== 'annual'">
- <el-input v-model="form.name" placeholder="璇疯緭鍏ュ悕绉�" />
- </el-form-item>
-
- <el-form-item label="绫诲瀷" prop="type" v-if="currentType === 'holiday' || currentType === 'overtime'">
- <el-select v-model="form.type" placeholder="璇烽�夋嫨绫诲瀷" style="width: 100%">
- <el-option
- v-for="option in getTypeOptions()"
- :key="option.value"
- :label="option.label"
- :value="option.value"
- />
- </el-select>
- </el-form-item>
-
- <el-form-item label="鍛樺伐绫诲瀷" prop="employeeType" v-if="currentType === 'annual'">
- <el-select v-model="form.employeeType" placeholder="璇烽�夋嫨鍛樺伐绫诲瀷" style="width: 100%">
- <el-option label="姝e紡鍛樺伐" value="regular" />
- <el-option label="璇曠敤鏈熷憳宸�" value="probation" />
- <el-option label="瀹炰範鐢�" value="intern" />
- </el-select>
- </el-form-item>
-
- <el-form-item label="宸ヤ綔骞撮檺" prop="workYears" v-if="currentType === 'annual'">
- <el-input v-model="form.workYears" placeholder="濡傦細1-3骞淬��3-5骞寸瓑" />
- </el-form-item>
-
- <el-form-item label="骞村亣澶╂暟" prop="annualDays" v-if="currentType === 'annual'">
- <el-input-number v-model="form.annualDays" :min="0" :max="365" style="width: 100%" />
- </el-form-item>
-
- <el-form-item label="鏈�澶х粨杞ぉ鏁�" prop="maxCarryOver" v-if="currentType === 'annual'">
- <el-input-number v-model="form.maxCarryOver" :min="0" :max="30" style="width: 100%" />
- </el-form-item>
-
- <el-form-item label="鏃ユ湡鑼冨洿" prop="dateRange" v-if="currentType === 'holiday'">
- <el-date-picker
- v-model="form.dateRange"
- type="daterange"
- range-separator="鑷�"
- start-placeholder="寮�濮嬫棩鏈�"
- end-placeholder="缁撴潫鏃ユ湡"
- style="width: 100%"
- @change="calculateDays"
- />
- </el-form-item>
-
- <el-form-item label="澶╂暟" prop="days" v-if="currentType === 'holiday'">
- <el-input-number v-model="form.days" :min="0" style="width: 100%" />
- </el-form-item>
-
- <el-form-item label="寮�濮嬫椂闂�" prop="startTime" v-if="currentType === 'overtime'">
- <el-time-picker
- v-model="form.startTime"
- placeholder="寮�濮嬫椂闂�"
- format="HH:mm"
- value-format="HH:mm"
- style="width: 100%"
- @change="validateTimeField('startTime')"
- />
- </el-form-item>
-
- <el-form-item label="缁撴潫鏃堕棿" prop="endTime" v-if="currentType === 'overtime'">
- <el-time-picker
- v-model="form.endTime"
- placeholder="缁撴潫鏃堕棿"
- format="HH:mm"
- value-format="HH:mm"
- style="width: 100%"
- @change="validateTimeField('endTime')"
- />
- </el-form-item>
-
- <el-form-item label="鍊嶇巼" prop="rate" v-if="currentType === 'overtime'">
- <el-input-number v-model="form.rate" :min="1" :max="3" :step="0.5" style="width: 100%" />
- </el-form-item>
-
- <el-form-item label="涓婄彮鏃堕棿" prop="workStartTime" v-if="currentType === 'worktime'">
- <el-time-picker
- v-model="form.workStartTime"
- placeholder="涓婄彮鏃堕棿"
- format="HH:mm"
- value-format="HH:mm"
- style="width: 100%"
- @change="validateTimeField('workStartTime')"
- />
- </el-form-item>
-
- <el-form-item label="涓嬬彮鏃堕棿" prop="workEndTime" v-if="currentType === 'worktime'">
- <el-time-picker
- v-model="form.workEndTime"
- placeholder="涓嬬彮鏃堕棿"
- format="HH:mm"
- value-format="HH:mm"
- style="width: 100%"
- @change="validateTimeField('workEndTime')"
- />
- </el-form-item>
-
- <el-form-item label="寮规�т笂鐝�" prop="flexibleStart" v-if="currentType === 'worktime'">
- <el-switch v-model="form.flexibleStart" />
- </el-form-item>
-
- <el-form-item label="寮规�ф椂闂�(鍒嗛挓)" prop="flexibleMinutes" v-if="currentType === 'worktime' && form.flexibleStart">
- <el-input-number v-model="form.flexibleMinutes" :min="0" :max="120" style="width: 100%" />
- </el-form-item>
-
- <el-form-item label="鐘舵��" prop="status">
- <el-radio-group v-model="form.status">
- <el-radio value="active">鍚敤</el-radio>
- <el-radio value="inactive">鍋滅敤</el-radio>
- </el-radio-group>
- </el-form-item>
- </el-form>
-
- <template #footer>
- <span class="dialog-footer">
- <el-button @click="dialogVisible = false">鍙栨秷</el-button>
- <el-button type="primary" @click="submitForm">纭畾</el-button>
- </span>
- </template>
- </el-dialog>
- </div>
-</template>
-
-<script setup>
-import { ref, reactive, onMounted, onUnmounted } from 'vue'
-import { ElMessage, ElMessageBox } from 'element-plus'
-
-// 褰撳墠婵�娲荤殑鏍囩椤�
-const activeTab = ref('holiday')
-
-// 寮圭獥鐩稿叧
-const dialogVisible = ref(false)
-const dialogTitle = ref('')
-const currentType = ref('')
-const currentAction = ref('')
-const currentEditId = ref('')
-const formRef = ref()
-
-// 琛ㄥ崟鏁版嵁
-const form = reactive({
- name: '',
- type: '',
- dateRange: [],
- days: 0,
- employeeType: '',
- workYears: '',
- annualDays: 0,
- maxCarryOver: 0,
- startTime: '', // 鍔犵彮寮�濮嬫椂闂�
- endTime: '', // 鍔犵彮缁撴潫鏃堕棿
- workStartTime: '', // 涓婄彮鏃堕棿
- workEndTime: '', // 涓嬬彮鏃堕棿
- rate: 1.5,
- flexibleStart: false,
- flexibleMinutes: 30,
- status: 'active'
-})
-
-// 琛ㄥ崟楠岃瘉瑙勫垯
-const rules = {
- name: [{ required: true, message: '璇疯緭鍏ュ悕绉�', trigger: 'blur' }],
- type: [{ required: true, message: '璇烽�夋嫨绫诲瀷', trigger: 'change' }],
- dateRange: [{ required: true, message: '璇烽�夋嫨鏃ユ湡鑼冨洿', trigger: 'change' }],
- days: [{ required: true, message: '璇疯緭鍏ュぉ鏁�', trigger: 'blur' }],
- employeeType: [{ required: true, message: '璇烽�夋嫨鍛樺伐绫诲瀷', trigger: 'change' }],
- workYears: [{ required: true, message: '璇疯緭鍏ュ伐浣滃勾闄�', trigger: 'blur' }],
- annualDays: [{ required: true, message: '璇疯緭鍏ュ勾鍋囧ぉ鏁�', trigger: 'blur' }],
- maxCarryOver: [{ required: true, message: '璇疯緭鍏ユ渶澶х粨杞ぉ鏁�', trigger: 'blur' }],
- startTime: [{
- required: true,
- message: '璇烽�夋嫨寮�濮嬫椂闂�',
- trigger: 'change',
- validator: (rule, value, callback) => {
- if (!value) {
- callback(new Error('璇烽�夋嫨寮�濮嬫椂闂�'))
- } else {
- callback()
- }
- }
- }],
- endTime: [{
- required: true,
- message: '璇烽�夋嫨缁撴潫鏃堕棿',
- trigger: 'change',
- validator: (rule, value, callback) => {
- if (!value) {
- callback(new Error('璇烽�夋嫨缁撴潫鏃堕棿'))
- } else {
- callback()
- }
- }
- }],
- workStartTime: [{
- required: true,
- message: '璇烽�夋嫨涓婄彮鏃堕棿',
- trigger: 'change',
- validator: (rule, value, callback) => {
- if (!value) {
- callback(new Error('璇烽�夋嫨涓婄彮鏃堕棿'))
- } else {
- callback()
- }
- }
- }],
- workEndTime: [{
- required: true,
- message: '璇烽�夋嫨涓嬬彮鏃堕棿',
- trigger: 'change',
- validator: (rule, value, callback) => {
- if (!value) {
- callback(new Error('璇烽�夋嫨涓嬬彮鏃堕棿'))
- } else {
- callback()
- }
- }
- }],
- rate: [{ required: true, message: '璇疯緭鍏ュ�嶇巼', trigger: 'blur' }]
-}
-
-// 妯℃嫙鏁版嵁
-const holidayData = ref([
- { id: '1', name: '鏄ヨ妭', type: 'legal', startDate: '2024-02-10', endDate: '2024-02-17', days: 8, status: 'active' },
- { id: '2', name: '娓呮槑鑺�', type: 'legal', startDate: '2024-04-05', endDate: '2024-04-05', days: 1, status: 'active' },
- { id: '3', name: '鍔冲姩鑺�', type: 'legal', startDate: '2024-05-01', endDate: '2024-05-05', days: 5, status: 'active' }
-])
-
-const annualData = ref([
- { id: '1', employeeType: 'regular', workYears: '1-3骞�', annualDays: 5, maxCarryOver: 2, status: 'active' },
- { id: '2', employeeType: 'regular', workYears: '3-5骞�', annualDays: 10, maxCarryOver: 5, status: 'active' },
- { id: '3', employeeType: 'regular', workYears: '5骞翠互涓�', annualDays: 15, maxCarryOver: 10, status: 'active' }
-])
-
-const overtimeData = ref([
- { id: '1', name: '宸ヤ綔鏃ュ姞鐝�', type: 'weekday', startTime: '18:00', endTime: '22:00', rate: 1.5, status: 'active' },
- { id: '2', name: '鍛ㄦ湯鍔犵彮', type: 'weekend', startTime: '09:00', endTime: '18:00', rate: 2.0, status: 'active' },
- { id: '3', name: '娣卞鍔犵彮', type: 'night', startTime: '22:00', endTime: '06:00', rate: 2.5, status: 'active' }
-])
-
-const worktimeData = ref([
- { id: '1', name: '鏍囧噯宸ヤ綔鏃堕棿', startTime: '09:00', endTime: '18:00', flexibleStart: true, flexibleMinutes: 30, status: 'active' },
- { id: '2', name: '鏃╃彮鏃堕棿', startTime: '08:00', endTime: '17:00', flexibleStart: false, flexibleMinutes: 0, status: 'active' },
- { id: '3', name: '鏅氱彮鏃堕棿', startTime: '14:00', endTime: '23:00', flexibleStart: false, flexibleMinutes: 0, status: 'active' }
-])
-
-// 宸ュ叿鍑芥暟
-const getTagType = (type) => {
- const tagMap = {
- legal: 'success', adjustment: 'warning', special: 'info', company: 'primary',
- weekday: 'primary', weekend: 'warning', holiday: 'danger', night: 'info'
- }
- return tagMap[type] || 'info'
-}
-
-const getTypeLabel = (type) => {
- const labelMap = {
- legal: '娉曞畾鑺傚亣鏃�', adjustment: '璋冧紤鏃�', special: '鐗规畩鍋囨湡', company: '鍏徃鍋囨湡',
- weekday: '宸ヤ綔鏃ュ姞鐝�', weekend: '鍛ㄦ湯鍔犵彮', holiday: '鑺傚亣鏃ュ姞鐝�', night: '娣卞鍔犵彮'
- }
- return labelMap[type] || type
-}
-
-const getTypeOptions = () => {
- if (currentType.value === 'holiday') {
- return [
- { label: '娉曞畾鑺傚亣鏃�', value: 'legal' },
- { label: '璋冧紤鏃�', value: 'adjustment' },
- { label: '鐗规畩鍋囨湡', value: 'special' },
- { label: '鍏徃鍋囨湡', value: 'company' }
- ]
- } else if (currentType.value === 'overtime') {
- return [
- { label: '宸ヤ綔鏃ュ姞鐝�', value: 'weekday' },
- { label: '鍛ㄦ湯鍔犵彮', value: 'weekend' },
- { label: '鑺傚亣鏃ュ姞鐝�', value: 'holiday' },
- { label: '娣卞鍔犵彮', value: 'night' }
- ]
- }
- return []
-}
-
-// 璁$畻鍋囨湡澶╂暟
-const calculateDays = () => {
- try {
- if (form.dateRange && form.dateRange.length === 2 && form.dateRange[0] && form.dateRange[1]) {
- const start = new Date(form.dateRange[0])
- const end = new Date(form.dateRange[1])
-
- if (isNaN(start.getTime()) || isNaN(end.getTime())) {
- console.warn('鏃犳晥鐨勬棩鏈熸牸寮�')
- return
- }
-
- const diffTime = Math.abs(end - start)
- const diffDays = Math.ceil(diffTime / (1000 * 60 * 60 * 24)) + 1
- form.days = diffDays
- }
- } catch (error) {
- console.error('璁$畻澶╂暟澶辫触:', error)
- }
-}
-
-// 楠岃瘉鏃堕棿鏍煎紡
-const validateTime = (time) => {
- if (!time) return ''
- if (typeof time === 'string') return time
- if (time instanceof Date) {
- return time.toTimeString().slice(0, 5)
- }
- return ''
-}
-
-// 楠岃瘉鏃堕棿瀛楁
-const validateTimeField = (fieldName) => {
- try {
- const value = form[fieldName]
- if (value && typeof value === 'object' && value.hour !== undefined) {
- // 濡傛灉鏄椂闂村璞★紝杞崲涓哄瓧绗︿覆鏍煎紡
- const hours = value.hour.toString().padStart(2, '0')
- const minutes = value.minute.toString().padStart(2, '0')
- form[fieldName] = `${hours}:${minutes}`
- }
- } catch (error) {
- console.error(`楠岃瘉鏃堕棿瀛楁 ${fieldName} 澶辫触:`, error)
- form[fieldName] = ''
- }
-}
-
-// 鎵撳紑寮圭獥
-const openDialog = (type, action, row = null) => {
- try {
- currentType.value = type
- currentAction.value = action
-
- if (action === 'add') {
- dialogTitle.value = `鏂板${getTypeName(type)}`
- currentEditId.value = ''
- resetForm()
- } else if (action === 'edit' && row) {
- dialogTitle.value = `缂栬緫${getTypeName(type)}`
- currentEditId.value = row.id
- fillForm(row)
- }
-
- dialogVisible.value = true
- } catch (error) {
- console.error('鎵撳紑寮圭獥澶辫触:', error)
- ElMessage.error('鎵撳紑寮圭獥澶辫触锛岃閲嶈瘯')
- }
-}
-
-const getTypeName = (type) => {
- const nameMap = {
- holiday: '鍋囨湡',
- annual: '骞村亣瑙勫垯',
- overtime: '鍔犵彮瑙勫垯',
- worktime: '鏃堕棿娈�'
- }
- return nameMap[type] || ''
-}
-
-const resetForm = () => {
- Object.assign(form, {
- name: '',
- type: '',
- dateRange: [],
- days: 0,
- employeeType: '',
- workYears: '',
- annualDays: 0,
- maxCarryOver: 0,
- startTime: '',
- endTime: '',
- workStartTime: '',
- workEndTime: '',
- rate: 1.5,
- flexibleStart: false,
- flexibleMinutes: 30,
- status: 'active'
- })
-}
-
-const fillForm = (row) => {
- if (currentType.value === 'holiday') {
- Object.assign(form, {
- name: row.name,
- type: row.type,
- dateRange: [new Date(row.startDate), new Date(row.endDate)],
- days: row.days,
- status: row.status
- })
- } else if (currentType.value === 'annual') {
- Object.assign(form, {
- employeeType: row.employeeType,
- workYears: row.workYears,
- annualDays: row.annualDays,
- maxCarryOver: row.maxCarryOver,
- status: row.status
- })
- } else if (currentType.value === 'overtime') {
- Object.assign(form, {
- name: row.name,
- type: row.type,
- startTime: row.startTime || '',
- endTime: row.endTime || '',
- rate: row.rate,
- status: row.status
- })
- } else if (currentType.value === 'worktime') {
- Object.assign(form, {
- name: row.name,
- workStartTime: row.startTime || '',
- workEndTime: row.endTime || '',
- flexibleStart: row.flexibleStart,
- flexibleMinutes: row.flexibleMinutes,
- status: row.status
- })
- }
-}
-
-// 鎻愪氦琛ㄥ崟
-const submitForm = async () => {
- try {
- if (!formRef.value) {
- ElMessage.error('琛ㄥ崟寮曠敤涓嶅瓨鍦�')
- return
- }
-
- await formRef.value.validate()
-
- if (currentAction.value === 'add') {
- addItem()
- } else if (currentAction.value === 'edit') {
- editItem()
- }
-
- dialogVisible.value = false
- ElMessage.success('鎿嶄綔鎴愬姛')
- } catch (error) {
- console.error('琛ㄥ崟楠岃瘉澶辫触:', error)
- ElMessage.error('琛ㄥ崟楠岃瘉澶辫触锛岃妫�鏌ヨ緭鍏�')
- }
-}
-
-const addItem = () => {
- const newItem = { ...form, id: Date.now().toString() }
-
- if (currentType.value === 'holiday') {
- newItem.startDate = form.dateRange[0].toISOString().split('T')[0]
- newItem.endDate = form.dateRange[1].toISOString().split('T')[0]
- holidayData.value.push(newItem)
- } else if (currentType.value === 'annual') {
- annualData.value.push(newItem)
- } else if (currentType.value === 'overtime') {
- newItem.startTime = form.startTime || ''
- newItem.endTime = form.endTime || ''
- overtimeData.value.push(newItem)
- } else if (currentType.value === 'worktime') {
- newItem.startTime = form.workStartTime || ''
- newItem.endTime = form.workEndTime || ''
- worktimeData.value.push(newItem)
- }
-}
-
-const editItem = () => {
- let dataArray
- let index
-
- if (currentType.value === 'holiday') {
- dataArray = holidayData.value
- index = dataArray.findIndex(item => item.id === currentEditId.value)
- if (index > -1) {
- dataArray[index] = {
- ...dataArray[index],
- name: form.name,
- type: form.type,
- startDate: form.dateRange[0].toISOString().split('T')[0],
- endDate: form.dateRange[1].toISOString().split('T')[0],
- days: form.days,
- status: form.status
- }
- }
- } else if (currentType.value === 'annual') {
- dataArray = annualData.value
- index = dataArray.findIndex(item => item.id === currentEditId.value)
- if (index > -1) {
- dataArray[index] = {
- ...dataArray[index],
- employeeType: form.employeeType,
- workYears: form.workYears,
- annualDays: form.annualDays,
- maxCarryOver: form.maxCarryOver,
- status: form.status
- }
- }
- } else if (currentType.value === 'overtime') {
- dataArray = overtimeData.value
- index = dataArray.findIndex(item => item.id === currentEditId.value)
- if (index > -1) {
- dataArray[index] = {
- ...dataArray[index],
- name: form.name,
- type: form.type,
- startTime: form.startTime || '',
- endTime: form.endTime || '',
- rate: form.rate,
- status: form.status
- }
- }
- } else if (currentType.value === 'worktime') {
- dataArray = worktimeData.value
- index = dataArray.findIndex(item => item.id === currentEditId.value)
- if (index > -1) {
- dataArray[index] = {
- ...dataArray[index],
- name: form.name,
- startTime: form.workStartTime || '',
- endTime: form.workEndTime || '',
- flexibleStart: form.flexibleStart,
- flexibleMinutes: form.flexibleMinutes,
- status: form.status
- }
- }
- }
-}
-
-// 鍒犻櫎椤圭洰
-const deleteItem = (type, row) => {
- ElMessageBox.confirm('纭畾瑕佸垹闄よ繖涓」鐩悧锛�', '鎻愮ず', {
- confirmButtonText: '纭畾',
- cancelButtonText: '鍙栨秷',
- type: 'warning'
- }).then(() => {
- let dataArray
- if (type === 'holiday') dataArray = holidayData.value
- else if (type === 'annual') dataArray = annualData.value
- else if (type === 'overtime') dataArray = overtimeData.value
- else if (type === 'worktime') dataArray = worktimeData.value
-
- const index = dataArray.findIndex(item => item.id === row.id)
- if (index > -1) {
- dataArray.splice(index, 1)
- ElMessage.success('鍒犻櫎鎴愬姛')
- }
- })
-}
-
-onMounted(() => {
- console.log('鑰冨嫟绠$悊椤甸潰鍔犺浇瀹屾垚')
-})
-
-onUnmounted(() => {
- // 娓呯悊宸ヤ綔
- dialogVisible.value = false
- currentType.value = ''
- currentAction.value = ''
- currentEditId.value = ''
-})
-</script>
-
-<style scoped>
-.app-container {
- padding: 20px;
-}
-
-.tab-content {
- padding: 20px 0;
-}
-
-.dialog-footer {
- text-align: right;
-}
-
-:deep(.el-tabs__content) {
- padding: 20px;
-}
-
-:deep(.el-form-item) {
- margin-bottom: 20px;
-}
-</style>
diff --git a/src/views/collaborativeApproval/knowledgeBase/index.vue b/src/views/collaborativeApproval/knowledgeBase/index.vue
deleted file mode 100644
index f944859..0000000
--- a/src/views/collaborativeApproval/knowledgeBase/index.vue
+++ /dev/null
@@ -1,848 +0,0 @@
-<template>
- <div class="app-container">
- <div class="search_form">
- <div>
- <span class="search_title">鐭ヨ瘑鏍囬锛�</span>
- <el-input
- v-model="searchForm.title"
- style="width: 240px"
- placeholder="璇疯緭鍏ョ煡璇嗘爣棰樻悳绱�"
- @change="handleQuery"
- clearable
- :prefix-icon="Search"
- />
- <span class="search_title ml10">鐭ヨ瘑绫诲瀷锛�</span>
- <el-select v-model="searchForm.type" clearable @change="handleQuery" style="width: 240px">
- <el-option label="鍚堝悓鐗规壒" :value="'contract'" />
- <el-option label="瀹℃壒妗堜緥" :value="'approval'" />
- <el-option label="瑙e喅鏂规" :value="'solution'" />
- <el-option label="缁忛獙鎬荤粨" :value="'experience'" />
- <el-option label="鎿嶄綔鎸囧崡" :value="'guide'" />
- </el-select>
- <el-button type="primary" @click="handleQuery" style="margin-left: 10px">
- 鎼滅储
- </el-button>
- </div>
- <div>
- <el-button type="primary" @click="openForm('add')">鏂板鐭ヨ瘑</el-button>
- <el-button type="danger" plain @click="handleDelete">鍒犻櫎</el-button>
- </div>
- </div>
-
- <div class="table_list">
- <PIMTable
- rowKey="id"
- :column="tableColumn"
- :tableData="tableData"
- :page="page"
- :isSelection="true"
- @selection-change="handleSelectionChange"
- :tableLoading="tableLoading"
- @pagination="pagination"
- :total="page.total"
- ></PIMTable>
- </div>
-
- <!-- 鏂板/缂栬緫鐭ヨ瘑寮圭獥 -->
- <el-dialog
- v-model="dialogVisible"
- :title="dialogTitle"
- width="800px"
- :close-on-click-modal="false"
- >
- <el-form ref="formRef" :model="form" :rules="rules" label-width="120px">
- <el-row :gutter="20">
- <el-col :span="12">
- <el-form-item label="鐭ヨ瘑鏍囬" prop="title">
- <el-input v-model="form.title" placeholder="璇疯緭鍏ョ煡璇嗘爣棰�" />
- </el-form-item>
- </el-col>
- <el-col :span="12">
- <el-form-item label="鐭ヨ瘑绫诲瀷" prop="type">
- <el-select v-model="form.type" placeholder="璇烽�夋嫨鐭ヨ瘑绫诲瀷" style="width: 100%">
- <el-option label="鍚堝悓鐗规壒" value="contract" />
- <el-option label="瀹℃壒妗堜緥" value="approval" />
- <el-option label="瑙e喅鏂规" value="solution" />
- <el-option label="缁忛獙鎬荤粨" value="experience" />
- <el-option label="鎿嶄綔鎸囧崡" value="guide" />
- </el-select>
- </el-form-item>
- </el-col>
- </el-row>
- <el-row :gutter="20">
- <el-col :span="12">
- <el-form-item label="閫傜敤鍦烘櫙" prop="scenario">
- <el-input v-model="form.scenario" placeholder="璇疯緭鍏ラ�傜敤鍦烘櫙" />
- </el-form-item>
- </el-col>
- <el-col :span="12">
- <el-form-item label="瑙e喅鏁堢巼" prop="efficiency">
- <el-select v-model="form.efficiency" placeholder="璇烽�夋嫨瑙e喅鏁堢巼" style="width: 100%">
- <el-option label="鏄捐憲鎻愬崌" value="high" />
- <el-option label="涓�鑸彁鍗�" value="medium" />
- <el-option label="杞诲井鎻愬崌" value="low" />
- </el-select>
- </el-form-item>
- </el-col>
- </el-row>
- <el-form-item label="闂鎻忚堪" prop="problem">
- <el-input
- v-model="form.problem"
- type="textarea"
- :rows="3"
- placeholder="璇锋弿杩伴亣鍒扮殑闂"
- />
- </el-form-item>
- <el-form-item label="瑙e喅鏂规" prop="solution">
- <el-input
- v-model="form.solution"
- type="textarea"
- :rows="4"
- placeholder="璇疯缁嗘弿杩拌В鍐虫柟妗�"
- />
- </el-form-item>
- <el-form-item label="鍏抽敭瑕佺偣" prop="keyPoints">
- <el-input
- v-model="form.keyPoints"
- type="textarea"
- :rows="3"
- placeholder="璇疯緭鍏ュ叧閿鐐癸紝鐢ㄩ�楀彿鍒嗛殧"
- />
- </el-form-item>
- <el-row :gutter="20">
- <el-col :span="12">
- <el-form-item label="鍒涘缓浜�" prop="creator">
- <el-input v-model="form.creator" placeholder="璇疯緭鍏ュ垱寤轰汉" />
- </el-form-item>
- </el-col>
- <el-col :span="12">
- <el-form-item label="浣跨敤娆℃暟" prop="usageCount">
- <el-input-number v-model="form.usageCount" :min="0" style="width: 100%" />
- </el-form-item>
- </el-col>
- </el-row>
- </el-form>
- <template #footer>
- <span class="dialog-footer">
- <el-button @click="dialogVisible = false">鍙栨秷</el-button>
- <el-button type="primary" @click="submitForm">纭畾</el-button>
- </span>
- </template>
- </el-dialog>
-
- <!-- 鏌ョ湅鐭ヨ瘑璇︽儏寮圭獥 -->
- <el-dialog
- v-model="viewDialogVisible"
- title="鐭ヨ瘑璇︽儏"
- width="900px"
- :close-on-click-modal="false"
- >
- <div class="knowledge-detail">
- <el-descriptions :column="2" border>
- <el-descriptions-item label="鐭ヨ瘑鏍囬" :span="2">
- <span class="detail-title">{{ currentKnowledge.title }}</span>
- </el-descriptions-item>
- <el-descriptions-item label="鐭ヨ瘑绫诲瀷">
- <el-tag :type="getTypeTagType(currentKnowledge.type)">
- {{ getTypeLabel(currentKnowledge.type) }}
- </el-tag>
- </el-descriptions-item>
- <el-descriptions-item label="閫傜敤鍦烘櫙">
- {{ currentKnowledge.scenario }}
- </el-descriptions-item>
- <el-descriptions-item label="瑙e喅鏁堢巼">
- <el-tag :type="getEfficiencyTagType(currentKnowledge.efficiency)">
- {{ getEfficiencyLabel(currentKnowledge.efficiency) }}
- </el-tag>
- </el-descriptions-item>
- <el-descriptions-item label="浣跨敤娆℃暟">
- <el-tag type="info">{{ currentKnowledge.usageCount }} 娆�</el-tag>
- </el-descriptions-item>
- <el-descriptions-item label="鍒涘缓浜�">
- {{ currentKnowledge.creator }}
- </el-descriptions-item>
- <el-descriptions-item label="鍒涘缓鏃堕棿">
- {{ currentKnowledge.createTime }}
- </el-descriptions-item>
- </el-descriptions>
-
- <div class="detail-section">
- <h4>闂鎻忚堪</h4>
- <div class="detail-content">{{ currentKnowledge.problem }}</div>
- </div>
-
- <div class="detail-section">
- <h4>瑙e喅鏂规</h4>
- <div class="detail-content">{{ currentKnowledge.solution }}</div>
- </div>
-
- <div class="detail-section">
- <h4>鍏抽敭瑕佺偣</h4>
- <div class="key-points">
- <el-tag
- v-for="(point, index) in currentKnowledge.keyPoints.split(',')"
- :key="index"
- type="success"
- style="margin-right: 8px; margin-bottom: 8px;"
- >
- {{ point.trim() }}
- </el-tag>
- </div>
- </div>
-
- <div class="detail-section">
- <h4>浣跨敤缁熻</h4>
- <div class="usage-stats">
- <el-row :gutter="20">
- <el-col :span="8">
- <div class="stat-item">
- <div class="stat-number">{{ currentKnowledge.usageCount }}</div>
- <div class="stat-label">浣跨敤娆℃暟</div>
- </div>
- </el-col>
- <el-col :span="8">
- <div class="stat-item">
- <div class="stat-number">{{ getEfficiencyScore(currentKnowledge.efficiency) }}%</div>
- <div class="stat-label">鏁堢巼鎻愬崌</div>
- </div>
- </el-col>
- <el-col :span="8">
- <div class="stat-item">
- <div class="stat-number">{{ getTimeSaved(currentKnowledge.efficiency) }}</div>
- <div class="stat-label">骞冲潎鑺傜渷鏃堕棿</div>
- </div>
- </el-col>
- </el-row>
- </div>
- </div>
- </div>
-
- <template #footer>
- <span class="dialog-footer">
- <el-button @click="viewDialogVisible = false">鍏抽棴</el-button>
- <el-button type="primary" @click="copyKnowledge">澶嶅埗鐭ヨ瘑</el-button>
- <el-button type="success" @click="markAsFavorite">鏀惰棌</el-button>
- </span>
- </template>
- </el-dialog>
- </div>
-</template>
-
-<script setup>
-import { Search } from "@element-plus/icons-vue";
-import { onMounted, ref, reactive, toRefs } from "vue";
-import { ElMessage, ElMessageBox } from "element-plus";
-import PIMTable from "@/components/PIMTable/PIMTable.vue";
-
-// 琛ㄥ崟楠岃瘉瑙勫垯
-const rules = {
- title: [
- { required: true, message: "璇疯緭鍏ョ煡璇嗘爣棰�", trigger: "blur" }
- ],
- type: [
- { required: true, message: "璇烽�夋嫨鐭ヨ瘑绫诲瀷", trigger: "change" }
- ],
- problem: [
- { required: true, message: "璇锋弿杩伴亣鍒扮殑闂", trigger: "blur" }
- ],
- solution: [
- { required: true, message: "璇疯缁嗘弿杩拌В鍐虫柟妗�", trigger: "blur" }
- ]
-};
-
-// 鍝嶅簲寮忔暟鎹�
-const data = reactive({
- searchForm: {
- title: "",
- type: "",
- },
- tableLoading: false,
- page: {
- current: 1,
- size: 100,
- total: 0,
- },
- tableData: [],
- selectedIds: [],
- form: {
- title: "",
- type: "",
- scenario: "",
- efficiency: "medium",
- problem: "",
- solution: "",
- keyPoints: "",
- creator: "",
- usageCount: 0
- },
- dialogVisible: false,
- dialogTitle: "",
- dialogType: "add",
- viewDialogVisible: false,
- currentKnowledge: {}
-});
-
-const {
- searchForm,
- tableLoading,
- page,
- tableData,
- selectedIds,
- form,
- dialogVisible,
- dialogTitle,
- dialogType,
- viewDialogVisible,
- currentKnowledge
-} = toRefs(data);
-
-// 琛ㄥ崟寮曠敤
-const formRef = ref();
-
-// 琛ㄦ牸鍒楅厤缃�
-const tableColumn = ref([
- {
- label: "鐭ヨ瘑鏍囬",
- prop: "title",
- showOverflowTooltip: true,
- },
- {
- label: "鐭ヨ瘑绫诲瀷",
- prop: "type",
- dataType: "tag",
- formatData: (params) => {
- const typeMap = {
- contract: "鍚堝悓鐗规壒",
- approval: "瀹℃壒妗堜緥",
- solution: "瑙e喅鏂规",
- experience: "缁忛獙鎬荤粨",
- guide: "鎿嶄綔鎸囧崡"
- };
- return typeMap[params] || params;
- },
- formatType: (params) => {
- const typeMap = {
- contract: "success",
- approval: "warning",
- solution: "primary",
- experience: "info",
- guide: "danger"
- };
- return typeMap[params] || "info";
- }
- },
- {
- label: "閫傜敤鍦烘櫙",
- prop: "scenario",
- width: 150,
- showOverflowTooltip: true,
- },
- {
- label: "瑙e喅鏁堢巼",
- prop: "efficiency",
- dataType: "tag",
- formatData: (params) => {
- const efficiencyMap = {
- high: "鏄捐憲鎻愬崌",
- medium: "涓�鑸彁鍗�",
- low: "杞诲井鎻愬崌"
- };
- return efficiencyMap[params] || params;
- },
- formatType: (params) => {
- const typeMap = {
- high: "success",
- medium: "warning",
- low: "info"
- };
- return typeMap[params] || "info";
- }
- },
- {
- label: "浣跨敤娆℃暟",
- prop: "usageCount",
- width: 100,
- align: "center"
- },
- {
- label: "鍒涘缓浜�",
- prop: "creator",
- width: 120,
- },
- {
- label: "鍒涘缓鏃堕棿",
- prop: "createTime",
- width: 180,
- },
- {
- dataType: "action",
- label: "鎿嶄綔",
- align: "center",
- fixed: "right",
- width: 200,
- operation: [
- {
- name: "缂栬緫",
- type: "text",
- clickFun: (row) => {
- openForm("edit", row);
- }
- },
- {
- name: "鏌ョ湅",
- type: "text",
- clickFun: (row) => {
- viewKnowledge(row);
- }
- }
- ]
- }
-]);
-
-// 妯℃嫙鏁版嵁
-let mockData = [
- {
- id: "1",
- title: "鐗规畩鍚堝悓瀹℃壒娴佺▼浼樺寲鏂规",
- type: "contract",
- scenario: "澶ч鍚堝悓蹇�熷鎵�",
- efficiency: "high",
- problem: "澶ч鍚堝悓瀹℃壒娴佺▼澶嶆潅锛屽鎵规椂闂撮暱锛屽奖鍝嶄笟鍔¤繘灞�",
- solution: "寤虹珛缁胯壊閫氶亾锛屽绗﹀悎鏉′欢鐨勫悎鍚岄噰鐢ㄧ畝鍖栧鎵规祦绋嬶紝鐢遍儴闂ㄨ礋璐d汉鐩存帴瀹℃壒锛屽钩鍧囧鎵规椂闂翠粠3澶╃缉鐭嚦1澶�",
- keyPoints: "缁胯壊閫氶亾鏉′欢,绠�鍖栨祦绋�,瀹℃壒鏉冮檺,鏃堕棿鎺у埗",
- creator: "寮犵粡鐞�",
- usageCount: 15,
- createTime: "2024-01-15 10:30:00"
- },
- {
- id: "2",
- title: "璺ㄩ儴闂ㄥ崗浣滃鎵圭粡楠屾�荤粨",
- type: "experience",
- scenario: "澶氶儴闂ㄥ崗浣滈」鐩�",
- efficiency: "medium",
- problem: "璺ㄩ儴闂ㄩ」鐩鎵规椂锛屽悇閮ㄩ棬鎰忚涓嶇粺涓�锛屽鎵硅繘搴︾紦鎱�",
- solution: "寤虹珛椤圭洰鍗忚皟鏈哄埗锛屾寚瀹氶」鐩礋璐d汉锛屽畾鏈熷彫寮�鍗忚皟浼氳锛岀粺涓�鍚勬柟鎰忚鍚庡啀杩涜瀹℃壒",
- keyPoints: "椤圭洰鍗忚皟,瀹氭湡浼氳,缁熶竴鎰忚,璐熻矗浜哄埗搴�",
- creator: "鏉庝富绠�",
- usageCount: 8,
- createTime: "2024-01-14 15:20:00"
- },
- {
- id: "3",
- title: "绱ф�ラ噰璐鎵规搷浣滄寚鍗�",
- type: "guide",
- scenario: "绱ф�ラ噰璐渶姹�",
- efficiency: "high",
- problem: "绱ф�ラ噰璐椂瀹℃壒娴佺▼澶嶆潅锛屾棤娉曟弧瓒崇揣鎬ラ渶姹�",
- solution: "鍒跺畾绱ф�ラ噰璐鎵规爣鍑嗭紝鏄庣‘绱ф�ョ▼搴﹀垎绾э紝涓嶅悓绾у埆閲囩敤涓嶅悓瀹℃壒娴佺▼锛岀‘淇濈揣鎬ラ渶姹傚緱鍒板強鏃跺鐞�",
- keyPoints: "绱ф�ュ垎绾�,鏍囧噯鍒跺畾,娴佺▼绠�鍖�,鍙婃椂澶勭悊",
- creator: "鐜嬩笓鍛�",
- usageCount: 12,
- createTime: "2024-01-13 09:15:00"
- }
-];
-
-// 鐭ヨ瘑鏍囬妯℃澘
-const titleTemplates = [
- "{type}瀹℃壒娴佺▼浼樺寲鏂规",
- "{scenario}澶勭悊缁忛獙鎬荤粨",
- "{type}鐗规畩鎯呭喌澶勭悊鎸囧崡",
- "{scenario}蹇�熷鎵规柟妗�",
- "{type}鏍囧噯鍖栨搷浣滄祦绋�",
- "{scenario}闂瑙e喅鏂规",
- "{type}鏈�浣冲疄璺垫�荤粨",
- "{scenario}鏁堢巼鎻愬崌鏂规"
-];
-
-// 鐭ヨ瘑绫诲瀷閰嶇疆
-const knowledgeTypes = [
- { type: "contract", label: "鍚堝悓鐗规壒", efficiency: "high" },
- { type: "approval", label: "瀹℃壒妗堜緥", efficiency: "medium" },
- { type: "solution", label: "瑙e喅鏂规", efficiency: "high" },
- { type: "experience", label: "缁忛獙鎬荤粨", efficiency: "medium" },
- { type: "guide", label: "鎿嶄綔鎸囧崡", efficiency: "low" }
-];
-
-// 鍦烘櫙鍒楄〃
-const scenarios = ["澶ч鍚堝悓瀹℃壒", "璺ㄩ儴闂ㄥ崗浣�", "绱ф�ラ噰璐�", "鐗规畩鐢宠", "娴佺▼浼樺寲", "闂澶勭悊", "鏍囧噯鍖栧缓璁�", "鏁堢巼鎻愬崌"];
-
-// 鑷姩鐢熸垚鏂版暟鎹�
-const generateNewData = () => {
- const newId = (mockData.length + 1).toString();
- const now = new Date();
- const randomType = knowledgeTypes[Math.floor(Math.random() * knowledgeTypes.length)];
- const randomScenario = scenarios[Math.floor(Math.random() * scenarios.length)];
-
- // 鐢熸垚闅忔満鏍囬
- let title = titleTemplates[Math.floor(Math.random() * titleTemplates.length)];
- title = title
- .replace('{type}', randomType.label)
- .replace('{scenario}', randomScenario);
-
- const newKnowledge = {
- id: newId,
- title: title,
- type: randomType.type,
- scenario: randomScenario,
- efficiency: randomType.efficiency,
- problem: `鍦�${randomScenario}杩囩▼涓亣鍒扮殑闂鎻忚堪...`,
- solution: `閽堝${randomScenario}鐨勮В鍐虫柟妗堝拰鎿嶄綔姝ラ...`,
- keyPoints: "鍏抽敭瑕佺偣1,鍏抽敭瑕佺偣2,鍏抽敭瑕佺偣3,鍏抽敭瑕佺偣4",
- creator: ["寮犵粡鐞�", "鏉庝富绠�", "鐜嬩笓鍛�", "鍒樻�荤洃"][Math.floor(Math.random() * 4)],
- usageCount: Math.floor(Math.random() * 20) + 1,
- createTime: now.toLocaleString()
- };
-
- // 娣诲姞鍒版暟鎹紑澶�
- mockData.unshift(newKnowledge);
-
- // 淇濇寔鏁版嵁閲忓湪鍚堢悊鑼冨洿鍐咃紙鏈�澶氫繚鐣�30鏉★級
- if (mockData.length > 30) {
- mockData = mockData.slice(0, 30);
- }
-
- console.log(`[${new Date().toLocaleString()}] 鑷姩鐢熸垚鏂扮煡璇�: ${title}`);
-};
-
-// 鐢熷懡鍛ㄦ湡
-onMounted(() => {
- getList();
- startAutoRefresh();
-});
-
-// 寮�濮嬭嚜鍔ㄥ埛鏂�
-const startAutoRefresh = () => {
- setInterval(() => {
- generateNewData();
- getList();
- }, 600000); // 10鍒嗛挓鍒锋柊涓�娆� (10 * 60 * 1000 = 600000ms)
-};
-
-// 鏌ヨ鏁版嵁
-const handleQuery = () => {
- page.value.current = 1;
- getList();
-};
-
-const getList = () => {
- tableLoading.value = true;
-
- setTimeout(() => {
- let filteredData = [...mockData];
-
- if (searchForm.value.title) {
- filteredData = filteredData.filter(item =>
- item.title.toLowerCase().includes(searchForm.value.title.toLowerCase())
- );
- }
-
- if (searchForm.value.type) {
- filteredData = filteredData.filter(item => item.type === searchForm.value.type);
- }
-
- tableData.value = filteredData;
- page.value.total = filteredData.length;
- tableLoading.value = false;
- }, 500);
-};
-
-// 鍒嗛〉澶勭悊
-const pagination = (obj) => {
- page.value.current = obj.page;
- page.value.size = obj.limit;
- handleQuery();
-};
-
-// 閫夋嫨鍙樺寲澶勭悊
-const handleSelectionChange = (selection) => {
- selectedIds.value = selection.map(item => item.id);
-};
-
-// 鎵撳紑琛ㄥ崟
-const openForm = (type, row = null) => {
- dialogType.value = type;
- if (type === "add") {
- dialogTitle.value = "鏂板鐭ヨ瘑";
- // 閲嶇疆琛ㄥ崟
- Object.assign(form.value, {
- title: "",
- type: "",
- scenario: "",
- efficiency: "medium",
- problem: "",
- solution: "",
- keyPoints: "",
- creator: "",
- usageCount: 0
- });
- } else if (type === "edit" && row) {
- dialogTitle.value = "缂栬緫鐭ヨ瘑";
- Object.assign(form.value, {
- title: row.title,
- type: row.type,
- scenario: row.scenario,
- efficiency: row.efficiency,
- problem: row.problem,
- solution: row.solution,
- keyPoints: row.keyPoints,
- creator: row.creator,
- usageCount: row.usageCount
- });
- }
- dialogVisible.value = true;
-};
-
-// 鏌ョ湅鐭ヨ瘑璇︽儏
-const viewKnowledge = (row) => {
- currentKnowledge.value = { ...row };
- viewDialogVisible.value = true;
-};
-
-// 鑾峰彇绫诲瀷鏍囩绫诲瀷
-const getTypeTagType = (type) => {
- const typeMap = {
- contract: "success",
- approval: "warning",
- solution: "primary",
- experience: "info",
- guide: "danger"
- };
- return typeMap[type] || "info";
-};
-
-// 鑾峰彇绫诲瀷鏍囩鏂囨湰
-const getTypeLabel = (type) => {
- const typeMap = {
- contract: "鍚堝悓鐗规壒",
- approval: "瀹℃壒妗堜緥",
- solution: "瑙e喅鏂规",
- experience: "缁忛獙鎬荤粨",
- guide: "鎿嶄綔鎸囧崡"
- };
- return typeMap[type] || type;
-};
-
-// 鑾峰彇鏁堢巼鏍囩绫诲瀷
-const getEfficiencyTagType = (efficiency) => {
- const typeMap = {
- high: "success",
- medium: "warning",
- low: "info"
- };
- return typeMap[efficiency] || "info";
-};
-
-// 鑾峰彇鏁堢巼鏍囩鏂囨湰
-const getEfficiencyLabel = (efficiency) => {
- const efficiencyMap = {
- high: "鏄捐憲鎻愬崌",
- medium: "涓�鑸彁鍗�",
- low: "杞诲井鎻愬崌"
- };
- return efficiencyMap[efficiency] || efficiency;
-};
-
-// 鑾峰彇鏁堢巼鎻愬崌鐧惧垎姣�
-const getEfficiencyScore = (efficiency) => {
- const scoreMap = {
- high: 40,
- medium: 25,
- low: 15
- };
- return scoreMap[efficiency] || 0;
-};
-
-// 鑾峰彇骞冲潎鑺傜渷鏃堕棿
-const getTimeSaved = (efficiency) => {
- const timeMap = {
- high: "2-3澶�",
- medium: "1-2澶�",
- low: "0.5-1澶�"
- };
- return timeMap[efficiency] || "鏈煡";
-};
-
-// 澶嶅埗鐭ヨ瘑
-const copyKnowledge = () => {
- const knowledgeText = `
-鐭ヨ瘑鏍囬锛�${currentKnowledge.value.title}
-鐭ヨ瘑绫诲瀷锛�${getTypeLabel(currentKnowledge.value.type)}
-閫傜敤鍦烘櫙锛�${currentKnowledge.value.scenario}
-闂鎻忚堪锛�${currentKnowledge.value.problem}
-瑙e喅鏂规锛�${currentKnowledge.value.solution}
-鍏抽敭瑕佺偣锛�${currentKnowledge.value.keyPoints}
-鍒涘缓浜猴細${currentKnowledge.value.creator}
- `.trim();
-
- // 澶嶅埗鍒板壀璐存澘
- navigator.clipboard.writeText(knowledgeText).then(() => {
- ElMessage.success("鐭ヨ瘑鍐呭宸插鍒跺埌鍓创鏉�");
- }).catch(() => {
- ElMessage.error("澶嶅埗澶辫触锛岃鎵嬪姩澶嶅埗");
- });
-};
-
-// 鏀惰棌鐭ヨ瘑
-const markAsFavorite = () => {
- // 澧炲姞浣跨敤娆℃暟
- const index = mockData.findIndex(item => item.id === currentKnowledge.value.id);
- if (index !== -1) {
- mockData[index].usageCount += 1;
- currentKnowledge.value.usageCount += 1;
- }
-
- ElMessage.success("宸叉敹钘忥紝浣跨敤娆℃暟+1");
-};
-
-// 鎻愪氦鐭ヨ瘑琛ㄥ崟
-const submitForm = async () => {
- try {
- await formRef.value.validate();
-
- if (dialogType.value === "add") {
- // 鏂板鐭ヨ瘑
- const newKnowledge = {
- id: (mockData.length + 1).toString(),
- title: form.value.title,
- type: form.value.type,
- scenario: form.value.scenario,
- efficiency: form.value.efficiency,
- problem: form.value.problem,
- solution: form.value.solution,
- keyPoints: form.value.keyPoints,
- creator: form.value.creator,
- usageCount: form.value.usageCount,
- createTime: new Date().toLocaleString()
- };
-
- mockData.unshift(newKnowledge);
- ElMessage.success("鐭ヨ瘑鍒涘缓鎴愬姛");
- } else {
- // 缂栬緫鐭ヨ瘑
- const index = mockData.findIndex(item => item.id === selectedIds.value[0]);
- if (index !== -1) {
- Object.assign(mockData[index], {
- title: form.value.title,
- type: form.value.type,
- scenario: form.value.scenario,
- efficiency: form.value.efficiency,
- problem: form.value.problem,
- solution: form.value.solution,
- keyPoints: form.value.keyPoints,
- creator: form.value.creator,
- usageCount: form.value.usageCount
- });
- ElMessage.success("鐭ヨ瘑鏇存柊鎴愬姛");
- }
- }
-
- dialogVisible.value = false;
- getList();
- } catch (error) {
- console.error("琛ㄥ崟楠岃瘉澶辫触:", error);
- }
-};
-
-// 鍒犻櫎鐭ヨ瘑
-const handleDelete = () => {
- if (selectedIds.value.length === 0) {
- ElMessage.warning("璇烽�夋嫨瑕佸垹闄ょ殑鐭ヨ瘑");
- return;
- }
-
- ElMessageBox.confirm("閫変腑鐨勫唴瀹瑰皢琚垹闄わ紝鏄惁纭鍒犻櫎锛�", "鍒犻櫎", {
- confirmButtonText: "纭",
- cancelButtonText: "鍙栨秷",
- type: "warning",
- }).then(() => {
- // 浠巑ockData涓垹闄ら�変腑鐨勯」
- selectedIds.value.forEach(id => {
- const index = mockData.findIndex(item => item.id === id);
- if (index !== -1) {
- mockData.splice(index, 1);
- }
- });
-
- ElMessage.success("鍒犻櫎鎴愬姛");
- selectedIds.value = [];
- getList();
- }).catch(() => {
- // 鐢ㄦ埛鍙栨秷
- });
-};
-</script>
-
-<style scoped>
-.auto-refresh-info {
- margin-bottom: 15px;
-}
-
-.auto-refresh-info .el-alert {
- border-radius: 8px;
-}
-
-.dialog-footer {
- text-align: right;
-}
-
-.knowledge-detail {
- padding: 20px 0;
-}
-
-.detail-title {
- font-size: 18px;
- font-weight: bold;
- color: #303133;
-}
-
-.detail-section {
- margin-top: 24px;
-}
-
-.detail-section h4 {
- margin: 0 0 12px 0;
- font-size: 16px;
- font-weight: 600;
- color: #303133;
- border-left: 4px solid #409eff;
- padding-left: 12px;
-}
-
-.detail-content {
- background: #f8f9fa;
- padding: 16px;
- border-radius: 6px;
- line-height: 1.6;
- color: #606266;
- white-space: pre-wrap;
-}
-
-.key-points {
- display: flex;
- flex-wrap: wrap;
- gap: 8px;
-}
-
-.usage-stats {
- margin-top: 16px;
-}
-
-.stat-item {
- text-align: center;
- padding: 20px;
- background: #f8f9fa;
- border-radius: 8px;
-}
-
-.stat-number {
- font-size: 24px;
- font-weight: bold;
- color: #409eff;
- margin-bottom: 8px;
-}
-
-.stat-label {
- font-size: 14px;
- color: #909399;
-}
-</style>
diff --git a/src/views/collaborativeApproval/meetingBoard/index.vue b/src/views/collaborativeApproval/meetingBoard/index.vue
deleted file mode 100644
index 63c74f9..0000000
--- a/src/views/collaborativeApproval/meetingBoard/index.vue
+++ /dev/null
@@ -1,498 +0,0 @@
-<template>
- <div class="app-container">
- <!-- 椤甸潰鏍囬 -->
- <div class="page-header">
- <h2>浼氳鐪嬫澘</h2>
-<!-- <el-button type="primary" @click="createMeeting">鍒涘缓浼氳</el-button>-->
- </div>
-
- <!-- 浼氳缁熻鍗$墖 -->
- <div class="stats-cards">
- <el-card class="stat-card">
- <div class="stat-content">
- <div class="stat-number">{{ stats.total }}</div>
- <div class="stat-label">鎬讳細璁暟</div>
- </div>
- </el-card>
- <el-card class="stat-card">
- <div class="stat-content">
- <div class="stat-number">{{ stats.ongoing }}</div>
- <div class="stat-label">杩涜涓�</div>
- </div>
- </el-card>
- <el-card class="stat-card">
- <div class="stat-content">
- <div class="stat-number">{{ stats.completed }}</div>
- <div class="stat-label">宸插畬鎴�</div>
- </div>
- </el-card>
- <el-card class="stat-card">
- <div class="stat-content">
- <div class="stat-number">{{ stats.upcoming }}</div>
- <div class="stat-label">鍗冲皢寮�濮�</div>
- </div>
- </el-card>
- </div>
-
- <!-- 浼氳鍒楄〃 -->
- <div class="meeting-list">
- <el-card v-for="meeting in meetings" :key="meeting.id" class="meeting-card">
- <div class="meeting-header">
- <div class="meeting-title">
- <h3>{{ meeting.title }}</h3>
- <el-tag :type="getStatusType(meeting.status)" size="small">
- {{ getStatusText(meeting.status) }}
- </el-tag>
- </div>
- <div class="meeting-time">
- <el-icon><Clock /></el-icon>
- {{ formatTime(meeting.startTime) }} - {{ formatTime(meeting.endTime) }}
- </div>
- </div>
-
- <div class="meeting-info">
- <div class="info-item">
- <el-icon><Location /></el-icon>
- <span>{{ meeting.location }}</span>
- </div>
- <div class="info-item">
- <el-icon><User /></el-icon>
- <span>涓绘寔浜�: {{ meeting.host }}</span>
- </div>
- <div class="info-item">
- <el-icon><UserFilled /></el-icon>
- <span>鍙備細浜烘暟: {{ meeting.participants.length }}浜�</span>
- </div>
- </div>
-
- <div class="meeting-agenda">
- <h4>璁▼瀹夋帓</h4>
- <div class="agenda-list">
- <div
- v-for="(agenda, index) in meeting.agenda"
- :key="index"
- class="agenda-item"
- :class="{ 'active': agenda.status === 'active', 'completed': agenda.status === 'completed' }"
- >
- <span class="agenda-time">{{ agenda.time }}</span>
- <span class="agenda-content">{{ agenda.content }}</span>
- <el-tag
- :type="getAgendaStatusType(agenda.status)"
- size="small"
- >
- {{ getAgendaStatusText(agenda.status) }}
- </el-tag>
- </div>
- </div>
- </div>
-
-<!-- <div class="meeting-actions">-->
-<!-- <el-button type="primary" size="small" @click="joinMeeting(meeting)">-->
-<!-- 鍔犲叆浼氳-->
-<!-- </el-button>-->
-<!-- <el-button type="info" size="small" @click="viewDetails(meeting)">-->
-<!-- 鏌ョ湅璇︽儏-->
-<!-- </el-button>-->
-<!-- <el-button type="warning" size="small" @click="editMeeting(meeting)">-->
-<!-- 缂栬緫-->
-<!-- </el-button>-->
-<!-- </div>-->
- </el-card>
- </div>
-
- <!-- 鍒涘缓浼氳瀵硅瘽妗� -->
- <el-dialog v-model="dialogVisible" title="鍒涘缓浼氳" width="600px">
- <el-form :model="meetingForm" label-width="100px">
- <el-form-item label="浼氳鏍囬">
- <el-input v-model="meetingForm.title" placeholder="璇疯緭鍏ヤ細璁爣棰�" />
- </el-form-item>
- <el-form-item label="浼氳鏃堕棿">
- <el-date-picker
- v-model="meetingForm.timeRange"
- type="datetimerange"
- range-separator="鑷�"
- start-placeholder="寮�濮嬫椂闂�"
- end-placeholder="缁撴潫鏃堕棿"
- format="YYYY-MM-DD HH:mm"
- value-format="YYYY-MM-DD HH:mm:ss"
- />
- </el-form-item>
- <el-form-item label="浼氳鍦扮偣">
- <el-input v-model="meetingForm.location" placeholder="璇疯緭鍏ヤ細璁湴鐐�" />
- </el-form-item>
- <el-form-item label="涓绘寔浜�">
- <el-input v-model="meetingForm.host" placeholder="璇疯緭鍏ヤ富鎸佷汉濮撳悕" />
- </el-form-item>
- <el-form-item label="浼氳鎻忚堪">
- <el-input
- v-model="meetingForm.description"
- type="textarea"
- :rows="3"
- placeholder="璇疯緭鍏ヤ細璁弿杩�"
- />
- </el-form-item>
- </el-form>
- <template #footer>
- <span class="dialog-footer">
- <el-button @click="dialogVisible = false">鍙栨秷</el-button>
- <el-button type="primary" @click="submitMeeting">纭畾</el-button>
- </span>
- </template>
- </el-dialog>
- </div>
-</template>
-
-<script setup>
-import { ref, reactive, onMounted } from 'vue'
-import { ElMessage } from 'element-plus'
-import { Clock, Location, User, UserFilled } from '@element-plus/icons-vue'
-
-// 缁熻鏁版嵁
-const stats = reactive({
- total: 12,
- ongoing: 3,
- completed: 7,
- upcoming: 2
-})
-
-// 浼氳鏁版嵁
-const meetings = ref([
- {
- id: 1,
- title: '浜у搧寮�鍙戝懆浼�',
- status: 'ongoing',
- startTime: '2024-01-15 09:00:00',
- endTime: '2024-01-15 10:30:00',
- location: '浼氳瀹',
- host: '寮犵粡鐞�',
- participants: ['寮犵粡鐞�', '鏉庡伐绋嬪笀', '鐜嬭璁″笀', '璧垫祴璇曞憳'],
- agenda: [
- { time: '09:00-09:15', content: '涓婂懆宸ヤ綔鎬荤粨', status: 'completed' },
- { time: '09:15-09:45', content: '鏈懆寮�鍙戣鍒�', status: 'active' },
- { time: '09:45-10:00', content: '鎶�鏈毦鐐硅璁�', status: 'pending' },
- { time: '10:00-10:30', content: '闂鍙嶉涓庤В鍐�', status: 'pending' }
- ]
- },
- {
- id: 2,
- title: '瀹㈡埛闇�姹傝瘎瀹′細',
- status: 'upcoming',
- startTime: '2024-01-15 14:00:00',
- endTime: '2024-01-15 15:00:00',
- location: '绾夸笂浼氳',
- host: '闄堟�荤洃',
- participants: ['闄堟�荤洃', '鍒樹骇鍝佺粡鐞�', '瀛欏鎴风粡鐞�', '瀹㈡埛浠h〃'],
- agenda: [
- { time: '14:00-14:20', content: '闇�姹傝儗鏅粙缁�', status: 'pending' },
- { time: '14:20-14:40', content: '鍔熻兘闇�姹傚垎鏋�', status: 'pending' },
- { time: '14:40-15:00', content: '鎶�鏈彲琛屾�ц瘎浼�', status: 'pending' }
- ]
- },
- {
- id: 3,
- title: '鍥㈤槦寤鸿娲诲姩',
- status: 'completed',
- startTime: '2024-01-14 16:00:00',
- endTime: '2024-01-14 18:00:00',
- location: '鍏徃澶у巺',
- host: '浜轰簨閮�',
- participants: ['鍏ㄤ綋鍛樺伐'],
- agenda: [
- { time: '16:00-16:30', content: '鍥㈤槦娓告垙', status: 'completed' },
- { time: '16:30-17:00', content: '缁忛獙鍒嗕韩', status: 'completed' },
- { time: '17:00-18:00', content: '鑷敱浜ゆ祦', status: 'completed' }
- ]
- }
-])
-
-// 瀵硅瘽妗嗙浉鍏�
-const dialogVisible = ref(false)
-const meetingForm = reactive({
- title: '',
- timeRange: [],
- location: '',
- host: '',
- description: ''
-})
-
-// 鑾峰彇鐘舵�佺被鍨�
-const getStatusType = (status) => {
- const statusMap = {
- 'ongoing': 'success',
- 'upcoming': 'warning',
- 'completed': 'info'
- }
- return statusMap[status] || 'info'
-}
-
-// 鑾峰彇鐘舵�佹枃鏈�
-const getStatusText = (status) => {
- const statusMap = {
- 'ongoing': '杩涜涓�',
- 'upcoming': '鍗冲皢寮�濮�',
- 'completed': '宸插畬鎴�'
- }
- return statusMap[status] || '鏈煡'
-}
-
-// 鑾峰彇璁▼鐘舵�佺被鍨�
-const getAgendaStatusType = (status) => {
- const statusMap = {
- 'completed': 'success',
- 'active': 'warning',
- 'pending': 'info'
- }
- return statusMap[status] || 'info'
-}
-
-// 鑾峰彇璁▼鐘舵�佹枃鏈�
-const getAgendaStatusText = (status) => {
- const statusMap = {
- 'completed': '宸插畬鎴�',
- 'active': '杩涜涓�',
- 'pending': '寰呭紑濮�'
- }
- return statusMap[status] || '鏈煡'
-}
-
-// 鏍煎紡鍖栨椂闂�
-const formatTime = (timeStr) => {
- const date = new Date(timeStr)
- return date.toLocaleTimeString('zh-CN', { hour: '2-digit', minute: '2-digit' })
-}
-
-// 鍒涘缓浼氳
-const createMeeting = () => {
- dialogVisible.value = true
- // 閲嶇疆琛ㄥ崟
- Object.assign(meetingForm, {
- title: '',
- timeRange: [],
- location: '',
- host: '',
- description: ''
- })
-}
-
-// 鎻愪氦浼氳
-const submitMeeting = () => {
- if (!meetingForm.title || !meetingForm.timeRange.length || !meetingForm.location || !meetingForm.host) {
- ElMessage.warning('璇峰~鍐欏畬鏁寸殑浼氳淇℃伅')
- return
- }
-
- // 鍒涘缓鏂颁細璁�
- const newMeeting = {
- id: Date.now(),
- title: meetingForm.title,
- status: 'upcoming',
- startTime: meetingForm.timeRange[0],
- endTime: meetingForm.timeRange[1],
- location: meetingForm.location,
- host: meetingForm.host,
- participants: [meetingForm.host],
- agenda: [
- { time: '寰呭畾', content: '璁▼寰呭畾', status: 'pending' }
- ]
- }
-
- meetings.value.unshift(newMeeting)
- stats.total++
- stats.upcoming++
-
- ElMessage.success('浼氳鍒涘缓鎴愬姛')
- dialogVisible.value = false
-}
-
-// 鍔犲叆浼氳
-const joinMeeting = (meeting) => {
- ElMessage.success(`宸插姞鍏ヤ細璁細${meeting.title}`)
-}
-
-// 鏌ョ湅璇︽儏
-const viewDetails = (meeting) => {
- ElMessage.info(`鏌ョ湅浼氳璇︽儏锛�${meeting.title}`)
-}
-
-// 缂栬緫浼氳
-const editMeeting = (meeting) => {
- ElMessage.info(`缂栬緫浼氳锛�${meeting.title}`)
-}
-
-onMounted(() => {
- console.log('浼氳鐪嬫澘椤甸潰鍔犺浇瀹屾垚')
-})
-</script>
-
-<style scoped>
-.app-container {
- padding: 20px;
-}
-
-.page-header {
- display: flex;
- justify-content: space-between;
- align-items: center;
- margin-bottom: 20px;
-}
-
-.page-header h2 {
- margin: 0;
- color: #303133;
-}
-
-.stats-cards {
- display: grid;
- grid-template-columns: repeat(auto-fit, minmax(200px, 1fr));
- gap: 20px;
- margin-bottom: 30px;
-}
-
-.stat-card {
- text-align: center;
-}
-
-.stat-content {
- padding: 10px;
-}
-
-.stat-number {
- font-size: 32px;
- font-weight: bold;
- color: #409eff;
- margin-bottom: 8px;
-}
-
-.stat-label {
- font-size: 14px;
- color: #606266;
-}
-
-.meeting-list {
- display: grid;
- gap: 20px;
-}
-
-.meeting-card {
- border-radius: 8px;
-}
-
-.meeting-header {
- display: flex;
- justify-content: space-between;
- align-items: flex-start;
- margin-bottom: 15px;
-}
-
-.meeting-title {
- display: flex;
- align-items: center;
- gap: 10px;
-}
-
-.meeting-title h3 {
- margin: 0;
- color: #303133;
-}
-
-.meeting-time {
- display: flex;
- align-items: center;
- gap: 5px;
- color: #606266;
- font-size: 14px;
-}
-
-.meeting-info {
- display: flex;
- gap: 20px;
- margin-bottom: 20px;
- flex-wrap: wrap;
-}
-
-.info-item {
- display: flex;
- align-items: center;
- gap: 5px;
- color: #606266;
- font-size: 14px;
-}
-
-.meeting-agenda {
- margin-bottom: 20px;
-}
-
-.meeting-agenda h4 {
- margin: 0 0 15px 0;
- color: #303133;
- font-size: 16px;
-}
-
-.agenda-list {
- display: flex;
- flex-direction: column;
- gap: 10px;
-}
-
-.agenda-item {
- display: flex;
- align-items: center;
- gap: 15px;
- padding: 10px;
- border-radius: 6px;
- background-color: #f5f7fa;
-}
-
-.agenda-item.active {
- background-color: #fdf6ec;
- border-left: 3px solid #e6a23c;
-}
-
-.agenda-item.completed {
- background-color: #f0f9ff;
- border-left: 3px solid #409eff;
-}
-
-.agenda-time {
- font-weight: bold;
- color: #606266;
- min-width: 80px;
-}
-
-.agenda-content {
- flex: 1;
- color: #303133;
-}
-
-.meeting-actions {
- display: flex;
- gap: 10px;
- justify-content: flex-end;
-}
-
-.dialog-footer {
- display: flex;
- justify-content: flex-end;
- gap: 10px;
-}
-
-@media (max-width: 768px) {
- .stats-cards {
- grid-template-columns: repeat(2, 1fr);
- }
-
- .meeting-header {
- flex-direction: column;
- gap: 10px;
- }
-
- .meeting-info {
- flex-direction: column;
- gap: 10px;
- }
-
- .meeting-actions {
- flex-direction: column;
- }
-}
-</style>
\ No newline at end of file
diff --git a/src/views/collaborativeApproval/noticeManagement/index.vue b/src/views/collaborativeApproval/noticeManagement/index.vue
deleted file mode 100644
index daa4cd7..0000000
--- a/src/views/collaborativeApproval/noticeManagement/index.vue
+++ /dev/null
@@ -1,705 +0,0 @@
-<template>
- <div class="app-container">
- <!-- 鎼滅储琛ㄥ崟 -->
- <div class="search_form">
- <div>
- <span class="search_title">鍏憡鏍囬锛�</span>
- <el-input
- v-model="searchForm.noticeTitle"
- style="width: 240px"
- placeholder="璇疯緭鍏ュ叕鍛婃爣棰樻悳绱�"
- @change="handleQuery"
- clearable
- :prefix-icon="Search"
- />
- <span class="search_title ml10">鍏憡绫诲瀷锛�</span>
- <el-select v-model="searchForm.noticeType" clearable @change="handleQuery" style="width: 240px">
- <el-option label="鏀惧亣閫氱煡" value="1" />
- <el-option label="璁惧缁翠慨閫氱煡" value="2" />
- </el-select>
- <span class="search_title ml10">鐘舵�侊細</span>
- <el-select v-model="searchForm.status" clearable @change="handleQuery" style="width: 240px">
- <el-option label="鑽夌" value="0" />
- <el-option label="宸插彂甯�" value="1" />
- <el-option label="宸蹭笅绾�" value="2" />
- </el-select>
- <el-button type="primary" @click="handleQuery" style="margin-left: 10px">鎼滅储</el-button>
- <el-button @click="resetQuery" style="margin-left: 10px">閲嶇疆</el-button>
- </div>
- <div>
- <el-button type="primary" @click="openForm('add')">鏂板鍏憡</el-button>
- <el-button type="danger" plain @click="handleDelete" :disabled="!selectedIds.length">鍒犻櫎</el-button>
- </div>
- </div>
-
- <!-- 閫氱煡鍏憡鏉� -->
- <div class="notice-board">
- <!-- 鏀惧亣閫氱煡鍖哄煙 -->
- <div class="notice-section" v-if="holidayNotices.length > 0">
- <div class="section-header">
- <h3>馃搮 鏀惧亣閫氱煡</h3>
- <span class="section-count">{{ holidayNotices.length }}鏉�</span>
- </div>
- <div class="notice-cards">
- <div
- v-for="notice in holidayNotices"
- :key="notice.id"
- class="notice-card holiday-card"
- :class="{ 'urgent': notice.priority === '3' }"
- >
- <div class="card-header">
- <div class="card-title">
- <el-icon class="holiday-icon"><Calendar /></el-icon>
- {{ notice.noticeTitle }}
- </div>
- <div class="card-actions">
- <el-button link type="primary" @click="handleEdit(notice)">缂栬緫</el-button>
- <el-button link type="danger" @click="handleDelete(notice.id)">鍒犻櫎</el-button>
- </div>
- </div>
- <div class="card-content">
- <p>{{ notice.noticeContent }}</p>
- </div>
- <div class="card-footer">
- <div class="card-meta">
- <span class="priority" :class="'priority-' + notice.priority">
- {{ getPriorityText(notice.priority) }}
- </span>
- <span class="status" :class="'status-' + notice.status">
- {{ getStatusText(notice.status) }}
- </span>
- </div>
- <div class="card-info">
- <span class="creator">{{ notice.createBy }}</span>
- <span class="time">{{ notice.createTime }}</span>
- </div>
- </div>
- <div class="card-remark" v-if="notice.remark">
- <el-icon><InfoFilled /></el-icon>
- <span>{{ notice.remark }}</span>
- </div>
- </div>
- </div>
- </div>
-
- <!-- 璁惧缁翠慨閫氱煡鍖哄煙 -->
- <div class="notice-section" v-if="maintenanceNotices.length > 0">
- <div class="section-header">
- <h3>馃敡 璁惧缁翠慨閫氱煡</h3>
- <span class="section-count">{{ maintenanceNotices.length }}鏉�</span>
- </div>
- <div class="notice-cards">
- <div
- v-for="notice in maintenanceNotices"
- :key="notice.id"
- class="notice-card maintenance-card"
- :class="{ 'urgent': notice.priority === '3' }"
- >
- <div class="card-header">
- <div class="card-title">
- <el-icon class="maintenance-icon"><Tools /></el-icon>
- {{ notice.noticeTitle }}
- </div>
- <div class="card-actions">
- <el-button link type="primary" @click="handleEdit(notice)">缂栬緫</el-button>
- <el-button link type="danger" @click="handleDelete(notice.id)">鍒犻櫎</el-button>
- </div>
- </div>
- <div class="card-content">
- <p>{{ notice.noticeContent }}</p>
- </div>
- <div class="card-footer">
- <div class="card-meta">
- <span class="priority" :class="'priority-' + notice.priority">
- {{ getPriorityText(notice.priority) }}
- </span>
- <span class="status" :class="'status-' + notice.status">
- {{ getStatusText(notice.status) }}
- </span>
- </div>
- <div class="card-info">
- <span class="creator">{{ notice.createBy }}</span>
- <span class="time">{{ notice.createTime }}</span>
- </div>
- </div>
- <div class="card-remark" v-if="notice.remark">
- <el-icon><InfoFilled /></el-icon>
- <span>{{ notice.remark }}</span>
- </div>
- </div>
- </div>
- </div>
-
- <!-- 绌虹姸鎬� -->
- <div class="empty-state" v-if="filteredNotices.length === 0">
- <el-empty description="鏆傛棤閫氱煡鍏憡" />
- </div>
- </div>
-
- <!-- 鏂板/缂栬緫瀵硅瘽妗� -->
- <el-dialog
- :title="dialogTitle"
- v-model="dialogVisible"
- width="800px"
- append-to-body
- @close="resetForm"
- >
- <el-form ref="formRef" :model="form" :rules="rules" label-width="100px">
- <el-row>
- <el-col :span="12">
- <el-form-item label="鍏憡鏍囬" prop="noticeTitle">
- <el-input v-model="form.noticeTitle" placeholder="璇疯緭鍏ュ叕鍛婃爣棰�" />
- </el-form-item>
- </el-col>
- <el-col :span="12">
- <el-form-item label="鍏憡绫诲瀷" prop="noticeType">
- <el-select v-model="form.noticeType" placeholder="璇烽�夋嫨鍏憡绫诲瀷" style="width: 100%">
- <el-option label="鏀惧亣閫氱煡" value="1" />
- <el-option label="璁惧缁翠慨閫氱煡" value="2" />
- </el-select>
- </el-form-item>
- </el-col>
- </el-row>
- <el-row>
- <el-col :span="12">
- <el-form-item label="鐘舵��">
- <el-radio-group v-model="form.status">
- <el-radio value="0">鑽夌</el-radio>
- <el-radio value="1">宸插彂甯�</el-radio>
- <el-radio value="2">宸蹭笅绾�</el-radio>
- </el-radio-group>
- </el-form-item>
- </el-col>
- <el-col :span="12">
- <el-form-item label="浼樺厛绾�">
- <el-select v-model="form.priority" placeholder="璇烽�夋嫨浼樺厛绾�" style="width: 100%">
- <el-option label="鏅��" value="1" />
- <el-option label="閲嶈" value="2" />
- <el-option label="绱ф��" value="3" />
- </el-select>
- </el-form-item>
- </el-col>
- </el-row>
- <el-row>
- <el-col :span="24">
- <el-form-item label="鍏憡鍐呭" prop="noticeContent">
- <el-input
- v-model="form.noticeContent"
- type="textarea"
- :rows="6"
- placeholder="璇疯緭鍏ュ叕鍛婂唴瀹�"
- maxlength="500"
- show-word-limit
- />
- </el-form-item>
- </el-col>
- </el-row>
- <el-row>
- <el-col :span="24">
- <el-form-item label="澶囨敞">
- <el-input
- v-model="form.remark"
- type="textarea"
- :rows="3"
- placeholder="璇疯緭鍏ュ娉ㄤ俊鎭�"
- maxlength="200"
- show-word-limit
- />
- </el-form-item>
- </el-col>
- </el-row>
- </el-form>
- <template #footer>
- <div class="dialog-footer">
- <el-button type="primary" @click="submitForm">纭� 瀹�</el-button>
- <el-button @click="dialogVisible = false">鍙� 娑�</el-button>
- </div>
- </template>
- </el-dialog>
- </div>
-</template>
-
-<script setup>
-import { Search, Calendar, Tools, InfoFilled } from "@element-plus/icons-vue";
-import { onMounted, ref, reactive, toRefs, computed } from "vue";
-import { ElMessage, ElMessageBox } from "element-plus";
-import useUserStore from "@/store/modules/user";
-
-const userStore = useUserStore();
-
-// 鍝嶅簲寮忔暟鎹�
-const data = reactive({
- searchForm: {
- noticeTitle: "",
- noticeType: "",
- status: "",
- },
- form: {
- id: undefined,
- noticeTitle: "",
- noticeType: "",
- noticeContent: "",
- status: "0",
- priority: "1",
- remark: "",
- createBy: "",
- createTime: "",
- },
- rules: {
- noticeTitle: [
- { required: true, message: "鍏憡鏍囬涓嶈兘涓虹┖", trigger: "blur" }
- ],
- noticeType: [
- { required: true, message: "璇烽�夋嫨鍏憡绫诲瀷", trigger: "change" }
- ],
- noticeContent: [
- { required: true, message: "鍏憡鍐呭涓嶈兘涓虹┖", trigger: "blur" }
- ]
- }
-});
-
-const { searchForm, form, rules } = toRefs(data);
-
-// 椤甸潰鐘舵��
-const dialogVisible = ref(false);
-const dialogTitle = ref("");
-const selectedIds = ref([]);
-const formRef = ref();
-
-// 妯℃嫙鏁版嵁 - 鏍规嵁娉曞畾鑺傚亣鏃ヨ璁�
-const mockData = [
- {
- id: 1,
- noticeTitle: "2024骞存槬鑺傛斁鍋囬�氱煡",
- noticeType: "1",
- priority: "2",
- status: "1",
- noticeContent: "鏍规嵁鍥藉姟闄㈠姙鍏巺閫氱煡锛�2024骞存槬鑺傛斁鍋囧畨鎺掑涓嬶細2鏈�10鏃ワ紙鍒濅竴锛夎嚦2鏈�17鏃ワ紙鍒濆叓锛夋斁鍋囪皟浼戯紝鍏�8澶┿��2鏈�4鏃ワ紙鏄熸湡鏃ワ級銆�2鏈�18鏃ワ紙鏄熸湡鏃ワ級涓婄彮銆傝鍚勯儴闂ㄦ彁鍓嶅仛濂藉伐浣滃畨鎺掋��",
- remark: "鏀惧亣鏈熼棿璇蜂繚鎸佹墜鏈虹晠閫氾紝濡傛湁绱ф�ヤ簨鍔″強鏃惰仈绯�",
- createBy: "浜轰簨閮�",
- createTime: "2024-01-15 10:30:00"
- },
- {
- id: 2,
- noticeTitle: "2024骞存竻鏄庤妭鏀惧亣閫氱煡",
- noticeType: "1",
- priority: "1",
- status: "1",
- noticeContent: "鏍规嵁鍥藉姟闄㈠姙鍏巺閫氱煡锛�2024骞存竻鏄庤妭鏀惧亣瀹夋帓濡備笅锛�4鏈�4鏃ワ紙鏄熸湡鍥涳級鑷�4鏈�6鏃ワ紙鏄熸湡鍏級鏀惧亣璋冧紤锛屽叡3澶┿��4鏈�7鏃ワ紙鏄熸湡鏃ワ級涓婄彮銆�",
- remark: "璇峰悇閮ㄩ棬鍋氬ソ鍊肩彮瀹夋帓锛岀‘淇濊妭鏃ユ湡闂村悇椤瑰伐浣滄甯歌繍杞�",
- createBy: "琛屾斂閮�",
- createTime: "2024-01-14 14:20:00"
- },
- {
- id: 3,
- noticeTitle: "2024骞村姵鍔ㄨ妭鏀惧亣閫氱煡",
- noticeType: "1",
- priority: "1",
- status: "1",
- noticeContent: "鏍规嵁鍥藉姟闄㈠姙鍏巺閫氱煡锛�2024骞村姵鍔ㄨ妭鏀惧亣瀹夋帓濡備笅锛�5鏈�1鏃ワ紙鏄熸湡涓夛級鑷�5鏈�5鏃ワ紙鏄熸湡鏃ワ級鏀惧亣璋冧紤锛屽叡5澶┿��4鏈�28鏃ワ紙鏄熸湡鏃ワ級銆�5鏈�11鏃ワ紙鏄熸湡鍏級涓婄彮銆�",
- remark: "鏀惧亣鍓嶈鍏抽棴鐢垫簮锛岄攣濂介棬绐楋紝娉ㄦ剰瀹夊叏",
- createBy: "琛屾斂閮�",
- createTime: "2024-01-13 09:15:00"
- },
- {
- id: 4,
- noticeTitle: "2024骞寸鍗堣妭鏀惧亣閫氱煡",
- noticeType: "1",
- priority: "1",
- status: "1",
- noticeContent: "鏍规嵁鍥藉姟闄㈠姙鍏巺閫氱煡锛�2024骞寸鍗堣妭鏀惧亣瀹夋帓濡備笅锛�6鏈�8鏃ワ紙鏄熸湡鍏級鑷�6鏈�10鏃ワ紙鏄熸湡涓�锛夋斁鍋囪皟浼戯紝鍏�3澶┿��6鏈�11鏃ワ紙鏄熸湡浜岋級涓婄彮銆�",
- remark: "绁濆ぇ瀹剁鍗堣妭蹇箰锛岄槚瀹跺垢绂忥紒",
- createBy: "琛屾斂閮�",
- createTime: "2024-01-12 16:30:00"
- },
- {
- id: 5,
- noticeTitle: "2024骞翠腑绉嬭妭鏀惧亣閫氱煡",
- noticeType: "1",
- priority: "1",
- status: "1",
- noticeContent: "鏍规嵁鍥藉姟闄㈠姙鍏巺閫氱煡锛�2024骞翠腑绉嬭妭鏀惧亣瀹夋帓濡備笅锛�9鏈�15鏃ワ紙鏄熸湡鏃ワ級鑷�9鏈�17鏃ワ紙鏄熸湡浜岋級鏀惧亣璋冧紤锛屽叡3澶┿��9鏈�14鏃ワ紙鏄熸湡鍏級涓婄彮銆�",
- remark: "涓浣宠妭锛岀澶у鍥㈠渾缇庢弧锛屽垢绂忓畨搴凤紒",
- createBy: "琛屾斂閮�",
- createTime: "2024-01-11 11:20:00"
- },
- {
- id: 6,
- noticeTitle: "2024骞村浗搴嗚妭鏀惧亣閫氱煡",
- noticeType: "1",
- priority: "2",
- status: "1",
- noticeContent: "鏍规嵁鍥藉姟闄㈠姙鍏巺閫氱煡锛�2024骞村浗搴嗚妭鏀惧亣瀹夋帓濡備笅锛�10鏈�1鏃ワ紙鏄熸湡浜岋級鑷�10鏈�7鏃ワ紙鏄熸湡涓�锛夋斁鍋囪皟浼戯紝鍏�7澶┿��9鏈�29鏃ワ紙鏄熸湡鏃ワ級銆�10鏈�12鏃ワ紙鏄熸湡鍏級涓婄彮銆�",
- remark: "鍥藉簡鏈熼棿璇峰悇閮ㄩ棬鍋氬ソ鍊肩彮瀹夋帓锛岀‘淇濆畨鍏ㄧǔ瀹�",
- createBy: "琛屾斂閮�",
- createTime: "2024-01-10 15:45:00"
- },
- {
- id: 7,
- noticeTitle: "A杞﹂棿鐢熶骇绾垮勾搴︽淇�氱煡",
- noticeType: "2",
- priority: "2",
- status: "1",
- noticeContent: "A杞﹂棿鐢熶骇绾垮皢浜�2024骞�1鏈�20鏃ワ紙鍛ㄥ叚锛夎繘琛屽勾搴︽淇淮鎶わ紝棰勮鍋滃伐8灏忔椂銆傛淇唴瀹瑰寘鎷細璁惧娓呮磥銆佹鼎婊戜繚鍏汇�佸畨鍏ㄨ缃鏌ョ瓑銆傝鐢熶骇閮ㄩ棬鎻愬墠璋冩暣鐢熶骇璁″垝銆�",
- remark: "缁翠慨鏈熼棿璇风浉鍏充汉鍛橀厤鍚堬紝纭繚妫�淇伐浣滃畨鍏ㄩ『鍒╄繘琛�",
- createBy: "璁惧閮�",
- createTime: "2024-01-14 14:20:00"
- },
- {
- id: 8,
- noticeTitle: "B杞﹂棿璁惧棰勯槻鎬х淮鎶ら�氱煡",
- noticeType: "2",
- priority: "1",
- status: "1",
- noticeContent: "B杞﹂棿鍏抽敭璁惧灏嗕簬2024骞�1鏈�25鏃ヨ繘琛岄闃叉�х淮鎶わ紝棰勮鍋滃伐4灏忔椂銆傜淮鎶ゅ唴瀹瑰寘鎷細璁惧妫�鏌ャ�侀浂浠舵洿鎹€�佹�ц兘娴嬭瘯绛夈�傝鐩稿叧閮ㄩ棬閰嶅悎銆�",
- remark: "缁存姢瀹屾垚鍚庡皢杩涜璇曡繍琛岋紝纭繚璁惧姝e父杩愯",
- createBy: "璁惧閮�",
- createTime: "2024-01-13 09:15:00"
- }
-];
-
-// 璁$畻灞炴��
-const filteredNotices = computed(() => {
- let filtered = [...mockData];
-
- if (searchForm.value.noticeTitle) {
- filtered = filtered.filter(item =>
- item.noticeTitle.includes(searchForm.value.noticeTitle)
- );
- }
- if (searchForm.value.noticeType) {
- filtered = filtered.filter(item =>
- item.noticeType === searchForm.value.noticeType
- );
- }
- if (searchForm.value.status !== "") {
- filtered = filtered.filter(item =>
- item.status === searchForm.value.status
- );
- }
-
- return filtered;
-});
-
-const holidayNotices = computed(() => {
- return filteredNotices.value.filter(notice => notice.noticeType === "1");
-});
-
-const maintenanceNotices = computed(() => {
- return filteredNotices.value.filter(notice => notice.noticeType === "2");
-});
-
-// 鏂规硶瀹氫箟
-const handleQuery = () => {
- // 鎼滅储鍔熻兘淇濇寔涓嶅彉锛屼絾鏁版嵁閫氳繃璁$畻灞炴�ц嚜鍔ㄨ繃婊�
-};
-
-const resetQuery = () => {
- searchForm.value = {
- noticeTitle: "",
- noticeType: "",
- status: ""
- };
-};
-
-const getPriorityText = (priority) => {
- const priorityMap = { "1": "鏅��", "2": "閲嶈", "3": "绱ф��" };
- return priorityMap[priority] || "鏅��";
-};
-
-const getStatusText = (status) => {
- const statusMap = { "0": "鑽夌", "1": "宸插彂甯�", "2": "宸蹭笅绾�" };
- return statusMap[status] || "鏈煡";
-};
-
-const openForm = (type) => {
- if (type === 'add') {
- dialogTitle.value = "鏂板鍏憡";
- form.value = {
- id: undefined,
- noticeTitle: "",
- noticeType: "",
- noticeContent: "",
- status: "0",
- priority: "1",
- remark: "",
- createBy: userStore.name || "褰撳墠鐢ㄦ埛",
- createTime: new Date().toLocaleString()
- };
- }
- dialogVisible.value = true;
-};
-
-const handleEdit = (row) => {
- dialogTitle.value = "缂栬緫鍏憡";
- form.value = { ...row };
- dialogVisible.value = true;
-};
-
-const handleSelectionChange = (selection) => {
- selectedIds.value = selection.map(item => item.id);
-};
-
-const handleDelete = (id) => {
- ElMessageBox.confirm(
- "纭鍒犻櫎杩欐潯鍏憡鍚楋紵",
- "鎻愮ず",
- {
- confirmButtonText: "纭畾",
- cancelButtonText: "鍙栨秷",
- type: "warning"
- }
- ).then(() => {
- const index = mockData.findIndex(item => item.id === id);
- if (index > -1) {
- mockData.splice(index, 1);
- ElMessage.success("鍒犻櫎鎴愬姛");
- }
- });
-};
-
-const submitForm = () => {
- formRef.value.validate((valid) => {
- if (valid) {
- if (form.value.id) {
- // 缂栬緫妯″紡
- const index = mockData.findIndex(item => item.id === form.value.id);
- if (index > -1) {
- mockData[index] = { ...form.value };
- }
- ElMessage.success("淇敼鎴愬姛");
- } else {
- // 鏂板妯″紡
- const newId = Math.max(...mockData.map(item => item.id)) + 1;
- const newNotice = {
- ...form.value,
- id: newId,
- createTime: new Date().toLocaleString()
- };
- mockData.unshift(newNotice);
- ElMessage.success("鏂板鎴愬姛");
- }
- dialogVisible.value = false;
- }
- });
-};
-
-const resetForm = () => {
- formRef.value?.resetFields();
-};
-
-// 鐢熷懡鍛ㄦ湡
-onMounted(() => {
- // 椤甸潰鍔犺浇瀹屾垚
-});
-</script>
-
-<style scoped>
-.search_form {
- background: #fff;
- padding: 20px;
- margin-bottom: 20px;
- border-radius: 8px;
- box-shadow: 0 2px 8px rgba(0, 0, 0, 0.1);
- display: flex;
- justify-content: space-between;
- align-items: center;
-}
-
-.search_title {
- font-weight: 500;
- color: #333;
- margin-right: 8px;
-}
-
-.ml10 {
- margin-left: 10px;
-}
-
-.notice-board {
- background: #f5f7fa;
- padding: 20px;
- border-radius: 8px;
-}
-
-.notice-section {
- margin-bottom: 30px;
-}
-
-.section-header {
- display: flex;
- align-items: center;
- margin-bottom: 20px;
- padding: 0 10px;
-}
-
-.section-header h3 {
- margin: 0;
- color: #303133;
- font-size: 18px;
- font-weight: 600;
-}
-
-.section-count {
- margin-left: 10px;
- background: #409eff;
- color: white;
- padding: 2px 8px;
- border-radius: 12px;
- font-size: 12px;
-}
-
-.notice-cards {
- display: grid;
- grid-template-columns: repeat(auto-fill, minmax(400px, 1fr));
- gap: 20px;
-}
-
-.notice-card {
- background: white;
- border-radius: 12px;
- padding: 20px;
- box-shadow: 0 4px 12px rgba(0, 0, 0, 0.1);
- transition: all 0.3s ease;
- border-left: 4px solid transparent;
-}
-
-.notice-card:hover {
- transform: translateY(-2px);
- box-shadow: 0 8px 24px rgba(0, 0, 0, 0.15);
-}
-
-.holiday-card {
- border-left-color: #67c23a;
-}
-
-.maintenance-card {
- border-left-color: #e6a23c;
-}
-
-.urgent {
- border-left-color: #f56c6c;
- background: linear-gradient(135deg, #fff5f5 0%, #ffffff 100%);
-}
-
-.card-header {
- display: flex;
- justify-content: space-between;
- align-items: flex-start;
- margin-bottom: 15px;
-}
-
-.card-title {
- display: flex;
- align-items: center;
- font-size: 16px;
- font-weight: 600;
- color: #303133;
- flex: 1;
-}
-
-.holiday-icon {
- color: #67c23a;
- margin-right: 8px;
- font-size: 18px;
-}
-
-.maintenance-icon {
- color: #e6a23c;
- margin-right: 8px;
- font-size: 18px;
-}
-
-.card-actions {
- display: flex;
- gap: 8px;
-}
-
-.card-content {
- margin-bottom: 15px;
-}
-
-.card-content p {
- margin: 0;
- color: #606266;
- line-height: 1.6;
- font-size: 14px;
-}
-
-.card-footer {
- display: flex;
- justify-content: space-between;
- align-items: center;
- margin-bottom: 10px;
-}
-
-.card-meta {
- display: flex;
- gap: 8px;
-}
-
-.priority, .status {
- padding: 2px 8px;
- border-radius: 12px;
- font-size: 12px;
- font-weight: 500;
-}
-
-.priority-1 { background: #f0f9ff; color: #0369a1; }
-.priority-2 { background: #fef3c7; color: #d97706; }
-.priority-3 { background: #fef2f2; color: #dc2626; }
-
-.status-0 { background: #f3f4f6; color: #6b7280; }
-.status-1 { background: #d1fae5; color: #059669; }
-.status-2 { background: #fef3c7; color: #d97706; }
-
-.card-info {
- display: flex;
- flex-direction: column;
- align-items: flex-end;
- font-size: 12px;
- color: #909399;
-}
-
-.creator {
- font-weight: 500;
- margin-bottom: 2px;
-}
-
-.card-remark {
- display: flex;
- align-items: center;
- gap: 6px;
- padding: 8px 12px;
- background: #f8f9fa;
- border-radius: 6px;
- font-size: 12px;
- color: #606266;
- border-left: 3px solid #409eff;
-}
-
-.empty-state {
- text-align: center;
- padding: 60px 20px;
-}
-
-.dialog-footer {
- text-align: right;
-}
-
-/* 鍝嶅簲寮忚璁� */
-@media (max-width: 768px) {
- .notice-cards {
- grid-template-columns: 1fr;
- }
-
- .search_form {
- flex-direction: column;
- gap: 15px;
- }
-
- .search_form > div {
- width: 100%;
- }
-}
-</style>
diff --git a/src/views/collaborativeApproval/notificationManagement/index.vue b/src/views/collaborativeApproval/notificationManagement/index.vue
deleted file mode 100644
index 288acf1..0000000
--- a/src/views/collaborativeApproval/notificationManagement/index.vue
+++ /dev/null
@@ -1,1187 +0,0 @@
-<template>
- <div class="app-container">
- <div class="search_form">
- <div>
- <span class="search_title">閫氱煡鏍囬锛�</span>
- <el-input
- v-model="searchForm.title"
- style="width: 240px"
- placeholder="璇疯緭鍏ラ�氱煡鏍囬鎼滅储"
- @change="handleQuery"
- clearable
- :prefix-icon="Search"
- />
- <span class="search_title ml10">閫氱煡绫诲瀷锛�</span>
- <el-select v-model="searchForm.type" clearable @change="handleQuery" style="width: 240px">
- <el-option label="鏀惧亣閫氱煡" :value="'holiday'" />
- <el-option label="澶勭綒閫氱煡" :value="'penalty'" />
- <el-option label="寮�浼氶�氱煡" :value="'meeting'" />
- <el-option label="涓存椂閫氱煡" :value="'temporary'" />
- <el-option label="姝e紡閫氱煡" :value="'formal'" />
- </el-select>
- <el-button type="primary" @click="handleQuery" style="margin-left: 10px">
- 鎼滅储
- </el-button>
- </div>
- <div>
- <el-button type="primary" @click="openForm('add')">鏂板閫氱煡</el-button>
- <el-button type="success" @click="openMeetingDialog">鍦ㄧ嚎浼氳</el-button>
- <el-button type="warning" @click="openFileShareDialog">鏂囦欢鍏变韩</el-button>
- <!-- <el-button type="info" @click="refreshEmployees">鍒锋柊鍛樺伐</el-button> -->
- <el-button type="danger" plain @click="handleDelete">鍒犻櫎</el-button>
- </div>
- </div>
- <div class="table_list">
- <PIMTable
- rowKey="id"
- :column="tableColumn"
- :tableData="tableData"
- :page="page"
- :isSelection="true"
- @selection-change="handleSelectionChange"
- :tableLoading="tableLoading"
- @pagination="pagination"
- :total="page.total"
- ></PIMTable>
- </div>
-
- <!-- 鏂板/缂栬緫閫氱煡寮圭獥 -->
- <el-dialog
- v-model="dialogVisible"
- :title="dialogTitle"
- width="800px"
- :close-on-click-modal="false"
- >
- <el-form ref="formRef" :model="form" :rules="rules" label-width="120px">
- <el-row :gutter="20">
- <el-col :span="12">
- <el-form-item label="閫氱煡鏍囬" prop="title">
- <el-input v-model="form.title" placeholder="璇疯緭鍏ラ�氱煡鏍囬" />
- </el-form-item>
- </el-col>
- <el-col :span="12">
- <el-form-item label="閫氱煡绫诲瀷" prop="type">
- <el-select v-model="form.type" placeholder="璇烽�夋嫨閫氱煡绫诲瀷" style="width: 100%">
- <el-option label="鏀惧亣閫氱煡" value="holiday" />
- <el-option label="澶勭綒閫氱煡" value="penalty" />
- <el-option label="寮�浼氶�氱煡" value="meeting" />
- <el-option label="涓存椂閫氱煡" value="temporary" />
- <el-option label="姝e紡閫氱煡" value="formal" />
- </el-select>
- </el-form-item>
- </el-col>
- </el-row>
- <el-row :gutter="20">
- <el-col :span="12">
- <el-form-item label="浼樺厛绾�" prop="priority">
- <el-select v-model="form.priority" placeholder="璇烽�夋嫨浼樺厛绾�" style="width: 100%">
- <el-option label="鏅��" value="low" />
- <el-option label="閲嶈" value="medium" />
- <el-option label="绱ф��" value="high" />
- </el-select>
- </el-form-item>
- </el-col>
- <el-col :span="12">
- <el-form-item label="鏈夋晥鏈熻嚦" prop="expireDate">
- <el-date-picker
- v-model="form.expireDate"
- type="date"
- placeholder="璇烽�夋嫨鏈夋晥鏈�"
- style="width: 100%"
- />
- </el-form-item>
- </el-col>
- </el-row>
- <el-form-item label="鎺ユ敹閮ㄩ棬" prop="departments">
- <el-select
- v-model="form.departments"
- multiple
- placeholder="璇烽�夋嫨鎺ユ敹閮ㄩ棬"
- style="width: 100%"
- >
- <el-option
- v-for="dept in departments"
- :key="dept"
- :label="dept"
- :value="dept"
- />
- </el-select>
- </el-form-item>
- <el-form-item label="鍚屾鏂瑰紡" prop="syncMethods">
- <el-checkbox-group v-model="form.syncMethods">
- <el-checkbox
- v-for="method in syncMethods"
- :key="method.value"
- :label="method.value"
- >
- {{ method.label }}
- </el-checkbox>
- </el-checkbox-group>
- </el-form-item>
- <el-form-item label="閫氱煡鍐呭" prop="content">
- <el-input
- v-model="form.content"
- type="textarea"
- :rows="4"
- placeholder="璇疯緭鍏ラ�氱煡鍐呭"
- />
- </el-form-item>
- </el-form>
- <template #footer>
- <span class="dialog-footer">
- <el-button @click="dialogVisible = false">鍙栨秷</el-button>
- <el-button type="primary" @click="submitForm">纭畾</el-button>
- </span>
- </template>
- </el-dialog>
-
- <!-- 鍦ㄧ嚎浼氳寮圭獥 -->
- <el-dialog
- v-model="meetingDialogVisible"
- title="鍒涘缓鍦ㄧ嚎浼氳"
- width="700px"
- :close-on-click-modal="false"
- >
- <el-form ref="meetingFormRef" :model="meetingForm" :rules="meetingRules" label-width="120px">
- <el-form-item label="浼氳鏍囬" prop="title">
- <el-input v-model="meetingForm.title" placeholder="璇疯緭鍏ヤ細璁爣棰�" />
- </el-form-item>
- <el-row :gutter="20">
- <el-col :span="12">
- <el-form-item label="寮�濮嬫椂闂�" prop="startTime">
- <el-date-picker
- v-model="meetingForm.startTime"
- type="datetime"
- placeholder="璇烽�夋嫨寮�濮嬫椂闂�"
- style="width: 100%"
- />
- </el-form-item>
- </el-col>
- <el-col :span="12">
- <el-form-item label="浼氳鏃堕暱" prop="duration">
- <el-input-number
- v-model="meetingForm.duration"
- :min="15"
- :max="480"
- :step="15"
- style="width: 100%"
- />
- <span style="margin-left: 10px">鍒嗛挓</span>
- </el-form-item>
- </el-col>
- </el-row>
- <el-form-item label="浼氳骞冲彴" prop="platform">
- <el-select v-model="meetingForm.platform" placeholder="璇烽�夋嫨浼氳骞冲彴" style="width: 100%">
- <el-option
- v-for="platform in meetingPlatforms"
- :key="platform.value"
- :label="platform.label"
- :value="platform.value"
- />
- </el-select>
- </el-form-item>
- <el-form-item label="鍙備細浜哄憳" prop="participants">
- <el-select
- v-model="meetingForm.participants"
- multiple
- filterable
- remote
- :remote-method="filterEmployees"
- :loading="employeesLoading"
- placeholder="璇烽�夋嫨鍙備細浜哄憳"
- style="width: 100%"
- >
- <el-option-group
- v-for="group in employeeGroups"
- :key="group.label"
- :label="group.label"
- >
- <el-option
- v-for="employee in group.options"
- :key="employee.value"
- :label="`${employee.label} (${employee.dept})`"
- :value="employee.value"
- >
- <div style="display: flex; justify-content: space-between; align-items: center;">
- <div>
- <div style="font-weight: 500;">{{ employee.label }}</div>
- <div style="color: #909399; font-size: 12px;">{{ employee.dept }}</div>
- </div>
- <div style="text-align: right; font-size: 12px; color: #909399;">
- <div v-if="employee.phone">{{ employee.phone }}</div>
- <div v-if="employee.email">{{ employee.email }}</div>
- </div>
- </div>
- </el-option>
- </el-option-group>
- </el-select>
- <div style="margin-top: 8px; color: #909399; font-size: 12px;">
- 宸查�夋嫨 {{ meetingForm.participants.length }} 浜�
- </div>
- <!-- 宸查�夋嫨浜哄憳璇︽儏 -->
- <div v-if="meetingForm.participants.length > 0" style="margin-top: 10px;">
- <el-tag
- v-for="participantId in meetingForm.participants"
- :key="participantId"
- closable
- @close="removeParticipant(participantId)"
- style="margin-right: 8px; margin-bottom: 8px;"
- >
- {{ getEmployeeName(participantId) }}
- </el-tag>
- </div>
- </el-form-item>
- <el-form-item label="浼氳鎻忚堪" prop="description">
- <el-input
- v-model="meetingForm.description"
- type="textarea"
- :rows="3"
- placeholder="璇疯緭鍏ヤ細璁弿杩�"
- />
- </el-form-item>
- </el-form>
- <template #footer>
- <span class="dialog-footer">
- <el-button @click="meetingDialogVisible = false">鍙栨秷</el-button>
- <el-button type="primary" @click="createMeeting">鍒涘缓浼氳</el-button>
- </span>
- </template>
- </el-dialog>
-
- <!-- 鏂囦欢鍏变韩寮圭獥 -->
- <el-dialog
- v-model="fileShareDialogVisible"
- title="鏂囦欢鍏变韩"
- width="700px"
- :close-on-click-modal="false"
- >
- <el-form ref="fileShareFormRef" :model="fileShareForm" :rules="fileShareRules" label-width="120px">
- <el-form-item label="鍏变韩鏍囬" prop="title">
- <el-input v-model="fileShareForm.title" placeholder="璇疯緭鍏ュ叡浜爣棰�" />
- </el-form-item>
- <el-form-item label="鍏变韩鎻忚堪" prop="description">
- <el-input
- v-model="fileShareForm.description"
- type="textarea"
- :rows="3"
- placeholder="璇疯緭鍏ュ叡浜弿杩�"
- />
- </el-form-item>
- <el-form-item label="鎺ユ敹閮ㄩ棬" prop="departments">
- <el-select
- v-model="fileShareForm.departments"
- multiple
- placeholder="璇烽�夋嫨鎺ユ敹閮ㄩ棬"
- style="width: 100%"
- >
- <el-option
- v-for="dept in departments"
- :key="dept"
- :label="dept"
- :value="dept"
- />
- </el-select>
- </el-form-item>
- <el-form-item label="涓婁紶鏂囦欢" prop="files">
- <el-upload
- ref="uploadRef"
- :auto-upload="false"
- :on-change="handleFileChange"
- :on-remove="removeFile"
- :file-list="fileList"
- multiple
- :limit="10"
- accept=".doc,.docx,.pdf,.xls,.xlsx,.ppt,.pptx,.txt,.jpg,.jpeg,.png,.gif"
- >
- <el-button type="primary">閫夋嫨鏂囦欢</el-button>
- <template #tip>
- <div class="el-upload__tip">
- 鏀寔涓婁紶鏂囨。銆佸浘鐗囩瓑鏍煎紡锛屽崟涓枃浠朵笉瓒呰繃10MB锛屾渶澶�10涓枃浠�
- </div>
- </template>
- </el-upload>
- </el-form-item>
- </el-form>
- <template #footer>
- <span class="dialog-footer">
- <el-button @click="fileShareDialogVisible = false">鍙栨秷</el-button>
- <el-button type="primary" @click="shareFiles">鍏变韩鏂囦欢</el-button>
- </span>
- </template>
- </el-dialog>
- </div>
-</template>
-
-<script setup>
-import { Search } from "@element-plus/icons-vue";
-import { onMounted, ref, reactive, toRefs, computed } from "vue";
-import { ElMessage, ElMessageBox } from "element-plus";
-import PIMTable from "@/components/PIMTable/PIMTable.vue";
-import { userListNoPageByTenantId } from "@/api/system/user.js";
-import { staffOnJobListPage } from "@/api/personnelManagement/employeeRecord.js";
-
-// 琛ㄥ崟楠岃瘉瑙勫垯
-const rules = {
- title: [
- { required: true, message: "璇疯緭鍏ラ�氱煡鏍囬", trigger: "blur" }
- ],
- type: [
- { required: true, message: "璇烽�夋嫨閫氱煡绫诲瀷", trigger: "change" }
- ],
- content: [
- { required: true, message: "璇疯緭鍏ラ�氱煡鍐呭", trigger: "blur" }
- ]
-};
-
-const meetingRules = {
- title: [
- { required: true, message: "璇疯緭鍏ヤ細璁爣棰�", trigger: "blur" }
- ],
- startTime: [
- { required: true, message: "璇烽�夋嫨浼氳寮�濮嬫椂闂�", trigger: "change" }
- ],
- participants: [
- { required: true, message: "璇烽�夋嫨鍙備細浜哄憳", trigger: "change" }
- ]
-};
-
-const fileShareRules = {
- title: [
- { required: true, message: "璇疯緭鍏ュ叡浜爣棰�", trigger: "blur" }
- ],
- description: [
- { required: true, message: "璇疯緭鍏ュ叡浜弿杩�", trigger: "blur" }
- ]
-};
-
-// 鍝嶅簲寮忔暟鎹�
-const data = reactive({
- searchForm: {
- title: "",
- type: "",
- status: "",
- },
- tableLoading: false,
- page: {
- current: 1,
- size: 100,
- total: 0,
- },
- tableData: [],
- selectedIds: [],
- // 鏂板閫氱煡鐩稿叧
- form: {
- title: "",
- type: "",
- priority: "medium",
- content: "",
- departments: [],
- expireDate: "",
- syncMethods: []
- },
- dialogVisible: false,
- dialogTitle: "",
- dialogType: "add",
- // 鍦ㄧ嚎浼氳鐩稿叧
- meetingDialogVisible: false,
- meetingForm: {
- title: "",
- startTime: "",
- duration: 60,
- participants: [],
- description: "",
- platform: "wechat"
- },
- // 鏂囦欢鍏变韩鐩稿叧
- fileShareDialogVisible: false,
- fileShareForm: {
- title: "",
- description: "",
- departments: [],
- files: []
- },
- fileList: []
-});
-
-const {
- searchForm,
- tableLoading,
- page,
- tableData,
- selectedIds,
- form,
- dialogVisible,
- dialogTitle,
- dialogType,
- meetingDialogVisible,
- meetingForm,
- fileShareDialogVisible,
- fileShareForm,
- fileList
-} = toRefs(data);
-
-// 琛ㄥ崟寮曠敤
-const formRef = ref();
-const meetingFormRef = ref();
-const fileShareFormRef = ref();
-
-// 琛ㄦ牸鍒楅厤缃�
-const tableColumn = ref([
- {
- label: "閫氱煡鏍囬",
- prop: "title",
- showOverflowTooltip: true,
- },
- {
- label: "閫氱煡绫诲瀷",
- prop: "type",
- dataType: "tag",
- formatData: (params) => {
- const typeMap = {
- holiday: "鏀惧亣閫氱煡",
- penalty: "澶勭綒閫氱煡",
- meeting: "寮�浼氶�氱煡",
- temporary: "涓存椂閫氱煡",
- formal: "姝e紡閫氱煡"
- };
- return typeMap[params] || params;
- },
- formatType: (params) => {
- const typeMap = {
- holiday: "success",
- penalty: "danger",
- meeting: "warning",
- temporary: "info",
- formal: "primary"
- };
- return typeMap[params] || "info";
- }
- },
- {
- label: "浼樺厛绾�",
- prop: "priority",
- dataType: "tag",
- formatData: (params) => {
- const priorityMap = {
- low: "鏅��",
- medium: "閲嶈",
- high: "绱ф��"
- };
- return priorityMap[params] || params;
- },
- formatType: (params) => {
- const typeMap = {
- low: "info",
- medium: "warning",
- high: "danger"
- };
- return typeMap[params] || "info";
- }
- },
- {
- label: "鐘舵��",
- prop: "status",
- dataType: "tag",
- formatData: (params) => {
- const statusMap = {
- draft: "鑽夌",
- published: "宸插彂甯�",
- expired: "宸茶繃鏈�"
- };
- return statusMap[params] || params;
- },
- formatType: (params) => {
- const typeMap = {
- draft: "info",
- published: "success",
- expired: "danger"
- };
- return typeMap[params] || "info";
- }
- },
- {
- label: "鎺ユ敹閮ㄩ棬",
- prop: "departments",
- width: 150,
- showOverflowTooltip: true,
- formatData: (params) => {
- if (!params || params.length === 0) return "鍏ㄩ儴閮ㄩ棬";
- return params.join(", ");
- }
- },
- {
- label: "鏈夋晥鏈熻嚦",
- prop: "expireDate",
- width: 150,
- formatData: (params) => {
- if (!params) return "姘镐箙鏈夋晥";
- return params;
- }
- },
- {
- label: "鍒涘缓鏃堕棿",
- prop: "createTime",
- width: 180,
- },
- {
- dataType: "action",
- label: "鎿嶄綔",
- align: "center",
- fixed: "right",
- width: 280,
- operation: [
- {
- name: "缂栬緫",
- type: "text",
- clickFun: (row) => {
- openForm("edit", row);
- }
- },
- {
- name: "鍙戝竷",
- type: "text",
- clickFun: (row) => {
- publishNotification(row);
- },
- // disabled: (row) => row.status === "published"
- },
- {
- name: "鎾ゅ洖",
- type: "text",
- clickFun: (row) => {
- revokeNotification(row);
- },
- // disabled: (row) => row.status !== "published"
- }
- ]
- }
-]);
-
-// 妯℃嫙鏁版嵁
-let mockData = [
- {
- id: "1",
- title: "2024骞存槬鑺傛斁鍋囬�氱煡",
- type: "holiday",
- priority: "high",
- status: "published",
- content: "鏍规嵁鍥藉瑙勫畾锛岀粨鍚堝叕鍙稿疄闄呮儏鍐碉紝鐜板皢2024骞存槬鑺傛斁鍋囧畨鎺掗�氱煡濡備笅...",
- departments: ["鎶�鏈儴", "閿�鍞儴", "浜轰簨閮�", "璐㈠姟閮�", "杩愯惀閮�", "甯傚満閮�", "瀹㈡湇閮�"],
- expireDate: "2024-02-15",
- syncMethods: ["wechat", "dingtalk", "email"],
- createTime: "2024-01-15 10:30:00"
- },
- {
- id: "2",
- title: "鎶�鏈儴鍛ㄤ緥浼氶�氱煡",
- type: "meeting",
- priority: "medium",
- status: "published",
- content: "鎶�鏈儴瀹氫簬姣忓懆浜斾笅鍗�2鐐瑰彫寮�鍛ㄤ緥浼氾紝璇峰悇浣嶅悓浜嬪噯鏃跺弬鍔�...",
- departments: ["鎶�鏈儴"],
- expireDate: "2024-01-20",
- syncMethods: ["wechat", "dingtalk"],
- createTime: "2024-01-14 15:20:00"
- },
- {
- id: "3",
- title: "鍛樺伐琛屼负瑙勮寖澶勭綒閫氱煡",
- type: "penalty",
- priority: "high",
- status: "draft",
- content: "涓虹淮鎶ゅ叕鍙告甯哥З搴忥紝瑙勮寖鍛樺伐琛屼负锛岀幇瀵硅繚鍙嶅叕鍙歌瀹氱殑琛屼负杩涜澶勭綒...",
- departments: ["浜轰簨閮�", "鎶�鏈儴", "閿�鍞儴"],
- expireDate: "2024-02-13",
- syncMethods: ["wechat", "email"],
- createTime: "2024-01-13 09:15:00"
- }
-];
-
-// 閫氱煡鏍囬妯℃澘
-const titleTemplates = [
- "鍏充簬{year}骞磠holiday}鏀惧亣瀹夋帓鐨勯�氱煡",
- "{dept}閮ㄩ棬{meeting}浼氳閫氱煡",
- "鍛樺伐{behavior}琛屼负瑙勮寖鎻愰啋",
- "{company}閲嶈浜嬮」閫氱煡",
- "{dept}閮ㄩ棬宸ヤ綔瀹夋帓閫氱煡",
- "鍏充簬{project}椤圭洰杩涘害鐨勯�氱煡",
- "{dept}閮ㄩ棬浜哄憳璋冩暣閫氱煡",
- "鍏徃{policy}鏀跨瓥鏇存柊閫氱煡"
-];
-
-// 閫氱煡绫诲瀷閰嶇疆
-const notificationTypes = [
- { type: "holiday", label: "鏀惧亣閫氱煡", priority: "high" },
- { type: "meeting", label: "寮�浼氶�氱煡", priority: "medium" },
- { type: "penalty", label: "澶勭綒閫氱煡", priority: "high" },
- { type: "temporary", label: "涓存椂閫氱煡", priority: "low" },
- { type: "formal", label: "姝e紡閫氱煡", priority: "medium" }
-];
-
-// 閮ㄩ棬鍒楄〃
-const departments = ["鎶�鏈儴", "閿�鍞儴", "浜轰簨閮�", "璐㈠姟閮�", "杩愯惀閮�", "甯傚満閮�", "瀹㈡湇閮�"];
-
-// 浜哄憳鍒楄〃
-const employees = ref([]);
-const employeesLoading = ref(false);
-
-// 鑾峰彇鍦ㄨ亴鍛樺伐鍒楄〃
-const getEmployeesList = async () => {
- try {
- employeesLoading.value = true;
- // 浼樺厛浣跨敤绯荤粺鐢ㄦ埛鎺ュ彛锛堟寜绉熸埛鑾峰彇锛�
- const userResponse = await userListNoPageByTenantId();
-
- if (userResponse.data) {
- employees.value = userResponse.data.map(user => ({
- label: user.nickName || user.userName || '鏈煡濮撳悕',
- value: user.userId || user.id,
- dept: user.dept?.deptName || '鏈煡閮ㄩ棬',
- phone: user.phonenumber || '',
- email: user.email || '',
- status: user.status || '0'
- })).filter(user => user.status === '0'); // 鍙樉绀烘甯哥姸鎬佺殑鐢ㄦ埛
- } else {
- // 濡傛灉绯荤粺鐢ㄦ埛鎺ュ彛澶辫触锛屼娇鐢ㄥ憳宸ュ彴璐︽帴鍙�
- const response = await staffOnJobListPage({
- pageNum: 1,
- pageSize: 1000,
- staffState: 1 // 鍦ㄨ亴鐘舵��
- });
-
- if (response.data && response.data.records) {
- employees.value = response.data.records.map(employee => ({
- label: employee.staffName || employee.name || '鏈煡濮撳悕',
- value: employee.staffNo || employee.id || employee.staffId,
- dept: employee.deptName || employee.department || '鏈煡閮ㄩ棬',
- phone: employee.phone || employee.mobile || '',
- email: employee.email || '',
- status: '0'
- }));
- }
- }
- } catch (error) {
- console.error('鑾峰彇鍛樺伐鍒楄〃澶辫触:', error);
- // 濡傛灉鎺ュ彛閮藉け璐ワ紝浣跨敤榛樿鏁版嵁
- employees.value = [
- { label: "寮犱笁", value: "001", dept: "鎶�鏈儴", phone: "13800138001", email: "zhangsan@company.com", status: "0" },
- { label: "鏉庡洓", value: "002", dept: "閿�鍞儴", phone: "13800138002", email: "lisi@company.com", status: "0" },
- { label: "鐜嬩簲", value: "003", dept: "浜轰簨閮�", phone: "13800138003", email: "wangwu@company.com", status: "0" }
- ];
- } finally {
- employeesLoading.value = false;
- }
-};
-
-// 鍛樺伐鍒嗙粍
-const employeeGroups = computed(() => {
- const groups = {};
- employees.value.forEach(employee => {
- const dept = employee.dept || '鍏朵粬閮ㄩ棬';
- if (!groups[dept]) {
- groups[dept] = [];
- }
- groups[dept].push(employee);
- });
-
- // 鎸夐儴闂ㄥ悕绉版帓搴忥紝纭繚鏄剧ず椤哄簭涓�鑷�
- return Object.keys(groups)
- .sort()
- .map(dept => ({
- label: dept,
- options: groups[dept].sort((a, b) => a.label.localeCompare(b.label, 'zh-CN'))
- }));
-});
-
-// 杩囨护鍛樺伐锛堣繙绋嬫悳绱級
-const filterEmployees = (query) => {
- if (query !== '') {
- const lowerQuery = query.toLowerCase();
- return employees.value.filter(employee =>
- employee.label.toLowerCase().includes(lowerQuery) ||
- employee.dept.toLowerCase().includes(lowerQuery) ||
- (employee.phone && employee.phone.includes(query)) ||
- (employee.email && employee.email.toLowerCase().includes(lowerQuery))
- );
- } else {
- return employees.value;
- }
-};
-
-// 鍒锋柊鍛樺伐鍒楄〃
-const refreshEmployees = async () => {
- ElMessage.info("姝e湪鍒锋柊鍛樺伐鍒楄〃...");
- await getEmployeesList();
-
- // 缁熻鍚勯儴闂ㄤ汉鏁�
- const deptStats = {};
- employees.value.forEach(emp => {
- const dept = emp.dept || '鍏朵粬閮ㄩ棬';
- deptStats[dept] = (deptStats[dept] || 0) + 1;
- });
-
- const deptInfo = Object.entries(deptStats)
- .map(([dept, count]) => `${dept}: ${count}浜篳)
- .join(', ');
-
- ElMessage.success(`鍛樺伐鍒楄〃鍒锋柊瀹屾垚锛屽叡 ${employees.value.length} 浜� (${deptInfo})`);
-};
-
-// 鑾峰彇鍛樺伐濮撳悕
-const getEmployeeName = (employeeId) => {
- const employee = employees.value.find(emp => emp.value === employeeId);
- return employee ? employee.label : '鏈煡浜哄憳';
-};
-
-// 鑾峰彇鍛樺伐璇︾粏淇℃伅
-const getEmployeeInfo = (employeeId) => {
- const employee = employees.value.find(emp => emp.value === employeeId);
- if (!employee) return null;
-
- return {
- name: employee.label,
- dept: employee.dept,
- phone: employee.phone,
- email: employee.email
- };
-};
-
-// 绉婚櫎鍙備細浜哄憳
-const removeParticipant = (participantId) => {
- const index = meetingForm.value.participants.indexOf(participantId);
- if (index > -1) {
- meetingForm.value.participants.splice(index, 1);
- }
-};
-
-// 鍚屾鏂瑰紡閫夐」
-const syncMethods = [
- { label: "浼佷笟寰俊", value: "wechat" },
- { label: "閽夐拤", value: "dingtalk" },
- { label: "閭欢", value: "email" },
- { label: "鐭俊", value: "sms" }
-];
-
-// 浼氳骞冲彴閫夐」
-const meetingPlatforms = [
- { label: "浼佷笟寰俊浼氳", value: "wechat" },
- { label: "閽夐拤浼氳", value: "dingtalk" },
- { label: "鑵捐浼氳", value: "tencent" },
- { label: "Zoom", value: "zoom" }
-];
-
-// 鑷姩鐢熸垚鏂版暟鎹�
-const generateNewData = () => {
- const newId = (mockData.length + 1).toString();
- const now = new Date();
- const randomType = notificationTypes[Math.floor(Math.random() * notificationTypes.length)];
- const randomDept = departments[Math.floor(Math.random() * departments.length)];
-
- // 鐢熸垚闅忔満鏍囬
- let title = titleTemplates[Math.floor(Math.random() * titleTemplates.length)];
- title = title
- .replace('{year}', now.getFullYear())
- .replace('{holiday}', ['鏄ヨ妭', '鍥藉簡', '涓', '鍏冩棪'][Math.floor(Math.random() * 4)])
- .replace('{dept}', randomDept)
- .replace('{meeting}', ['鍛ㄤ緥浼�', '鏈堝害鎬荤粨', '椤圭洰璇勫', '鍩硅浼氳'][Math.floor(Math.random() * 4)])
- .replace('{behavior}', ['鑰冨嫟', '鐫�瑁�', '宸ヤ綔鎬佸害', '鍥㈤槦鍗忎綔'][Math.floor(Math.random() * 4)])
- .replace('{company}', ['鍏徃', '闆嗗洟', '鎬婚儴'][Math.floor(Math.random() * 4)])
- .replace('{project}', ['鏁板瓧鍖栬浆鍨�', '浜у搧鍗囩骇', '甯傚満鎷撳睍', '浜烘墠鍩瑰吇'][Math.floor(Math.random() * 4)])
- .replace('{policy}', ['鑰冨嫟', '钖叕', '绂忓埄', '鏅嬪崌'][Math.floor(Math.random() * 4)]);
-
- // 闅忔満鐘舵��
- const statuses = ['draft', 'published'];
- const randomStatus = statuses[Math.floor(Math.random() * statuses.length)];
-
- // 闅忔満浼樺厛绾�
- const priorities = ['low', 'medium', 'high'];
- const randomPriority = priorities[Math.floor(Math.random() * priorities.length)];
-
- const newNotification = {
- id: newId,
- title: title,
- type: randomType.type,
- priority: randomPriority,
- status: randomStatus,
- content: `杩欐槸${title}鐨勮缁嗗唴瀹癸紝璇风浉鍏充汉鍛樻敞鎰忔煡鐪�...`,
- departments: [randomDept],
- expireDate: new Date(now.getTime() + 30 * 24 * 60 * 60 * 1000).toISOString().split('T')[0], // 30澶╁悗杩囨湡
- syncMethods: ["wechat", "dingtalk"],
- createTime: now.toLocaleString()
- };
-
- // 娣诲姞鍒版暟鎹紑澶�
- mockData.unshift(newNotification);
-
- // 淇濇寔鏁版嵁閲忓湪鍚堢悊鑼冨洿鍐咃紙鏈�澶氫繚鐣�20鏉★級
- if (mockData.length > 20) {
- mockData = mockData.slice(0, 20);
- }
-
- console.log(`[${new Date().toLocaleString()}] 鑷姩鐢熸垚鏂伴�氱煡: ${title}`);
-};
-
-// 鐢熷懡鍛ㄦ湡
-onMounted(() => {
- getList();
- getEmployeesList(); // 鑾峰彇鍛樺伐鍒楄〃
- startAutoRefresh();
-});
-
-// 寮�濮嬭嚜鍔ㄥ埛鏂�
-const startAutoRefresh = () => {
- setInterval(() => {
- generateNewData();
- getList();
- }, 600000); // 10鍒嗛挓鍒锋柊涓�娆� (10 * 60 * 1000 = 600000ms)
-};
-
-// 鏌ヨ鏁版嵁
-const handleQuery = () => {
- page.value.current = 1;
- getList();
-};
-
-const getList = () => {
- tableLoading.value = true;
-
- setTimeout(() => {
- let filteredData = [...mockData];
-
- if (searchForm.value.title) {
- filteredData = filteredData.filter(item =>
- item.title.toLowerCase().includes(searchForm.value.title.toLowerCase())
- );
- }
-
- if (searchForm.value.type) {
- filteredData = filteredData.filter(item => item.type === searchForm.value.type);
- }
-
- tableData.value = filteredData;
- page.value.total = filteredData.length;
- tableLoading.value = false;
- }, 500);
-};
-
-// 鍒嗛〉澶勭悊
-const pagination = (obj) => {
- page.value.current = obj.page;
- page.value.size = obj.limit;
- handleQuery();
-};
-
-// 閫夋嫨鍙樺寲澶勭悊
-const handleSelectionChange = (selection) => {
- selectedIds.value = selection.map(item => item.id);
-};
-
-// 鎵撳紑琛ㄥ崟
-const openForm = (type, row = null) => {
- dialogType.value = type;
- if (type === "add") {
- dialogTitle.value = "鏂板閫氱煡";
- // 閲嶇疆琛ㄥ崟
- Object.assign(form.value, {
- title: "",
- type: "",
- priority: "medium",
- content: "",
- departments: [],
- expireDate: "",
- syncMethods: []
- });
- } else if (type === "edit" && row) {
- dialogTitle.value = "缂栬緫閫氱煡";
- Object.assign(form.value, {
- title: row.title,
- type: row.type,
- priority: row.priority,
- content: row.content || "",
- departments: row.departments || [],
- expireDate: row.expireDate || "",
- syncMethods: row.syncMethods || []
- });
- }
- dialogVisible.value = true;
-};
-
-// 鎵撳紑鍦ㄧ嚎浼氳寮圭獥
-const openMeetingDialog = () => {
- // 閲嶇疆琛ㄥ崟
- Object.assign(meetingForm.value, {
- title: "",
- startTime: "",
- duration: 60,
- participants: [],
- description: "",
- platform: "wechat"
- });
- meetingDialogVisible.value = true;
-};
-
-// 鎵撳紑鏂囦欢鍏变韩寮圭獥
-const openFileShareDialog = () => {
- // 閲嶇疆琛ㄥ崟
- Object.assign(fileShareForm.value, {
- title: "",
- description: "",
- departments: [],
- files: []
- });
- fileList.value = [];
- fileShareDialogVisible.value = true;
-};
-
-// 鎵嬪姩鍒锋柊鏁版嵁
-const manualRefresh = () => {
- generateNewData();
- getList();
- ElMessage.success("鎵嬪姩鍒锋柊瀹屾垚锛屽凡鐢熸垚鏂伴�氱煡");
-};
-
-// 鎻愪氦閫氱煡琛ㄥ崟
-const submitForm = async () => {
- try {
- await formRef.value.validate();
-
- if (dialogType.value === "add") {
- // 鏂板閫氱煡
- const newNotification = {
- id: (mockData.length + 1).toString(),
- title: form.value.title,
- type: form.value.type,
- priority: form.value.priority,
- status: "draft",
- content: form.value.content,
- departments: form.value.departments,
- expireDate: form.value.expireDate,
- syncMethods: form.value.syncMethods,
- createTime: new Date().toLocaleString()
- };
-
- mockData.unshift(newNotification);
- ElMessage.success("閫氱煡鍒涘缓鎴愬姛");
- } else {
- // 缂栬緫閫氱煡
- const index = mockData.findIndex(item => item.id === selectedIds.value[0]);
- if (index !== -1) {
- Object.assign(mockData[index], {
- title: form.value.title,
- type: form.value.type,
- priority: form.value.priority,
- content: form.value.content,
- departments: form.value.departments,
- expireDate: form.value.expireDate,
- syncMethods: form.value.syncMethods
- });
- ElMessage.success("閫氱煡鏇存柊鎴愬姛");
- }
- }
-
- dialogVisible.value = false;
- getList();
- } catch (error) {
- console.error("琛ㄥ崟楠岃瘉澶辫触:", error);
- }
-};
-
-// 鍒涘缓浼氳
-const createMeeting = async () => {
- try {
- await meetingFormRef.value.validate();
-
- // 妯℃嫙鍒涘缓浼氳
- const meetingInfo = {
- title: meetingForm.value.title,
- startTime: meetingForm.value.startTime,
- duration: meetingForm.value.duration,
- participants: meetingForm.value.participants,
- description: meetingForm.value.description,
- platform: meetingForm.value.platform,
- meetingId: `MTG${Date.now()}`
- };
-
- // 妯℃嫙鍙戦�佸埌浼佷笟寰俊/閽夐拤
- const platformName = meetingPlatforms.find(p => p.value === meetingForm.value.platform)?.label || "鏈煡骞冲彴";
-
- ElMessage.success(`浼氳鍒涘缓鎴愬姛锛佷細璁甀D: ${meetingInfo.meetingId}锛屽皢閫氳繃${platformName}鍙戦�侀�氱煡`);
- meetingDialogVisible.value = false;
-
- // 鑾峰彇鍙備細浜哄憳淇℃伅
- const participantNames = meetingForm.value.participants.map(participantId => {
- const employee = employees.value.find(emp => emp.value === participantId);
- return employee ? employee.label : '鏈煡浜哄憳';
- }).join('銆�');
-
- // 鑾峰彇鍙備細浜哄憳璇︾粏淇℃伅
- const participantDetails = meetingForm.value.participants.map(participantId => {
- const employee = employees.value.find(emp => emp.value === participantId);
- return employee ? {
- name: employee.label,
- dept: employee.dept,
- phone: employee.phone,
- email: employee.email
- } : null;
- }).filter(Boolean);
-
- // 灏嗕細璁俊鎭坊鍔犲埌閫氱煡鍒楄〃
- const meetingNotification = {
- id: (mockData.length + 1).toString(),
- title: `[浼氳閫氱煡] ${meetingInfo.title}`,
- type: "meeting",
- priority: "high",
- status: "published",
- content: `浼氳鏃堕棿: ${meetingInfo.startTime}锛屾椂闀�: ${meetingInfo.duration}鍒嗛挓锛屽钩鍙�: ${meetingPlatforms.find(p => p.value === meetingForm.value.platform)?.label || "鏈煡骞冲彴"}锛屽弬浼氫汉鍛�: ${participantNames}锛屽叡${participantDetails.length}浜篳,
- departments: [],
- expireDate: "",
- syncMethods: [meetingForm.value.platform],
- createTime: new Date().toLocaleString()
- };
-
- mockData.unshift(meetingNotification);
- getList();
- } catch (error) {
- console.error("浼氳琛ㄥ崟楠岃瘉澶辫触:", error);
- }
-};
-
-// 鏂囦欢涓婁紶澶勭悊
-const handleFileChange = (file) => {
- const isLt10M = file.size / 1024 / 1024 < 10;
- if (!isLt10M) {
- ElMessage.error("涓婁紶鏂囦欢澶у皬涓嶈兘瓒呰繃 10MB!");
- return false;
- }
-
- const fileInfo = {
- name: file.name,
- size: file.size,
- type: file.type,
- uid: file.uid
- };
-
- fileList.value.push(fileInfo);
- fileShareForm.value.files.push(fileInfo);
- return false; // 闃绘鑷姩涓婁紶
-};
-
-// 绉婚櫎鏂囦欢
-const removeFile = (file) => {
- const index = fileList.value.findIndex(item => item.uid === file.uid);
- if (index !== -1) {
- const index2 = fileShareForm.value.files.findIndex(item => item.uid === file.uid);
- if (index2 !== -1) {
- fileShareForm.value.files.splice(index2, 1);
- }
- fileList.value.splice(index, 1);
- }
-};
-
-// 鍏变韩鏂囦欢
-const shareFiles = async () => {
- try {
- await fileShareFormRef.value.validate();
-
- if (fileShareForm.value.files.length === 0) {
- ElMessage.warning("璇疯嚦灏戦�夋嫨涓�涓枃浠�");
- return;
- }
-
- // 妯℃嫙鏂囦欢鍏变韩
- const shareInfo = {
- title: fileShareForm.value.title,
- description: fileShareForm.value.description,
- departments: fileShareForm.value.departments,
- files: fileShareForm.value.files,
- shareId: `FILE${Date.now()}`
- };
-
- ElMessage.success(`鏂囦欢鍏变韩鎴愬姛锛佸叡浜獻D: ${shareInfo.shareId}锛屽凡閫氱煡鐩稿叧閮ㄩ棬`);
- fileShareDialogVisible.value = false;
-
- // 灏嗘枃浠跺叡浜俊鎭坊鍔犲埌閫氱煡鍒楄〃
- const fileShareNotification = {
- id: (mockData.length + 1).toString(),
- title: `[鏂囦欢鍏变韩] ${shareInfo.title}`,
- type: "temporary",
- priority: "medium",
- status: "published",
- content: `鍏变韩鎻忚堪: ${shareInfo.description}锛屾枃浠舵暟閲�: ${shareInfo.files.length}涓猔,
- departments: shareInfo.departments,
- expireDate: "",
- syncMethods: ["wechat", "dingtalk"],
- createTime: new Date().toLocaleString()
- };
-
- mockData.unshift(fileShareNotification);
- getList();
- } catch (error) {
- console.error("鏂囦欢鍏变韩琛ㄥ崟楠岃瘉澶辫触:", error);
- }
-};
-
-// 鍙戝竷閫氱煡
-const publishNotification = (row) => {
- row.status = "published";
- ElMessage.success("閫氱煡鍙戝竷鎴愬姛");
- getList();
-};
-
-// 鎾ゅ洖閫氱煡
-const revokeNotification = (row) => {
- row.status = "draft";
- ElMessage.success("閫氱煡宸叉挙鍥�");
- getList();
-};
-
-// 鍒犻櫎閫氱煡
-const handleDelete = () => {
- if (selectedIds.value.length === 0) {
- ElMessage.warning("璇烽�夋嫨瑕佸垹闄ょ殑閫氱煡");
- return;
- }
-
- ElMessageBox.confirm("閫変腑鐨勫唴瀹瑰皢琚垹闄わ紝鏄惁纭鍒犻櫎锛�", "鍒犻櫎", {
- confirmButtonText: "纭",
- cancelButtonText: "鍙栨秷",
- type: "warning",
- }).then(() => {
- ElMessage.success("鍒犻櫎鎴愬姛");
- selectedIds.value = [];
- getList();
- }).catch(() => {
- // 鐢ㄦ埛鍙栨秷
- });
-};
-</script>
-
-<style scoped>
-.auto-refresh-info {
- margin-bottom: 15px;
-}
-
-.auto-refresh-info .el-alert {
- border-radius: 8px;
-}
-
-.dialog-footer {
- text-align: right;
-}
-
-.el-upload__tip {
- color: #909399;
- font-size: 12px;
- margin-top: 8px;
-}
-
-.el-checkbox-group {
- display: flex;
- flex-wrap: wrap;
- gap: 10px;
-}
-
-.el-checkbox {
- margin-right: 0;
-}
-</style>
diff --git a/src/views/collaborativeApproval/rpaManagement/index.vue b/src/views/collaborativeApproval/rpaManagement/index.vue
deleted file mode 100644
index 51cef73..0000000
--- a/src/views/collaborativeApproval/rpaManagement/index.vue
+++ /dev/null
@@ -1,400 +0,0 @@
-<template>
- <div class="app-container">
- <div class="search_form">
- <div>
- <span class="search_title">绋嬪簭鍚嶏細</span>
- <el-input
- v-model="searchForm.programName"
- style="width: 240px"
- placeholder="璇疯緭鍏ョ▼搴忓悕鎼滅储"
- @change="handleQuery"
- clearable
- :prefix-icon="Search"
- />
- <span class="search_title ml10">鎵ц鐘舵�侊細</span>
- <el-select v-model="searchForm.status" clearable @change="handleQuery" style="width: 240px">
- <el-option label="杩愯涓�" :value="'running'" />
- <el-option label="宸插仠姝�" :value="'stopped'" />
- <el-option label="寮傚父" :value="'error'" />
- </el-select>
- <el-button type="primary" @click="handleQuery" style="margin-left: 10px">
- 鎼滅储
- </el-button>
- </div>
- <div>
- <el-button type="primary" @click="openForm('add')">鏂板</el-button>
- <el-button type="danger" plain @click="handleDelete">鍒犻櫎</el-button>
- </div>
- </div>
- <div class="table_list">
- <PIMTable
- rowKey="id"
- :column="tableColumn"
- :tableData="tableData"
- :page="page"
- :isSelection="true"
- @selection-change="handleSelectionChange"
- :tableLoading="tableLoading"
- @pagination="pagination"
- :total="page.total"
- ></PIMTable>
- </div>
-
- <!-- RPA琛ㄥ崟寮圭獥 -->
- <el-dialog
- v-model="dialogVisible"
- :title="dialogTitle"
- width="500px"
- :close-on-click-modal="false"
- >
- <el-form
- ref="formRef"
- :model="form"
- :rules="rules"
- label-width="100px"
- >
- <el-form-item label="绋嬪簭鍚�" prop="programName">
- <el-input
- v-model="form.programName"
- placeholder="璇疯緭鍏ョ▼搴忓悕"
- clearable
- />
- </el-form-item>
- <el-form-item label="鎵ц鐘舵��" prop="status">
- <el-select v-model="form.status" placeholder="璇烽�夋嫨鎵ц鐘舵��" style="width: 100%">
- <el-option label="杩愯涓�" value="running" />
- <el-option label="宸插仠姝�" value="stopped" />
- <el-option label="寮傚父" value="error" />
- </el-select>
- </el-form-item>
- <el-form-item label="鎻忚堪" prop="description">
- <el-input
- v-model="form.description"
- type="textarea"
- :rows="3"
- placeholder="璇疯緭鍏PA绋嬪簭鎻忚堪"
- clearable
- />
- </el-form-item>
- </el-form>
- <template #footer>
- <span class="dialog-footer">
- <el-button @click="dialogVisible = false">鍙栨秷</el-button>
- <el-button type="primary" @click="submitForm">纭畾</el-button>
- </span>
- </template>
- </el-dialog>
- </div>
-</template>
-
-<script setup>
-import { Search } from "@element-plus/icons-vue";
-import { onMounted, ref, reactive, toRefs } from "vue";
-import { ElMessage, ElMessageBox } from "element-plus";
-import PIMTable from "@/components/PIMTable/PIMTable.vue";
-
-// 鍝嶅簲寮忔暟鎹�
-const data = reactive({
- searchForm: {
- programName: "",
- status: "",
- },
- form: {
- id: "",
- programName: "",
- status: "stopped",
- description: "",
- createTime: "",
- },
- dialogVisible: false,
- dialogTitle: "",
- dialogType: "add",
- selectedIds: [],
- tableLoading: false,
- page: {
- current: 1,
- size: 100,
- total: 0,
- },
- tableData: [],
-});
-
-const { searchForm, form, dialogVisible, dialogTitle, dialogType, selectedIds, tableLoading, page, tableData } = toRefs(data);
-
-// 琛ㄥ崟寮曠敤
-const formRef = ref();
-
-// 琛ㄥ崟楠岃瘉瑙勫垯
-const rules = {
- programName: [
- { required: true, message: "璇疯緭鍏ョ▼搴忓悕", trigger: "blur" }
- ],
- status: [
- { required: true, message: "璇烽�夋嫨鎵ц鐘舵��", trigger: "change" }
- ]
-};
-
-// 琛ㄦ牸鍒楅厤缃�
-const tableColumn = ref([
- {
- label: "绋嬪簭鍚�",
- prop: "programName",
- // width: 200,
- },
- {
- label: "鎵ц鐘舵��",
- prop: "status",
- dataType: "tag",
- // width: 120,
- formatData: (params) => {
- const statusMap = {
- running: "杩愯涓�",
- stopped: "宸插仠姝�",
- error: "寮傚父"
- };
- return statusMap[params] || params;
- },
- formatType: (params) => {
- const typeMap = {
- running: "success",
- stopped: "info",
- error: "danger"
- };
- return typeMap[params] || "info";
- }
- },
- {
- label: "鎻忚堪",
- prop: "description",
- // width: 300,
- showOverflowTooltip: true,
- },
- {
- label: "鍒涘缓鏃堕棿",
- prop: "createTime",
- // width: 180,
- },
- {
- dataType: "action",
- label: "鎿嶄綔",
- align: "center",
- fixed: "right",
- width: 230,
- operation: [
- {
- name: "缂栬緫",
- type: "text",
- clickFun: (row) => {
- openForm("edit", row);
- }
- },
- {
- name: "寮�濮�",
- type: "text",
- clickFun: (row) => {
- handleStart(row);
- },
- disabled: (row) => row.status !== 'stopped'
- },
- {
- name: "鍋滄",
- type: "text",
- clickFun: (row) => {
- handleStop(row);
- },
- disabled: (row) => row.status === 'stopped'
- }
- ]
- }
-]);
-
-// 妯℃嫙鏁版嵁
-const mockData = [
- {
- id: "1",
- programName: "璁㈠崟澶勭悊RPA",
- status: "running",
- description: "鑷姩澶勭悊瀹㈡埛璁㈠崟锛屽寘鎷獙璇併�佸垎閰嶅拰纭",
- createTime: "2024-01-15 10:30:00"
- },
- {
- id: "2",
- programName: "搴撳瓨鍚屾RPA",
- status: "stopped",
- description: "鍚屾澶氫釜浠撳簱鐨勫簱瀛樻暟鎹紝纭繚鏁版嵁涓�鑷存��",
- createTime: "2024-01-14 15:20:00"
- },
- {
- id: "3",
- programName: "鎶ヨ〃鐢熸垚RPA",
- status: "error",
- description: "鑷姩鐢熸垚姣忔棩閿�鍞姤琛ㄥ拰搴撳瓨鎶ヨ〃",
- createTime: "2024-01-13 09:15:00"
- }
-];
-
-// 鐢熷懡鍛ㄦ湡
-onMounted(() => {
- getList();
-});
-
-// 鏌ヨ鏁版嵁
-const handleQuery = () => {
- page.value.current = 1;
- getList();
-};
-
-const getList = () => {
- tableLoading.value = true;
-
- // 妯℃嫙API璋冪敤寤惰繜
- setTimeout(() => {
- let filteredData = [...mockData];
-
- // 鏍规嵁鎼滅储鏉′欢杩囨护鏁版嵁
- if (searchForm.value.programName) {
- filteredData = filteredData.filter(item =>
- item.programName.toLowerCase().includes(searchForm.value.programName.toLowerCase())
- );
- }
-
- if (searchForm.value.status) {
- filteredData = filteredData.filter(item => item.status === searchForm.value.status);
- }
-
- tableData.value = filteredData;
- page.value.total = filteredData.length;
- tableLoading.value = false;
- }, 500);
-};
-
-// 鍒嗛〉澶勭悊
-const pagination = (obj) => {
- page.value.current = obj.page;
- page.value.size = obj.limit;
- handleQuery();
-};
-
-// 閫夋嫨鍙樺寲澶勭悊
-const handleSelectionChange = (selection) => {
- selectedIds.value = selection.map(item => item.id);
-};
-
-// 鎵撳紑琛ㄥ崟
-const openForm = (type, row) => {
- dialogType.value = type;
- dialogVisible.value = true;
-
- if (type === "add") {
- dialogTitle.value = "娣诲姞RPA";
- form.value = {
- id: "",
- programName: "",
- status: "stopped",
- description: "",
- createTime: "",
- };
- } else {
- dialogTitle.value = "缂栬緫RPA";
- form.value = { ...row };
- }
-};
-
-// 鎻愪氦琛ㄥ崟
-const submitForm = async () => {
- if (!formRef.value) return;
-
- try {
- await formRef.value.validate();
-
- if (dialogType.value === "add") {
- // 娣诲姞鏂癛PA
- const newRPA = {
- id: Date.now().toString(),
- programName: form.value.programName,
- status: form.value.status,
- description: form.value.description,
- createTime: new Date().toLocaleString(),
- };
-
- mockData.unshift(newRPA);
- ElMessage.success("RPA娣诲姞鎴愬姛");
- } else {
- // 缂栬緫RPA
- const index = mockData.findIndex(item => item.id === form.value.id);
- if (index !== -1) {
- mockData[index] = { ...form.value };
- ElMessage.success("RPA鏇存柊鎴愬姛");
- }
- }
-
- dialogVisible.value = false;
- getList();
- } catch (error) {
- console.error("琛ㄥ崟楠岃瘉澶辫触:", error);
- }
-};
-
-// 寮�濮婻PA
-const handleStart = (row) => {
- ElMessageBox.confirm(`纭畾瑕佸惎鍔≧PA绋嬪簭"${row.programName}"鍚楋紵`, "鎻愮ず", {
- confirmButtonText: "纭",
- cancelButtonText: "鍙栨秷",
- type: "warning",
- }).then(() => {
- row.status = "running";
- ElMessage.success("RPA鍚姩鎴愬姛");
- getList();
- }).catch(() => {
- // 鐢ㄦ埛鍙栨秷
- });
-};
-
-// 鍋滄RPA
-const handleStop = (row) => {
- ElMessageBox.confirm(`纭畾瑕佸仠姝PA绋嬪簭"${row.programName}"鍚楋紵`, "鎻愮ず", {
- confirmButtonText: "纭",
- cancelButtonText: "鍙栨秷",
- type: "warning",
- }).then(() => {
- row.status = "stopped";
- ElMessage.success("RPA鍋滄鎴愬姛");
- getList();
- }).catch(() => {
- // 鐢ㄦ埛鍙栨秷
- });
-};
-
-// 鍒犻櫎RPA
-const handleDelete = () => {
- let ids = [];
- if (selectedIds.value.length > 0) {
- ids = selectedIds.value.map((item) => item.id);
- } else {
- ElMessage.warning("璇烽�夋嫨瑕佸垹闄ょ殑RPA");
- return;
- }
-
- ElMessageBox.confirm("閫変腑鐨勫唴瀹瑰皢琚垹闄わ紝鏄惁纭鍒犻櫎锛�", "鍒犻櫎", {
- confirmButtonText: "纭",
- cancelButtonText: "鍙栨秷",
- type: "warning",
- }).then(() => {
- // 浠庢ā鎷熸暟鎹腑鍒犻櫎閫変腑鐨勯」
- ids.forEach(id => {
- const index = mockData.findIndex(item => item.id === id);
- if (index !== -1) {
- mockData.splice(index, 1);
- }
- });
-
- ElMessage.success("鍒犻櫎鎴愬姛");
- selectedIds.value = [];
- getList();
- }).catch(() => {
- // 鐢ㄦ埛鍙栨秷
- });
-};
-</script>
-
-<style scoped></style>
diff --git a/src/views/collaborativeApproval/warningSystem/index.vue b/src/views/collaborativeApproval/warningSystem/index.vue
deleted file mode 100644
index b04c583..0000000
--- a/src/views/collaborativeApproval/warningSystem/index.vue
+++ /dev/null
@@ -1,307 +0,0 @@
-<template>
- <div class="warning-system">
- <h2>棰勮鑱斿姩鏈哄埗</h2>
-
- <!-- 缁熻鍗$墖 -->
- <div class="stats">
- <div class="stat-card red">
- <span class="number">2</span>
- <span class="label">绾㈣壊棰勮</span>
- </div>
- <div class="stat-card orange">
- <span class="number">1</span>
- <span class="label">姗欒壊棰勮</span>
- </div>
- <div class="stat-card yellow">
- <span class="number">1</span>
- <span class="label">榛勮壊棰勮</span>
- </div>
- <div class="stat-card green">
- <span class="number">1</span>
- <span class="label">缁胯壊棰勮</span>
- </div>
- </div>
-
- <!-- 棰勮鍒楄〃 -->
- <div class="warning-list">
- <h3>棰勮鍒楄〃</h3>
- <table>
- <thead>
- <tr>
- <th>缂栧彿</th>
- <th>鏍囬</th>
- <th>绫诲瀷</th>
- <th>绛夌骇</th>
- <th>鐘舵��</th>
- <th>璐d换浜�</th>
- <th>鎿嶄綔</th>
- </tr>
- </thead>
- <tbody>
- <tr v-for="warning in warnings" :key="warning.id">
- <td>{{ warning.id }}</td>
- <td>{{ warning.title }}</td>
- <td>{{ warning.type }}</td>
- <td>
- <span :class="['level-tag', warning.level]">
- {{ warning.levelText }}
- </span>
- </td>
- <td>
- <span :class="['status-tag', warning.status]">
- {{ warning.statusText }}
- </span>
- </td>
- <td>{{ warning.responsible }}</td>
- <td>
- <button @click="viewDetail(warning)">鏌ョ湅璇︽儏</button>
- </td>
- </tr>
- </tbody>
- </table>
- </div>
-
- <!-- 璇︽儏瀵硅瘽妗� -->
- <div v-if="showDetail" class="modal">
- <div class="modal-content">
- <h3>棰勮璇︽儏</h3>
- <div v-if="currentWarning">
- <p><strong>缂栧彿锛�</strong>{{ currentWarning.id }}</p>
- <p><strong>鏍囬锛�</strong>{{ currentWarning.title }}</p>
- <p><strong>绫诲瀷锛�</strong>{{ currentWarning.type }}</p>
- <p><strong>绛夌骇锛�</strong>{{ currentWarning.levelText }}</p>
- <p><strong>鎻忚堪锛�</strong>{{ currentWarning.description }}</p>
- <p><strong>褰卞搷锛�</strong>{{ currentWarning.impact }}</p>
- <p><strong>寤鸿锛�</strong>{{ currentWarning.suggestions }}</p>
- </div>
- <button @click="showDetail = false">鍏抽棴</button>
- </div>
- </div>
- </div>
-</template>
-
-<script>
-export default {
- name: 'WarningSystem',
- data() {
- return {
- showDetail: false,
- currentWarning: null,
- warnings: [
- {
- id: 'W001',
- title: '椤圭洰棰勭畻瓒呮敮棰勮',
- type: '璐㈠姟棰勮',
- level: 'red',
- levelText: '绾㈣壊棰勮',
- status: 'pending',
- statusText: '寰呭鐞�',
- responsible: '寮犵粡鐞�',
- description: 'A椤圭洰棰勭畻鎵ц鐜囧凡杈�95%锛岄璁″皢瓒呭嚭棰勭畻鑼冨洿銆�',
- impact: '褰卞搷椤圭洰鏁翠綋璐㈠姟鎸囨爣锛屽彲鑳藉鑷撮」鐩簭鎹�',
- suggestions: '鏆傚仠闈炲繀瑕佹敮鍑猴紝浼樺寲璧勬簮閰嶇疆锛岀敵璇烽绠楄皟鏁�'
- },
- {
- id: 'W002',
- title: '鍚堝悓鍒版湡棰勮',
- type: '鍚堣棰勮',
- level: 'orange',
- levelText: '姗欒壊棰勮',
- status: 'processing',
- statusText: '澶勭悊涓�',
- responsible: '鏉庝富绠�',
- description: '涓庝緵搴斿晢B鐨勫悎鍚屽皢浜�2024骞�1鏈�25鏃ュ埌鏈熴��',
- impact: '褰卞搷渚涘簲閾剧ǔ瀹氭�э紝鍙兘瀵艰嚧鏈嶅姟涓柇',
- suggestions: '璇勪及渚涘簲鍟嗚〃鐜帮紝鍑嗗缁鏉愭枡锛屽埗瀹氬閫夋柟妗�'
- },
- {
- id: 'W003',
- title: '璁惧缁存姢棰勮',
- type: '杩愯惀棰勮',
- level: 'yellow',
- levelText: '榛勮壊棰勮',
- status: 'pending',
- statusText: '寰呭鐞�',
- responsible: '鐜嬪伐绋嬪笀',
- description: '鐢熶骇绾胯澶嘋宸茶繍琛�8000灏忔椂锛屾帴杩戠淮鎶ゅ懆鏈熴��',
- impact: '鍙兘褰卞搷鐢熶骇鏁堢巼鍜屼骇鍝佽川閲�',
- suggestions: '瀹夋帓缁存姢鏃堕棿锛屽噯澶囧浠讹紝鍒跺畾缁存姢璁″垝'
- },
- {
- id: 'W004',
- title: '浜哄憳閰嶇疆棰勮',
- type: '杩愯惀棰勮',
- level: 'green',
- levelText: '缁胯壊棰勮',
- status: 'resolved',
- statusText: '宸茶В鍐�',
- responsible: '璧礖R',
- description: '鎶�鏈儴闂ㄤ汉鍛橀厤缃厖瓒筹紝椤圭洰杩涘害姝e父銆�',
- impact: '鏃犺礋闈㈠奖鍝�',
- suggestions: '缁х画鐩戞帶浜哄憳閰嶇疆鎯呭喌'
- },
- {
- id: 'W005',
- title: '璐ㄩ噺浜嬫晠棰勮',
- type: '杩愯惀棰勮',
- level: 'red',
- levelText: '绾㈣壊棰勮',
- status: 'pending',
- statusText: '寰呭鐞�',
- responsible: '闄堟�荤洃',
- description: '浜у搧D鍦ㄥ鎴风幇鍦哄嚭鐜拌川閲忛棶棰樸��',
- impact: '褰卞搷瀹㈡埛婊℃剰搴︼紝鍙兘閫犳垚缁忔祹鎹熷け',
- suggestions: '绔嬪嵆鍙洖闂浜у搧锛屽垎鏋愬師鍥狅紝鍒跺畾鏀硅繘鎺柦'
- }
- ]
- }
- },
- methods: {
- viewDetail(warning) {
- this.currentWarning = warning
- this.showDetail = true
- }
- }
-}
-</script>
-
-<style scoped>
-.warning-system {
- padding: 20px;
- max-width: 1200px;
- margin: 0 auto;
-}
-
-h2 {
- color: #333;
- margin-bottom: 30px;
-}
-
-.stats {
- display: grid;
- grid-template-columns: repeat(auto-fit, minmax(200px, 1fr));
- gap: 20px;
- margin-bottom: 30px;
-}
-
-.stat-card {
- padding: 20px;
- border-radius: 8px;
- color: white;
- text-align: center;
- box-shadow: 0 2px 8px rgba(0,0,0,0.1);
-}
-
-.stat-card.red { background: linear-gradient(135deg, #ff6b6b, #ee5a52); }
-.stat-card.orange { background: linear-gradient(135deg, #ffa726, #ff9800); }
-.stat-card.yellow { background: linear-gradient(135deg, #ffd54f, #ffc107); }
-.stat-card.green { background: linear-gradient(135deg, #66bb6a, #4caf50); }
-
-.stat-card .number {
- display: block;
- font-size: 32px;
- font-weight: bold;
- margin-bottom: 8px;
-}
-
-.stat-card .label {
- font-size: 14px;
- opacity: 0.9;
-}
-
-.warning-list h3 {
- margin-bottom: 20px;
- color: #333;
-}
-
-table {
- width: 100%;
- border-collapse: collapse;
- background: white;
- border-radius: 8px;
- overflow: hidden;
- box-shadow: 0 2px 8px rgba(0,0,0,0.1);
-}
-
-th, td {
- padding: 12px;
- text-align: left;
- border-bottom: 1px solid #eee;
-}
-
-th {
- background: #f8f9fa;
- font-weight: 600;
- color: #333;
-}
-
-.level-tag, .status-tag {
- padding: 4px 8px;
- border-radius: 4px;
- font-size: 12px;
- color: white;
-}
-
-.level-tag.red { background: #f56c6c; }
-.level-tag.orange { background: #e6a23c; }
-.level-tag.yellow { background: #e6a23c; }
-.level-tag.green { background: #67c23a; }
-
-.status-tag.pending { background: #f56c6c; }
-.status-tag.processing { background: #e6a23c; }
-.status-tag.resolved { background: #67c23a; }
-
-button {
- padding: 6px 12px;
- margin: 0 4px;
- border: none;
- border-radius: 4px;
- cursor: pointer;
- font-size: 12px;
- background: #409eff;
- color: white;
-}
-
-.modal {
- position: fixed;
- top: 0;
- left: 0;
- width: 100%;
- height: 100%;
- background: rgba(0,0,0,0.5);
- display: flex;
- align-items: center;
- justify-content: center;
-}
-
-.modal-content {
- background: white;
- padding: 30px;
- border-radius: 8px;
- max-width: 600px;
- width: 90%;
- max-height: 80vh;
- overflow-y: auto;
-}
-
-.modal-content h3 {
- margin-bottom: 20px;
- color: #333;
-}
-
-.modal-content p {
- margin-bottom: 15px;
- line-height: 1.6;
-}
-
-.modal-content strong {
- color: #333;
-}
-
-.modal-content button {
- background: #409eff;
- color: white;
- padding: 10px 20px;
- font-size: 14px;
-}
-</style>
diff --git a/src/views/customerService/afterSalesHandling/components/formDia.vue b/src/views/customerService/afterSalesHandling/components/formDia.vue
deleted file mode 100644
index cfdb01c..0000000
--- a/src/views/customerService/afterSalesHandling/components/formDia.vue
+++ /dev/null
@@ -1,212 +0,0 @@
-<template>
- <div>
- <el-dialog
- v-model="dialogFormVisible"
- title="鍞悗澶勭悊"
- width="70%"
- @close="closeDia"
- >
- <el-form
- :model="form"
- label-width="140px"
- label-position="top"
- :rules="rules"
- ref="formRef"
- >
- <el-row :gutter="30">
- <el-col :span="12">
- <el-form-item label="鍙嶉鏃堕棿锛�" prop="feedbackDate">
- <el-date-picker
- style="width: 100%"
- v-model="form.feedbackDate"
- value-format="YYYY-MM-DD"
- format="YYYY-MM-DD"
- type="date"
- placeholder="璇烽�夋嫨"
- clearable
- disabled
- />
- </el-form-item>
- </el-col>
- <el-col :span="12">
- <el-form-item label="鐧昏浜猴細" prop="checkUserId">
- <el-select
- v-model="form.checkUserId"
- placeholder="璇烽�夋嫨"
- clearable
- disabled
- >
- <el-option
- v-for="item in userList"
- :key="item.userId"
- :label="item.nickName"
- :value="item.userId"
- ></el-option>
- </el-select>
- </el-form-item>
- </el-col>
- </el-row>
- <el-row :gutter="30">
- <el-col :span="12">
- <el-form-item label="瀹㈡埛鍚嶇О锛�" prop="customerName">
- <el-input
- v-model="form.customerName"
- placeholder="璇疯緭鍏�"
- clearable
- disabled
- />
- </el-form-item>
- </el-col>
- <el-col :span="12">
- <el-form-item label="闂鎻忚堪锛�" prop="proDesc">
- <el-input
- v-model="form.proDesc"
- placeholder="璇疯緭鍏�"
- clearable
- disabled
- type="textarea"
- />
- </el-form-item>
- </el-col>
- </el-row>
- <el-row :gutter="30">
- <el-col :span="24">
- <el-form-item label="澶勭悊缁撴灉锛�" prop="disRes">
- <el-input
- v-model="form.disRes"
- placeholder="璇疯緭鍏�"
- clearable
- :disabled="operationType === 'view'"
- type="textarea"
- />
- </el-form-item>
- </el-col>
- </el-row>
- </el-form>
- <el-row :gutter="30">
- <el-col :span="12">
- <el-form-item label="澶勭悊浜猴細" prop="disposeUserId">
- <el-select
- v-model="form.disposeUserId"
- placeholder="璇烽�夋嫨"
- clearable
- disabled
- >
- <el-option
- v-for="item in userList"
- :key="item.userId"
- :label="item.nickName"
- :value="item.userId"
- ></el-option>
- </el-select>
- </el-form-item>
- </el-col>
- <el-col :span="12">
- <el-form-item label="澶勭悊鏃堕棿锛�" prop="disDate">
- <el-date-picker
- style="width: 100%"
- v-model="form.disDate"
- value-format="YYYY-MM-DD"
- format="YYYY-MM-DD"
- type="date"
- placeholder="璇烽�夋嫨"
- clearable
- disabled
- />
- </el-form-item>
- </el-col>
- </el-row>
- <template #footer>
- <div class="dialog-footer">
- <el-button type="primary" @click="submitForm">纭</el-button>
- <el-button @click="closeDia">鍙栨秷</el-button>
- </div>
- </template>
- </el-dialog>
- </div>
-</template>
-
-<script setup>
-import {ref} from "vue";
-import useUserStore from "@/store/modules/user.js";
-import {userListNoPageByTenantId} from "@/api/system/user.js";
-import {afterSalesServiceAdd, afterSalesServiceDispose, afterSalesServiceUpdate} from "@/api/customerService/index.js";
-const { proxy } = getCurrentInstance()
-const emit = defineEmits(['close'])
-const dialogFormVisible = ref(false);
-const operationType = ref('')
-const userStore = useUserStore();
-
-const data = reactive({
- form: {
- feedbackDate: "",
- checkUserId: "",
- customerName: "",
- proDesc: "",
- disposeUserId: "",
- disDate: "",
- disRes: "",
- },
- rules: {
- feedbackDate: [{required: true, message: "璇烽�夋嫨", trigger: "change"}],
- checkUserId: [{required: true, message: "璇烽�夋嫨", trigger: "change"}],
- customerName: [{required: true, message: "璇疯緭鍏�", trigger: "blur"}],
- proDesc: [{required: true, message: "璇疯緭鍏�", trigger: "blur"}],
- disRes: [{required: true, message: "璇疯緭鍏�", trigger: "blur"}],
- disposeUserId: [{required: true, message: "璇烽�夋嫨", trigger: "change"}],
- disDate: [{required: true, message: "璇烽�夋嫨", trigger: "change"}],
- }
-})
-const { form, rules } = toRefs(data);
-const userList = ref([])
-
-// 鎵撳紑寮规
-const openDialog = (type, row) => {
- operationType.value = type;
- dialogFormVisible.value = true;
- userListNoPageByTenantId().then((res) => {
- userList.value = res.data;
- });
- form.value = {...row}
- form.value.disposeUserId = userStore.id;
- form.value.disDate = getCurrentDate();
-}
-// const setName = (code) => {
-// const index = userList.value.findIndex(item => item.deviceModel === code);
-// if (index > -1) {
-// console.log(userList)
-// form.value.name = userList.value[index].deviceName;
-// }
-// }
-const submitForm = () => {
- proxy.$refs["formRef"].validate(valid => {
- if (valid) {
- afterSalesServiceDispose(form.value).then(response => {
- proxy.$modal.msgSuccess("鏂板鎴愬姛")
- closeDia()
- })
- }
- })
-}
-// 鍏抽棴寮规
-const closeDia = () => {
- proxy.resetForm("formRef");
- dialogFormVisible.value = false;
- emit('close')
-};
-// 鑾峰彇褰撳墠鏃ユ湡骞舵牸寮忓寲涓� YYYY-MM-DD
-function getCurrentDate() {
- const today = new Date();
- const year = today.getFullYear();
- const month = String(today.getMonth() + 1).padStart(2, "0"); // 鏈堜唤浠�0寮�濮�
- const day = String(today.getDate()).padStart(2, "0");
- return `${year}-${month}-${day}`;
-}
-defineExpose({
- openDialog,
-});
-</script>
-
-<style scoped>
-
-</style>
\ No newline at end of file
diff --git a/src/views/customerService/afterSalesHandling/index.vue b/src/views/customerService/afterSalesHandling/index.vue
deleted file mode 100644
index 818270d..0000000
--- a/src/views/customerService/afterSalesHandling/index.vue
+++ /dev/null
@@ -1,235 +0,0 @@
-<template>
- <div class="app-container">
- <div class="search_form">
- <div>
- <span class="search_title">鍙嶉鏃ユ湡锛�</span>
- <el-date-picker
- v-model="searchForm.feedbackDate"
- value-format="YYYY-MM-DD"
- format="YYYY-MM-DD"
- type="date"
- placeholder="璇烽�夋嫨"
- clearable
- @change="handleQuery"
- />
- <span class="search_title ml10">澶勭悊鏃ユ湡锛�</span>
- <el-date-picker
- v-model="searchForm.disDate"
- value-format="YYYY-MM-DD"
- format="YYYY-MM-DD"
- type="date"
- placeholder="璇烽�夋嫨"
- clearable
- @change="handleQuery"
- />
- <span style = "margin-left: 10px;" class="search_title">澶勭悊鐘舵�侊細</span>
- <el-select v-model="searchForm.status" placeholder="璇烽�夋嫨鐘舵��" @change="handleQuery" style="width: 140px" clearable>
- <el-option label="寰呭鐞�" :value="1"></el-option>
- <el-option label="宸插鐞�" :value="2"></el-option>
- </el-select>
- <el-button type="primary" @click="handleQuery" style="margin-left: 10px"
- >鎼滅储</el-button
- >
- </div>
- </div>
- <div class="table_list">
- <PIMTable
- rowKey="id"
- :column="tableColumn"
- :tableData="tableData"
- :page="page"
- :isSelection="true"
- @selection-change="handleSelectionChange"
- :tableLoading="tableLoading"
- @pagination="pagination"
- ></PIMTable>
- </div>
- <form-dia ref="formDia" @close="handleQuery"></form-dia>
- </div>
-</template>
-
-<script setup>
-import {Search} from "@element-plus/icons-vue";
-import {onMounted, ref} from "vue";
-import FormDia from "@/views/customerService/afterSalesHandling/components/formDia.vue";
-import {ElMessageBox} from "element-plus";
-import {afterSalesServiceDelete, afterSalesServiceListPage} from "@/api/customerService/index.js";
-import useUserStore from "@/store/modules/user.js";
-const { proxy } = getCurrentInstance();
-const userStore = useUserStore()
-
-const data = reactive({
- searchForm: {
- feedbackDate: "",
- disDate: "",
- },
-});
-const { searchForm } = toRefs(data);
-
-const tableColumn = ref([
- {
- label: "澶勭悊鐘舵��",
- prop: "status",
- dataType: "tag",
- formatData: (params) => {
- if (params == 1) {
- return "寰呭鐞�";
- } else if (params == 2) {
- return "宸插鐞�";
- } else {
- return null;
- }
- },
- formatType: (params) => {
- if (params == 1) {
- return "danger";
- } else if (params == 2) {
- return "success";
- } else {
- return null;
- }
- },
- },
- {
- label: "鍙嶉鏃ユ湡",
- prop: "feedbackDate",
- width: 150,
- },
- {
- label: "鐧昏浜�",
- prop: "checkNickName",
- },
- {
- label: "瀹㈡埛鍚嶇О",
- prop: "customerName",
- width: 200,
- },
- {
- label: "闂鎻忚堪",
- prop: "proDesc",
- width:300
- },
- {
- label: "鍏宠仈閮ㄩ棬",
- prop: "deptName",
- width: 200,
- },
- {
- label: "澶勭悊浜�",
- prop: "disposeNickName",
- },
- {
- label: "澶勭悊缁撴灉",
- prop: "disRes",
- width: 200,
- },
- {
- label: "澶勭悊鏃ユ湡",
- prop: "disDate",
- width: 150,
- },
- {
- dataType: "action",
- label: "鎿嶄綔",
- align: "center",
- fixed: 'right',
- width: 120,
- operation: [
- {
- name: "澶勭悊",
- type: "text",
- clickFun: (row) => {
- openForm("approve", row);
- },
- disabled: (row) => {
- return row.status !== 1
- }
- },
- {
- name: "鏌ョ湅",
- type: "text",
- clickFun: (row) => {
- openForm("view", row);
- },
- },
- ],
- },
-]);
-const tableData = ref([]);
-const tableLoading = ref(false);
-const page = reactive({
- current: 1,
- size: 100,
- total: 0,
-});
-const selectedRows = ref([]);
-
-// 琛ㄦ牸閫夋嫨鏁版嵁
-const handleSelectionChange = (selection) => {
- selectedRows.value = selection;
-};
-const formDia = ref()
-
-// 鏌ヨ鍒楄〃
-/** 鎼滅储鎸夐挳鎿嶄綔 */
-const handleQuery = () => {
- page.current = 1;
- getList();
-};
-const pagination = (obj) => {
- page.current = obj.page;
- page.size = obj.limit;
- getList();
-};
-const getList = () => {
- tableLoading.value = true;
- afterSalesServiceListPage({ ...searchForm.value, ...page }).then((res) => {
- tableLoading.value = false;
- tableData.value = res.data.records;
- page.total = res.data.total;
- });
-};
-
-// 鎵撳紑寮规
-const openForm = (type, row) => {
- nextTick(() => {
- formDia.value?.openDialog(type, row)
- })
-};
-
-const handleDelete = () => {
- let ids = [];
- if (selectedRows.value.length > 0) {
- ids = selectedRows.value.map((item) => item.id);
- } else {
- proxy.$modal.msgWarning("璇烽�夋嫨鏁版嵁");
- return;
- }
- ElMessageBox.confirm("閫変腑鐨勫唴瀹瑰皢琚垹闄わ紝鏄惁纭鍒犻櫎锛�", "鍒犻櫎鎻愮ず", {
- confirmButtonText: "纭",
- cancelButtonText: "鍙栨秷",
- type: "warning",
- })
- .then(() => {
- tableLoading.value = true;
- afterSalesServiceDelete(ids)
- .then((res) => {
- proxy.$modal.msgSuccess("鍒犻櫎鎴愬姛");
- getList();
- })
- .finally(() => {
- tableLoading.value = false;
- });
- })
- .catch(() => {
- proxy.$modal.msg("宸插彇娑�");
- });
-};
-onMounted(() => {
- getList();
-});
-</script>
-
-<style scoped>
-
-</style>
\ No newline at end of file
diff --git a/src/views/customerService/feedbackRegistration/components/formDia.vue b/src/views/customerService/feedbackRegistration/components/formDia.vue
deleted file mode 100644
index a37002b..0000000
--- a/src/views/customerService/feedbackRegistration/components/formDia.vue
+++ /dev/null
@@ -1,167 +0,0 @@
-<template>
- <div>
- <el-dialog
- v-model="dialogFormVisible"
- title="鍞悗鐧昏"
- width="70%"
- @close="closeDia"
- >
- <el-form
- :model="form"
- label-width="140px"
- label-position="top"
- :rules="rules"
- ref="formRef"
- >
- <el-row :gutter="30">
- <el-col :span="12">
- <el-form-item label="鍙嶉鏃堕棿锛�" prop="feedbackDate">
- <el-date-picker
- style="width: 100%"
- v-model="form.feedbackDate"
- value-format="YYYY-MM-DD"
- format="YYYY-MM-DD"
- type="date"
- placeholder="璇烽�夋嫨"
- clearable
- />
- </el-form-item>
- </el-col>
- <el-col :span="12">
- <el-form-item label="鐧昏浜猴細" prop="checkUserId">
- <el-select
- v-model="form.checkUserId"
- placeholder="璇烽�夋嫨"
- clearable
- >
- <el-option
- v-for="item in userList"
- :key="item.userId"
- :label="item.nickName"
- :value="item.userId"
- ></el-option>
- </el-select>
- </el-form-item>
- </el-col>
- </el-row>
- <el-row :gutter="30">
- <el-col :span="12">
- <el-form-item label="瀹㈡埛鍚嶇О锛�" prop="customerName">
- <el-input
- v-model="form.customerName"
- placeholder="璇疯緭鍏�"
- clearable
- />
- </el-form-item>
- </el-col>
- <el-col :span="12">
- <el-form-item label="闂鎻忚堪锛�" prop="proDesc">
- <el-input
- v-model="form.proDesc"
- placeholder="璇疯緭鍏�"
- clearable
- type="textarea"
- />
- </el-form-item>
- </el-col>
- </el-row>
- </el-form>
- <template #footer>
- <div class="dialog-footer">
- <el-button type="primary" @click="submitForm">纭</el-button>
- <el-button @click="closeDia">鍙栨秷</el-button>
- </div>
- </template>
- </el-dialog>
- </div>
-</template>
-
-<script setup>
-import {ref} from "vue";
-import useUserStore from "@/store/modules/user.js";
-import {userListNoPageByTenantId} from "@/api/system/user.js";
-import {afterSalesServiceAdd, afterSalesServiceUpdate} from "@/api/customerService/index.js";
-const { proxy } = getCurrentInstance()
-const emit = defineEmits(['close'])
-const dialogFormVisible = ref(false);
-const operationType = ref('')
-const userStore = useUserStore();
-
-const data = reactive({
- form: {
- feedbackDate: "",
- checkUserId: "",
- customerName: "",
- proDesc: "",
- },
- rules: {
- feedbackDate: [{required: true, message: "璇烽�夋嫨", trigger: "change"}],
- checkUserId: [{required: true, message: "璇烽�夋嫨", trigger: "change"}],
- customerName: [{required: true, message: "璇疯緭鍏�", trigger: "blur"}],
- proDesc: [{required: true, message: "璇疯緭鍏�", trigger: "blur"}],
- }
-})
-const { form, rules } = toRefs(data);
-const userList = ref([])
-
-// 鎵撳紑寮规
-const openDialog = (type, row) => {
- operationType.value = type;
- dialogFormVisible.value = true;
- form.value = {}
- proxy.resetForm("formRef");
- form.value.checkUserId = userStore.id;
- form.value.feedbackDate = getCurrentDate();
- userListNoPageByTenantId().then((res) => {
- userList.value = res.data;
- });
- if (type === "edit") {
- form.value = {...row}
- }
-}
-// const setName = (code) => {
-// const index = userList.value.findIndex(item => item.deviceModel === code);
-// if (index > -1) {
-// console.log(userList)
-// form.value.name = userList.value[index].deviceName;
-// }
-// }
-const submitForm = () => {
- proxy.$refs["formRef"].validate(valid => {
- if (valid) {
- if (operationType.value === "add") {
- afterSalesServiceAdd(form.value).then(response => {
- proxy.$modal.msgSuccess("鏂板鎴愬姛")
- closeDia()
- })
- } else {
- afterSalesServiceUpdate(form.value).then(response => {
- proxy.$modal.msgSuccess("淇敼鎴愬姛")
- closeDia()
- })
- }
- }
- })
-}
-// 鍏抽棴寮规
-const closeDia = () => {
- proxy.resetForm("formRef");
- dialogFormVisible.value = false;
- emit('close')
-};
-// 鑾峰彇褰撳墠鏃ユ湡骞舵牸寮忓寲涓� YYYY-MM-DD
-function getCurrentDate() {
- const today = new Date();
- const year = today.getFullYear();
- const month = String(today.getMonth() + 1).padStart(2, "0"); // 鏈堜唤浠�0寮�濮�
- const day = String(today.getDate()).padStart(2, "0");
- return `${year}-${month}-${day}`;
-}
-defineExpose({
- openDialog,
-});
-</script>
-
-<style scoped>
-
-</style>
\ No newline at end of file
diff --git a/src/views/customerService/feedbackRegistration/index.vue b/src/views/customerService/feedbackRegistration/index.vue
deleted file mode 100644
index 780de93..0000000
--- a/src/views/customerService/feedbackRegistration/index.vue
+++ /dev/null
@@ -1,212 +0,0 @@
-<template>
- <div class="app-container">
- <div class="search_form">
- <div>
- <span class="search_title">鍙嶉鏃ユ湡锛�</span>
- <el-date-picker
- v-model="searchForm.feedbackDate"
- value-format="YYYY-MM-DD"
- format="YYYY-MM-DD"
- type="date"
- placeholder="璇烽�夋嫨"
- clearable
- @change="handleQuery"
- />
- <span style="margin-left: 10px;" class="search_title">澶勭悊鐘舵�侊細</span>
- <el-select v-model="searchForm.status" placeholder="璇烽�夋嫨鐘舵��" @change="handleQuery" style="width: 140px" clearable>
- <el-option label="寰呭鐞�" :value="1"></el-option>
- <el-option label="宸插鐞�" :value="2"></el-option>
- </el-select>
- <el-button type="primary" @click="handleQuery" style="margin-left: 10px"
- >鎼滅储</el-button
- >
- </div>
- <div>
- <el-button type="primary" @click="openForm('add')">鏂板</el-button>
- <el-button type="danger" plain @click="handleDelete">鍒犻櫎</el-button>
- </div>
- </div>
- <div class="table_list">
- <PIMTable
- rowKey="id"
- :column="tableColumn"
- :tableData="tableData"
- :page="page"
- :isSelection="true"
- @selection-change="handleSelectionChange"
- :tableLoading="tableLoading"
- @pagination="pagination"
- ></PIMTable>
- </div>
- <form-dia ref="formDia" @close="handleQuery"></form-dia>
- </div>
-</template>
-
-<script setup>
-import {Search} from "@element-plus/icons-vue";
-import {onMounted, ref} from "vue";
-import FormDia from "@/views/customerService/feedbackRegistration/components/formDia.vue";
-import {ElMessageBox} from "element-plus";
-import {afterSalesServiceDelete, afterSalesServiceListPage} from "@/api/customerService/index.js";
-import useUserStore from "@/store/modules/user.js";
-const { proxy } = getCurrentInstance();
-const userStore = useUserStore()
-
-const data = reactive({
- searchForm: {
- feedbackDate: "",
- },
-});
-const { searchForm } = toRefs(data);
-
-const tableColumn = ref([
- {
- label: "澶勭悊鐘舵��",
- prop: "status",
- dataType: "tag",
- formatData: (params) => {
- if (params == 1) {
- return "寰呭鐞�";
- } else if (params == 2) {
- return "宸插鐞�";
- } else {
- return null;
- }
- },
- formatType: (params) => {
- if (params == 1) {
- return "danger";
- } else if (params == 2) {
- return "success";
- } else {
- return null;
- }
- },
- },
- {
- label: "鍙嶉鏃ユ湡",
- prop: "feedbackDate",
- width: 150,
- },
- {
- label: "鐧昏浜�",
- prop: "checkNickName",
- },
- {
- label: "瀹㈡埛鍚嶇О",
- prop: "customerName",
- width: 200,
- },
- {
- label: "闂鎻忚堪",
- prop: "proDesc",
- width:300
- },
- {
- label: "鍏宠仈閮ㄩ棬",
- prop: "deptName",
- width: 200,
- },
- {
- dataType: "action",
- label: "鎿嶄綔",
- align: "center",
- fixed: 'right',
- operation: [
- {
- name: "缂栬緫",
- type: "text",
- clickFun: (row) => {
- openForm("edit", row);
- },
- disabled: (row) => {
- return row.checkUserId !== userStore.id || row.status !== 1
- }
- },
- ],
- },
-]);
-const tableData = ref([]);
-const tableLoading = ref(false);
-const page = reactive({
- current: 1,
- size: 100,
- total: 0,
-});
-const selectedRows = ref([]);
-
-// 琛ㄦ牸閫夋嫨鏁版嵁
-const handleSelectionChange = (selection) => {
- selectedRows.value = selection;
-};
-const formDia = ref()
-
-// 鏌ヨ鍒楄〃
-/** 鎼滅储鎸夐挳鎿嶄綔 */
-const handleQuery = () => {
- page.current = 1;
- getList();
-};
-const pagination = (obj) => {
- page.current = obj.page;
- page.size = obj.limit;
- getList();
-};
-const getList = () => {
- tableLoading.value = true;
- afterSalesServiceListPage({ ...searchForm.value, ...page }).then((res) => {
- tableLoading.value = false;
- tableData.value = res.data.records;
- page.total = res.data.total;
- });
-};
-
-// 鎵撳紑寮规
-const openForm = (type, row) => {
- nextTick(() => {
- formDia.value?.openDialog(type, row)
- })
-};
-
-const handleDelete = () => {
- let ids = [];
- if (selectedRows.value.length > 0) {
- // 妫�鏌ユ槸鍚︽湁浠栦汉缁存姢鐨勬暟鎹�
- const unauthorizedData = selectedRows.value.filter(item => item.checkUserId !== userStore.id);
- if (unauthorizedData.length > 0) {
- proxy.$modal.msgWarning("涓嶅彲鍒犻櫎浠栦汉缁存姢鐨勬暟鎹�");
- return;
- }
- ids = selectedRows.value.map((item) => item.id);
- } else {
- proxy.$modal.msgWarning("璇烽�夋嫨鏁版嵁");
- return;
- }
- ElMessageBox.confirm("閫変腑鐨勫唴瀹瑰皢琚垹闄わ紝鏄惁纭鍒犻櫎锛�", "鍒犻櫎鎻愮ず", {
- confirmButtonText: "纭",
- cancelButtonText: "鍙栨秷",
- type: "warning",
- })
- .then(() => {
- tableLoading.value = true;
- afterSalesServiceDelete(ids)
- .then((res) => {
- proxy.$modal.msgSuccess("鍒犻櫎鎴愬姛");
- getList();
- })
- .finally(() => {
- tableLoading.value = false;
- });
- })
- .catch(() => {
- proxy.$modal.msg("宸插彇娑�");
- });
-};
-onMounted(() => {
- getList();
-});
-</script>
-
-<style scoped>
-
-</style>
\ No newline at end of file
diff --git a/src/views/demo/fakePage/index.vue b/src/views/demo/fakePage/index.vue
deleted file mode 100644
index 7ef8b89..0000000
--- a/src/views/demo/fakePage/index.vue
+++ /dev/null
@@ -1,248 +0,0 @@
-<template>
- <div class="app-container">
- <el-card shadow="never">
- <div class="toolbar">
- <el-input
- v-model="query.keyword"
- placeholder="鎼滅储鍚嶇О/绫诲埆"
- clearable
- style="width: 240px"
- @keyup.enter="handleSearch"
- />
- <el-select
- v-model="query.status"
- placeholder="鐘舵��"
- clearable
- style="width: 140px; margin-left: 12px"
- >
- <el-option label="鍚敤" value="鍚敤" />
- <el-option label="鍋滅敤" value="鍋滅敤" />
- </el-select>
- <el-button type="primary" style="margin-left: 12px" @click="handleSearch">鏌ヨ</el-button>
- <el-button @click="resetQuery">閲嶇疆</el-button>
- <el-button type="success" plain style="float: right" @click="openCreate">鏂板</el-button>
- </div>
-
- <el-table :data="pagedList" border style="width: 100%" height="480" stripe>
- <el-table-column prop="id" label="缂栧彿" width="90" sortable />
- <el-table-column prop="name" label="鍚嶇О" min-width="140" />
- <el-table-column prop="category" label="绫诲埆" width="120" />
- <el-table-column prop="stock" label="搴撳瓨" width="100" sortable />
- <el-table-column prop="price" label="鍗曚环(楼)" width="120">
- <template #default="scope">{{ formatPrice(scope.row.price) }}</template>
- </el-table-column>
- <el-table-column label="鐘舵��" width="120">
- <template #default="scope">
- <el-tag :type="scope.row.status === '鍚敤' ? 'success' : 'info'">{{ scope.row.status }}</el-tag>
- </template>
- </el-table-column>
- <el-table-column prop="updatedAt" label="鏇存柊鏃堕棿" min-width="160" />
- <el-table-column label="鎿嶄綔" width="180" fixed="right">
- <template #default="scope">
- <el-button link type="primary" @click="openEdit(scope.row)">缂栬緫</el-button>
- <el-button link type="danger" @click="handleDelete(scope.row)">鍒犻櫎</el-button>
- </template>
- </el-table-column>
- </el-table>
-
- <div class="pagination">
- <el-pagination
- background
- layout="total, sizes, prev, pager, next, jumper"
- :total="filteredList.length"
- :page-sizes="[5, 10, 20, 50]"
- :page-size="pager.pageSize"
- :current-page="pager.pageNum"
- @size-change="handleSizeChange"
- @current-change="handleCurrentChange"
- />
- </div>
- </el-card>
-
- <el-dialog v-model="dialogVisible" :title="isEdit ? '缂栬緫' : '鏂板'" width="520px">
- <el-form :model="form" :rules="rules" ref="formRef" label-width="90px">
- <el-form-item label="鍚嶇О" prop="name">
- <el-input v-model="form.name" placeholder="璇疯緭鍏ュ悕绉�" />
- </el-form-item>
- <el-form-item label="绫诲埆" prop="category">
- <el-select v-model="form.category" placeholder="璇烽�夋嫨绫诲埆" style="width: 100%">
- <el-option label="鍘熸枡" value="鍘熸枡" />
- <el-option label="鍗婃垚鍝�" value="鍗婃垚鍝�" />
- <el-option label="鎴愬搧" value="鎴愬搧" />
- </el-select>
- </el-form-item>
- <el-form-item label="搴撳瓨" prop="stock">
- <el-input v-model.number="form.stock" type="number" min="0" />
- </el-form-item>
- <el-form-item label="鍗曚环(楼)" prop="price">
- <el-input v-model.number="form.price" type="number" min="0" step="0.01" />
- </el-form-item>
- <el-form-item label="鐘舵��" prop="status">
- <el-radio-group v-model="form.status">
- <el-radio label="鍚敤">鍚敤</el-radio>
- <el-radio label="鍋滅敤">鍋滅敤</el-radio>
- </el-radio-group>
- </el-form-item>
- </el-form>
- <template #footer>
- <el-button @click="dialogVisible = false">鍙� 娑�</el-button>
- <el-button type="primary" @click="submitForm">纭� 瀹�</el-button>
- </template>
- </el-dialog>
- </div>
-
-</template>
-
-<script setup>
-import { ref, reactive, computed, nextTick } from 'vue'
-import { ElMessage, ElMessageBox } from 'element-plus'
-
-defineOptions({ name: 'FakePage' })
-
-const query = reactive({
- keyword: '',
- status: ''
-})
-
-const pager = reactive({
- pageNum: 1,
- pageSize: 10
-})
-
-const allList = ref(generateMockData())
-
-const filteredList = computed(() => {
- const keyword = (query.keyword || '').trim()
- const status = query.status
- return allList.value.filter(item => {
- const hitKeyword = !keyword || item.name.includes(keyword) || item.category.includes(keyword)
- const hitStatus = !status || item.status === status
- return hitKeyword && hitStatus
- })
-})
-
-const pagedList = computed(() => {
- const start = (pager.pageNum - 1) * pager.pageSize
- const end = start + pager.pageSize
- return filteredList.value.slice(start, end)
-})
-
-function handleSearch() {
- pager.pageNum = 1
-}
-
-function resetQuery() {
- query.keyword = ''
- query.status = ''
- pager.pageNum = 1
-}
-
-function handleSizeChange(size) {
- pager.pageSize = size
- pager.pageNum = 1
-}
-
-function handleCurrentChange(page) {
- pager.pageNum = page
-}
-
-function formatPrice(val) {
- return Number(val || 0).toFixed(2)
-}
-
-// 鏂板/缂栬緫
-const dialogVisible = ref(false)
-const isEdit = ref(false)
-const formRef = ref()
-const form = reactive({ id: null, name: '', category: '', stock: 0, price: 0, status: '鍚敤' })
-
-const rules = {
- name: [{ required: true, message: '璇疯緭鍏ュ悕绉�', trigger: 'blur' }],
- category: [{ required: true, message: '璇烽�夋嫨绫诲埆', trigger: 'change' }],
- stock: [{ required: true, message: '璇疯緭鍏ュ簱瀛�', trigger: 'blur' }],
- price: [{ required: true, message: '璇疯緭鍏ュ崟浠�', trigger: 'blur' }]
-}
-
-function openCreate() {
- isEdit.value = false
- Object.assign(form, { id: null, name: '', category: '', stock: 0, price: 0, status: '鍚敤' })
- dialogVisible.value = true
- nextTick(() => formRef.value?.clearValidate?.())
-}
-
-function openEdit(row) {
- isEdit.value = true
- Object.assign(form, JSON.parse(JSON.stringify(row)))
- dialogVisible.value = true
- nextTick(() => formRef.value?.clearValidate?.())
-}
-
-function submitForm() {
- formRef.value?.validate?.((valid) => {
- if (!valid) return
- if (isEdit.value) {
- const index = allList.value.findIndex(x => x.id === form.id)
- if (index > -1) {
- allList.value[index] = { ...form, updatedAt: nowString() }
- ElMessage.success('宸蹭繚瀛�')
- }
- } else {
- const newId = Date.now()
- allList.value.unshift({ ...form, id: newId, updatedAt: nowString() })
- ElMessage.success('宸叉柊澧�')
- }
- dialogVisible.value = false
- })
-}
-
-function handleDelete(row) {
- ElMessageBox.confirm(`纭鍒犻櫎銆�${row.name}銆戝悧锛焋, '鎻愮ず', { type: 'warning' })
- .then(() => {
- allList.value = allList.value.filter(x => x.id !== row.id)
- ElMessage.success('宸插垹闄�')
- })
- .catch(() => {})
-}
-
-function generateMockData() {
- const categories = ['鍘熸枡', '鍗婃垚鍝�', '鎴愬搧']
- const statusOptions = ['鍚敤', '鍋滅敤']
- const list = []
- for (let i = 1; i <= 36; i++) {
- list.push({
- id: i,
- name: `鐗╂枡-${i.toString().padStart(3, '0')}`,
- category: categories[i % categories.length],
- stock: Math.floor(Math.random() * 1000),
- price: (Math.random() * 500 + 10).toFixed(2),
- status: statusOptions[i % 2],
- updatedAt: nowString()
- })
- }
- return list
-}
-
-function nowString() {
- const d = new Date()
- const yyyy = d.getFullYear()
- const MM = String(d.getMonth() + 1).padStart(2, '0')
- const dd = String(d.getDate()).padStart(2, '0')
- const hh = String(d.getHours()).padStart(2, '0')
- const mm = String(d.getMinutes()).padStart(2, '0')
- const ss = String(d.getSeconds()).padStart(2, '0')
- return `${yyyy}-${MM}-${dd} ${hh}:${mm}:${ss}`
-}
-</script>
-
-<style scoped>
-.toolbar {
- margin-bottom: 12px;
-}
-.pagination {
- margin-top: 12px;
- text-align: right;
-}
-</style>
-
-
-
diff --git a/src/views/energyManagement/dynamicEnergySaving/index.vue b/src/views/energyManagement/dynamicEnergySaving/index.vue
deleted file mode 100644
index 2666e0f..0000000
--- a/src/views/energyManagement/dynamicEnergySaving/index.vue
+++ /dev/null
@@ -1,659 +0,0 @@
-<template>
- <div class="app-container">
- <!-- 杈圭紭璁$畻鐘舵�佺洃鎺� -->
- <el-row :gutter="20" class="status-section">
- <el-col :span="8">
- <el-card class="status-card">
- <div class="status-item">
- <div class="status-icon">
- <el-icon><Monitor /></el-icon>
- </div>
- <div class="status-info">
- <div class="status-title">杈圭紭鏈嶅姟鍣ㄧ姸鎬�</div>
- <div class="status-value" :class="edgeServerStatus.status">
- {{ edgeServerStatus.status === 'online' ? '鍦ㄧ嚎' : '绂荤嚎' }}
- </div>
- <div class="status-detail">鏈�鍚庡績璺�: {{ formatTime(edgeServerStatus.lastHeartbeat) }}</div>
- </div>
- </div>
- </el-card>
- </el-col>
- <el-col :span="8">
- <el-card class="status-card">
- <div class="status-item">
- <div class="status-icon">
- <el-icon><Cpu /></el-icon>
- </div>
- <div class="status-info">
- <div class="status-title">妯″瀷杩愯鐘舵��</div>
- <div class="status-value" :class="modelStatus.status">
- {{ modelStatus.status === 'running' ? '杩愯涓�' : '宸插仠姝�' }}
- </div>
- <div class="status-detail">杩愯妯″瀷: {{ modelStatus.modelCount }}涓�</div>
- </div>
- </div>
- </el-card>
- </el-col>
- <el-col :span="8">
- <el-card class="status-card">
- <div class="status-item">
- <div class="status-icon">
- <el-icon><TrendCharts /></el-icon>
- </div>
- <div class="status-info">
- <div class="status-title">鑺傝兘鏁堟灉</div>
- <div class="status-value success">{{ energySavingRate.toFixed(1) }}%</div>
- <div class="status-detail">绱鑺傝兘: {{ totalEnergySaved.toFixed(1) }}kWh</div>
- </div>
- </div>
- </el-card>
- </el-col>
- </el-row>
-
- <!-- 娉ㄦ按娉甸鐜囦紭鍖栨帶鍒� -->
- <el-card class="control-section">
- <template #header>
- <span>娉ㄦ按娉甸鐜囦紭鍖栨帶鍒�</span>
- </template>
-
- <el-row :gutter="20">
- <el-col :span="12">
- <div class="pump-control">
- <h4>瀹炴椂鍙傛暟鐩戞帶</h4>
- <el-form label-width="120px">
- <el-form-item label="鍦板眰鍘嬪姏 (MPa)">
- <el-input v-model="pumpData.formationPressure" readonly>
- <template #append>MPa</template>
- </el-input>
- </el-form-item>
- <el-form-item label="褰撳墠娉甸�� (Hz)">
- <el-input v-model="pumpData.currentFrequency" readonly>
- <template #append>Hz</template>
- </el-input>
- </el-form-item>
- <el-form-item label="浼樺寲鍚庢车閫� (Hz)">
- <el-input v-model="pumpData.optimizedFrequency" readonly>
- <template #append>Hz</template>
- </el-input>
- </el-form-item>
- <el-form-item label="鑳借�楅檷浣�">
- <el-progress
- :percentage="pumpData.energyReduction"
- :color="getProgressColor"
- :format="format => `${format}%`"
- />
- </el-form-item>
- <el-form-item label="娴侀噺 (m鲁/h)">
- <el-input v-model="pumpData.flowRate" readonly>
- <template #append>m鲁/h</template>
- </el-input>
- </el-form-item>
- <el-form-item label="鍔熺巼 (kW)">
- <el-input v-model="pumpData.power" readonly>
- <template #append>kW</template>
- </el-input>
- </el-form-item>
- </el-form>
- </div>
- </el-col>
-
- <el-col :span="12">
- <div class="pump-chart">
- <h4>棰戠巼浼樺寲瓒嬪娍</h4>
- <div ref="frequencyChart" style="height: 300px;"></div>
- </div>
- </el-col>
- </el-row>
-
- <el-row :gutter="20" class="control-buttons">
- <el-col :span="24">
- <el-button
- type="primary"
- :disabled="!canControl"
- @click="applyOptimization"
- >
- 搴旂敤浼樺寲璁剧疆
- </el-button>
- <el-button
- type="warning"
- :disabled="!canControl"
- @click="emergencyStop"
- >
- 绱ф�ュ仠姝�
- </el-button>
- <el-button
- type="info"
- @click="showOptimizationHistory"
- >
- 浼樺寲鍘嗗彶
- </el-button>
- <el-button
- type="success"
- @click="toggleAutoRefresh"
- >
- {{ autoRefreshStatus ? '鍋滄鑷姩鍒锋柊' : '寮�鍚嚜鍔ㄥ埛鏂�' }}
- </el-button>
- </el-col>
- </el-row>
- </el-card>
-
- <!-- 杈圭紭璁$畻妯″瀷閰嶇疆 -->
- <el-card class="model-section">
- <template #header>
- <span>杈圭紭璁$畻妯″瀷閰嶇疆</span>
- </template>
-
- <el-table :data="modelConfigs" style="width: 100%" stripe>
- <el-table-column prop="modelName" label="妯″瀷鍚嶇О" />
- <el-table-column prop="version" label="鐗堟湰" />
- <el-table-column prop="status" label="鐘舵��">
- <template #default="scope">
- <el-tag :type="scope.row.status === 'active' ? 'success' : 'info'">
- {{ scope.row.status === 'active' ? '婵�娲�' : '寰呮満' }}
- </el-tag>
- </template>
- </el-table-column>
- <el-table-column prop="accuracy" label="鍑嗙‘鐜�" />
- <el-table-column prop="lastUpdate" label="鏈�鍚庢洿鏂�" />
- <el-table-column label="鎿嶄綔">
- <template #default="scope">
- <el-button
- size="small"
- @click="updateModel(scope.row)"
- >
- 鏇存柊妯″瀷
- </el-button>
- <el-button
- size="small"
- type="danger"
- @click="deleteModel(scope.row)"
- >
- 鍒犻櫎
- </el-button>
- </template>
- </el-table-column>
- </el-table>
- </el-card>
-
- <!-- 鑳借�楀垎鏋愬浘琛� -->
- <el-card class="analysis-section">
- <template #header>
- <span>鑳借�楀垎鏋�</span>
- </template>
-
- <el-row :gutter="20">
- <el-col :span="12">
- <div ref="energyChart" style="height: 400px;"></div>
- </el-col>
- <el-col :span="12">
- <div ref="savingChart" style="height: 400px;"></div>
- </el-col>
- </el-row>
- </el-card>
-
- <!-- 浼樺寲鍘嗗彶瀵硅瘽妗� -->
- <el-dialog v-model="historyDialogVisible" title="浼樺寲鍘嗗彶璁板綍" width="80%">
- <el-table :data="optimizationHistory" style="width: 100%" stripe>
- <el-table-column prop="timestamp" label="鏃堕棿" />
- <el-table-column prop="formationPressure" label="鍦板眰鍘嬪姏 (MPa)" />
- <el-table-column prop="oldFrequency" label="鍘熼鐜� (Hz)" />
- <el-table-column prop="newFrequency" label="鏂伴鐜� (Hz)" />
- <el-table-column prop="energySaved" label="鑺傝兘 (kWh)" />
- <el-table-column prop="status" label="鐘舵��">
- <template #default="scope">
- <el-tag :type="scope.row.status === 'success' ? 'success' : 'warning'">
- {{ scope.row.status === 'success' ? '鎴愬姛' : '澶辫触' }}
- </el-tag>
- </template>
- </el-table-column>
- </el-table>
- </el-dialog>
- </div>
-</template>
-
-<script setup>
-import { ref, onMounted, onUnmounted, computed } from 'vue'
-import { ElMessage, ElMessageBox } from 'element-plus'
-import { Monitor, Cpu, TrendCharts } from '@element-plus/icons-vue'
-import * as echarts from 'echarts'
-
-// 鍝嶅簲寮忔暟鎹�
-const edgeServerStatus = ref({ status: 'online', lastHeartbeat: Date.now() })
-const modelStatus = ref({ status: 'running', modelCount: 3 })
-const energySavingRate = ref(15.8)
-const totalEnergySaved = ref(1250.5)
-const pumpData = ref({
- formationPressure: 25.6,
- currentFrequency: 45.2,
- optimizedFrequency: 42.1,
- energyReduction: 23,
- flowRate: 180.5,
- power: 85.3
-})
-
-const modelConfigs = ref([
- {
- modelName: '娉ㄦ按娉甸鐜囦紭鍖栨ā鍨�',
- version: 'v2.1.0',
- status: 'active',
- accuracy: '94.2%',
- lastUpdate: '2024-01-15 14:30:00'
- },
- {
- modelName: '鍦板眰鍘嬪姏棰勬祴妯″瀷',
- version: 'v1.8.5',
- status: 'active',
- accuracy: '91.7%',
- lastUpdate: '2024-01-14 09:15:00'
- },
- {
- modelName: '鑳借�楀垎鏋愭ā鍨�',
- version: 'v2.0.3',
- status: 'standby',
- accuracy: '89.3%',
- lastUpdate: '2024-01-13 16:45:00'
- }
-])
-
-const historyDialogVisible = ref(false)
-const optimizationHistory = ref([])
-
-// 鍥捐〃寮曠敤
-const frequencyChart = ref(null)
-const energyChart = ref(null)
-const savingChart = ref(null)
-
-// 鑷姩鍒锋柊鐩稿叧
-const autoRefreshStatus = ref(true)
-const autoRefreshTimer = ref(null)
-const chartInstances = ref([])
-
-// 璁$畻灞炴��
-const canControl = computed(() => {
- return edgeServerStatus.value.status === 'online' && modelStatus.value.status === 'running'
-})
-
-const getProgressColor = computed(() => {
- return (percentage) => {
- if (percentage < 20) return '#909399'
- if (percentage < 40) return '#E6A23C'
- if (percentage < 60) return '#409EFF'
- return '#67C23A'
- }
-})
-
-// 鐢熸垚妯℃嫙鏁版嵁
-const generateMockData = () => {
- // 鐢熸垚闅忔満鍦板眰鍘嬪姏 (20-30 MPa)
- const formationPressure = 20 + Math.random() * 10
-
- // 鏍规嵁鍦板眰鍘嬪姏璁$畻浼樺寲棰戠巼
- const baseFrequency = 40 + (formationPressure - 25) * 2
- const currentFrequency = baseFrequency + (Math.random() - 0.5) * 4
- const optimizedFrequency = Math.max(35, baseFrequency - Math.random() * 3)
-
- // 璁$畻鑳借�楅檷浣�
- const energyReduction = Math.round((currentFrequency - optimizedFrequency) / currentFrequency * 100)
-
- // 璁$畻娴侀噺鍜屽姛鐜�
- const flowRate = 150 + Math.random() * 60
- const power = 70 + Math.random() * 30
-
- // 鏇存柊娉垫暟鎹�
- pumpData.value = {
- formationPressure: parseFloat(formationPressure.toFixed(1)),
- currentFrequency: parseFloat(currentFrequency.toFixed(1)),
- optimizedFrequency: parseFloat(optimizedFrequency.toFixed(1)),
- energyReduction: Math.min(energyReduction, 35),
- flowRate: parseFloat(flowRate.toFixed(1)),
- power: parseFloat(power.toFixed(1))
- }
-
- // 鏇存柊鑺傝兘鏁堟灉
- energySavingRate.value = 12 + Math.random() * 8
- totalEnergySaved.value += Math.random() * 2
-
- // 鏇存柊杈圭紭鏈嶅姟鍣ㄧ姸鎬�
- edgeServerStatus.value.lastHeartbeat = Date.now()
-
- // 闅忔満鏇存柊妯″瀷鐘舵��
- if (Math.random() > 0.95) {
- modelStatus.value.modelCount = Math.max(1, modelStatus.value.modelCount + (Math.random() > 0.5 ? 1 : -1))
- }
-
- // 娣诲姞浼樺寲鍘嗗彶璁板綍
- if (Math.random() > 0.7) {
- addOptimizationHistory()
- }
-
- // 鏇存柊鍥捐〃鏁版嵁
- updateCharts()
-}
-
-// 娣诲姞浼樺寲鍘嗗彶璁板綍
-const addOptimizationHistory = () => {
- const timestamp = new Date().toLocaleString()
- const record = {
- timestamp,
- formationPressure: pumpData.value.formationPressure,
- oldFrequency: pumpData.value.currentFrequency,
- newFrequency: pumpData.value.optimizedFrequency,
- energySaved: parseFloat((Math.random() * 5 + 1).toFixed(2)),
- status: Math.random() > 0.1 ? 'success' : 'failed'
- }
-
- optimizationHistory.value.unshift(record)
-
- // 淇濇寔鏈�澶�100鏉¤褰�
- if (optimizationHistory.value.length > 100) {
- optimizationHistory.value = optimizationHistory.value.slice(0, 100)
- }
-}
-
-// 鏇存柊鍥捐〃鏁版嵁
-const updateCharts = () => {
- chartInstances.value.forEach(instance => {
- if (instance && instance.setOption) {
- // 杩欓噷鍙互鏇存柊鍥捐〃鏁版嵁
- // 涓轰簡绠�鍖栵紝鎴戜滑鍙槸閲嶆柊鍒濆鍖栧浘琛�
- }
- })
-}
-
-// 鏂规硶
-const refreshData = () => {
- generateMockData()
- ElMessage.success('鏁版嵁鍒锋柊鎴愬姛')
-}
-
-const applyOptimization = async () => {
- try {
- await ElMessageBox.confirm('纭畾瑕佸簲鐢ㄥ綋鍓嶇殑浼樺寲璁剧疆鍚楋紵', '纭鎿嶄綔', {
- confirmButtonText: '纭畾',
- cancelButtonText: '鍙栨秷',
- type: 'warning'
- })
-
- // 搴旂敤浼樺寲璁剧疆
- pumpData.value.currentFrequency = pumpData.value.optimizedFrequency
- ElMessage.success('浼樺寲璁剧疆搴旂敤鎴愬姛')
- refreshData()
- } catch (error) {
- if (error !== 'cancel') {
- ElMessage.error('搴旂敤浼樺寲璁剧疆澶辫触')
- }
- }
-}
-
-const emergencyStop = async () => {
- try {
- await ElMessageBox.confirm('纭畾瑕佺揣鎬ュ仠姝㈡墍鏈夋敞姘存车鍚楋紵', '绱ф�ユ搷浣�', {
- confirmButtonText: '纭畾',
- cancelButtonText: '鍙栨秷',
- type: 'error'
- })
-
- // 鎵ц绱ф�ュ仠姝㈤�昏緫
- pumpData.value.currentFrequency = 0
- pumpData.value.optimizedFrequency = 0
- ElMessage.success('绱ф�ュ仠姝㈡墽琛屾垚鍔�')
- } catch (error) {
- if (error !== 'cancel') {
- ElMessage.error('绱ф�ュ仠姝㈡墽琛屽け璐�')
- }
- }
-}
-
-const showOptimizationHistory = () => {
- historyDialogVisible.value = true
-}
-
-const updateModel = (model) => {
- ElMessage.info(`鏇存柊妯″瀷: ${model.modelName}`)
-}
-
-const deleteModel = async (model) => {
- try {
- await ElMessageBox.confirm(`纭畾瑕佸垹闄ゆā鍨� ${model.modelName} 鍚楋紵`, '纭鍒犻櫎', {
- confirmButtonText: '纭畾',
- cancelButtonText: '鍙栨秷',
- type: 'warning'
- })
-
- const index = modelConfigs.value.findIndex(m => m.modelName === model.modelName)
- if (index > -1) {
- modelConfigs.value.splice(index, 1)
- ElMessage.success('妯″瀷鍒犻櫎鎴愬姛')
- }
- } catch (error) {
- if (error !== 'cancel') {
- ElMessage.error('妯″瀷鍒犻櫎澶辫触')
- }
- }
-}
-
-const toggleAutoRefresh = () => {
- autoRefreshStatus.value = !autoRefreshStatus.value
- if (autoRefreshStatus.value) {
- startAutoRefresh()
- ElMessage.success('鑷姩鍒锋柊宸插紑鍚�')
- } else {
- stopAutoRefresh()
- ElMessage.info('鑷姩鍒锋柊宸插叧闂�')
- }
-}
-
-const startAutoRefresh = () => {
- stopAutoRefresh() // 鍏堝仠姝箣鍓嶇殑瀹氭椂鍣�
- autoRefreshTimer.value = setInterval(() => {
- generateMockData()
- }, 60000) // 1鍒嗛挓 = 60000姣
-}
-
-const stopAutoRefresh = () => {
- if (autoRefreshTimer.value) {
- clearInterval(autoRefreshTimer.value)
- autoRefreshTimer.value = null
- }
-}
-
-const formatTime = (timestamp) => {
- return new Date(timestamp).toLocaleTimeString()
-}
-
-// 鍒濆鍖栧浘琛�
-const initCharts = () => {
- // 棰戠巼浼樺寲瓒嬪娍鍥�
- const frequencyChartInstance = echarts.init(frequencyChart.value)
- const frequencyOption = {
- title: { text: '娉甸鐜囦紭鍖栬秼鍔�' },
- tooltip: { trigger: 'axis' },
- legend: { data: ['褰撳墠棰戠巼', '浼樺寲棰戠巼', '鍦板眰鍘嬪姏'] },
- xAxis: { type: 'category', data: ['00:00', '04:00', '08:00', '12:00', '16:00', '20:00'] },
- yAxis: [
- { type: 'value', name: '棰戠巼 (Hz)' },
- { type: 'value', name: '鍘嬪姏 (MPa)' }
- ],
- series: [
- {
- name: '褰撳墠棰戠巼',
- type: 'line',
- data: [45.2, 44.8, 45.5, 45.1, 44.9, 45.2]
- },
- {
- name: '浼樺寲棰戠巼',
- type: 'line',
- data: [42.1, 41.8, 42.3, 41.9, 41.7, 42.1]
- },
- {
- name: '鍦板眰鍘嬪姏',
- type: 'line',
- yAxisIndex: 1,
- data: [25.6, 25.8, 26.1, 25.9, 25.7, 25.6]
- }
- ]
- }
- frequencyChartInstance.setOption(frequencyOption)
- chartInstances.value.push(frequencyChartInstance)
-
- // 鑳借�楀垎鏋愬浘
- const energyChartInstance = echarts.init(energyChart.value)
- const energyOption = {
- title: { text: '鏃ヨ兘鑰楀姣�' },
- tooltip: { trigger: 'item' },
- legend: { orient: 'vertical', left: 'left',top: 'center' },
- series: [
- {
- name: '鑳借�楀垎甯�',
- type: 'pie',
- radius: '50%',
- data: [
- { value: 45, name: '娉ㄦ按娉�' },
- { value: 25, name: '鐓ф槑绯荤粺' },
- { value: 20, name: '閫氶绯荤粺' },
- { value: 10, name: '鍏朵粬璁惧' }
- ]
- }
- ]
- }
- energyChartInstance.setOption(energyOption)
- chartInstances.value.push(energyChartInstance)
-
- // 鑺傝兘鏁堟灉鍥�
- const savingChartInstance = echarts.init(savingChart.value)
- const savingOption = {
- title: { text: '鑺傝兘鏁堟灉瓒嬪娍' },
- tooltip: { trigger: 'axis' },
- xAxis: { type: 'category', data: ['鍛ㄤ竴', '鍛ㄤ簩', '鍛ㄤ笁', '鍛ㄥ洓', '鍛ㄤ簲', '鍛ㄥ叚', '鍛ㄦ棩'] },
- yAxis: { type: 'value', name: '鑺傝兘鐜� (%)' },
- series: [
- {
- name: '鑺傝兘鐜�',
- type: 'bar',
- data: [12.5, 15.2, 18.7, 16.3, 19.1, 17.8, 15.8]
- }
- ]
- }
- savingChartInstance.setOption(savingOption)
- chartInstances.value.push(savingChartInstance)
-}
-
-// 鐢熸垚鍒濆鍘嗗彶鏁版嵁
-const generateInitialHistory = () => {
- for (let i = 0; i < 20; i++) {
- const timestamp = new Date(Date.now() - i * 3600000).toLocaleString()
- const record = {
- timestamp,
- formationPressure: parseFloat((20 + Math.random() * 10).toFixed(1)),
- oldFrequency: parseFloat((40 + Math.random() * 10).toFixed(1)),
- newFrequency: parseFloat((35 + Math.random() * 8).toFixed(1)),
- energySaved: parseFloat((Math.random() * 5 + 1).toFixed(2)),
- status: Math.random() > 0.1 ? 'success' : 'failed'
- }
- optimizationHistory.value.push(record)
- }
-}
-
-// 鐢熷懡鍛ㄦ湡
-onMounted(() => {
- initCharts()
- generateInitialHistory()
- refreshData()
- if (autoRefreshStatus.value) {
- startAutoRefresh()
- }
-})
-
-onUnmounted(() => {
- stopAutoRefresh()
- chartInstances.value.forEach(instance => {
- if (instance && instance.dispose) {
- instance.dispose()
- }
- })
-})
-</script>
-
-<style scoped>
-.app-container {
- padding: 20px;
-}
-
-
-
-.status-section {
- margin-bottom: 20px;
-}
-
-.status-card {
- height: 140px;
-}
-
-.status-item {
- display: flex;
- align-items: center;
- height: 100%;
-}
-
-.status-icon {
- font-size: 48px;
- margin-right: 20px;
- color: #409EFF;
-}
-
-.status-info {
- flex: 1;
-}
-
-.status-title {
- font-size: 14px;
- color: #909399;
- margin-bottom: 8px;
-}
-
-.status-value {
- font-size: 24px;
- font-weight: bold;
- margin-bottom: 8px;
-}
-
-.status-detail {
- font-size: 12px;
- color: #909399;
-}
-
-.status-value.online,
-.status-value.running {
- color: #67C23A;
-}
-
-.status-value.offline,
-.status-value.stopped {
- color: #F56C6C;
-}
-
-.status-value.success {
- color: #67C23A;
-}
-
-.control-section,
-.model-section,
-.analysis-section {
- margin-bottom: 20px;
-}
-
-.pump-control h4,
-.pump-chart h4 {
- margin-bottom: 20px;
- color: #303133;
-}
-
-.control-buttons {
- margin-top: 20px;
- text-align: center;
-}
-
-.control-buttons .el-button {
- margin: 0 10px;
-}
-</style>
diff --git a/src/views/energyManagement/energyArea/index.vue b/src/views/energyManagement/energyArea/index.vue
deleted file mode 100644
index 63feff8..0000000
--- a/src/views/energyManagement/energyArea/index.vue
+++ /dev/null
@@ -1,511 +0,0 @@
-<template>
- <div class="app-container product-view">
- <div class="left">
- <div>
- <el-input
- v-model="search"
- style="width: 210px"
- placeholder="杈撳叆鍏抽敭瀛楄繘琛屾悳绱�"
- @change="searchFilter"
- @clear="searchFilter"
- clearable
- prefix-icon="Search"
- />
- <el-button
- type="primary"
- @click="openProDia('addOne')"
- style="margin-left: 10px"
- >鏂板鐖跺尯鍩�</el-button
- >
- </div>
- <div ref="containerRef">
- <el-tree
- ref="tree"
- v-loading="treeLoad"
- :data="list"
- @node-click="handleNodeClick"
- :expand-on-click-node="false"
- default-expand-all
- :default-expanded-keys="expandedKeys"
- :draggable="true"
- :filter-node-method="filterNode"
- :props="{ children: 'children', label: 'label' }"
- highlight-current
- node-key="id"
- style="
- height: calc(100vh - 190px);
- overflow-y: scroll;
- scrollbar-width: none;
- margin-top: 10px;
- "
- >
- <template #default="{ node, data }">
- <div class="custom-tree-node">
- <span class="tree-node-content">
- <el-icon class="orange-icon">
- <component :is="data.children && data.children.length > 0
- ? node.expanded ? 'FolderOpened' : 'Folder' : 'Tickets'" />
- </el-icon>
- {{ data.label }}
- </span>
- <div>
- <el-button
- type="primary"
- link
- @click="openProDia('edit', data)"
- >
- 缂栬緫
- </el-button>
- <el-button type="primary" link @click="openModelDia('add','', data.id)">
- 娣诲姞瀛愬尯鍩�
- </el-button>
- <el-button
- v-if="!node.childNodes.length"
- style="margin-left: 4px"
- type="danger"
- link
- @click="remove(node, data)"
- >
- 鍒犻櫎
- </el-button>
- </div>
- </div>
- </template>
- </el-tree>
- </div>
- </div>
- <div class="right">
- <div style="margin-bottom: 10px" v-if="isShowButton">
- <el-button type="primary" @click="openModelDia('add')">
- 鏂板瀛愬尯鍩�
- </el-button>
- <el-button
- type="danger"
- @click="handleDelete"
- style="margin-left: 10px"
- plain
- >
- 鍒犻櫎
- </el-button>
- </div>
- <PIMTable
- rowKey="id"
- :column="tableColumn"
- :tableData="tableData"
- :page="page"
- :isSelection="true"
- @selection-change="handleSelectionChange"
- :tableLoading="tableLoading"
- @pagination="pagination"
- ></PIMTable>
- </div>
- <el-dialog v-model="productDia" title="鍖哄煙" width="400px" @keydown.enter.prevent>
- <el-form
- :model="form"
- label-width="140px"
- label-position="top"
- :rules="rules"
- ref="formRef"
- >
- <el-row :gutter="30">
- <el-col :span="24">
- <el-form-item label="鍖哄煙鍚嶇О锛�" prop="areaName">
- <el-input
- v-model="form.areaName"
- placeholder="璇疯緭鍏ヤ骇鍝佸悕绉�"
- clearable
- @keydown.enter.prevent
- />
- </el-form-item>
- </el-col>
- </el-row>
- </el-form>
- <template #footer>
- <div class="dialog-footer">
- <el-button type="primary" @click="submitForm">纭</el-button>
- <el-button @click="closeProDia">鍙栨秷</el-button>
- </div>
- </template>
- </el-dialog>
- <el-dialog
- v-model="modelDia"
- title="瀛愬尯鍩�"
- width="400px"
- @close="closeModelDia"
- @keydown.enter.prevent
- >
- <el-form
- :model="modelForm"
- label-width="140px"
- label-position="top"
- :rules="modelRules"
- ref="modelFormRef"
- >
- <el-form-item label="鐖跺尯鍩燂細" prop="fuId">
- <el-cascader v-model="modelForm.fuId" :options="list" :props="{
- value: 'id',
- label: 'label',
- children: 'children',
- checkStrictly: true,
- }" />
- </el-form-item>
- <el-form-item label="鍖哄煙绫诲瀷锛�" prop="areaType">
- <el-select v-model="modelForm.areaType" placeholder="璇烽�夋嫨">
- <el-option v-for="item in area_type" :key="item.value" :label="item.label" :value="item.value" />
- </el-select>
- </el-form-item>
- <el-form-item label="鍖哄煙鍚嶇О锛�" prop="areaName">
- <el-input
- v-model="modelForm.areaName"
- placeholder="璇疯緭鍏ュ崟浣�"
- clearable
- @keydown.enter.prevent
- />
- </el-form-item>
- </el-form>
- <template #footer>
- <div class="dialog-footer">
- <el-button type="primary" @click="submitModelForm">纭</el-button>
- <el-button @click="closeModelDia">鍙栨秷</el-button>
- </div>
- </template>
- </el-dialog>
- </div>
-</template>
-
-<script setup>
-import { ref } from "vue";
-import { ElMessageBox } from "element-plus";
-import {
- areaAdd,
- areaDelete,
- areaListPage,
- areaListTree,
-} from "@/api/energyManagement/index.js";
-
-const { proxy } = getCurrentInstance();
-const tree = ref(null);
-const containerRef = ref(null);
-
-const productDia = ref(false);
-const modelDia = ref(false);
-const modelOperationType = ref("");
-const search = ref("");
-const currentId = ref("");
-const currentParentId = ref("");
-const operationType = ref("");
-const treeLoad = ref(false);
-const list = ref([]);
-const expandedKeys = ref([]);
-const {area_type} = proxy.useDict("area_type")
-const tableColumn = ref([
- {
- label: "鍖哄煙鍚嶇О",
- prop: "areaName",
- },
- {
- label: "鍖哄煙绫诲瀷",
- prop: "areaType",
- dataType: "tag",
- formatData: (row) => {
- return area_type.value.find(item => item.value == row)?.label;
- }
- },
- {
- dataType: "action",
- label: "鎿嶄綔",
- align: "center",
- operation: [
- {
- name: "缂栬緫",
- type: "text",
- clickFun: (row) => {
- openModelDia("edit", row);
- },
- },
- ],
- },
-]);
-const tableData = ref([]);
-const tableLoading = ref(false);
-const isShowButton = ref(false);
-const selectedRows = ref([]);
-const page = reactive({
- current: 1,
- size: 10,
- total: 0,
-});
-const data = reactive({
- form: {
- areaName: "",
- },
- rules: {
- areaName: [{ required: true, message: "璇疯緭鍏�", trigger: "blur" }],
- },
- modelForm: {
- areaName: "",
- fuId: "",
- },
- modelRules: {
- areaName: [{ required: true, message: "璇疯緭鍏�", trigger: "blur" }],
- fuId: [{ required: true, message: "璇疯緭鍏�", trigger: "change" }],
- },
-});
-const { form, rules, modelForm, modelRules } = toRefs(data);
-
-// 鏌ヨ浜у搧鏍�
-const getProductTreeList = () => {
- treeLoad.value = true;
- areaListTree()
- .then((res) => {
- list.value = res;
- list.value.forEach((a) => {
- expandedKeys.value.push(a.label);
- });
- treeLoad.value = false;
- })
- .catch((err) => {
- treeLoad.value = false;
- });
-};
-// 杩囨护浜у搧鏍�
-const searchFilter = () => {
- proxy.$refs.tree.filter(search.value);
-};
-// 鎵撳紑浜у搧寮规
-const openProDia = (type, data) => {
- operationType.value = type;
- productDia.value = true;
- form.value.areaName = "";
- if (type === "edit") {
- form.value.areaName = data.areaName;
- }
-};
-// 鎵撳紑瑙勬牸鍨嬪彿寮规
-const openModelDia = (type, data,fatherId) => {
- modelOperationType.value = type;
- modelDia.value = true;
- modelForm.value.fuId = "";
- modelForm.value.areaType = "";
- modelForm.value.areaName = "";
- modelForm.value.id = "";
- modelForm.value.fuId = fatherId;
- if (type === "edit") {
- modelForm.value = { ...data };
- }
-};
-// 鎻愪氦浜у搧鍚嶇О淇敼
-const submitForm = () => {
- proxy.$refs.formRef.validate((valid) => {
- if (valid) {
- if (operationType.value === "add") {
- form.value.parentId = currentId.value;
- form.value.id = "";
- } else if (operationType.value === "addOne") {
- form.value.id = "";
- form.value.parentId = "";
- } else {
- form.value.id = currentId.value;
- form.value.parentId = "";
- }
- areaAdd(form.value).then((res) => {
- proxy.$modal.msgSuccess("鎻愪氦鎴愬姛");
- closeProDia();
- getProductTreeList();
- });
- }
- });
-};
-// 鍏抽棴浜у搧寮规
-const closeProDia = () => {
- proxy.$refs.formRef.resetFields();
- productDia.value = false;
-};
-
-// 鍒犻櫎浜у搧
-const remove = (node, data) => {
- let ids = [];
- ids.push(data.id);
- ElMessageBox.confirm("閫変腑鐨勫唴瀹瑰皢琚垹闄わ紝鏄惁纭鍒犻櫎锛�", "鍒犻櫎鎻愮ず", {
- confirmButtonText: "纭",
- cancelButtonText: "鍙栨秷",
- type: "warning",
- })
- .then(() => {
- tableLoading.value = true;
- areaDelete(ids)
- .then((res) => {
- proxy.$modal.msgSuccess("鍒犻櫎鎴愬姛");
- getProductTreeList();
- })
- .finally(() => {
- tableLoading.value = false;
- });
- })
- .catch(() => {
- proxy.$modal.msg("宸插彇娑�");
- });
-};
-// 閫夋嫨浜у搧
-const handleNodeClick = (val, node, el) => {
- // 鍒ゆ柇鏄惁涓哄彾瀛愯妭鐐�
- isShowButton.value = !(val.children && val.children.length > 0);
- // 鍙湁鍙跺瓙鑺傜偣鎵嶆墽琛屼互涓嬮�昏緫
- currentId.value = val.id;
- currentParentId.value = val.parentId;
- getModelList(true);
-};
-
-// 鎻愪氦瑙勬牸鍨嬪彿淇敼
-const submitModelForm = () => {
- proxy.$refs.modelFormRef.validate((valid) => {
- if (valid) {
- modelForm.value.fuId = currentId.value;
- areaAdd(modelForm.value).then((res) => {
- proxy.$modal.msgSuccess("鎻愪氦鎴愬姛");
- closeModelDia();
- getModelList();
- getProductTreeList();
- });
- }
- });
-};
-// 鍏抽棴鍨嬪彿寮规
-const closeModelDia = () => {
- proxy.$refs.modelFormRef.resetFields();
- modelDia.value = false;
-};
-// 琛ㄦ牸閫夋嫨鏁版嵁
-const handleSelectionChange = (selection) => {
- selectedRows.value = selection;
-};
-
-// 鏌ヨ瑙勬牸鍨嬪彿
-const pagination = (obj) => {
- page.current = obj.page;
- page.size = obj.limit;
- getModelList();
-};
-const getModelList = (val = false) => {
- tableLoading.value = true;
- let obj = {
- id: currentId.value,
- fuId:currentId.value,
- current: page.current,
- size: page.size
- }
- if(val){
- delete obj.id;
- }else{
- delete obj.fuId
- }
- areaListPage(obj).then((res) => {
- console.log("res", res);
- tableData.value = res.data.records;
- page.total = res.data.total;
- tableLoading.value = false;
- });
-};
-// 鍒犻櫎瑙勬牸鍨嬪彿
-const handleDelete = () => {
- let ids = [];
- if (selectedRows.value.length > 0) {
- ids = selectedRows.value.map((item) => item.id);
- } else {
- proxy.$modal.msgWarning("璇烽�夋嫨鏁版嵁");
- return;
- }
- ElMessageBox.confirm("閫変腑鐨勫唴瀹瑰皢琚垹闄わ紝鏄惁纭鍒犻櫎锛�", "鍒犻櫎鎻愮ず", {
- confirmButtonText: "纭",
- cancelButtonText: "鍙栨秷",
- type: "warning",
- })
- .then(() => {
- tableLoading.value = true;
- areaDelete(ids)
- .then((res) => {
- proxy.$modal.msgSuccess("鍒犻櫎鎴愬姛");
- getModelList();
- getProductTreeList();
- })
- .finally(() => {
- tableLoading.value = false;
- });
- })
- .catch(() => {
- proxy.$modal.msg("宸插彇娑�");
- });
-};
-// 璋冪敤tree杩囨护鏂规硶 涓枃鑻辫繃婊�
-const filterNode = (value, data, node) => {
- if (!value) {
- //濡傛灉鏁版嵁涓虹┖锛屽垯杩斿洖true,鏄剧ず鎵�鏈夌殑鏁版嵁椤�
- return true;
- }
- // 鏌ヨ鍒楄〃鏄惁鏈夊尮閰嶆暟鎹紝灏嗗�煎皬鍐欙紝鍖归厤鑻辨枃鏁版嵁
- let val = value.toLowerCase();
- return chooseNode(val, data, node); // 璋冪敤杩囨护浜屽眰鏂规硶
-};
-// 杩囨护鐖惰妭鐐� / 瀛愯妭鐐� (濡傛灉杈撳叆鐨勫弬鏁版槸鐖惰妭鐐逛笖鑳藉尮閰嶏紝鍒欒繑鍥炶鑺傜偣浠ュ強鍏朵笅鐨勬墍鏈夊瓙鑺傜偣锛涘鏋滃弬鏁版槸瀛愯妭鐐癸紝鍒欒繑鍥炶鑺傜偣鐨勭埗鑺傜偣銆俷ame鏄腑鏂囧瓧绗︼紝enName鏄嫳鏂囧瓧绗�.
-const chooseNode = (value, data, node) => {
- if (data.label.indexOf(value) !== -1) {
- return true;
- }
- const level = node.level;
- // 濡傛灉浼犲叆鐨勮妭鐐规湰韬氨鏄竴绾ц妭鐐瑰氨涓嶇敤鏍¢獙浜�
- if (level === 1) {
- return false;
- }
- // 鍏堝彇褰撳墠鑺傜偣鐨勭埗鑺傜偣
- let parentData = node.parent;
- // 閬嶅巻褰撳墠鑺傜偣鐨勭埗鑺傜偣
- let index = 0;
- while (index < level - 1) {
- // 濡傛灉鍖归厤鍒扮洿鎺ヨ繑鍥烇紝姝ゅname鍊兼槸涓枃瀛楃锛宔nName鏄嫳鏂囧瓧绗︺�傚垽鏂尮閰嶄腑鑻辨枃杩囨护
- if (parentData.data.label.indexOf(value) !== -1) {
- return true;
- }
- // 鍚﹀垯鐨勮瘽鍐嶅線涓婁竴灞傚仛鍖归厤
- parentData = parentData.parent;
- index++;
- }
- // 娌″尮閰嶅埌杩斿洖false
- return false;
-};
-getProductTreeList();
-</script>
-
-<style scoped>
-.product-view {
- display: flex;
-}
-.left {
- width: 380px;
- padding: 16px;
- background: #ffffff;
-}
-.right {
- width: calc(100% - 380px);
- padding: 16px;
- margin-left: 20px;
- background: #ffffff;
-}
-.custom-tree-node {
- flex: 1;
- display: flex;
- align-items: center;
- justify-content: space-between;
- font-size: 14px;
- padding-right: 8px;
-}
-.tree-node-content {
- display: flex;
- align-items: center; /* 鍨傜洿灞呬腑 */
- height: 100%;
-}
-.orange-icon {
- color: orange;
- font-size: 18px;
- margin-right: 8px; /* 鍥炬爣涓庢枃瀛椾箣闂村姞鐐归棿璺� */
-}
-</style>
diff --git a/src/views/energyManagement/energyCockpit/index.vue b/src/views/energyManagement/energyCockpit/index.vue
deleted file mode 100644
index 9281e37..0000000
--- a/src/views/energyManagement/energyCockpit/index.vue
+++ /dev/null
@@ -1,1380 +0,0 @@
-<template>
- <div class="app-container">
- <!-- 椤甸潰鏍囬 -->
- <div class="page-header">
- <h2>鑳芥簮椹鹃┒鑸�</h2>
- <div class="header-info">
- <span class="update-time">鏈�鍚庢洿鏂帮細{{ lastUpdateTime }}</span>
- <el-button type="primary" size="small" @click="refreshData">
- <el-icon><Refresh /></el-icon>
- 鍒锋柊鏁版嵁
- </el-button>
- </div>
- </div>
-
- <!-- 瀹炴椂鑳借�楃洃鎺� -->
- <div class="real-time-monitor">
- <el-row :gutter="20">
- <el-col :span="8">
- <el-card class="monitor-card">
- <template #header>
- <div class="card-header">
- <span>鐢靛姏娑堣��</span>
- <el-tag type="success" size="small">瀹炴椂</el-tag>
- </div>
- </template>
- <div class="monitor-content">
- <div class="monitor-value">
- <span class="value">{{ electricityConsumption }}</span>
- <span class="unit">kW路h</span>
- </div>
- <div class="monitor-trend">
- <span class="trend-label">瓒嬪娍锛�</span>
- <el-tag :type="getTrendType(electricityTrend)" size="small">
- {{ electricityTrend > 0 ? '鈫�' : '鈫�' }} {{ Math.abs(electricityTrend) }}%
- </el-tag>
- </div>
- </div>
- </el-card>
- </el-col>
- <el-col :span="8">
- <el-card class="monitor-card">
- <template #header>
- <div class="card-header">
- <span>姘存秷鑰�</span>
- <el-tag type="primary" size="small">瀹炴椂</el-tag>
- </div>
- </template>
- <div class="monitor-content">
- <div class="monitor-value">
- <span class="value">{{ waterConsumption }}</span>
- <span class="unit">m鲁</span>
- </div>
- <div class="monitor-trend">
- <span class="trend-label">瓒嬪娍锛�</span>
- <el-tag :type="getTrendType(waterTrend)" size="small">
- {{ waterTrend > 0 ? '鈫�' : '鈫�' }} {{ Math.abs(waterTrend) }}%
- </el-tag>
- </div>
- </div>
- </el-card>
- </el-col>
- <el-col :span="8">
- <el-card class="monitor-card">
- <template #header>
- <div class="card-header">
- <span>姘斾綋娑堣��</span>
- <el-tag type="warning" size="small">瀹炴椂</el-tag>
- </div>
- </template>
- <div class="monitor-content">
- <div class="monitor-value">
- <span class="value">{{ gasConsumption }}</span>
- <span class="unit">m鲁</span>
- </div>
- <div class="monitor-trend">
- <span class="trend-label">瓒嬪娍锛�</span>
- <el-tag :type="getTrendType(gasTrend)" size="small">
- {{ gasTrend > 0 ? '鈫�' : '鈫�' }} {{ Math.abs(gasTrend) }}%
- </el-tag>
- </div>
- </div>
- </el-card>
- </el-col>
- </el-row>
- </div>
-
- <!-- 鑳借�楄秼鍔垮垎鏋� -->
- <div class="trend-analysis">
- <el-card>
- <template #header>
- <div class="card-header">
- <span>鑳借�楄秼鍔垮垎鏋�</span>
- <div class="time-selector">
- <el-radio-group v-model="trendTimeUnit" @change="handleTrendTimeChange">
- <el-radio value="hour">灏忔椂</el-radio>
- <el-radio value="day">鏃�</el-radio>
- <el-radio value="week">鍛�</el-radio>
- <el-radio value="month">鏈�</el-radio>
- <el-radio value="year">骞�</el-radio>
- </el-radio-group>
- </div>
- </div>
- </template>
- <div class="chart-container">
- <div ref="trendChart" style="width: 100%; height: 400px;"></div>
- </div>
- </el-card>
- </div>
-
- <!-- 鑳借�楃粺璁′笌鎺掑悕 -->
- <div class="statistics-ranking">
- <el-row :gutter="20">
- <el-col :span="12">
- <el-card class="statistics-card">
- <template #header>
- <div class="card-header">
- <span class="card-title">鑳借�楃粺璁℃姤琛�</span>
- <div class="header-actions">
- <el-select v-model="statisticsPeriod" @change="handleStatisticsChange" size="small" style="width: 100px;">
- <el-option label="鏃ョ粺璁�" value="day" />
- <el-option label="鍛ㄧ粺璁�" value="week" />
- <el-option label="鏈堢粺璁�" value="month" />
- <el-option label="骞寸粺璁�" value="year" />
- </el-select>
- </div>
- </div>
- </template>
- <div class="statistics-content">
- <div class="statistics-item">
- <span class="label">鎬昏兘鑰楋細</span>
- <span class="value">{{ totalEnergyConsumption }} kW路h</span>
- </div>
- <div class="statistics-item">
- <span class="label">鍚屾瘮锛�</span>
- <span class="value" :class="getComparisonClass(yearOverYear)">
- {{ yearOverYear > 0 ? '+' : '' }}{{ yearOverYear }}%
- </span>
- </div>
- <div class="statistics-item">
- <span class="label">鐜瘮锛�</span>
- <span class="value" :class="getComparisonClass(monthOverMonth)">
- {{ monthOverMonth > 0 ? '+' : '' }}{{ monthOverMonth }}%
- </span>
- </div>
- <div class="statistics-item">
- <span class="label">鑺傝兘鐜囷細</span>
- <span class="value success">{{ energySavingRate }}%</span>
- </div>
- </div>
- </el-card>
- </el-col>
- <el-col :span="12">
- <el-card class="ranking-card">
- <template #header>
- <div class="card-header">
- <span class="card-title">鑳借�楁帓鍚�</span>
- <el-select v-model="rankingType" @change="handleRankingChange" size="small" style="width: 120px;">
- <el-option label="閮ㄩ棬鎺掑悕" value="department" />
- <el-option label="杞﹂棿鎺掑悕" value="workshop" />
- <el-option label="璁惧鎺掑悕" value="equipment" />
- </el-select>
- </div>
- </template>
- <div class="ranking-list">
- <div v-for="(item, index) in rankingList" :key="index" class="ranking-item">
- <div class="ranking-number" :class="getRankingClass(index + 1)">{{ index + 1 }}</div>
- <div class="ranking-info">
- <div class="ranking-name">{{ item.name }}</div>
- <div class="ranking-value">{{ item.value }} kW路h</div>
- </div>
- <div class="ranking-trend">
- <el-tag :type="getTrendType(item.trend)" size="small">
- {{ item.trend > 0 ? '鈫�' : '鈫�' }} {{ Math.abs(item.trend) }}%
- </el-tag>
- </div>
- </div>
- </div>
- </el-card>
- </el-col>
- </el-row>
- </div>
-
- <!-- 寮傚父鍒嗘瀽涓庢櫤鑳芥帶鍒� -->
- <div class="analysis-control">
- <el-row :gutter="20">
- <el-col :span="12">
- <el-card class="abnormal-card">
- <template #header>
- <div class="card-header">
- <span class="card-title">寮傚父鍒嗘瀽</span>
- <el-tag type="danger" size="small">{{ abnormalCount }}涓紓甯�</el-tag>
- </div>
- </template>
- <div class="abnormal-list">
- <div v-for="(item, index) in abnormalList" :key="index" class="abnormal-item">
- <div class="abnormal-icon">
- <el-icon :color="getAbnormalColor(item.level)">
- <Warning v-if="item.level === 'warning'" />
- <CircleClose v-else />
- </el-icon>
- </div>
- <div class="abnormal-content">
- <div class="abnormal-title">{{ item.title }}</div>
- <div class="abnormal-desc">{{ item.description }}</div>
- <div class="abnormal-time">{{ item.time }}</div>
- </div>
- <div class="abnormal-action">
- <el-button link size="small" @click="handleAbnormal(item)">澶勭悊</el-button>
- </div>
- </div>
- </div>
- </el-card>
- </el-col>
- <el-col :span="12">
- <el-card class="control-card">
- <template #header>
- <div class="card-header">
- <span class="card-title">鏅鸿兘鎺у埗绯荤粺</span>
- <el-switch v-model="autoControlEnabled" @change="handleAutoControlChange" />
- </div>
- </template>
- <div class="control-content">
- <div class="control-item">
- <span class="label">宄拌胺骞崇數浠风鐞嗭細</span>
- <el-tag :type="getPriceType(currentPriceType)" size="small">
- {{ getPriceTypeText(currentPriceType) }}
- </el-tag>
- </div>
- <div class="control-item">
- <span class="label">璐熻嵎棰勬祴锛�</span>
- <span class="value">{{ loadForecast }} kW</span>
- </div>
- <div class="control-item">
- <span class="label">鑷姩鍚仠锛�</span>
- <el-tag :type="autoStartStop ? 'success' : 'info'" size="small">
- {{ autoStartStop ? '宸插惎鐢�' : '宸茬鐢�' }}
- </el-tag>
- </div>
- <div class="control-item">
- <span class="label">鏅鸿兘璋冭妭锛�</span>
- <el-progress :percentage="intelligentAdjustment" :color="getProgressColor" />
- </div>
- </div>
- </el-card>
- </el-col>
- </el-row>
- </div>
-
- <!-- 鐜繚鎸囨爣 -->
- <div class="environmental-indicators">
- <el-card>
- <template #header>
- <div class="card-header">
- <span>鐜繚鎸囨爣鐩戞帶</span>
- </div>
- </template>
- <el-row :gutter="20">
- <el-col :span="8">
- <div class="indicator-item">
- <div class="indicator-title">纰虫帓鏀鹃噺</div>
- <div class="indicator-value">{{ carbonEmission }} kg</div>
- <div class="indicator-trend">
- <span>鍚屾瘮锛�</span>
- <span :class="getComparisonClass(carbonEmissionTrend)">
- {{ carbonEmissionTrend > 0 ? '+' : '' }}{{ carbonEmissionTrend }}%
- </span>
- </div>
- </div>
- </el-col>
- <el-col :span="8">
- <div class="indicator-item">
- <div class="indicator-title">鐜繚杈炬爣鐜�</div>
- <div class="indicator-value">{{ environmentalCompliance }}%</div>
- <div class="indicator-trend">
- <span>鐩爣锛�</span>
- <span class="success">95%</span>
- </div>
- </div>
- </el-col>
- <el-col :span="8">
- <div class="indicator-item">
- <div class="indicator-title">缁胯壊鑳芥簮鍗犳瘮</div>
- <div class="indicator-value">{{ greenEnergyRatio }}%</div>
- <div class="indicator-trend">
- <span>鐩爣锛�</span>
- <span class="success">30%</span>
- </div>
- </div>
- </el-col>
- </el-row>
- </el-card>
- </div>
-
- <!-- 澶氱淮搴︽姤琛� -->
- <div class="multi-dimensional-reports">
- <el-card>
- <template #header>
- <div class="card-header">
- <span>澶氱淮搴︽姤琛�</span>
- </div>
- </template>
- <div class="report-filters">
- <el-row :gutter="20">
- <el-col :span="6">
- <el-form-item label="鏃堕棿缁村害">
- <el-select v-model="reportTimeDimension" placeholder="閫夋嫨鏃堕棿缁村害">
- <el-option label="灏忔椂" value="hour" />
- <el-option label="鏃�" value="day" />
- <el-option label="鍛�" value="week" />
- <el-option label="鏈�" value="month" />
- <el-option label="骞�" value="year" />
- </el-select>
- </el-form-item>
- </el-col>
- <el-col :span="6">
- <el-form-item label="閮ㄩ棬缁村害">
- <el-select v-model="reportDepartmentDimension" placeholder="閫夋嫨閮ㄩ棬">
- <el-option label="鍏ㄩ儴閮ㄩ棬" value="all" />
- <el-option label="鐢熶骇閮�" value="production" />
- <el-option label="鎶�鏈儴" value="technology" />
- <el-option label="琛屾斂閮�" value="administration" />
- </el-select>
- </el-form-item>
- </el-col>
- <el-col :span="6">
- <el-form-item label="璁惧缁村害">
- <el-select v-model="reportEquipmentDimension" placeholder="閫夋嫨璁惧绫诲瀷">
- <el-option label="鍏ㄩ儴璁惧" value="all" />
- <el-option label="鐢靛姏璁惧" value="electricity" />
- <el-option label="姘村鐞嗚澶�" value="water" />
- <el-option label="姘斾綋璁惧" value="gas" />
- </el-select>
- </el-form-item>
- </el-col>
- <el-col :span="6">
- <el-form-item>
- <el-button type="primary" @click="generateReport">鐢熸垚鎶ヨ〃</el-button>
- </el-form-item>
- </el-col>
- </el-row>
- </div>
- <div class="report-preview">
- <div class="report-data">
- <el-row :gutter="20">
- <el-col :span="8">
- <div class="data-card">
- <div class="data-title">鐢靛姏娑堣��</div>
- <div class="data-value">{{ reportData.electricity }} kW路h</div>
- <div class="data-trend">
- <span :class="getTrendClass(reportData.electricityTrend)">
- {{ reportData.electricityTrend > 0 ? '鈫�' : '鈫�' }} {{ Math.abs(reportData.electricityTrend) }}%
- </span>
- </div>
- </div>
- </el-col>
- <el-col :span="8">
- <div class="data-card">
- <div class="data-title">姘存秷鑰�</div>
- <div class="data-value">{{ reportData.water }} m鲁</div>
- <div class="data-trend">
- <span :class="getTrendClass(reportData.waterTrend)">
- {{ reportData.waterTrend > 0 ? '鈫�' : '鈫�' }} {{ Math.abs(reportData.waterTrend) }}%
- </span>
- </div>
- </div>
- </el-col>
- <el-col :span="8">
- <div class="data-card">
- <div class="data-title">姘斾綋娑堣��</div>
- <div class="data-value">{{ reportData.gas }} m鲁</div>
- <div class="data-trend">
- <span :class="getTrendClass(reportData.gasTrend)">
- {{ reportData.gasTrend > 0 ? '鈫�' : '鈫�' }} {{ Math.abs(reportData.gasTrend) }}%
- </span>
- </div>
- </div>
- </el-col>
- </el-row>
-
- <div class="report-chart">
- <div class="chart-title">鑳借�楄秼鍔垮浘</div>
- <div class="chart-bars">
- <div v-for="(item, index) in reportData.chartData" :key="index" class="chart-bar">
- <div class="bar-label">{{ item.label }}</div>
- <div class="bar-container">
- <div class="bar-fill" :style="{ height: item.percentage + '%', backgroundColor: item.color }"></div>
- </div>
- <div class="bar-value">{{ item.value }}</div>
- </div>
- </div>
- </div>
-
- <div class="report-summary">
- <div class="summary-item">
- <span class="summary-label">鎬昏兘鑰楋細</span>
- <span class="summary-value">{{ reportData.totalEnergy }} kW路h</span>
- </div>
- <div class="summary-item">
- <span class="summary-label">骞冲潎鑳借�楋細</span>
- <span class="summary-value">{{ reportData.averageEnergy }} kW路h</span>
- </div>
- <div class="summary-item">
- <span class="summary-label">鑳借�楁晥鐜囷細</span>
- <span class="summary-value">{{ reportData.efficiency }}%</span>
- </div>
- </div>
- </div>
- </div>
- </el-card>
- </div>
- </div>
-</template>
-
-<script setup>
-import { ref, reactive, onMounted, onUnmounted, nextTick } from 'vue'
-import { ElMessage, ElMessageBox } from 'element-plus'
-import * as echarts from 'echarts'
-import {
- Refresh,
- Download,
- Warning,
- CircleClose,
- Document,
- Edit,
- Bell
-} from '@element-plus/icons-vue'
-
-// 鍝嶅簲寮忔暟鎹�
-const lastUpdateTime = ref('')
-const electricityConsumption = ref(0)
-const waterConsumption = ref(0)
-const gasConsumption = ref(0)
-const electricityTrend = ref(0)
-const waterTrend = ref(0)
-const gasTrend = ref(0)
-
-// 瓒嬪娍鍒嗘瀽
-const trendTimeUnit = ref('day')
-const trendChart = ref(null)
-let chartInstance = null
-
-// 缁熻鎶ヨ〃
-const statisticsPeriod = ref('month')
-const totalEnergyConsumption = ref(0)
-const yearOverYear = ref(0)
-const monthOverMonth = ref(0)
-const energySavingRate = ref(0)
-
-// 鑳借�楁帓鍚�
-const rankingType = ref('department')
-const rankingList = ref([])
-
-// 寮傚父鍒嗘瀽
-const abnormalCount = ref(0)
-const abnormalList = ref([])
-
-// 鏅鸿兘鎺у埗
-const autoControlEnabled = ref(true)
-const currentPriceType = ref('peak')
-const loadForecast = ref(0)
-const autoStartStop = ref(true)
-const intelligentAdjustment = ref(0)
-
-// 鐜繚鎸囨爣
-const carbonEmission = ref(0)
-const carbonEmissionTrend = ref(0)
-const environmentalCompliance = ref(0)
-const greenEnergyRatio = ref(0)
-
-// 澶氱淮搴︽姤琛�
-const reportTimeDimension = ref('month')
-const reportDepartmentDimension = ref('all')
-const reportEquipmentDimension = ref('all')
-const reportData = ref({
- electricity: 0,
- water: 0,
- gas: 0,
- electricityTrend: 0,
- waterTrend: 0,
- gasTrend: 0,
- totalEnergy: 0,
- averageEnergy: 0,
- efficiency: 0,
- chartData: []
-})
-
-// 瀹氭椂鍣�
-let updateTimer = null
-
-// 鑾峰彇瓒嬪娍绫诲瀷鏍峰紡
-const getTrendType = (trend) => {
- if (trend > 0) return 'danger'
- if (trend < 0) return 'success'
- return 'info'
-}
-
-// 鑾峰彇瀵规瘮绫诲瀷鏍峰紡
-const getComparisonClass = (value) => {
- if (value > 0) return 'danger'
- if (value < 0) return 'success'
- return 'info'
-}
-
-// 鑾峰彇鎺掑悕鏍峰紡
-const getRankingClass = (rank) => {
- if (rank === 1) return 'ranking-first'
- if (rank === 2) return 'ranking-second'
- if (rank === 3) return 'ranking-third'
- return 'ranking-normal'
-}
-
-// 鑾峰彇寮傚父棰滆壊
-const getAbnormalColor = (level) => {
- return level === 'warning' ? '#E6A23C' : '#F56C6C'
-}
-
-// 鑾峰彇鐢典环绫诲瀷鏍峰紡
-const getPriceType = (type) => {
- const typeMap = {
- peak: 'danger',
- normal: 'warning',
- valley: 'success'
- }
- return typeMap[type] || 'info'
-}
-
-// 鑾峰彇鐢典环绫诲瀷鏂囨湰
-const getPriceTypeText = (type) => {
- const typeMap = {
- peak: '宄版椂',
- normal: '骞虫椂',
- valley: '璋锋椂'
- }
- return typeMap[type] || '鏈煡'
-}
-
-// 鑾峰彇杩涘害鏉¢鑹�
-const getProgressColor = (percentage) => {
- if (percentage < 50) return '#67C23A'
- if (percentage < 80) return '#E6A23C'
- return '#F56C6C'
-}
-
-// 鑾峰彇瓒嬪娍鏍峰紡
-const getTrendClass = (trend) => {
- if (trend > 0) return 'trend-up'
- if (trend < 0) return 'trend-down'
- return 'trend-stable'
-}
-
-// 妯℃嫙鏁版嵁鐢熸垚
-const generateMockData = () => {
- // 瀹炴椂鑳借�楁暟鎹�
- electricityConsumption.value = Math.floor(Math.random() * 1000) + 2000
- waterConsumption.value = Math.floor(Math.random() * 100) + 150
- gasConsumption.value = Math.floor(Math.random() * 50) + 80
-
- // 瓒嬪娍鏁版嵁
- electricityTrend.value = (Math.random() * 20 - 10).toFixed(1)
- waterTrend.value = (Math.random() * 15 - 7.5).toFixed(1)
- gasTrend.value = (Math.random() * 12 - 6).toFixed(1)
-
- // 缁熻鏁版嵁
- totalEnergyConsumption.value = Math.floor(Math.random() * 50000) + 100000
- yearOverYear.value = (Math.random() * 20 - 10).toFixed(1)
- monthOverMonth.value = (Math.random() * 15 - 7.5).toFixed(1)
- energySavingRate.value = (Math.random() * 10 + 5).toFixed(1)
-
- // 鎺掑悕鏁版嵁
- rankingList.value = [
- { name: '鐢熶骇杞﹂棿A', value: Math.floor(Math.random() * 5000) + 10000, trend: (Math.random() * 20 - 10).toFixed(1) },
- { name: '鐢熶骇杞﹂棿B', value: Math.floor(Math.random() * 4000) + 8000, trend: (Math.random() * 20 - 10).toFixed(1) },
- { name: '鎶�鏈爺鍙戦儴', value: Math.floor(Math.random() * 3000) + 6000, trend: (Math.random() * 20 - 10).toFixed(1) },
- { name: '琛屾斂鍔炲叕鍖�', value: Math.floor(Math.random() * 2000) + 4000, trend: (Math.random() * 20 - 10).toFixed(1) },
- { name: '鍚庡嫟淇濋殰鍖�', value: Math.floor(Math.random() * 1500) + 3000, trend: (Math.random() * 20 - 10).toFixed(1) }
- ].sort((a, b) => b.value - a.value)
-
- // 寮傚父鏁版嵁
- abnormalCount.value = Math.floor(Math.random() * 5) + 1
- abnormalList.value = [
- { level: 'warning', title: '鐢靛姏璐熻嵎杩囬珮', description: '鐢熶骇杞﹂棿A鐢靛姏璐熻嵎杈惧埌85%锛屽缓璁鏌ヨ澶囪繍琛岀姸鎬�', time: '2鍒嗛挓鍓�' },
- { level: 'error', title: '姘村帇寮傚父', description: '姘村鐞嗚澶囧帇鍔涘紓甯革紝褰撳墠鍘嬪姏0.3MPa锛屼綆浜庢甯歌寖鍥�', time: '5鍒嗛挓鍓�' }
- ]
-
- // 鏅鸿兘鎺у埗鏁版嵁
- loadForecast.value = Math.floor(Math.random() * 500) + 1500
- intelligentAdjustment.value = Math.floor(Math.random() * 30) + 60
-
- // 鐜繚鎸囨爣
- carbonEmission.value = Math.floor(Math.random() * 1000) + 5000
- carbonEmissionTrend.value = (Math.random() * 15 - 7.5).toFixed(1)
- environmentalCompliance.value = (Math.random() * 5 + 95).toFixed(1)
- greenEnergyRatio.value = (Math.random() * 10 + 25).toFixed(1)
-
- // 鏇存柊鏈�鍚庢洿鏂版椂闂�
- lastUpdateTime.value = new Date().toLocaleString()
-
- // 鍚屾椂鏇存柊鎶ヨ〃鏁版嵁
- generateReportData()
-}
-
-// 鍒濆鍖栬秼鍔垮浘琛�
-const initTrendChart = () => {
- if (chartInstance) {
- chartInstance.dispose()
- }
-
- chartInstance = echarts.init(trendChart.value)
-
- const option = {
- title: {
- text: '鑳借�楄秼鍔垮垎鏋�',
- left: 'center'
- },
- tooltip: {
- trigger: 'axis'
- },
- legend: {
- data: ['鐢靛姏', '姘�', '姘斾綋'],
- bottom: 10
- },
- xAxis: {
- type: 'category',
- data: generateTimeData()
- },
- yAxis: {
- type: 'value',
- name: '娑堣�楅噺'
- },
- series: [
- {
- name: '鐢靛姏',
- type: 'line',
- data: generateSeriesData(),
- smooth: true
- },
- {
- name: '姘�',
- type: 'line',
- data: generateSeriesData(),
- smooth: true
- },
- {
- name: '姘斾綋',
- type: 'line',
- data: generateSeriesData(),
- smooth: true
- }
- ]
- }
-
- chartInstance.setOption(option)
-}
-
-// 鐢熸垚鏃堕棿鏁版嵁
-const generateTimeData = () => {
- const data = []
- const now = new Date()
-
- switch (trendTimeUnit.value) {
- case 'hour':
- for (let i = 23; i >= 0; i--) {
- const time = new Date(now.getTime() - i * 60 * 60 * 1000)
- data.unshift(time.getHours() + ':00')
- }
- break
- case 'day':
- for (let i = 29; i >= 0; i--) {
- const time = new Date(now.getTime() - i * 24 * 60 * 60 * 1000)
- data.unshift(time.getDate() + '鏃�')
- }
- break
- case 'week':
- for (let i = 11; i >= 0; i--) {
- data.unshift(`绗�${12 - i}鍛╜)
- }
- break
- case 'month':
- for (let i = 11; i >= 0; i--) {
- const month = (12 - i) % 12 || 12
- data.unshift(`${month}鏈坄)
- }
- break
- case 'year':
- for (let i = 4; i >= 0; i--) {
- const year = new Date().getFullYear() - i
- data.unshift(`${year}骞碻)
- }
- break
- }
-
- return data
-}
-
-// 鐢熸垚绯诲垪鏁版嵁
-const generateSeriesData = () => {
- const data = []
- const count = trendTimeUnit.value === 'hour' ? 24 :
- trendTimeUnit.value === 'day' ? 30 :
- trendTimeUnit.value === 'week' ? 12 :
- trendTimeUnit.value === 'month' ? 12 : 5
-
- for (let i = 0; i < count; i++) {
- data.push(Math.floor(Math.random() * 1000) + 500)
- }
-
- return data
-}
-
-// 澶勭悊瓒嬪娍鏃堕棿鍙樺寲
-const handleTrendTimeChange = () => {
- nextTick(() => {
- initTrendChart()
- })
-}
-
-// 澶勭悊缁熻鍛ㄦ湡鍙樺寲
-const handleStatisticsChange = () => {
- generateMockData()
-}
-
-// 澶勭悊鎺掑悕绫诲瀷鍙樺寲
-const handleRankingChange = () => {
- // 鏍规嵁绫诲瀷閲嶆柊鐢熸垚鎺掑悕鏁版嵁
- generateMockData()
-}
-
-// 澶勭悊鑷姩鎺у埗鍙樺寲
-const handleAutoControlChange = (value) => {
- ElMessage.success(`鏅鸿兘鎺у埗绯荤粺宸�${value ? '鍚敤' : '绂佺敤'}`)
-}
-
-// 澶勭悊寮傚父
-const handleAbnormal = (item) => {
- ElMessage.info(`姝e湪澶勭悊寮傚父锛�${item.title}`)
-}
-
-// 鍒锋柊鏁版嵁
-const refreshData = () => {
- generateMockData()
- if (chartInstance) {
- initTrendChart()
- }
- ElMessage.success('鏁版嵁宸插埛鏂�')
-}
-
-// 瀵煎嚭缁熻
-const exportStatistics = () => {
- ElMessage.success('缁熻鏁版嵁瀵煎嚭鎴愬姛')
-}
-
-// 瀵煎嚭鐜繚鎶ュ憡
-const exportEnvironmentalReport = () => {
- ElMessage.success('鐜繚鎶ュ憡瀵煎嚭鎴愬姛')
-}
-
-// 鐢熸垚鑷畾涔夋姤琛�
-const generateCustomReport = () => {
- ElMessage.info('鑷畾涔夋姤琛ㄥ姛鑳藉紑鍙戜腑...')
-}
-
-// 璁㈤槄鎶ヨ〃
-const subscribeReport = () => {
- ElMessage.info('鎶ヨ〃璁㈤槄鍔熻兘寮�鍙戜腑...')
-}
-
-// 鐢熸垚鎶ヨ〃鏁版嵁
-const generateReportData = () => {
- // 鐢熸垚鍩虹鏁版嵁
- reportData.value.electricity = Math.floor(Math.random() * 5000) + 8000
- reportData.value.water = Math.floor(Math.random() * 200) + 300
- reportData.value.gas = Math.floor(Math.random() * 100) + 150
-
- // 鐢熸垚瓒嬪娍鏁版嵁
- reportData.value.electricityTrend = (Math.random() * 20 - 10).toFixed(1)
- reportData.value.waterTrend = (Math.random() * 15 - 7.5).toFixed(1)
- reportData.value.gasTrend = (Math.random() * 12 - 6).toFixed(1)
-
- // 璁$畻鎬昏兘鑰楀拰骞冲潎鑳借��
- reportData.value.totalEnergy = reportData.value.electricity + reportData.value.water * 0.1 + reportData.value.gas * 0.05
- reportData.value.averageEnergy = Math.floor(reportData.value.totalEnergy / 3)
- reportData.value.efficiency = (Math.random() * 20 + 80).toFixed(1)
-
- // 鐢熸垚鍥捐〃鏁版嵁
- const labels = ['鍛ㄤ竴', '鍛ㄤ簩', '鍛ㄤ笁', '鍛ㄥ洓', '鍛ㄤ簲', '鍛ㄥ叚', '鍛ㄦ棩']
- const colors = ['#409eff', '#67c23a', '#e6a23c', '#f56c6c', '#909399', '#9c27b0', '#ff9800']
-
- reportData.value.chartData = labels.map((label, index) => ({
- label,
- value: Math.floor(Math.random() * 1000) + 500,
- percentage: Math.floor(Math.random() * 40) + 30,
- color: colors[index]
- }))
-}
-
-// 鐢熸垚鎶ヨ〃
-const generateReport = () => {
- generateReportData()
- ElMessage.success('鎶ヨ〃鐢熸垚鎴愬姛')
-}
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-// 鍚姩瀹氭椂鏇存柊
-const startAutoUpdate = () => {
- updateTimer = setInterval(() => {
- generateMockData()
- if (chartInstance) {
- initTrendChart()
- }
- }, 60000) // 姣忓垎閽熸洿鏂颁竴娆�
-}
-
-// 鍋滄瀹氭椂鏇存柊
-const stopAutoUpdate = () => {
- if (updateTimer) {
- clearInterval(updateTimer)
- updateTimer = null
- }
-}
-
-// 缁勪欢鎸傝浇
-onMounted(() => {
- generateMockData()
- nextTick(() => {
- initTrendChart()
- })
- startAutoUpdate()
-})
-
-// 缁勪欢鍗歌浇
-onUnmounted(() => {
- stopAutoUpdate()
- if (chartInstance) {
- chartInstance.dispose()
- }
-})
-</script>
-
-<style lang="scss" scoped>
-.app-container {
- padding: 12px;
- background: #f5f5f5;
- min-height: 100vh;
-}
-
-.page-header {
- display: flex;
- justify-content: space-between;
- align-items: center;
- margin-bottom: 12px;
- padding: 16px;
- background: white;
- border-radius: 8px;
- box-shadow: 0 2px 8px rgba(0, 0, 0, 0.1);
-
- h2 {
- margin: 0;
- color: #303133;
- font-size: 22px;
- }
-
- .header-info {
- display: flex;
- align-items: center;
- gap: 12px;
-
- .update-time {
- color: #909399;
- font-size: 14px;
- }
- }
-}
-
-.real-time-monitor {
- margin-bottom: 12px;
-
- .monitor-card {
- .monitor-content {
- text-align: center;
- padding: 16px 0;
-
- .monitor-value {
- margin-bottom: 12px;
-
- .value {
- font-size: 28px;
- font-weight: bold;
- color: #409eff;
- }
-
- .unit {
- font-size: 14px;
- color: #909399;
- margin-left: 4px;
- }
- }
-
- .monitor-trend {
- .trend-label {
- font-size: 14px;
- color: #606266;
- margin-right: 6px;
- }
- }
- }
- }
-}
-
-.trend-analysis {
- margin-bottom: 12px;
-
- .card-header {
- display: flex;
- justify-content: space-between;
- align-items: center;
-
- .time-selector {
- .el-radio-group {
- .el-radio {
- margin-right: 4px;
- }
- }
- }
- }
-
- .chart-container {
- padding: 16px 0;
- }
-}
-
-.statistics-ranking {
- margin-bottom: 12px;
-
- .statistics-card, .ranking-card {
- height: 100%;
- box-shadow: 0 2px 12px rgba(0, 0, 0, 0.1);
- border-radius: 8px;
- transition: all 0.3s ease;
-
- &:hover {
- transform: translateY(-2px);
- box-shadow: 0 4px 20px rgba(0, 0, 0, 0.15);
- }
- }
-
- .card-header {
- display: flex;
- justify-content: space-between;
- align-items: center;
- padding: 12px 16px;
- border-bottom: 1px solid #f0f0f0;
- background: #fafafa;
-
- .card-title {
- font-size: 15px;
- font-weight: 600;
- color: #303133;
- }
-
- .header-actions {
- display: flex;
- gap: 8px;
- align-items: center;
- }
- }
-
- .statistics-content {
- padding: 16px;
-
- .statistics-item {
- display: flex;
- justify-content: space-between;
- align-items: center;
- margin-bottom: 12px;
- padding: 10px 12px;
- background: #f8f9fa;
- border-radius: 6px;
- transition: background-color 0.3s ease;
-
- &:hover {
- background: #e9ecef;
- }
-
- &:last-child {
- margin-bottom: 0;
- }
-
- .label {
- color: #606266;
- font-size: 14px;
- font-weight: 500;
- }
-
- .value {
- font-weight: bold;
- font-size: 15px;
-
- &.success {
- color: #67c23a;
- }
- }
- }
- }
-
- .ranking-list {
- padding: 16px;
-
- .ranking-item {
- display: flex;
- align-items: center;
- padding: 12px;
- margin-bottom: 6px;
- background: #f8f9fa;
- border-radius: 6px;
- transition: all 0.3s ease;
-
- &:hover {
- background: #e9ecef;
- transform: translateX(4px);
- }
-
- &:last-child {
- margin-bottom: 0;
- }
-
- .ranking-number {
- width: 32px;
- height: 32px;
- border-radius: 50%;
- display: flex;
- align-items: center;
- justify-content: center;
- font-weight: bold;
- font-size: 14px;
- margin-right: 12px;
- box-shadow: 0 2px 8px rgba(0, 0, 0, 0.1);
-
- &.ranking-first {
- background: linear-gradient(135deg, #ffd700 0%, #ffed4e 100%);
- color: #fff;
- }
-
- &.ranking-second {
- background: linear-gradient(135deg, #c0c0c0 0%, #d4d4d4 100%);
- color: #fff;
- }
-
- &.ranking-third {
- background: linear-gradient(135deg, #cd7f32 0%, #daa520 100%);
- color: #fff;
- }
-
- &.ranking-normal {
- background: linear-gradient(135deg, #f5f5f5 0%, #e9ecef 100%);
- color: #909399;
- }
- }
-
- .ranking-info {
- flex: 1;
-
- .ranking-name {
- font-weight: 600;
- color: #303133;
- margin-bottom: 4px;
- font-size: 14px;
- }
-
- .ranking-value {
- color: #606266;
- font-size: 13px;
- font-weight: 500;
- }
- }
-
- .ranking-trend {
- margin-left: 12px;
- }
- }
- }
-}
-
-.analysis-control {
- margin-bottom: 20px;
-
- .card-header {
- display: flex;
- justify-content: space-between;
- align-items: center;
- }
-
- .abnormal-list {
- .abnormal-item {
- display: flex;
- align-items: flex-start;
- padding: 15px 0;
- border-bottom: 1px solid #f0f0f0;
-
- &:last-child {
- border-bottom: none;
- }
-
- .abnormal-icon {
- margin-right: 15px;
- margin-top: 2px;
- }
-
- .abnormal-content {
- flex: 1;
-
- .abnormal-title {
- font-weight: bold;
- color: #303133;
- margin-bottom: 5px;
- }
-
- .abnormal-desc {
- color: #606266;
- font-size: 14px;
- margin-bottom: 5px;
- }
-
- .abnormal-time {
- color: #909399;
- font-size: 12px;
- }
- }
-
- .abnormal-action {
- margin-left: 15px;
- }
- }
- }
-
- .control-content {
- .control-item {
- display: flex;
- justify-content: space-between;
- align-items: center;
- margin-bottom: 20px;
-
- &:last-child {
- margin-bottom: 0;
- }
-
- .label {
- color: #606266;
- font-size: 14px;
- }
-
- .value {
- font-weight: bold;
- color: #303133;
- }
- }
- }
-}
-
-.environmental-indicators {
- margin-bottom: 20px;
-
- .card-header {
- display: flex;
- justify-content: space-between;
- align-items: center;
-
- .header-actions {
- display: flex;
- gap: 10px;
- }
- }
-
- .indicator-item {
- text-align: center;
- padding: 20px 0;
-
- .indicator-title {
- color: #606266;
- font-size: 14px;
- margin-bottom: 10px;
- }
-
- .indicator-value {
- font-size: 24px;
- font-weight: bold;
- color: #409eff;
- margin-bottom: 10px;
- }
-
- .indicator-trend {
- font-size: 12px;
- color: #909399;
-
- .success {
- color: #67c23a;
- }
- }
- }
-}
-
-.multi-dimensional-reports {
- .card-header {
- display: flex;
- justify-content: space-between;
- align-items: center;
-
- .header-actions {
- display: flex;
- gap: 10px;
- }
- }
-
- .report-filters {
- padding: 20px 0;
- border-bottom: 1px solid #f0f0f0;
- margin-bottom: 20px;
- }
-
- .report-preview {
- .report-data {
- padding: 20px 0;
-
- .data-card {
- text-align: center;
- padding: 16px;
- background: #f8f9fa;
- border-radius: 8px;
- margin-bottom: 16px;
-
- .data-title {
- color: #606266;
- font-size: 14px;
- margin-bottom: 8px;
- }
-
- .data-value {
- font-size: 20px;
- font-weight: bold;
- color: #303133;
- margin-bottom: 8px;
- }
-
- .data-trend {
- font-size: 12px;
-
- .trend-up {
- color: #f56c6c;
- }
-
- .trend-down {
- color: #67c23a;
- }
-
- .trend-stable {
- color: #909399;
- }
- }
- }
-
- .report-chart {
- margin: 20px 0;
- padding: 20px;
- background: #f8f9fa;
- border-radius: 8px;
-
- .chart-title {
- text-align: center;
- font-size: 16px;
- font-weight: 600;
- color: #303133;
- margin-bottom: 16px;
- }
-
- .chart-bars {
- display: flex;
- justify-content: space-around;
- align-items: flex-end;
- height: 120px;
-
- .chart-bar {
- text-align: center;
- flex: 1;
- margin: 0 8px;
-
- .bar-label {
- font-size: 12px;
- color: #606266;
- margin-bottom: 8px;
- }
-
- .bar-container {
- height: 80px;
- background: #e9ecef;
- border-radius: 4px;
- position: relative;
- margin-bottom: 8px;
- }
-
- .bar-fill {
- position: absolute;
- bottom: 0;
- left: 0;
- right: 0;
- border-radius: 4px;
- transition: height 0.3s ease;
- }
-
- .bar-value {
- font-size: 12px;
- color: #303133;
- font-weight: 500;
- }
- }
- }
- }
-
- .report-summary {
- display: flex;
- justify-content: space-around;
- padding: 20px;
- background: #f8f9fa;
- border-radius: 8px;
-
- .summary-item {
- text-align: center;
-
- .summary-label {
- display: block;
- color: #606266;
- font-size: 14px;
- margin-bottom: 8px;
- }
-
- .summary-value {
- font-size: 18px;
- font-weight: bold;
- color: #303133;
- }
- }
- }
- }
- }
-}
-
-// 閫氱敤鏍峰紡
-.card-header {
- display: flex;
- justify-content: space-between;
- align-items: center;
-}
-
-.success {
- color: #67c23a;
-}
-
-.danger {
- color: #f56c6c;
-}
-
-.warning {
- color: #e6a23c;
-}
-
-.info {
- color: #909399;
-}
-</style>
diff --git a/src/views/energyManagement/energyPeriodTime/index.vue b/src/views/energyManagement/energyPeriodTime/index.vue
deleted file mode 100644
index 0c94322..0000000
--- a/src/views/energyManagement/energyPeriodTime/index.vue
+++ /dev/null
@@ -1,444 +0,0 @@
-<template>
- <div class="app-container">
- <div class="search_form">
- <div>
- <span class="search_title">鏃ユ湡锛�</span>
- <!-- <el-time-picker
- style="width: 240px;margin-right: 10px"
- v-model="searchForm.startTime"
- value-format="HH:mm:ss"
- format="HH:mm:ss"
- type="time"
- placeholder="璇烽�夋嫨寮�濮嬫椂闂�"
- clearable
- /> -->
- <el-date-picker
- v-model="searchForm.date"
- type="date"
- placeholder="璇烽�夋嫨鏃ユ湡"
- :size="size"
- />
- <!-- <el-time-picker
- v-model="searchForm.timeRange"
- is-range
- arrow-control
- range-separator="To"
- start-placeholder="閫夋嫨缁撴潫鏃堕棿"
- end-placeholder="閫夋嫨缁撴潫鏃堕棿"
- /> -->
- <span class="search_title">鐢典环锛堝厓/搴︼級锛�</span>
- <el-input
- v-model="searchForm.price"
- style="width: 240px"
- placeholder="璇疯緭鍏ョ數浠�"
- @change="handleQuery"
- clearable
- :prefix-icon="Search"
- />
- <el-button type="primary" @click="handleQuery" style="margin-left: 10px"
- >鎼滅储</el-button>
- <el-button @click="resetFilters">閲嶇疆</el-button>
- </div>
- <div>
- <el-button type="primary" @click="openForm('add')">鏂板</el-button>
- <el-button type="danger" plain @click="handleDelete">鍒犻櫎</el-button>
- </div>
- </div>
- <div class="table_list">
- <PIMTable
- rowKey="id"
- :column="tableColumn"
- :tableData="tableData"
- :page="page"
- :isSelection="true"
- @selection-change="handleSelectionChange"
- :tableLoading="tableLoading"
- @pagination="pagination"
- ></PIMTable>
- </div>
- <el-dialog
- v-model="dialogFormVisible"
- title="鐢ㄧ數鏃舵绠$悊"
- width="70%"
- @close="closeDia"
- >
- <el-form
- :model="form"
- label-width="140px"
- label-position="top"
- :rules="rules"
- ref="formRef"
- >
- <el-row :gutter="30">
- <el-col :span="12">
- <el-form-item label="鏃ユ湡锛�" prop="date">
- <el-date-picker
- style="width: 100%"
- v-model="form.date"
- value-format="YYYY-MM-DD"
- format="YYYY-MM-DD"
- type="date"
- placeholder="璇烽�夋嫨鏃ユ湡"
- clearable
- />
- </el-form-item>
- </el-col>
- <el-col :span="12">
- <el-form-item label="鐢典环锛堝厓/搴︼級锛�" prop="price">
- <el-input
- v-model="form.price"
- placeholder="璇疯緭鍏ョ數浠�"
- clearable
- type="number"
- step="0.01"
- min="0"
- />
- </el-form-item>
- </el-col>
- </el-row>
- <el-row :gutter="30">
- <el-col :span="12">
- <el-form-item label="宄版锛�" prop="peak">
- <el-input
- v-model="form.peak"
- placeholder="璇疯緭鍏ュ嘲娈�"
- clearable
- type="number"
- step="0.01"
- min="0"
- />
- </el-form-item>
- </el-col>
- <el-col :span="12">
- <el-form-item label="璋锋锛�" prop="valley">
- <el-input
- v-model="form.valley"
- placeholder="璇疯緭鍏ヨ胺娈�"
- clearable
- type="number"
- step="0.01"
- min="0"
- />
- </el-form-item>
- </el-col>
- </el-row>
- <el-row :gutter="30">
- <el-col :span="12">
- <el-form-item label="骞虫锛�" prop="flat">
- <el-input
- v-model="form.flat"
- placeholder="璇疯緭鍏ュ钩娈�"
- clearable
- type="number"
- step="0.01"
- min="0"
- />
- </el-form-item>
- </el-col>
- <el-col :span="12">
- <el-form-item label="灏栨锛�" prop="sharp">
- <el-input
- v-model="form.sharp"
- placeholder="璇疯緭鍏ュ皷娈�"
- clearable
- type="number"
- step="0.01"
- min="0"
- />
- </el-form-item>
- </el-col>
- </el-row>
- </el-form>
- <template #footer>
- <div class="dialog-footer">
- <el-button type="primary" @click="submitForm">纭</el-button>
- <el-button @click="closeDia">鍙栨秷</el-button>
- </div>
- </template>
- </el-dialog>
- </div>
-</template>
-<script setup>
-import {Search} from "@element-plus/icons-vue";
-import {onMounted, ref} from "vue";
-import {ElMessageBox} from "element-plus";
-import {getToken} from "@/utils/auth.js";
-import {periodListPage,periodDelete,periodAdd,periodUpdate} from "@/api/energyManagement/index.js";
-const { proxy } = getCurrentInstance();
-
-const data = reactive({
- searchForm: {
- date: "",
- price: ""
- },
- form: {
- date: "",
- price: "",
- peak: "",
- valley: "",
- flat: "",
- sharp: ""
- }
-});
-const { searchForm,form } = toRefs(data);
-const page = ref({
- current: 1,
- size: 10,
- total: 0
-});
-const dialogFormVisible = ref(false);
-const selectedRows = ref([]);
-const operationType = ref('');
-const tableData = ref([]);
-const emit = defineEmits(['close'])
-const tableLoading = ref(false);
-const tableColumn = ref([
- // {
- // label: "鏃舵鍚嶇О",
- // prop: "timeName",
- // width: 200,
- // },
- {
- label: "鏃ユ湡",
- prop: "date",
- width: 200,
- },
- {
- label: "鐢典环锛堝厓/搴︼級",
- prop: "price",
- width: 200,
- },
- {
- label: "宄版",
- prop: "peak",
- },
- {
- label: "璋锋",
- prop: "valley",
- },
- {
- label: "骞虫",
- prop: "flat",
- },
- {
- label: "灏栨",
- prop: "sharp",
- },
- {
- dataType: "action",
- label: "鎿嶄綔",
- align: "center",
- fixed: 'right',
- operation: [
- {
- name: "缂栬緫",
- type: "text",
- clickFun: (row) => {
- openForm("edit", row);
- },
- },
- ],
- },
-]);
-
-
-// 琛ㄦ牸閫夋嫨鏁版嵁
-const handleSelectionChange = (selection) => {
- selectedRows.value = selection;
-};
-const formDia = ref()
-const upload = reactive({
- // 鏄惁鏄剧ず寮瑰嚭灞傦紙瀹㈡埛瀵煎叆锛�
- open: false,
- // 寮瑰嚭灞傛爣棰橈紙瀹㈡埛瀵煎叆锛�
- title: "",
- // 鏄惁绂佺敤涓婁紶
- isUploading: false,
- // 璁剧疆涓婁紶鐨勮姹傚ご閮�
- headers: { Authorization: "Bearer " + getToken() },
- // 涓婁紶鐨勫湴鍧�
- url: import.meta.env.VITE_APP_BASE_API + "/equipmentEnergyConsumption/importData",
- // 鏂囦欢涓婁紶鍓嶇殑鍥炶皟
- beforeUpload: (file) => {
- console.log('鏂囦欢鍗冲皢涓婁紶', file);
- // 鍙互鍦ㄦ澶勫仛鏂囦欢绫诲瀷鎴栧ぇ灏忔牎楠�
- const isValid = file.type === 'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet' || file.name.endsWith('.xlsx') || file.name.endsWith('.xls');
- if (!isValid) {
- proxy.$modal.msgError("鍙兘涓婁紶 Excel 鏂囦欢");
- }
- return isValid;
- },
- // 鏂囦欢鐘舵�佹敼鍙樻椂鐨勫洖璋�
- onChange: (file, fileList) => {
- console.log('鏂囦欢鐘舵�佹敼鍙�', file, fileList);
- },
- // 鏂囦欢涓婁紶鎴愬姛鏃剁殑鍥炶皟
- onSuccess: (response, file, fileList) => {
- console.log('涓婁紶鎴愬姛', response, file, fileList);
- if(response.code === 200){
- proxy.$modal.msgSuccess("鏂囦欢涓婁紶鎴愬姛");
- }else if(response.code === 500){
- ElMessageBox.error(response.msg);
- }else{
- ElMessageBox.warning(response.msg);
- }
- },
- // 鏂囦欢涓婁紶澶辫触鏃剁殑鍥炶皟
- onError: (error, file, fileList) => {
- console.error('涓婁紶澶辫触', error, file, fileList);
- ElMessageBox.error("鏂囦欢涓婁紶澶辫触");
- },
- // 鏂囦欢涓婁紶杩涘害鍥炶皟
- onProgress: (event, file, fileList) => {
- console.log('涓婁紶涓�...', event.percent);
- }
-});
-
-// 鏌ヨ鍒楄〃
-/** 鎼滅储鎸夐挳鎿嶄綔 */
-const handleQuery = () => {
- page.current = 1;
- getList();
-};
-//閲嶇疆
-const resetFilters = () => {
- searchForm.value = {
- date: "",
- price: ""
- };
- getList();
-
-};
-const pagination = (obj) => {
- page.current = obj.page;
- page.size = obj.limit;
- getList();
-};
-const getList = () => {
- tableLoading.value = true;
- periodListPage({ ...searchForm, ...page.value }).then((res) => {
- tableLoading.value = false;
- if (res && res.data) {
- tableData.value = res.data.records || [];
- page.total = res.data.total || 0;
- } else {
- tableData.value = [];
- page.total = 0;
- ElMessageBox.warning('鏈幏鍙栧埌鏁版嵁');
- }
- })
- .catch((err) => {
- tableLoading.value = false;
- console.error('鏁版嵁鍔犺浇澶辫触:', err);
- ElMessageBox.error('鏁版嵁鍔犺浇澶辫触锛岃閲嶈瘯');
- });
-};
-// 鎵撳紑寮规
-const openDialog = (type, row) => {
- operationType.value = type;
- dialogFormVisible.value = true;
- // form.value.maintainer = userStore.nickName;
- // form.value.maintenanceTime = getCurrentDate();
- form.value = {}
- proxy.resetForm("formRef");
- periodListPage().then((res) => {
- codeList.value = res.data;
- });
- if (type === "edit") {
- form.value = {...row}
- }
-}
-// 鎵撳紑寮规
-const openForm = (type, row) => {
- openDialog(type, row)
-};
-// 鎻愪氦琛ㄥ崟
-const submitForm = () => {
- proxy.$refs["formRef"].validate(valid => {
- if (valid) {
- if (operationType.value === "add") {
- periodAdd(form.value).then(response => {
- proxy.$modal.msgSuccess("鏂板鎴愬姛")
- closeDia()
- getList()
- })
- } else {
- periodUpdate(form.value).then(response => {
- proxy.$modal.msgSuccess("淇敼鎴愬姛")
- closeDia()
- getList()
- })
- }
- }
- })
-}
-// 鍏抽棴寮规
-const closeDia = () => {
- proxy.resetForm("formRef");
- dialogFormVisible.value = false;
- emit('close')
-};
-/** 瀵煎叆鎸夐挳鎿嶄綔 */
-function handleImport() {
- upload.title = "璁惧鑳借��";
- upload.open = true;
- // 娓呯┖涓婃涓婁紶鐨勬枃浠跺垪琛�
- nextTick(() => {
- proxy.$refs["uploadRef"]?.clearFiles();
- });
-}
-function importTemplate() {
- proxy.download(
- "/equipmentEnergyConsumption/export",
- {},
- '璁惧鑳借�楀鍏ユā鐗�.xlsx'
- );
-}
-/** 鎻愪氦涓婁紶鏂囦欢 */
-function submitFileForm() {
- proxy.$refs["uploadRef"].submit();
-}
-
-/** 寮规鍏抽棴鏃舵竻绌烘枃浠跺垪琛� */
-function handleDialogClose() {
- nextTick(() => {
- proxy.$refs["uploadRef"]?.clearFiles();
- });
-}
-
-const handleDelete = () => {
- let ids = [];
- if (selectedRows.value.length > 0) {
- ids = selectedRows.value.map((item) => item.id);
- } else {
- proxy.$modal.msgWarning("璇烽�夋嫨鏁版嵁");
- return;
- }
- ElMessageBox.confirm("閫変腑鐨勫唴瀹瑰皢琚垹闄わ紝鏄惁纭鍒犻櫎锛�", "鍒犻櫎鎻愮ず", {
- confirmButtonText: "纭",
- cancelButtonText: "鍙栨秷",
- type: "warning",
- })
- .then(() => {
- tableLoading.value = true;
- periodDelete(ids)
- .then((res) => {
- proxy.$modal.msgSuccess("鍒犻櫎鎴愬姛");
- getList();
- })
- .finally(() => {
- tableLoading.value = false;
- });
- })
- .catch(() => {
- proxy.$modal.msg("宸插彇娑�");
- });
-};
-onMounted(() => {
- getList();
-});
-</script>
-
-<style scoped>
-
-</style>
diff --git a/src/views/energyManagement/energyPower/components/formDia.vue b/src/views/energyManagement/energyPower/components/formDia.vue
deleted file mode 100644
index 518a254..0000000
--- a/src/views/energyManagement/energyPower/components/formDia.vue
+++ /dev/null
@@ -1,235 +0,0 @@
-<template>
- <div>
- <el-dialog
- v-model="dialogFormVisible"
- title="璁惧鑳借��"
- width="70%"
- @close="closeDia"
- >
- <el-form
- :model="form"
- label-width="140px"
- label-position="top"
- :rules="rules"
- ref="formRef"
- >
- <el-row :gutter="30">
- <el-col :span="12">
- <el-form-item label="璁惧锛�" prop="code">
- <el-select
- v-model="form.code"
- placeholder="璇烽�夋嫨"
- clearable
- @change="setName"
- :disabled="operationType !== 'add'"
- >
- <el-option
- v-for="item in codeList"
- :key="item.deviceModel"
- :label="item.deviceName"
- :value="item.deviceModel"
- >
- {{item.deviceName + '--' + item.deviceModel}}
- </el-option>
- </el-select>
- </el-form-item>
- </el-col>
- <el-col :span="12">
- <el-form-item label="鐢ㄧ數娑堣�楀尯鍩燂細" prop="electricityConsumptionAreaId">
- <el-cascader
- v-model="form.electricityConsumptionAreaId"
- :options="areaList"
- :props="{
- value: 'id',
- label: 'label',
- children: 'children',
- checkStrictly: true,
- }"
- placeholder="璇烽�夋嫨鍖哄煙"
- clearable
- style="width: 100%"
- />
- </el-form-item>
- </el-col>
- </el-row>
- <el-row :gutter="30">
- <el-col :span="12">
- <el-form-item label="姣忔棩闄愬埗鐢甸噺锛�" prop="everyNum">
- <el-input
- v-model="form.everyNum"
- placeholder="璇疯緭鍏�"
- clearable
- />
- </el-form-item>
- </el-col>
- <el-col :span="12">
- <el-form-item label="棰濆畾鍔熺巼锛�" prop="powerRating">
- <el-input
- v-model="form.powerRating"
- placeholder="璇疯緭鍏�"
- clearable
- />
- </el-form-item>
- </el-col>
- </el-row>
- <el-row :gutter="30">
- <el-col :span="12">
- <el-form-item label="瀹為檯鍔熺巼锛�" prop="powerActual">
- <el-input
- v-model="form.powerActual"
- placeholder="璇疯緭鍏�"
- clearable
- />
- </el-form-item>
- </el-col>
- <el-col :span="12">
- <el-form-item label="杩愯鏃堕棿锛�" prop="runDate">
- <el-date-picker
- style="width: 100%"
- v-model="form.runDate"
- value-format="YYYY-MM-DD"
- format="YYYY-MM-DD"
- type="date"
- placeholder="璇烽�夋嫨"
- clearable
- />
- </el-form-item>
- </el-col>
- </el-row>
- <el-row :gutter="30">
- <el-col :span="12">
- <el-form-item label="褰撴棩鐢ㄧ數閲忥細" prop="dayNum">
- <el-input
- v-model="form.dayNum"
- placeholder="璇疯緭鍏�"
- clearable
- />
- </el-form-item>
- </el-col>
- </el-row>
- </el-form>
- <template #footer>
- <div class="dialog-footer">
- <el-button type="primary" @click="submitForm">纭</el-button>
- <el-button @click="closeDia">鍙栨秷</el-button>
- </div>
- </template>
- </el-dialog>
- </div>
-</template>
-
-<script setup>
-import {ref} from "vue";
-import useUserStore from "@/store/modules/user.js";
-import {deviceList, equipmentEnergyAdd, equipmentEnergyUpdate, areaListTree} from "@/api/energyManagement/index.js";
-const { proxy } = getCurrentInstance()
-const emit = defineEmits(['close'])
-const dialogFormVisible = ref(false);
-const operationType = ref('')
-const userStore = useUserStore();
-
-const data = reactive({
- form: {
- name: "",
- code: "",
- everyNum: "",
- powerRating: "",
- powerActual: "",
- runDate: "",
- dayNum: "",
- electricityConsumptionAreaId: "",
- },
- rules: {
- code: [{ required: true, message: "璇烽�夋嫨", trigger: "change" }],
- runDate: [{ required: true, message: "璇烽�夋嫨", trigger: "change" }],
- everyNum: [{ required: true, message: "璇疯緭鍏�", trigger: "blur" }],
- powerRating: [{ required: true, message: "璇疯緭鍏�", trigger: "blur" }],
- powerActual: [{ required: true, message: "璇疯緭鍏�", trigger: "blur" }],
- dayNum: [{ required: true, message: "璇疯緭鍏�", trigger: "blur" }],
- electricityConsumptionAreaId: [{ required: true, message: "璇烽�夋嫨鍖哄煙", trigger: "change" }],
- },
-})
-const { form, rules } = toRefs(data);
-const codeList = ref([])
-const areaList = ref([])
-
-// 鎵撳紑寮规
-const openDialog = (type, row) => {
- operationType.value = type;
- dialogFormVisible.value = true;
- // form.value.maintainer = userStore.nickName;
- // form.value.maintenanceTime = getCurrentDate();
- form.value = {}
- proxy.resetForm("formRef");
-
- // 鑾峰彇璁惧鍒楄〃
- deviceList().then((res) => {
- codeList.value = res.data;
- });
-
- // 鑾峰彇鍖哄煙鍒楄〃
- areaListTree().then((res) => {
- areaList.value = res;
- console.log("areaList", res);
- });
-
- if (type === "edit") {
- form.value = {...row}
- // 缂栬緫鏃讹紝灏嗗崟涓狪D杞崲涓烘暟缁勬牸寮忕敤浜庡洖鏄�
- if (row.electricityConsumptionAreaId) {
- form.value.electricityConsumptionAreaId = [row.electricityConsumptionAreaId];
- }
- }
-}
-const setName = (code) => {
- const index = codeList.value.findIndex(item => item.deviceModel === code);
- if (index > -1) {
- console.log(codeList)
- form.value.name = codeList.value[index].deviceName;
- }
-}
-const submitForm = () => {
- proxy.$refs["formRef"].validate(valid => {
- if (valid) {
- // 鎻愪氦鍓嶅鐞� electricityConsumptionAreaId锛屽彇鏁扮粍鐨勬渶鍚庝竴涓��
- const submitData = { ...form.value };
- if (Array.isArray(submitData.electricityConsumptionAreaId) && submitData.electricityConsumptionAreaId.length > 0) {
- submitData.electricityConsumptionAreaId = submitData.electricityConsumptionAreaId[submitData.electricityConsumptionAreaId.length - 1];
- }
-
- if (operationType.value === "add") {
- equipmentEnergyAdd(submitData).then(response => {
- proxy.$modal.msgSuccess("鏂板鎴愬姛")
- closeDia()
- })
- } else {
- equipmentEnergyUpdate(submitData).then(response => {
- proxy.$modal.msgSuccess("淇敼鎴愬姛")
- closeDia()
- })
- }
- }
- })
-}
-// 鍏抽棴寮规
-const closeDia = () => {
- proxy.resetForm("formRef");
- dialogFormVisible.value = false;
- emit('close')
-};
-// 鑾峰彇褰撳墠鏃ユ湡骞舵牸寮忓寲涓� YYYY-MM-DD
-function getCurrentDate() {
- const today = new Date();
- const year = today.getFullYear();
- const month = String(today.getMonth() + 1).padStart(2, "0"); // 鏈堜唤浠�0寮�濮�
- const day = String(today.getDate()).padStart(2, "0");
- return `${year}-${month}-${day}`;
-}
-defineExpose({
- openDialog,
-});
-</script>
-
-<style scoped>
-
-</style>
\ No newline at end of file
diff --git a/src/views/energyManagement/energyPower/index.vue b/src/views/energyManagement/energyPower/index.vue
deleted file mode 100644
index 6d7ba83..0000000
--- a/src/views/energyManagement/energyPower/index.vue
+++ /dev/null
@@ -1,305 +0,0 @@
-<template>
- <div class="app-container">
- <div class="search_form">
- <div>
- <span class="search_title">璁惧鍚嶇О锛�</span>
- <el-input
- v-model="searchForm.name"
- style="width: 240px"
- placeholder="璇疯緭鍏�"
- @change="handleQuery"
- clearable
- :prefix-icon="Search"
- />
- <el-button type="primary" @click="handleQuery" style="margin-left: 10px"
- >鎼滅储</el-button
- >
- </div>
- <div>
- <el-button type="primary" @click="openForm('add')">鏂板</el-button>
- <el-button type="info" plain icon="Upload" @click="handleImport">瀵煎叆</el-button>
- <el-button type="danger" plain @click="handleDelete">鍒犻櫎</el-button>
- </div>
- </div>
- <div class="table_list">
- <PIMTable
- rowKey="id"
- :column="tableColumn"
- :tableData="tableData"
- :page="page"
- :isSelection="true"
- @selection-change="handleSelectionChange"
- :tableLoading="tableLoading"
- @pagination="pagination"
- ></PIMTable>
- </div>
- <form-dia ref="formDia" @close="handleQuery"></form-dia>
- <el-dialog
- :title="upload.title"
- v-model="upload.open"
- width="400px"
- append-to-body
- @close="handleDialogClose"
- >
- <el-upload
- ref="uploadRef"
- :limit="1"
- accept=".xlsx, .xls"
- :headers="upload.headers"
- :action="upload.url"
- :disabled="upload.isUploading"
- :before-upload="upload.beforeUpload"
- :on-progress="upload.onProgress"
- :on-success="upload.onSuccess"
- :on-error="upload.onError"
- :on-change="upload.onChange"
- :auto-upload="false"
- drag
- >
- <el-icon class="el-icon--upload"><upload-filled /></el-icon>
- <div class="el-upload__text">灏嗘枃浠舵嫋鍒版澶勶紝鎴�<em>鐐瑰嚮涓婁紶</em></div>
- <template #tip>
- <div class="el-upload__tip text-center">
- <span>浠呭厑璁稿鍏ls銆亁lsx鏍煎紡鏂囦欢銆�</span>
- <el-link
- type="primary"
- :underline="false"
- style="font-size: 12px; vertical-align: baseline"
- @click="importTemplate"
- >涓嬭浇妯℃澘</el-link
- >
- </div>
- </template>
- </el-upload>
- <template #footer>
- <div class="dialog-footer">
- <el-button type="primary" @click="submitFileForm">纭� 瀹�</el-button>
- <el-button @click="upload.open = false">鍙� 娑�</el-button>
- </div>
- </template>
- </el-dialog>
- </div>
-</template>
-
-<script setup>
-import {Search} from "@element-plus/icons-vue";
-import {onMounted, ref} from "vue";
-import FormDia from "@/views/energyManagement/energyPower/components/formDia.vue";
-import {ElMessageBox} from "element-plus";
-import {getToken} from "@/utils/auth.js";
-import {equipmentEnergyDelete, equipmentEnergyListPage} from "@/api/energyManagement/index.js";
-const { proxy } = getCurrentInstance();
-
-const data = reactive({
- searchForm: {
- name: "",
- },
-});
-const { searchForm } = toRefs(data);
-
-const selectedRows = ref([]);
-const tableColumn = ref([
- {
- label: "璁惧鍚嶇О",
- prop: "name",
- width: 200,
- },
- {
- label: "瑙勬牸鍨嬪彿",
- prop: "code",
- width: 200,
- },
- {
- label: "棰濆畾鍔熺巼",
- prop: "powerRating",
- },
- {
- label: "瀹為檯鍔熺巼",
- prop: "powerActual",
- },
- {
- label: "杩愯鏃堕棿",
- prop: "runDate",
- width:150
- },
- {
- label: "褰撴棩鐢ㄧ數閲�",
- prop: "dayNum",
- width: 150,
- },
- // {
- // label: "绱鐢ㄧ數閲�",
- // prop: "sumNum",
- // width: 150,
- // },
- {
- label: "姣忔棩闄愬埗鐢甸噺",
- prop: "everyNum",
- width:220
- },
- {
- dataType: "action",
- label: "鎿嶄綔",
- align: "center",
- fixed: 'right',
- operation: [
- {
- name: "缂栬緫",
- type: "text",
- clickFun: (row) => {
- openForm("edit", row);
- },
- },
- ],
- },
-]);
-const tableData = ref([]);
-const tableLoading = ref(false);
-const page = reactive({
- current: 1,
- size: 100,
- total: 0,
-});
-// 琛ㄦ牸閫夋嫨鏁版嵁
-const handleSelectionChange = (selection) => {
- selectedRows.value = selection;
-};
-const formDia = ref()
-const upload = reactive({
- // 鏄惁鏄剧ず寮瑰嚭灞傦紙瀹㈡埛瀵煎叆锛�
- open: false,
- // 寮瑰嚭灞傛爣棰橈紙瀹㈡埛瀵煎叆锛�
- title: "",
- // 鏄惁绂佺敤涓婁紶
- isUploading: false,
- // 璁剧疆涓婁紶鐨勮姹傚ご閮�
- headers: { Authorization: "Bearer " + getToken() },
- // 涓婁紶鐨勫湴鍧�
- url: import.meta.env.VITE_APP_BASE_API + "/equipmentEnergyConsumption/importData",
- // 鏂囦欢涓婁紶鍓嶇殑鍥炶皟
- beforeUpload: (file) => {
- console.log('鏂囦欢鍗冲皢涓婁紶', file);
- // 鍙互鍦ㄦ澶勫仛鏂囦欢绫诲瀷鎴栧ぇ灏忔牎楠�
- const isValid = file.type === 'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet' || file.name.endsWith('.xlsx') || file.name.endsWith('.xls');
- if (!isValid) {
- proxy.$modal.msgError("鍙兘涓婁紶 Excel 鏂囦欢");
- }
- return isValid;
- },
- // 鏂囦欢鐘舵�佹敼鍙樻椂鐨勫洖璋�
- onChange: (file, fileList) => {
- console.log('鏂囦欢鐘舵�佹敼鍙�', file, fileList);
- },
- // 鏂囦欢涓婁紶鎴愬姛鏃剁殑鍥炶皟
- onSuccess: (response, file, fileList) => {
- console.log('涓婁紶鎴愬姛', response, file, fileList);
- if(response.code === 200){
- proxy.$modal.msgSuccess("鏂囦欢涓婁紶鎴愬姛");
- }else if(response.code === 500){
- proxy.$modal.msgError(response.msg);
- }else{
- proxy.$modal.msgWarning(response.msg);
- }
- },
- // 鏂囦欢涓婁紶澶辫触鏃剁殑鍥炶皟
- onError: (error, file, fileList) => {
- console.error('涓婁紶澶辫触', error, file, fileList);
- proxy.$modal.msgError("鏂囦欢涓婁紶澶辫触");
- },
- // 鏂囦欢涓婁紶杩涘害鍥炶皟
- onProgress: (event, file, fileList) => {
- console.log('涓婁紶涓�...', event.percent);
- }
-});
-
-// 鏌ヨ鍒楄〃
-/** 鎼滅储鎸夐挳鎿嶄綔 */
-const handleQuery = () => {
- page.current = 1;
- getList();
-};
-const pagination = (obj) => {
- page.current = obj.page;
- page.size = obj.limit;
- getList();
-};
-const getList = () => {
- tableLoading.value = true;
- equipmentEnergyListPage({ ...searchForm.value, ...page }).then((res) => {
- tableLoading.value = false;
- tableData.value = res.data.records;
- page.total = res.data.total;
- });
-};
-
-// 鎵撳紑寮规
-const openForm = (type, row) => {
- nextTick(() => {
- formDia.value?.openDialog(type, row)
- })
-};
-
-/** 瀵煎叆鎸夐挳鎿嶄綔 */
-function handleImport() {
- upload.title = "璁惧鑳借��";
- upload.open = true;
- // 娓呯┖涓婃涓婁紶鐨勬枃浠跺垪琛�
- nextTick(() => {
- proxy.$refs["uploadRef"]?.clearFiles();
- });
-}
-function importTemplate() {
- proxy.download(
- "/equipmentEnergyConsumption/export",
- {},
- '璁惧鑳借�楀鍏ユā鐗�.xlsx'
- );
-}
-/** 鎻愪氦涓婁紶鏂囦欢 */
-function submitFileForm() {
- proxy.$refs["uploadRef"].submit();
-}
-
-/** 寮规鍏抽棴鏃舵竻绌烘枃浠跺垪琛� */
-function handleDialogClose() {
- nextTick(() => {
- proxy.$refs["uploadRef"]?.clearFiles();
- });
-}
-
-const handleDelete = () => {
- let ids = [];
- if (selectedRows.value.length > 0) {
- ids = selectedRows.value.map((item) => item.id);
- } else {
- proxy.$modal.msgWarning("璇烽�夋嫨鏁版嵁");
- return;
- }
- ElMessageBox.confirm("閫変腑鐨勫唴瀹瑰皢琚垹闄わ紝鏄惁纭鍒犻櫎锛�", "鍒犻櫎鎻愮ず", {
- confirmButtonText: "纭",
- cancelButtonText: "鍙栨秷",
- type: "warning",
- })
- .then(() => {
- tableLoading.value = true;
- equipmentEnergyDelete(ids)
- .then((res) => {
- proxy.$modal.msgSuccess("鍒犻櫎鎴愬姛");
- getList();
- })
- .finally(() => {
- tableLoading.value = false;
- });
- })
- .catch(() => {
- proxy.$modal.msg("宸插彇娑�");
- });
-};
-onMounted(() => {
- getList();
-});
-</script>
-
-<style scoped>
-
-</style>
\ No newline at end of file
diff --git a/src/views/energyManagement/energyTrends/index.vue b/src/views/energyManagement/energyTrends/index.vue
deleted file mode 100644
index 0e7bcbf..0000000
--- a/src/views/energyManagement/energyTrends/index.vue
+++ /dev/null
@@ -1,116 +0,0 @@
-<template>
- <div class="app-container">
- <div class="search_form">
- <div>
- <span class="search_title">璁惧鍚嶇О锛�</span>
- <el-input
- v-model="searchForm.name"
- style="width: 240px"
- placeholder="璇疯緭鍏�"
- @change="handleQuery"
- clearable
- :prefix-icon="Search"
- />
- <el-button type="primary" @click="handleQuery" style="margin-left: 10px"
- >鎼滅储</el-button
- >
- </div>
- </div>
- <div class="table_list">
- <PIMTable
- rowKey="id"
- :column="tableColumn"
- :tableData="tableData"
- :page="page"
- :isSelection="true"
- @selection-change="handleSelectionChange"
- :tableLoading="tableLoading"
- @pagination="pagination"
- ></PIMTable>
- </div>
-
- </div>
-</template>
-
-<script setup>
-import {Search} from "@element-plus/icons-vue";
-import {onMounted, ref} from "vue";
-import {listPageByTrend} from "@/api/energyManagement/index.js";
-
-const data = reactive({
- searchForm: {
- name: "",
- },
-});
-const { searchForm } = toRefs(data);
-
-const tableColumn = ref([
- {
- label: "璁惧鍚嶇О",
- prop: "name",
- width: 220,
- },
- {
- label: "瑙勬牸鍨嬪彿",
- prop: "code",
- width: 220,
- },
- {
- label: "杩愯鏃堕棿",
- prop: "runDate",
- width: 250,
- },
- {
- label: "鏄ㄦ棩鐢ㄧ數閲�",
- prop: "toDayNum",
- },
- {
- label: "鏈湀骞冲潎鐢甸噺",
- prop: "avgNum",
- width:150
- },
- {
- label: "瓒嬪娍",
- prop: "trend",
- width: 220,
- },
-]);
-const tableData = ref([]);
-const tableLoading = ref(false);
-const page = reactive({
- current: 1,
- size: 100,
- total: 0,
-});
-// 琛ㄦ牸閫夋嫨鏁版嵁
-const handleSelectionChange = (selection) => {
- selectedRows.value = selection;
-};
-
-// 鏌ヨ鍒楄〃
-/** 鎼滅储鎸夐挳鎿嶄綔 */
-const handleQuery = () => {
- page.current = 1;
- getList();
-};
-const pagination = (obj) => {
- page.current = obj.page;
- page.size = obj.limit;
- getList();
-};
-const getList = () => {
- tableLoading.value = true;
- listPageByTrend({ ...searchForm.value, ...page }).then((res) => {
- tableLoading.value = false;
- tableData.value = res.data.records;
- page.total = res.data.total;
- });
-};
-onMounted(() => {
- getList();
-});
-</script>
-
-<style scoped>
-
-</style>
\ No newline at end of file
diff --git a/src/views/energyManagement/gasManagement/index.vue b/src/views/energyManagement/gasManagement/index.vue
deleted file mode 100644
index 59ca9f7..0000000
--- a/src/views/energyManagement/gasManagement/index.vue
+++ /dev/null
@@ -1,624 +0,0 @@
-<template>
- <div class="app-container">
- <!-- 椤甸潰鏍囬 -->
- <div class="page-header">
- <h2>鐢ㄦ皵绠$悊绯荤粺</h2>
- <div class="header-info">
- <span class="update-time">鏈�鍚庢洿鏂帮細{{ lastUpdateTime }}</span>
- <el-button type="primary" size="small" @click="refreshData">
- <el-icon><Refresh /></el-icon>
- 鍒锋柊鏁版嵁
- </el-button>
- </div>
- </div>
-
- <!-- 缁熻鍗$墖鍖哄煙 -->
- <div class="stats-cards">
- <el-row :gutter="20">
- <el-col :span="6">
- <el-card class="stat-card">
- <div class="stat-content">
- <div class="stat-icon gas-device">
- <el-icon size="32"><Box /></el-icon>
- </div>
- <div class="stat-info">
- <div class="stat-value">{{ totalDevices }}</div>
- <div class="stat-label">鍦ㄧ敤璁惧</div>
- </div>
- </div>
- </el-card>
- </el-col>
- <el-col :span="6">
- <el-card class="stat-card">
- <div class="stat-content">
- <div class="stat-icon daily-consumption">
- <el-icon size="32"><TrendCharts /></el-icon>
- </div>
- <div class="stat-info">
- <div class="stat-value">{{ dailyConsumption }} m鲁</div>
- <div class="stat-label">鏃ヨ�楅噺</div>
- </div>
- </div>
- </el-card>
- </el-col>
- <el-col :span="6">
- <el-card class="stat-card">
- <div class="stat-content">
- <div class="stat-icon monthly-consumption">
- <el-icon size="32"><DataLine /></el-icon>
- </div>
- <div class="stat-info">
- <div class="stat-value">{{ monthlyConsumption }} m鲁</div>
- <div class="stat-label">鏈堣�楅噺</div>
- </div>
- </div>
- </el-card>
- </el-col>
- <el-col :span="6">
- <el-card class="stat-card">
- <div class="stat-content">
- <div class="stat-icon gas-price">
- <el-icon size="32"><Money /></el-icon>
- </div>
- <div class="stat-info">
- <div class="stat-value">楼{{ gasUnitPrice }}</div>
- <div class="stat-label">姘斾綋鍗曚环</div>
- </div>
- </div>
- </el-card>
- </el-col>
- </el-row>
- </div>
-
- <!-- 璐圭敤缁熻鍖哄煙 -->
- <div class="cost-stats">
- <el-row :gutter="20">
- <el-col :span="12">
- <el-card class="cost-card">
- <template #header>
- <div class="card-header">
- <span>鏃ヨ垂鐢ㄧ粺璁�</span>
- <el-tag type="success" size="small">浠婃棩</el-tag>
- </div>
- </template>
- <div class="cost-content">
- <div class="cost-main">
- <span class="cost-amount">楼{{ dailyTotalCost.toFixed(2) }}</span>
- <span class="cost-unit">鍏�</span>
- </div>
- <div class="cost-details">
- <div class="cost-item">
- <span>娑堣�楅噺锛�</span>
- <span>{{ dailyConsumption }} m鲁</span>
- </div>
- <div class="cost-item">
- <span>鍗曚环锛�</span>
- <span>楼{{ gasUnitPrice }}/m鲁</span>
- </div>
- </div>
- </div>
- </el-card>
- </el-col>
- <el-col :span="12">
- <el-card class="cost-card">
- <template #header>
- <div class="card-header">
- <span>鏈堣垂鐢ㄧ粺璁�</span>
- <el-tag type="primary" size="small">鏈湀</el-tag>
- </div>
- </template>
- <div class="cost-content">
- <div class="cost-main">
- <span class="cost-amount">楼{{ monthlyTotalCost.toFixed(2) }}</span>
- <span class="cost-unit">鍏�</span>
- </div>
- <div class="cost-details">
- <div class="cost-item">
- <span>娑堣�楅噺锛�</span>
- <span>{{ monthlyConsumption }} m鲁</span>
- </div>
- <div class="cost-item">
- <span>骞冲潎鍗曚环锛�</span>
- <span>楼{{ gasUnitPrice }}/m鲁</span>
- </div>
- </div>
- </div>
- </el-card>
- </el-col>
- </el-row>
- </div>
-
- <!-- 璁惧鍒楄〃鍖哄煙 -->
- <div class="device-section">
- <el-card>
- <template #header>
- <div class="card-header">
- <span>璁惧鐩戞帶</span>
- <div class="header-actions">
- <el-button type="primary" size="small" @click="addDevice">
- <el-icon><Plus /></el-icon>
- 娣诲姞璁惧
- </el-button>
- </div>
- </div>
- </template>
-
- <el-table :data="deviceList" border style="width: 100%" v-loading="tableLoading" stripe>
- <el-table-column align="center" label="搴忓彿" type="index" width="60" />
- <el-table-column label="璁惧缂栧彿" prop="deviceCode" width="120" show-overflow-tooltip />
- <el-table-column label="璁惧鍚嶇О" prop="deviceName" width="150" show-overflow-tooltip />
- <el-table-column label="璁惧绫诲瀷" prop="deviceType" width="120" show-overflow-tooltip />
- <el-table-column label="瑙勬牸鍨嬪彿" prop="specification" width="150" show-overflow-tooltip />
- <el-table-column label="褰撳墠鍘嬪姏(MPa)" prop="currentPressure" width="130" show-overflow-tooltip>
- <template #default="scope">
- <span :class="getPressureClass(scope.row.currentPressure)">
- {{ scope.row.currentPressure }}
- </span>
- </template>
- </el-table-column>
- <el-table-column label="褰撳墠娓╁害(鈩�)" prop="currentTemperature" width="130" show-overflow-tooltip>
- <template #default="scope">
- <span :class="getTemperatureClass(scope.row.currentTemperature)">
- {{ scope.row.currentTemperature }}
- </span>
- </template>
- </el-table-column>
- <el-table-column label="姘斾綋娴撳害(ppm)" prop="gasConcentration" width="140" show-overflow-tooltip>
- <template #default="scope">
- <span :class="getConcentrationClass(scope.row.gasConcentration)">
- {{ scope.row.gasConcentration }}
- </span>
- </template>
- </el-table-column>
- <el-table-column label="杩愯鐘舵��" prop="status" width="100" show-overflow-tooltip>
- <template #default="scope">
- <el-tag :type="getStatusType(scope.row.status)" size="small">
- {{ getStatusText(scope.row.status) }}
- </el-tag>
- </template>
- </el-table-column>
- <el-table-column label="鏈�鍚庢洿鏂�" prop="lastUpdate" width="160" show-overflow-tooltip />
- <el-table-column label="鎿嶄綔" align="center" width="100" fixed="right">
- <template #default="scope">
- <el-button link size="small" @click="editDevice(scope.row)">
- 缂栬緫
- </el-button>
- </template>
- </el-table-column>
- </el-table>
- </el-card>
- </div>
-
- <!-- 娣诲姞/缂栬緫璁惧寮圭獥 -->
- <el-dialog v-model="deviceDialogVisible" :title="dialogTitle" width="600px">
- <el-form :model="deviceForm" :rules="deviceRules" ref="deviceFormRef" label-width="120px">
- <el-row :gutter="20">
- <el-col :span="12">
- <el-form-item label="璁惧缂栧彿" prop="deviceCode">
- <el-input v-model="deviceForm.deviceCode" placeholder="璇疯緭鍏ヨ澶囩紪鍙�" />
- </el-form-item>
- </el-col>
- <el-col :span="12">
- <el-form-item label="璁惧鍚嶇О" prop="deviceName">
- <el-input v-model="deviceForm.deviceName" placeholder="璇疯緭鍏ヨ澶囧悕绉�" />
- </el-form-item>
- </el-col>
- </el-row>
- <el-row :gutter="20">
- <el-col :span="12">
- <el-form-item label="璁惧绫诲瀷" prop="deviceType">
- <el-select v-model="deviceForm.deviceType" placeholder="璇烽�夋嫨璁惧绫诲瀷" style="width: 100%">
- <el-option label="娑插寲姘斿偍缃�" value="娑插寲姘斿偍缃�" />
- <el-option label="鍘嬬缉姘斿偍缃�" value="鍘嬬缉姘斿偍缃�" />
- <el-option label="澶╃劧姘斿偍缃�" value="澶╃劧姘斿偍缃�" />
- <el-option label="姘ф皵鍌ㄧ綈" value="姘ф皵鍌ㄧ綈" />
- <el-option label="鍏朵粬" value="鍏朵粬" />
- </el-select>
- </el-form-item>
- </el-col>
- <el-col :span="12">
- <el-form-item label="瑙勬牸鍨嬪彿" prop="specification">
- <el-input v-model="deviceForm.specification" placeholder="璇疯緭鍏ヨ鏍煎瀷鍙�" />
- </el-form-item>
- </el-col>
- </el-row>
- <el-row :gutter="20">
- <el-col :span="12">
- <el-form-item label="璁捐鍘嬪姏(MPa)" prop="designPressure">
- <el-input-number v-model="deviceForm.designPressure" :min="0" :precision="2" style="width: 100%" />
- </el-form-item>
- </el-col>
- <el-col :span="12">
- <el-form-item label="瀹圭Н(m鲁)" prop="volume">
- <el-input-number v-model="deviceForm.volume" :min="0" :precision="2" style="width: 100%" />
- </el-form-item>
- </el-col>
- </el-row>
- </el-form>
- <template #footer>
- <el-button @click="deviceDialogVisible = false">鍙栨秷</el-button>
- <el-button type="primary" @click="saveDevice">淇濆瓨</el-button>
- </template>
- </el-dialog>
- </div>
-</template>
-
-<script setup>
-import { ref, reactive, onMounted, onUnmounted } from 'vue'
-import { ElMessage, ElMessageBox } from 'element-plus'
-import {
- Refresh,
- Box,
- TrendCharts,
- DataLine,
- Money,
- Plus
-} from '@element-plus/icons-vue'
-
-// 鍝嶅簲寮忔暟鎹�
-const lastUpdateTime = ref('')
-const totalDevices = ref(0)
-const dailyConsumption = ref(0)
-const monthlyConsumption = ref(0)
-const gasUnitPrice = ref(0)
-const dailyTotalCost = ref(0)
-const monthlyTotalCost = ref(0)
-const deviceList = ref([])
-const tableLoading = ref(false)
-const deviceDialogVisible = ref(false)
-const dialogTitle = ref('')
-const deviceFormRef = ref()
-
-// 璁惧琛ㄥ崟鏁版嵁
-const deviceForm = reactive({
- deviceCode: '',
- deviceName: '',
- deviceType: '',
- specification: '',
- designPressure: 0,
- volume: 0
-})
-
-// 琛ㄥ崟楠岃瘉瑙勫垯
-const deviceRules = {
- deviceCode: [{ required: true, message: '璇疯緭鍏ヨ澶囩紪鍙�', trigger: 'blur' }],
- deviceName: [{ required: true, message: '璇疯緭鍏ヨ澶囧悕绉�', trigger: 'blur' }],
- deviceType: [{ required: true, message: '璇烽�夋嫨璁惧绫诲瀷', trigger: 'change' }],
- specification: [{ required: true, message: '璇疯緭鍏ヨ鏍煎瀷鍙�', trigger: 'blur' }],
- designPressure: [{ required: true, message: '璇疯緭鍏ヨ璁″帇鍔�', trigger: 'blur' }],
- volume: [{ required: true, message: '璇疯緭鍏ュ绉�', trigger: 'blur' }]
-}
-
-// 瀹氭椂鍣�
-let updateTimer = null
-
-// 妯℃嫙鏁版嵁鐢熸垚
-const generateMockData = () => {
- // 鏇存柊缁熻鏁版嵁
- totalDevices.value = Math.floor(Math.random() * 10) + 15 // 15-25鍙拌澶�
- dailyConsumption.value = Math.floor(Math.random() * 100) + 200 // 200-300 m鲁
- monthlyConsumption.value = Math.floor(Math.random() * 2000) + 5000 // 5000-7000 m鲁
- gasUnitPrice.value = (Math.random() * 2 + 3).toFixed(2) // 3-5鍏�/m鲁
-
- // 璁$畻璐圭敤
- dailyTotalCost.value = dailyConsumption.value * gasUnitPrice.value
- monthlyTotalCost.value = monthlyConsumption.value * gasUnitPrice.value
-
- // 鏇存柊璁惧鍒楄〃鏁版嵁
- deviceList.value = Array.from({ length: totalDevices.value }, (_, index) => ({
- id: index + 1,
- deviceCode: `GT${String(index + 1).padStart(3, '0')}`,
- deviceName: `鍌ㄦ皵缃�${index + 1}`,
- deviceType: ['娑插寲姘斿偍缃�', '鍘嬬缉姘斿偍缃�', '澶╃劧姘斿偍缃�', '姘ф皵鍌ㄧ綈'][Math.floor(Math.random() * 4)],
- specification: `${Math.floor(Math.random() * 50) + 50}m鲁`,
- currentPressure: (Math.random() * 2 + 0.5).toFixed(2),
- currentTemperature: (Math.random() * 20 + 15).toFixed(1),
- gasConcentration: (Math.random() * 10).toFixed(2),
- status: ['running', 'stopped', 'warning', 'error'][Math.floor(Math.random() * 4)],
- lastUpdate: new Date().toLocaleString()
- }))
-
- // 鏇存柊鏈�鍚庢洿鏂版椂闂�
- lastUpdateTime.value = new Date().toLocaleString()
-}
-
-// 鑾峰彇鍘嬪姏鐘舵�佹牱寮�
-const getPressureClass = (pressure) => {
- const p = parseFloat(pressure)
- if (p < 0.8) return 'pressure-low'
- if (p > 1.5) return 'pressure-high'
- return 'pressure-normal'
-}
-
-// 鑾峰彇娓╁害鐘舵�佹牱寮�
-const getTemperatureClass = (temperature) => {
- const t = parseFloat(temperature)
- if (t < 10 || t > 35) return 'temperature-warning'
- return 'temperature-normal'
-}
-
-// 鑾峰彇娴撳害鐘舵�佹牱寮�
-const getConcentrationClass = (concentration) => {
- const c = parseFloat(concentration)
- if (c > 5) return 'concentration-warning'
- return 'concentration-normal'
-}
-
-// 鑾峰彇鐘舵�佺被鍨�
-const getStatusType = (status) => {
- const statusMap = {
- running: 'success',
- stopped: 'info',
- warning: 'warning',
- error: 'danger'
- }
- return statusMap[status] || 'info'
-}
-
-// 鑾峰彇鐘舵�佹枃鏈�
-const getStatusText = (status) => {
- const statusMap = {
- running: '杩愯涓�',
- stopped: '宸插仠姝�',
- warning: '璀﹀憡',
- error: '鏁呴殰'
- }
- return statusMap[status] || '鏈煡'
-}
-
-// 鍒锋柊鏁版嵁
-const refreshData = () => {
- generateMockData()
- ElMessage.success('鏁版嵁宸插埛鏂�')
-}
-
-// 娣诲姞璁惧
-const addDevice = () => {
- dialogTitle.value = '娣诲姞璁惧'
- Object.keys(deviceForm).forEach(key => {
- deviceForm[key] = key === 'designPressure' || key === 'volume' ? 0 : ''
- })
- deviceDialogVisible.value = true
-}
-
-// 缂栬緫璁惧
-const editDevice = (row) => {
- dialogTitle.value = '缂栬緫璁惧'
- Object.keys(deviceForm).forEach(key => {
- if (row[key] !== undefined) {
- deviceForm[key] = row[key]
- }
- })
- deviceDialogVisible.value = true
-}
-
-
-
-// 淇濆瓨璁惧
-const saveDevice = () => {
- deviceFormRef.value.validate((valid) => {
- if (valid) {
- ElMessage.success('淇濆瓨鎴愬姛')
- deviceDialogVisible.value = false
- refreshData()
- }
- })
-}
-
-
-
-// 鍚姩瀹氭椂鏇存柊
-const startAutoUpdate = () => {
- updateTimer = setInterval(() => {
- generateMockData()
- }, 60000) // 姣忓垎閽熸洿鏂颁竴娆�
-}
-
-// 鍋滄瀹氭椂鏇存柊
-const stopAutoUpdate = () => {
- if (updateTimer) {
- clearInterval(updateTimer)
- updateTimer = null
- }
-}
-
-// 缁勪欢鎸傝浇
-onMounted(() => {
- generateMockData()
- startAutoUpdate()
-})
-
-// 缁勪欢鍗歌浇
-onUnmounted(() => {
- stopAutoUpdate()
-})
-</script>
-
-<style lang="scss" scoped>
-.app-container {
- padding: 20px;
- background: #f5f5f5;
- min-height: 100vh;
-}
-
-.page-header {
- display: flex;
- justify-content: space-between;
- align-items: center;
- margin-bottom: 20px;
- padding: 20px;
- background: white;
- border-radius: 8px;
- box-shadow: 0 2px 8px rgba(0, 0, 0, 0.1);
-
- h2 {
- margin: 0;
- color: #303133;
- font-size: 24px;
- }
-
- .header-info {
- display: flex;
- align-items: center;
- gap: 15px;
-
- .update-time {
- color: #909399;
- font-size: 14px;
- }
- }
-}
-
-.stats-cards {
- margin-bottom: 20px;
-
- .stat-card {
- .stat-content {
- display: flex;
- align-items: center;
- padding: 10px;
-
- .stat-icon {
- width: 60px;
- height: 60px;
- border-radius: 50%;
- display: flex;
- align-items: center;
- justify-content: center;
- margin-right: 15px;
-
- &.gas-device {
- background: linear-gradient(135deg, #667eea 0%, #764ba2 100%);
- color: white;
- }
-
- &.daily-consumption {
- background: linear-gradient(135deg, #f093fb 0%, #f5576c 100%);
- color: white;
- }
-
- &.monthly-consumption {
- background: linear-gradient(135deg, #4facfe 0%, #00f2fe 100%);
- color: white;
- }
-
- &.gas-price {
- background: linear-gradient(135deg, #43e97b 0%, #38f9d7 100%);
- color: white;
- }
- }
-
- .stat-info {
- .stat-value {
- font-size: 24px;
- font-weight: bold;
- color: #303133;
- line-height: 1;
- }
-
- .stat-label {
- font-size: 14px;
- color: #909399;
- margin-top: 5px;
- }
- }
- }
- }
-}
-
-.cost-stats {
- margin-bottom: 20px;
-
- .cost-card {
- .card-header {
- display: flex;
- justify-content: space-between;
- align-items: center;
- }
-
- .cost-content {
- text-align: center;
- padding: 20px 0;
-
- .cost-main {
- margin-bottom: 15px;
-
- .cost-amount {
- font-size: 36px;
- font-weight: bold;
- color: #409eff;
- }
-
- .cost-unit {
- font-size: 16px;
- color: #909399;
- margin-left: 5px;
- }
- }
-
- .cost-details {
- .cost-item {
- display: flex;
- justify-content: space-between;
- margin-bottom: 8px;
- font-size: 14px;
- color: #606266;
-
- &:last-child {
- margin-bottom: 0;
- }
- }
- }
- }
- }
-}
-
-.device-section {
- .card-header {
- display: flex;
- justify-content: space-between;
- align-items: center;
-
- .header-actions {
- display: flex;
- gap: 10px;
- }
- }
-}
-
-// 鐘舵�佹牱寮�
-.pressure-low {
- color: #e6a23c;
- font-weight: bold;
-}
-
-.pressure-normal {
- color: #67c23a;
- font-weight: bold;
-}
-
-.pressure-high {
- color: #f56c6c;
- font-weight: bold;
-}
-
-.temperature-normal {
- color: #67c23a;
- font-weight: bold;
-}
-
-.temperature-warning {
- color: #e6a23c;
- font-weight: bold;
-}
-
-.concentration-normal {
- color: #67c23a;
- font-weight: bold;
-}
-
-.concentration-warning {
- color: #f56c6c;
- font-weight: bold;
-}
-</style>
diff --git a/src/views/energyManagement/meterCollection/index.vue b/src/views/energyManagement/meterCollection/index.vue
deleted file mode 100644
index 8b2636b..0000000
--- a/src/views/energyManagement/meterCollection/index.vue
+++ /dev/null
@@ -1,556 +0,0 @@
-<template>
- <div class="app-container">
- <el-card class="box-card">
- <div slot="header" class="clearfix">
- <span>鐢佃〃閲囬泦绠$悊</span>
- <el-button style="float: right; padding: 3px 0" link @click="refreshData">
- <i class="el-icon-refresh"></i> 鍒锋柊
- </el-button>
- </div>
-
- <!-- 娴嬭瘯鎸夐挳 -->
- <el-row :gutter="20" style="margin-bottom: 15px;">
- <el-col :span="24">
- <el-button @click="addTestData" type="primary" size="small">娣诲姞娴嬭瘯鏁版嵁</el-button>
- <el-button @click="clearData" type="danger" size="small">娓呯┖鏁版嵁</el-button>
- <el-button @click="testChart" type="success" size="small">娴嬭瘯鍥捐〃</el-button>
- </el-col>
- </el-row>
-
- <!-- 鎼滅储鍖哄煙 -->
- <el-row :gutter="20" class="search-row">
- <el-col :span="6">
- <el-input
- v-model="searchForm.meterNo"
- placeholder="璇疯緭鍏ョ數琛ㄧ紪鍙�"
- clearable
- @keyup.enter.native="handleSearch"
- >
- <i slot="prefix" class="el-input__icon el-icon-search"></i>
- </el-input>
- </el-col>
- <el-col :span="6">
- <el-select v-model="searchForm.location" placeholder="璇烽�夋嫨浣嶇疆" clearable>
- <el-option label="鐢熶骇杞﹂棿A" value="杞﹂棿A"></el-option>
- <el-option label="鐢熶骇杞﹂棿B" value="杞﹂棿B"></el-option>
- <el-option label="鍔炲叕鍖哄煙" value="鍔炲叕鍖�"></el-option>
- <el-option label="閰嶇數瀹�" value="閰嶇數瀹�"></el-option>
- </el-select>
- </el-col>
- <el-col :span="6">
- <el-date-picker
- v-model="searchForm.dateRange"
- type="daterange"
- range-separator="鑷�"
- start-placeholder="寮�濮嬫棩鏈�"
- end-placeholder="缁撴潫鏃ユ湡"
- format="yyyy-MM-dd"
- value-format="yyyy-MM-dd"
- />
- </el-col>
- <el-col :span="6">
- <el-button type="primary" @click="handleSearch">鎼滅储</el-button>
- <el-button @click="resetSearch">閲嶇疆</el-button>
- </el-col>
- </el-row>
-
- <!-- 鐢佃〃鍒楄〃 -->
- <el-table
- :data="meterList"
- style="width: 100%"
- v-loading="loading"
- border
- stripe
- height="calc(100vh - 22em)"
- >
- <el-table-column prop="meterNo" label="鐢佃〃缂栧彿" width="120" />
- <el-table-column prop="location" label="瀹夎浣嶇疆" width="120" />
- <el-table-column prop="meterType" label="鐢佃〃绫诲瀷" width="120" />
- <el-table-column prop="voltage" label="鐢靛帇绛夌骇" width="100" />
- <el-table-column prop="currentReading" label="褰撳墠璇绘暟(kWh)" width="140" />
- <el-table-column prop="lastReading" label="涓婃璇绘暟(kWh)" width="140" />
- <el-table-column prop="consumption" label="鐢ㄧ數閲�(kWh)" width="120" />
- <el-table-column prop="power" label="鍔熺巼(kW)" width="100" />
- <el-table-column prop="powerFactor" label="鍔熺巼鍥犳暟" width="100" />
- <el-table-column prop="status" label="鐘舵��" width="80">
- <template #default="scope">
- <el-tag :type="scope.row.status === '姝e父' ? 'success' : 'danger'">
- {{ scope.row.status }}
- </el-tag>
- </template>
- </el-table-column>
- <el-table-column prop="lastUpdateTime" label="鏈�鍚庢洿鏂版椂闂�" width="160" />
- <el-table-column label="鎿嶄綔" width="180" fixed="right" align="center">
- <template #default="scope">
- <el-button link @click="viewDetails(scope.row)">
- 鏌ョ湅璇︽儏
- </el-button>
- <el-button link @click="manualCollection(scope.row)">
- 鎵嬪姩閲囬泦
- </el-button>
- </template>
- </el-table-column>
- </el-table>
- <!-- 鍒嗛〉 -->
- <pagination
- :total="pagination.total"
- layout="total, sizes, prev, pager, next, jumper"
- :page="pagination.currentPage"
- :limit="pagination.pageSize"
- @pagination="handleCurrentChange"
- />
- </el-card>
-
- <!-- 璇︽儏瀵硅瘽妗� -->
- <el-dialog
- title="鐢佃〃璇︽儏"
- v-model="detailDialogVisible"
- width="60%"
- @opened="onDialogOpened"
- >
- <el-row :gutter="20">
- <el-col :span="12">
- <div class="detail-item">
- <label>鐢佃〃缂栧彿:</label>
- <span>{{ currentMeter.meterNo }}</span>
- </div>
- </el-col>
- <el-col :span="12">
- <div class="detail-item">
- <label>瀹夎浣嶇疆:</label>
- <span>{{ currentMeter.location }}</span>
- </div>
- </el-col>
- <el-col :span="12">
- <div class="detail-item">
- <label>鐢佃〃绫诲瀷:</label>
- <span>{{ currentMeter.meterType }}</span>
- </div>
- </el-col>
- <el-col :span="12">
- <div class="detail-item">
- <label>鐢靛帇绛夌骇:</label>
- <span>{{ currentMeter.voltage }}</span>
- </div>
- </el-col>
- <el-col :span="12">
- <div class="detail-item">
- <label>褰撳墠璇绘暟:</label>
- <span>{{ currentMeter.currentReading }} kWh</span>
- </div>
- </el-col>
- <el-col :span="12">
- <div class="detail-item">
- <label>涓婃璇绘暟:</label>
- <span>{{ currentMeter.lastReading }} kWh</span>
- </div>
- </el-col>
- <el-col :span="12">
- <div class="detail-item">
- <label>鐢ㄧ數閲�:</label>
- <span>{{ currentMeter.consumption }} kWh</span>
- </div>
- </el-col>
- <el-col :span="12">
- <div class="detail-item">
- <label>鍔熺巼:</label>
- <span>{{ currentMeter.power }} kW</span>
- </div>
- </el-col>
- <el-col :span="12">
- <div class="detail-item">
- <label>鍔熺巼鍥犳暟:</label>
- <span>{{ currentMeter.powerFactor }}</span>
- </div>
- </el-col>
- <el-col :span="12">
- <div class="detail-item">
- <label>鐘舵��:</label>
- <el-tag :type="currentMeter.status === '姝e父' ? 'success' : 'danger'">
- {{ currentMeter.status }}
- </el-tag>
- </div>
- </el-col>
- <el-col :span="12">
- <div class="detail-item">
- <label>鏈�鍚庢洿鏂版椂闂�:</label>
- <span>{{ currentMeter.lastUpdateTime }}</span>
- </div>
- </el-col>
- </el-row>
-
- <!-- 鐢ㄧ數瓒嬪娍鍥� -->
- <div style="margin-top: 20px;">
- <h4>24灏忔椂鐢ㄧ數瓒嬪娍</h4>
- <div ref="chartContainer" style="height: 300px;"></div>
- </div>
- </el-dialog>
- </div>
-</template>
-
-<script>
-import * as echarts from 'echarts'
-
-export default {
- name: 'MeterCollection',
- data() {
- return {
- loading: false,
- searchForm: {
- meterNo: '',
- location: '',
- dateRange: []
- },
- meterList: [],
- pagination: {
- currentPage: 1,
- pageSize: 10,
- total: 0
- },
- detailDialogVisible: false,
- currentMeter: {},
- chart: null
- }
- },
- created() {
- // 绔嬪嵆鐢熸垚涓�浜涙祴璇曟暟鎹�
- this.meterList = [
- {
- id: 1,
- meterNo: 'M001',
- location: '杞﹂棿A',
- meterType: '鏅鸿兘鐢佃〃',
- voltage: '380V',
- currentReading: 8500,
- lastReading: 8400,
- consumption: 100,
- power: '75.5',
- powerFactor: '0.85',
- status: '姝e父',
- lastUpdateTime: '2024-01-15 10:30:00'
- },
- {
- id: 2,
- meterNo: 'M002',
- location: '杞﹂棿B',
- meterType: '澶氬姛鑳界數琛�',
- voltage: '220V',
- currentReading: 6200,
- lastReading: 6100,
- consumption: 100,
- power: '45.2',
- powerFactor: '0.92',
- status: '姝e父',
- lastUpdateTime: '2024-01-15 10:25:00'
- }
- ]
- this.pagination.total = this.meterList.length
- },
- mounted() {
- // 寤惰繜涓�鐐规椂闂村啀璋冪敤锛岀‘淇滵OM宸茬粡娓叉煋
- this.$nextTick(() => {
- this.getMeterList()
- })
- },
- watch: {
- meterList: {
- handler(newVal) {
- console.log('meterList鏁版嵁鍙樺寲:', newVal)
- },
- deep: true,
- immediate: true
- }
- },
- methods: {
- // 鑾峰彇鐢佃〃鍒楄〃
- getMeterList() {
- this.loading = true
- // 妯℃嫙API璋冪敤
- setTimeout(() => {
- const mockData = this.generateMockData()
- this.meterList = mockData
- this.pagination.total = this.meterList.length
- this.loading = false
- }, 500)
- },
-
- // 鐢熸垚妯℃嫙鏁版嵁
- generateMockData() {
- const locations = ['杞﹂棿A', '杞﹂棿B', '鍔炲叕鍖�', '閰嶇數瀹�']
- const meterTypes = ['鏅鸿兘鐢佃〃', '澶氬姛鑳界數琛�', '鏅�氱數琛�']
- const voltages = ['220V', '380V', '10kV']
- const statuses = ['姝e父', '寮傚父']
-
- const data = []
- for (let i = 1; i <= 25; i++) {
- const currentReading = Math.floor(Math.random() * 10000) + 5000
- const lastReading = currentReading - Math.floor(Math.random() * 100) - 10
- const consumption = currentReading - lastReading
- const power = Math.random() * 100 + 20
- const powerFactor = (Math.random() * 0.3 + 0.7).toFixed(2)
-
- data.push({
- id: i,
- meterNo: `M${String(i).padStart(3, '0')}`,
- location: locations[Math.floor(Math.random() * locations.length)],
- meterType: meterTypes[Math.floor(Math.random() * meterTypes.length)],
- voltage: voltages[Math.floor(Math.random() * voltages.length)],
- currentReading: currentReading,
- lastReading: lastReading,
- consumption: consumption,
- power: power.toFixed(2),
- powerFactor: powerFactor,
- status: statuses[Math.floor(Math.random() * statuses.length)],
- lastUpdateTime: this.formatDate(new Date(Date.now() - Math.random() * 86400000))
- })
- }
- return data
- },
-
- // 鏍煎紡鍖栨棩鏈�
- formatDate(date) {
- const year = date.getFullYear()
- const month = String(date.getMonth() + 1).padStart(2, '0')
- const day = String(date.getDate()).padStart(2, '0')
- const hours = String(date.getHours()).padStart(2, '0')
- const minutes = String(date.getMinutes()).padStart(2, '0')
- return `${year}-${month}-${day} ${hours}:${minutes}`
- },
-
- // 鎼滅储
- handleSearch() {
- this.pagination.currentPage = 1
- this.getMeterList()
- },
-
- // 閲嶇疆鎼滅储
- resetSearch() {
- this.searchForm = {
- meterNo: '',
- location: '',
- dateRange: []
- }
- this.handleSearch()
- },
-
- // 鏌ョ湅璇︽儏
- viewDetails(row) {
- this.currentMeter = row
- this.detailDialogVisible = true
- },
-
- // 瀵硅瘽妗嗘墦寮�鍚庡垵濮嬪寲鍥捐〃
- onDialogOpened() {
- this.$nextTick(() => {
- setTimeout(() => {
- this.initChart()
- }, 100)
- })
- },
-
- // 鎵嬪姩閲囬泦
- manualCollection(row) {
- this.$message.success(`姝e湪閲囬泦鐢佃〃 ${row.meterNo} 鐨勬暟鎹�...`)
- // 妯℃嫙閲囬泦杩囩▼
- setTimeout(() => {
- row.currentReading = Math.floor(Math.random() * 100) + row.currentReading
- row.lastUpdateTime = this.formatDate(new Date())
- this.$message.success('鏁版嵁閲囬泦瀹屾垚')
- }, 1000)
- },
-
- // 鍒锋柊鏁版嵁
- refreshData() {
- this.getMeterList()
- this.$message.success('鏁版嵁宸插埛鏂�')
- },
-
- // 娣诲姞娴嬭瘯鏁版嵁
- addTestData() {
- const testData = {
- id: Date.now(),
- meterNo: `M${String(this.meterList.length + 1).padStart(3, '0')}`,
- location: '娴嬭瘯浣嶇疆',
- meterType: '娴嬭瘯鐢佃〃',
- voltage: '220V',
- currentReading: Math.floor(Math.random() * 10000) + 1000,
- lastReading: Math.floor(Math.random() * 5000) + 500,
- consumption: Math.floor(Math.random() * 100) + 10,
- power: (Math.random() * 100 + 10).toFixed(2),
- powerFactor: (Math.random() * 0.3 + 0.7).toFixed(2),
- status: '姝e父',
- lastUpdateTime: this.formatDate(new Date())
- }
- this.meterList.push(testData)
- this.pagination.total = this.meterList.length
- this.$message.success('娴嬭瘯鏁版嵁宸叉坊鍔�')
- },
-
- // 娓呯┖鏁版嵁
- clearData() {
- this.meterList = []
- this.pagination.total = 0
- this.$message.success('鏁版嵁宸叉竻绌�')
- },
-
- // 娴嬭瘯鍥捐〃
- testChart() {
- this.$message.info('鍥捐〃娴嬭瘯鍔熻兘')
- // 鍒涘缓涓�涓祴璇曞璇濇鏉ユ祴璇曞浘琛�
- this.currentMeter = {
- meterNo: 'TEST001',
- location: '娴嬭瘯浣嶇疆',
- meterType: '娴嬭瘯鐢佃〃',
- voltage: '220V',
- currentReading: 1000,
- lastReading: 900,
- consumption: 100,
- power: '50.0',
- powerFactor: '0.85',
- status: '姝e父',
- lastUpdateTime: '2024-01-15 12:00:00'
- }
- this.detailDialogVisible = true
- },
-
- // 鍒嗛〉澶у皬鏀瑰彉
- handleSizeChange(val) {
- this.pagination.pageSize = val
- this.getMeterList()
- },
-
- // 褰撳墠椤垫敼鍙�
- handleCurrentChange(val) {
- this.pagination.pageSize = val.limit
- this.pagination.currentPage = val.page
- this.getMeterList()
- },
-
- // 鍒濆鍖栧浘琛�
- initChart() {
- try {
- if (this.chart) {
- this.chart.dispose()
- this.chart = null
- }
-
- // 纭繚DOM鍏冪礌瀛樺湪
- if (!this.$refs.chartContainer) {
- console.error('鍥捐〃瀹瑰櫒涓嶅瓨鍦紝绛夊緟DOM鏇存柊...')
- // 濡傛灉瀹瑰櫒涓嶅瓨鍦紝绛夊緟涓�涓嬪啀璇�
- setTimeout(() => {
- this.initChart()
- }, 100)
- return
- }
-
- // 妫�鏌ュ鍣ㄥ昂瀵�
- const container = this.$refs.chartContainer
- if (container.offsetWidth === 0 || container.offsetHeight === 0) {
- setTimeout(() => {
- this.initChart()
- }, 100)
- return
- }
- this.chart = echarts.init(container)
-
- // 鐢熸垚24灏忔椂妯℃嫙鏁版嵁
- const hours = []
- const consumption = []
- for (let i = 0; i < 24; i++) {
- hours.push(`${i}:00`)
- consumption.push(Math.floor(Math.random() * 50) + 20)
- }
-
- const option = {
- title: {
- text: '24灏忔椂鐢ㄧ數閲忚秼鍔�',
- left: 'center'
- },
- tooltip: {
- trigger: 'axis',
- formatter: '{b}<br/>鐢ㄧ數閲�: {c} kWh'
- },
- xAxis: {
- type: 'category',
- data: hours,
- axisLabel: {
- rotate: 45
- }
- },
- yAxis: {
- type: 'value',
- name: '鐢ㄧ數閲� (kWh)'
- },
- series: [{
- data: consumption,
- type: 'line',
- smooth: true,
- areaStyle: {
- opacity: 0.3
- },
- itemStyle: {
- color: '#409EFF'
- }
- }]
- }
-
- this.chart.setOption(option)
- } catch (error) {
- console.error('鍥捐〃鍒濆鍖栧け璐�:', error)
- this.$message.error('鍥捐〃鍒濆鍖栧け璐�: ' + error.message)
- }
- }
- },
-
- beforeUnmount() {
- if (this.chart) {
- try {
- this.chart.dispose()
- this.chart = null
- } catch (error) {
- console.error('娓呯悊鍥捐〃澶辫触:', error)
- }
- }
- }
-}
-</script>
-
-<style scoped>
-.search-row {
- margin-bottom: 20px;
-}
-
-.pagination {
- margin-top: 20px;
- text-align: right;
-}
-
-.el-table {
- margin-top: 20px;
-}
-
-.detail-item {
- margin-bottom: 15px;
- padding: 10px;
- border: 1px solid #ebeef5;
- border-radius: 4px;
- background-color: #fafafa;
-}
-
-.detail-item label {
- font-weight: bold;
- color: #606266;
- margin-right: 10px;
- min-width: 100px;
- display: inline-block;
-}
-
-.detail-item span {
- color: #303133;
-}
-
-.detail-item .el-tag {
- margin-left: 0;
-}
-</style>
diff --git a/src/views/energyManagement/waterManagement/components/formDia.vue b/src/views/energyManagement/waterManagement/components/formDia.vue
deleted file mode 100644
index 2e58ea0..0000000
--- a/src/views/energyManagement/waterManagement/components/formDia.vue
+++ /dev/null
@@ -1,221 +0,0 @@
-<template>
- <div>
- <el-dialog
- v-model="dialogFormVisible"
- title="鐢ㄦ按璁惧"
- width="70%"
- @close="closeDia"
- >
- <el-form
- :model="form"
- label-width="140px"
- label-position="top"
- :rules="rules"
- ref="formRef"
- >
- <el-row :gutter="30">
- <el-col :span="12">
- <el-form-item label="璁惧锛�" prop="deviceModel">
- <el-select
- v-model="form.deviceModel"
- placeholder="璇烽�夋嫨"
- clearable
- @change="setName"
- :disabled="operationType !== 'add'"
- >
- <el-option
- v-for="item in codeList"
- :key="item.deviceModel"
- :label="item.deviceName"
- :value="item.deviceModel"
- >
- {{item.deviceName + '--' + item.deviceModel}}
- </el-option>
- </el-select>
- </el-form-item>
- </el-col>
- <el-col :span="12">
- <el-form-item label="姣忔棩闄愬埗姘撮噺锛�" prop="waterDayLimit">
- <el-input
- v-model="form.waterDayLimit"
- placeholder="璇疯緭鍏�"
- clearable
- />
- </el-form-item>
- </el-col>
- </el-row>
- <el-row :gutter="30">
- <el-col :span="12">
- <el-form-item label="棰濆畾娴侀噺锛�" prop="ratedRate">
- <el-input
- v-model="form.ratedRate"
- placeholder="璇疯緭鍏�"
- clearable
- />
- </el-form-item>
- </el-col>
- <el-col :span="12">
- <el-form-item label="瀹為檯娴侀噺锛�" prop="actualTraffic">
- <el-input
- v-model="form.actualTraffic"
- placeholder="璇疯緭鍏�"
- clearable
- />
- </el-form-item>
- </el-col>
- </el-row>
- <el-row :gutter="30">
- <el-col :span="12">
- <el-form-item label="杩愯鏃堕棿锛�" prop="runTime">
- <el-date-picker
- style="width: 100%"
- v-model="form.runTime"
- value-format="YYYY-MM-DD"
- format="YYYY-MM-DD"
- type="date"
- placeholder="璇烽�夋嫨"
- clearable
- />
- </el-form-item>
- </el-col>
- <el-col :span="12">
- <el-form-item label="褰撴棩鐢ㄦ按閲忥細" prop="waterDay">
- <el-input
- v-model="form.waterDay"
- placeholder="璇疯緭鍏�"
- clearable
- />
- </el-form-item>
- </el-col>
- </el-row>
- <el-row :gutter="30">
- <el-col :span="12">
- <el-form-item label="姘磋垂鍗曚环锛�" prop="waterPrice">
- <el-input
- v-model="form.waterPrice"
- placeholder="璇疯緭鍏�"
- clearable
- />
- </el-form-item>
- </el-col>
- <el-col :span="12">
- <el-form-item label="鐢ㄦ按绫诲瀷锛�" prop="type">
- <el-select
- v-model="form.type"
- placeholder="璇烽�夋嫨"
- clearable
- >
- <el-option label="宸ヤ笟鐢ㄦ按" value="industrial" />
- <el-option label="鐢熸椿鐢ㄦ按" value="domestic" />
- <el-option label="娑堥槻鐢ㄦ按" value="fire" />
- <el-option label="缁垮寲鐢ㄦ按" value="greening" />
- </el-select>
- </el-form-item>
- </el-col>
- </el-row>
- </el-form>
- <template #footer>
- <div class="dialog-footer">
- <el-button type="primary" @click="submitForm">纭</el-button>
- <el-button @click="closeDia">鍙栨秷</el-button>
- </div>
- </template>
- </el-dialog>
- </div>
-</template>
-
-<script setup>
-import {ref, reactive, nextTick} from "vue";
-import useUserStore from "@/store/modules/user.js";
-import {waterDeviceList, waterEquipmentAdd, waterEquipmentUpdate} from "@/api/energyManagement/waterManagement.js";
-const { proxy } = getCurrentInstance()
-const emit = defineEmits(['close'])
-const dialogFormVisible = ref(false);
-const operationType = ref('')
-const userStore = useUserStore();
-
-const data = reactive({
- form: {
- deviceName: "",
- deviceModel: "",
- waterDayLimit: "",
- ratedRate: "",
- actualTraffic: "",
- runTime: "",
- waterDay: "",
- waterPrice: "",
- type: "",
- },
- rules: {
- deviceModel: [{ required: true, message: "璇烽�夋嫨", trigger: "change" }],
- runTime: [{ required: true, message: "璇烽�夋嫨", trigger: "change" }],
- waterDayLimit: [{ required: true, message: "璇疯緭鍏�", trigger: "blur" }],
- ratedRate: [{ required: true, message: "璇疯緭鍏�", trigger: "blur" }],
- actualTraffic: [{ required: true, message: "璇疯緭鍏�", trigger: "blur" }],
- waterDay: [{ required: true, message: "璇疯緭鍏�", trigger: "blur" }],
- waterPrice: [{ required: true, message: "璇疯緭鍏�", trigger: "blur" }],
- type: [{ required: true, message: "璇烽�夋嫨", trigger: "change" }],
- },
-})
-const { form, rules } = toRefs(data);
-const codeList = ref([])
-
-// 鎵撳紑寮规
-const openDialog = (type, row) => {
- operationType.value = type;
- dialogFormVisible.value = true;
- form.value = {}
- proxy.resetForm("formRef");
- waterDeviceList({size: -1}).then((res) => {
- codeList.value = res.data.records;
- });
- if (type === "edit") {
- form.value = {...row}
- }
-}
-const setName = (code) => {
- const index = codeList.value.findIndex(item => item.deviceModel === code);
- if (index > -1) {
- console.log(codeList)
- form.value.name = codeList.value[index].deviceName;
- }
-}
-const submitForm = () => {
- proxy.$refs["formRef"].validate(valid => {
- if (valid) {
- if (operationType.value === "add") {
- waterEquipmentAdd(form.value).then(response => {
- proxy.$modal.msgSuccess("鏂板鎴愬姛")
- closeDia()
- })
- } else {
- waterEquipmentUpdate(form.value).then(response => {
- proxy.$modal.msgSuccess("淇敼鎴愬姛")
- closeDia()
- })
- }
- }
- })
-}
-// 鍏抽棴寮规
-const closeDia = () => {
- proxy.resetForm("formRef");
- dialogFormVisible.value = false;
- emit('close')
-};
-// 鑾峰彇褰撳墠鏃ユ湡骞舵牸寮忓寲涓� YYYY-MM-DD
-function getCurrentDate() {
- const today = new Date();
- const year = today.getFullYear();
- const month = String(today.getMonth() + 1).padStart(2, "0"); // 鏈堜唤浠�0寮�濮�
- const day = String(today.getDate()).padStart(2, "0");
- return `${year}-${month}-${day}`;
-}
-defineExpose({
- openDialog,
-});
-</script>
-
-<style scoped>
-
-</style>
diff --git a/src/views/energyManagement/waterManagement/components/waterBillForm.vue b/src/views/energyManagement/waterManagement/components/waterBillForm.vue
deleted file mode 100644
index a132041..0000000
--- a/src/views/energyManagement/waterManagement/components/waterBillForm.vue
+++ /dev/null
@@ -1,210 +0,0 @@
-<template>
- <div>
- <el-dialog
- v-model="dialogFormVisible"
- title="姘磋垂绠$悊"
- width="70%"
- @close="closeDia"
- >
- <el-form
- :model="form"
- label-width="140px"
- label-position="top"
- :rules="rules"
- ref="formRef"
- >
- <el-row :gutter="30">
- <el-col :span="12">
- <el-form-item label="璁惧锛�" prop="code">
- <el-select
- v-model="form.code"
- placeholder="璇烽�夋嫨"
- clearable
- @change="setName"
- :disabled="operationType !== 'add'"
- >
- <el-option
- v-for="item in codeList"
- :key="item.deviceModel"
- :label="item.deviceName"
- :value="item.deviceModel"
- >
- {{item.deviceName + '--' + item.deviceModel}}
- </el-option>
- </el-select>
- </el-form-item>
- </el-col>
- <el-col :span="12">
- <el-form-item label="鐢ㄦ按閲忥細" prop="waterConsumption">
- <el-input
- v-model="form.waterConsumption"
- placeholder="璇疯緭鍏�"
- clearable
- />
- </el-form-item>
- </el-col>
- </el-row>
- <el-row :gutter="30">
- <el-col :span="12">
- <el-form-item label="姘磋垂鍗曚环锛�" prop="waterPrice">
- <el-input
- v-model="form.waterPrice"
- placeholder="璇疯緭鍏�"
- clearable
- />
- </el-form-item>
- </el-col>
- <el-col :span="12">
- <el-form-item label="姘磋垂閲戦锛�" prop="waterBill">
- <el-input
- v-model="form.waterBill"
- placeholder="鑷姩璁$畻"
- clearable
- disabled
- />
- </el-form-item>
- </el-col>
- </el-row>
- <el-row :gutter="30">
- <el-col :span="12">
- <el-form-item label="璁¤垂鏃ユ湡锛�" prop="billDate">
- <el-date-picker
- style="width: 100%"
- v-model="form.billDate"
- value-format="YYYY-MM-DD"
- format="YYYY-MM-DD"
- type="date"
- placeholder="璇烽�夋嫨"
- clearable
- />
- </el-form-item>
- </el-col>
- <el-col :span="12">
- <el-form-item label="鐢ㄦ按绫诲瀷锛�" prop="waterType">
- <el-select
- v-model="form.waterType"
- placeholder="璇烽�夋嫨"
- clearable
- >
- <el-option label="宸ヤ笟鐢ㄦ按" value="industrial" />
- <el-option label="鐢熸椿鐢ㄦ按" value="domestic" />
- <el-option label="娑堥槻鐢ㄦ按" value="fire" />
- <el-option label="缁垮寲鐢ㄦ按" value="greening" />
- </el-select>
- </el-form-item>
- </el-col>
- </el-row>
- </el-form>
- <template #footer>
- <div class="dialog-footer">
- <el-button type="primary" @click="submitForm">纭</el-button>
- <el-button @click="closeDia">鍙栨秷</el-button>
- </div>
- </template>
- </el-dialog>
- </div>
-</template>
-
-<script setup>
-import {ref, reactive, nextTick, watch} from "vue";
-import useUserStore from "@/store/modules/user.js";
-import {waterDeviceList, waterBillAdd, waterBillUpdate} from "@/api/energyManagement/waterManagement.js";
-const { proxy } = getCurrentInstance()
-const emit = defineEmits(['close'])
-const dialogFormVisible = ref(false);
-const operationType = ref('')
-const userStore = useUserStore();
-
-const data = reactive({
- form: {
- name: "",
- code: "",
- waterConsumption: "",
- waterPrice: "",
- waterBill: "",
- billDate: "",
- waterType: "",
- },
- rules: {
- code: [{ required: true, message: "璇烽�夋嫨", trigger: "change" }],
- waterConsumption: [{ required: true, message: "璇疯緭鍏�", trigger: "blur" }],
- waterPrice: [{ required: true, message: "璇疯緭鍏�", trigger: "blur" }],
- billDate: [{ required: true, message: "璇烽�夋嫨", trigger: "change" }],
- waterType: [{ required: true, message: "璇烽�夋嫨", trigger: "change" }],
- },
-})
-const { form, rules } = toRefs(data);
-const codeList = ref([])
-
-// 鎵撳紑寮规
-const openDialog = (type, row) => {
- operationType.value = type;
- dialogFormVisible.value = true;
- form.value = {}
- proxy.resetForm("formRef");
- waterDeviceList().then((res) => {
- codeList.value = res.data;
- });
- if (type === "edit") {
- form.value = {...row}
- }
-}
-const setName = (code) => {
- const index = codeList.value.findIndex(item => item.deviceModel === code);
- if (index > -1) {
- console.log(codeList)
- form.value.name = codeList.value[index].deviceName;
- }
-}
-
-// 璁$畻姘磋垂閲戦
-const calculateWaterBill = () => {
- if (form.value.waterConsumption && form.value.waterPrice) {
- form.value.waterBill = (parseFloat(form.value.waterConsumption) * parseFloat(form.value.waterPrice)).toFixed(2);
- }
-}
-
-// 鐩戝惉鐢ㄦ按閲忓拰姘磋垂鍗曚环鍙樺寲
-watch([() => form.value.waterConsumption, () => form.value.waterPrice], () => {
- calculateWaterBill();
-});
-
-const submitForm = () => {
- proxy.$refs["formRef"].validate(valid => {
- if (valid) {
- if (operationType.value === "add") {
- waterBillAdd(form.value).then(response => {
- proxy.$modal.msgSuccess("鏂板鎴愬姛")
- closeDia()
- })
- } else {
- waterBillUpdate(form.value).then(response => {
- proxy.$modal.msgSuccess("淇敼鎴愬姛")
- closeDia()
- })
- }
- }
- })
-}
-// 鍏抽棴寮规
-const closeDia = () => {
- proxy.resetForm("formRef");
- dialogFormVisible.value = false;
- emit('close')
-};
-// 鑾峰彇褰撳墠鏃ユ湡骞舵牸寮忓寲涓� YYYY-MM-DD
-function getCurrentDate() {
- const today = new Date();
- const year = today.getFullYear();
- const month = String(today.getMonth() + 1).padStart(2, "0"); // 鏈堜唤浠�0寮�濮�
- const day = String(today.getDate()).padStart(2, "0");
- return `${year}-${month}-${day}`;
-}
-defineExpose({
- openDialog,
-});
-</script>
-
-<style scoped>
-
-</style>
diff --git a/src/views/energyManagement/waterManagement/index.vue b/src/views/energyManagement/waterManagement/index.vue
deleted file mode 100644
index 181ae88..0000000
--- a/src/views/energyManagement/waterManagement/index.vue
+++ /dev/null
@@ -1,312 +0,0 @@
-<template>
- <div class="app-container">
- <div class="search_form">
- <div>
- <span class="search_title">璁惧鍚嶇О锛�</span>
- <el-input
- v-model="searchForm.deviceName"
- style="width: 240px"
- placeholder="璇疯緭鍏�"
- @change="handleQuery"
- clearable
- :prefix-icon="Search"
- />
- <el-button type="primary" @click="handleQuery" style="margin-left: 10px"
- >鎼滅储</el-button
- >
- </div>
- <div>
- <el-button type="primary" @click="openForm('add')">鏂板</el-button>
- <el-button type="info" plain icon="Upload" @click="handleImport">瀵煎叆</el-button>
- <el-button type="danger" plain @click="handleDelete">鍒犻櫎</el-button>
- </div>
- </div>
- <div class="table_list">
- <PIMTable
- rowKey="id"
- :column="tableColumn"
- :tableData="tableData"
- :page="page"
- :isSelection="true"
- @selection-change="handleSelectionChange"
- :tableLoading="tableLoading"
- @pagination="pagination"
- ></PIMTable>
- </div>
- <form-dia ref="formDia" @close="handleQuery"></form-dia>
- <el-dialog
- :title="upload.title"
- v-model="upload.open"
- width="400px"
- append-to-body
- @close="handleDialogClose"
- >
- <el-upload
- ref="uploadRef"
- :limit="1"
- accept=".xlsx, .xls"
- :headers="upload.headers"
- :action="upload.url"
- :disabled="upload.isUploading"
- :before-upload="upload.beforeUpload"
- :on-progress="upload.onProgress"
- :on-success="upload.onSuccess"
- :on-error="upload.onError"
- :on-change="upload.onChange"
- :auto-upload="false"
- drag
- >
- <el-icon class="el-icon--upload"><upload-filled /></el-icon>
- <div class="el-upload__text">灏嗘枃浠舵嫋鍒版澶勶紝鎴�<em>鐐瑰嚮涓婁紶</em></div>
- <template #tip>
- <div class="el-upload__tip text-center">
- <span>浠呭厑璁稿鍏ls銆亁lsx鏍煎紡鏂囦欢銆�</span>
- <el-link
- type="primary"
- :underline="false"
- style="font-size: 12px; vertical-align: baseline"
- @click="importTemplate"
- >涓嬭浇妯℃澘</el-link
- >
- </div>
- </template>
- </el-upload>
- <template #footer>
- <div class="dialog-footer">
- <el-button type="primary" @click="submitFileForm">纭� 瀹�</el-button>
- <el-button @click="upload.open = false">鍙� 娑�</el-button>
- </div>
- </template>
- </el-dialog>
- </div>
-</template>
-
-<script setup>
-import {Search} from "@element-plus/icons-vue";
-import {onMounted, ref, reactive, nextTick} from "vue";
-import FormDia from "@/views/energyManagement/waterManagement/components/formDia.vue";
-import {ElMessageBox} from "element-plus";
-import {getToken} from "@/utils/auth.js";
-import {waterEquipmentDelete, waterEquipmentListPage} from "@/api/energyManagement/waterManagement.js";
-const { proxy } = getCurrentInstance();
-
-const data = reactive({
- searchForm: {
- name: "",
- },
-});
-const { searchForm } = toRefs(data);
-
-const selectedRows = ref([]);
-const tableColumn = ref([
- {
- label: "璁惧鍚嶇О",
- prop: "deviceName",
- width: 200,
- },
- {
- label: "瑙勬牸鍨嬪彿",
- prop: "deviceModel",
- width: 200,
- },
- {
- label: "棰濆畾娴侀噺",
- prop: "ratedRate",
- },
- {
- label: "瀹為檯娴侀噺",
- prop: "actualTraffic",
- },
- {
- label: "杩愯鏃堕棿",
- prop: "runTime",
- width:150
- },
- {
- label: "褰撴棩鐢ㄦ按閲�",
- prop: "waterDay",
- width: 150,
- },
- {
- label: "姣忔棩闄愬埗姘撮噺",
- prop: "waterDayLimit",
- width:220
- },
- {
- label: "姘磋垂鍗曚环",
- prop: "waterPrice",
- width: 120,
- },
- {
- dataType: "action",
- label: "鎿嶄綔",
- align: "center",
- fixed: 'right',
- operation: [
- {
- name: "缂栬緫",
- type: "text",
- clickFun: (row) => {
- openForm("edit", row);
- },
- },
- ],
- },
-]);
-const tableData = ref([]);
-const tableLoading = ref(false);
-const page = reactive({
- current: 1,
- size: 100,
- total: 0,
-});
-// 琛ㄦ牸閫夋嫨鏁版嵁
-const handleSelectionChange = (selection) => {
- selectedRows.value = selection;
-};
-const formDia = ref()
-const upload = reactive({
- // 鏄惁鏄剧ず寮瑰嚭灞傦紙瀹㈡埛瀵煎叆锛�
- open: false,
- // 寮瑰嚭灞傛爣棰橈紙瀹㈡埛瀵煎叆锛�
- title: "",
- // 鏄惁绂佺敤涓婁紶
- isUploading: false,
- // 璁剧疆涓婁紶鐨勮姹傚ご閮�
- headers: { Authorization: "Bearer " + getToken() },
- // 涓婁紶鐨勫湴鍧�
- url: import.meta.env.VITE_APP_BASE_API + "/waterRecord/importData",
- // 鏂囦欢涓婁紶鍓嶇殑鍥炶皟
- beforeUpload: (file) => {
- console.log('鏂囦欢鍗冲皢涓婁紶', file);
- // 鍙互鍦ㄦ澶勫仛鏂囦欢绫诲瀷鎴栧ぇ灏忔牎楠�
- const isValid = file.type === 'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet' || file.name.endsWith('.xlsx') || file.name.endsWith('.xls');
- if (!isValid) {
- proxy.$modal.msgError("鍙兘涓婁紶 Excel 鏂囦欢");
- }
- return isValid;
- },
- // 鏂囦欢鐘舵�佹敼鍙樻椂鐨勫洖璋�
- onChange: (file, fileList) => {
- console.log('鏂囦欢鐘舵�佹敼鍙�', file, fileList);
- },
- // 鏂囦欢涓婁紶鎴愬姛鏃剁殑鍥炶皟
- onSuccess: (response, file, fileList) => {
- console.log('涓婁紶鎴愬姛', response, file, fileList);
- if(response.code === 200){
- proxy.$modal.msgSuccess("鏂囦欢涓婁紶鎴愬姛");
- }else if(response.code === 500){
- proxy.$modal.msgError(response.msg);
- }else{
- proxy.$modal.msgError("鏂囦欢涓婁紶澶辫触");
- }
- upload.open = false;
- getList();
- },
- // 鏂囦欢涓婁紶澶辫触鏃剁殑鍥炶皟
- onError: (error, file, fileList) => {
- console.log('涓婁紶澶辫触', error, file, fileList);
- proxy.$modal.msgError("鏂囦欢涓婁紶澶辫触");
- upload.open = false;
- },
- // 鏂囦欢涓婁紶杩涘害鏀瑰彉鏃剁殑鍥炶皟
- onProgress: (event, file, fileList) => {
- console.log('涓婁紶杩涘害', event, file, fileList);
- upload.isUploading = true;
- },
-});
-
-// 鏌ヨ鍒楄〃
-/** 鎼滅储鎸夐挳鎿嶄綔 */
-const handleQuery = () => {
- page.current = 1;
- getList();
-};
-const pagination = (obj) => {
- page.current = obj.page;
- page.size = obj.limit;
- getList();
-};
-
-const getList = () => {
- tableLoading.value = true;
- waterEquipmentListPage({ ...searchForm.value, ...page }).then((res) => {
- tableLoading.value = false;
- tableData.value = res.data.records;
- page.total = res.data.total;
- }).catch(() => {
- tableLoading.value = false;
- })
-};
-
-// 鎵撳紑寮规
-const openForm = (type, row) => {
- nextTick(() => {
- formDia.value?.openDialog(type, row)
- })
-};
-
-/** 瀵煎叆鎸夐挳鎿嶄綔 */
-function handleImport() {
- upload.title = "鐢ㄦ按璁惧";
- upload.open = true;
- // 娓呯┖涓婃涓婁紶鐨勬枃浠跺垪琛�
- nextTick(() => {
- proxy.$refs["uploadRef"]?.clearFiles();
- });
-}
-function importTemplate() {
- proxy.download(
- "/waterRecord/export",
- {},
- '鐢ㄦ按璁惧瀵煎叆妯$増.xlsx'
- );
-}
-/** 鎻愪氦涓婁紶鏂囦欢 */
-function submitFileForm() {
- proxy.$refs["uploadRef"].submit();
-}
-
-/** 寮规鍏抽棴鏃舵竻绌烘枃浠跺垪琛� */
-function handleDialogClose() {
- nextTick(() => {
- proxy.$refs["uploadRef"]?.clearFiles();
- });
-}
-
-const handleDelete = () => {
- let ids = [];
- if (selectedRows.value.length > 0) {
- ids = selectedRows.value.map((item) => item.id);
- } else {
- proxy.$modal.msgWarning("璇烽�夋嫨鏁版嵁");
- return;
- }
- ElMessageBox.confirm("閫変腑鐨勫唴瀹瑰皢琚垹闄わ紝鏄惁纭鍒犻櫎锛�", "鍒犻櫎鎻愮ず", {
- confirmButtonText: "纭",
- cancelButtonText: "鍙栨秷",
- type: "warning",
- })
- .then(() => {
- tableLoading.value = true;
- waterEquipmentDelete(ids)
- .then((res) => {
- proxy.$modal.msgSuccess("鍒犻櫎鎴愬姛");
- getList();
- })
- .finally(() => {
- tableLoading.value = false;
- });
- })
- .catch(() => {
- proxy.$modal.msg("宸插彇娑�");
- });
-};
-onMounted(() => {
- getList();
-});
-</script>
-
-<style scoped>
-
-</style>
diff --git a/src/views/energyManagement/waterManagement/waterBill.vue b/src/views/energyManagement/waterManagement/waterBill.vue
deleted file mode 100644
index ea382f0..0000000
--- a/src/views/energyManagement/waterManagement/waterBill.vue
+++ /dev/null
@@ -1,181 +0,0 @@
-<template>
- <div class="app-container">
- <div class="search_form">
- <div>
- <span class="search_title">璁惧鍚嶇О锛�</span>
- <el-input
- v-model="searchForm.name"
- style="width: 240px"
- placeholder="璇疯緭鍏�"
- @change="handleQuery"
- clearable
- :prefix-icon="Search"
- />
- <el-button type="primary" @click="handleQuery" style="margin-left: 10px"
- >鎼滅储</el-button
- >
- </div>
- <div>
- <el-button type="primary" @click="openForm('add')">鏂板</el-button>
- <el-button type="danger" plain @click="handleDelete">鍒犻櫎</el-button>
- </div>
- </div>
- <div class="table_list">
- <PIMTable
- rowKey="id"
- :column="tableColumn"
- :tableData="tableData"
- :page="page"
- :isSelection="true"
- @selection-change="handleSelectionChange"
- :tableLoading="tableLoading"
- @pagination="pagination"
- ></PIMTable>
- </div>
- <form-dia ref="formDia" @close="handleQuery"></form-dia>
- </div>
-</template>
-
-<script setup>
-import {Search} from "@element-plus/icons-vue";
-import {onMounted, ref, reactive, nextTick} from "vue";
-import FormDia from "@/views/energyManagement/waterManagement/components/waterBillForm.vue";
-import {ElMessageBox} from "element-plus";
-import {waterBillDelete, waterBillListPage} from "@/api/energyManagement/waterManagement.js";
-const { proxy } = getCurrentInstance();
-
-const data = reactive({
- searchForm: {
- name: "",
- },
-});
-const { searchForm } = toRefs(data);
-
-const selectedRows = ref([]);
-const tableColumn = ref([
- {
- label: "璁惧鍚嶇О",
- prop: "name",
- width: 200,
- },
- {
- label: "瑙勬牸鍨嬪彿",
- prop: "code",
- width: 200,
- },
- {
- label: "鐢ㄦ按閲�",
- prop: "waterConsumption",
- },
- {
- label: "姘磋垂鍗曚环",
- prop: "waterPrice",
- },
- {
- label: "姘磋垂閲戦",
- prop: "waterBill",
- width:150
- },
- {
- label: "璁¤垂鏃ユ湡",
- prop: "billDate",
- width: 150,
- },
- {
- label: "鐢ㄦ按绫诲瀷",
- prop: "waterType",
- width:120
- },
- {
- dataType: "action",
- label: "鎿嶄綔",
- align: "center",
- fixed: 'right',
- operation: [
- {
- name: "缂栬緫",
- type: "text",
- clickFun: (row) => {
- openForm("edit", row);
- },
- },
- ],
- },
-]);
-const tableData = ref([]);
-const tableLoading = ref(false);
-const page = reactive({
- current: 1,
- size: 100,
- total: 0,
-});
-// 琛ㄦ牸閫夋嫨鏁版嵁
-const handleSelectionChange = (selection) => {
- selectedRows.value = selection;
-};
-const formDia = ref()
-
-// 鏌ヨ鍒楄〃
-/** 鎼滅储鎸夐挳鎿嶄綔 */
-const handleQuery = () => {
- page.current = 1;
- getList();
-};
-const pagination = (obj) => {
- page.current = obj.page;
- page.size = obj.limit;
- getList();
-};
-
-const getList = () => {
- tableLoading.value = true;
- waterBillListPage({ ...searchForm.value, ...page }).then((res) => {
- tableLoading.value = false;
- tableData.value = res.data.records;
- page.total = res.data.total;
- });
-};
-
-// 鎵撳紑寮规
-const openForm = (type, row) => {
- nextTick(() => {
- formDia.value?.openDialog(type, row)
- })
-};
-
-const handleDelete = () => {
- let ids = [];
- if (selectedRows.value.length > 0) {
- ids = selectedRows.value.map((item) => item.id);
- } else {
- proxy.$modal.msgWarning("璇烽�夋嫨鏁版嵁");
- return;
- }
- ElMessageBox.confirm("閫変腑鐨勫唴瀹瑰皢琚垹闄わ紝鏄惁纭鍒犻櫎锛�", "鍒犻櫎鎻愮ず", {
- confirmButtonText: "纭",
- cancelButtonText: "鍙栨秷",
- type: "warning",
- })
- .then(() => {
- tableLoading.value = true;
- waterBillDelete(ids)
- .then((res) => {
- proxy.$modal.msgSuccess("鍒犻櫎鎴愬姛");
- getList();
- })
- .finally(() => {
- tableLoading.value = false;
- });
- })
- .catch(() => {
- proxy.$modal.msg("宸插彇娑�");
- });
-};
-onMounted(() => {
- getList();
-});
-</script>
-
-<style scoped>
-
-</style>
diff --git a/src/views/energyManagement/waterManagement/waterTrends.vue b/src/views/energyManagement/waterManagement/waterTrends.vue
deleted file mode 100644
index 12e45fc..0000000
--- a/src/views/energyManagement/waterManagement/waterTrends.vue
+++ /dev/null
@@ -1,118 +0,0 @@
-<template>
- <div class="app-container">
- <div class="search_form">
- <div>
- <span class="search_title">璁惧鍚嶇О锛�</span>
- <el-input
- v-model="searchForm.name"
- style="width: 240px"
- placeholder="璇疯緭鍏�"
- @change="handleQuery"
- clearable
- :prefix-icon="Search"
- />
- <el-button type="primary" @click="handleQuery" style="margin-left: 10px"
- >鎼滅储</el-button
- >
- </div>
- </div>
- <div class="table_list">
- <PIMTable
- rowKey="id"
- :column="tableColumn"
- :tableData="tableData"
- :page="page"
- :isSelection="true"
- @selection-change="handleSelectionChange"
- :tableLoading="tableLoading"
- @pagination="pagination"
- ></PIMTable>
- </div>
- </div>
-</template>
-
-<script setup>
-import {Search} from "@element-plus/icons-vue";
-import {onMounted, ref, reactive} from "vue";
-import {listPageByWaterTrend} from "@/api/energyManagement/waterManagement.js";
-
-const data = reactive({
- searchForm: {
- name: "",
- },
-});
-const { searchForm } = toRefs(data);
-
-const selectedRows = ref([]);
-const tableColumn = ref([
- {
- label: "璁惧鍚嶇О",
- prop: "name",
- width: 220,
- },
- {
- label: "瑙勬牸鍨嬪彿",
- prop: "code",
- width: 220,
- },
- {
- label: "杩愯鏃堕棿",
- prop: "runDate",
- width: 250,
- },
- {
- label: "鏄ㄦ棩鐢ㄦ按閲�",
- prop: "toDayNum",
- },
- {
- label: "鏈湀骞冲潎姘撮噺",
- prop: "avgNum",
- width:150
- },
- {
- label: "瓒嬪娍",
- prop: "trend",
- width: 220,
- },
-]);
-const tableData = ref([]);
-const tableLoading = ref(false);
-const page = reactive({
- current: 1,
- size: 100,
- total: 0,
-});
-// 琛ㄦ牸閫夋嫨鏁版嵁
-const handleSelectionChange = (selection) => {
- selectedRows.value = selection;
-};
-
-// 鏌ヨ鍒楄〃
-/** 鎼滅储鎸夐挳鎿嶄綔 */
-const handleQuery = () => {
- page.current = 1;
- getList();
-};
-const pagination = (obj) => {
- page.current = obj.page;
- page.size = obj.limit;
- getList();
-};
-
-const getList = () => {
- tableLoading.value = true;
- listPageByWaterTrend({ ...searchForm.value, ...page }).then((res) => {
- tableLoading.value = false;
- tableData.value = res.data.records;
- page.total = res.data.total;
- });
-};
-
-onMounted(() => {
- getList();
-});
-</script>
-
-<style scoped>
-
-</style>
diff --git a/src/views/environmentAccess/accessManagement/index.vue b/src/views/environmentAccess/accessManagement/index.vue
deleted file mode 100644
index 40dc0c9..0000000
--- a/src/views/environmentAccess/accessManagement/index.vue
+++ /dev/null
@@ -1,9 +0,0 @@
-<template>
- <div></div>
-</template>
-<script>
-
-</script>
-<style>
-
-</style>
diff --git a/src/views/environmentAccess/intelligentInspectionManagement/index.vue b/src/views/environmentAccess/intelligentInspectionManagement/index.vue
deleted file mode 100644
index 40dc0c9..0000000
--- a/src/views/environmentAccess/intelligentInspectionManagement/index.vue
+++ /dev/null
@@ -1,9 +0,0 @@
-<template>
- <div></div>
-</template>
-<script>
-
-</script>
-<style>
-
-</style>
diff --git a/src/views/environmentAccess/remoteMonitoringOfEquipment/index.vue b/src/views/environmentAccess/remoteMonitoringOfEquipment/index.vue
deleted file mode 100644
index 40dc0c9..0000000
--- a/src/views/environmentAccess/remoteMonitoringOfEquipment/index.vue
+++ /dev/null
@@ -1,9 +0,0 @@
-<template>
- <div></div>
-</template>
-<script>
-
-</script>
-<style>
-
-</style>
diff --git a/src/views/environmentAccess/vehicleInformationCollection/index.vue b/src/views/environmentAccess/vehicleInformationCollection/index.vue
deleted file mode 100644
index 40dc0c9..0000000
--- a/src/views/environmentAccess/vehicleInformationCollection/index.vue
+++ /dev/null
@@ -1,9 +0,0 @@
-<template>
- <div></div>
-</template>
-<script>
-
-</script>
-<style>
-
-</style>
diff --git a/src/views/equipmentManagement/calibration/index.vue b/src/views/equipmentManagement/calibration/index.vue
deleted file mode 100644
index 7dfd405..0000000
--- a/src/views/equipmentManagement/calibration/index.vue
+++ /dev/null
@@ -1,218 +0,0 @@
-<template>
- <div class="app-container">
- <div class="search_form">
- <div>
- <span class="search_title">妫�瀹氭棩鏈燂細</span>
- <el-date-picker
- v-model="searchForm.recordDate"
- value-format="YYYY-MM-DD"
- format="YYYY-MM-DD"
- type="date"
- placeholder="璇烽�夋嫨"
- clearable
- style="width: 160px"
- @change="handleQuery"
- />
- <span class="search_title ml10">褰曞叆鏃ユ湡锛�</span>
- <el-date-picker
- v-model="searchForm.entryDate"
- value-format="YYYY-MM-DD"
- format="YYYY-MM-DD"
- type="date"
- placeholder="璇烽�夋嫨"
- clearable
- style="width: 160px"
- @change="handleQuery"
- />
- <span class="search_title ml10">璁¢噺鍣ㄥ叿缂栧彿锛�</span>
- <el-input v-model="searchForm.code" placeholder="璇疯緭鍏ョ紪鍙�" clearable style="width: 240px" @change="handleQuery"/>
-<!-- <span class="search_title ml10">鐘舵�侊細</span>-->
-<!-- <el-select v-model="searchForm.status" placeholder="璇烽�夋嫨鐘舵��" @change="handleQuery" style="width: 160px" clearable>-->
-<!-- <el-option label="鏈夋晥" :value="1"></el-option>-->
-<!-- <el-option label="閫炬湡" :value="2"></el-option>-->
-<!-- </el-select>-->
- <el-button type="primary" @click="handleQuery" style="margin-left: 10px"
- >鎼滅储</el-button
- >
- </div>
- <div>
- <el-button @click="handleOut">瀵煎嚭</el-button>
- </div>
- </div>
- <div class="table_list">
- <PIMTable
- rowKey="id"
- :column="tableColumn"
- :tableData="tableData"
- :page="page"
- :isSelection="true"
- @selection-change="handleSelectionChange"
- :tableLoading="tableLoading"
- @pagination="pagination"
- ></PIMTable>
- </div>
- <calibration-dia ref="calibrationDia" @close="handleQuery"></calibration-dia>
- </div>
-</template>
-
-<script setup>
-import {onMounted, ref} from "vue";
-import {ElMessageBox} from "element-plus";
-import useUserStore from "@/store/modules/user.js";
-import CalibrationDia from "@/views/equipmentManagement/measurementEquipment/components/calibrationDia.vue";
-import {ledgerRecordListPage} from "@/api/equipmentManagement/calibration.js";
-const { proxy } = getCurrentInstance();
-const userStore = useUserStore()
-
-const data = reactive({
- searchForm: {
- recordDate: "",
- code: "",
- entryDate: "",
- },
-});
-const { searchForm } = toRefs(data);
-
-const tableColumn = ref([
- // {
- // label: "鐘舵��",
- // prop: "status",
- // dataType: "tag",
- // formatData: (params) => {
- // if (params == 1) {
- // return "鏈夋晥";
- // } else if (params == 2) {
- // return "閫炬湡";
- // } else {
- // return null;
- // }
- // },
- // formatType: (params) => {
- // if (params == 1) {
- // return "success";
- // } else if (params == 2) {
- // return "danger";
- // } else {
- // return null;
- // }
- // },
- // },
- {
- label: "妫�瀹氭棩鏈�",
- prop: "recordDate",
- width: 130,
- },
- {
- label: "璁¢噺鍣ㄥ叿缂栧彿",
- prop: "code",
- width: 150,
- },
- {
- label: "璁¢噺鍣ㄥ叿鍚嶇О",
- prop: "name",
- width: 200,
- },
- {
- label: "瑙勬牸鍨嬪彿",
- prop: "model",
- width:200
- },
- {
- label: "鏈夋晥鏈�",
- prop: "valid",
- width: 100,
- },
- {
- label: "褰曞叆浜�",
- prop: "userName",
- },
- {
- label: "褰曞叆鏃ユ湡",
- prop: "entryDate",
- width: 130,
- },
- {
- dataType: "action",
- label: "鎿嶄綔",
- align: "center",
- fixed: 'right',
- operation: [
- {
- name: "缂栬緫",
- type: "text",
- clickFun: (row) => {
- openCalibrationDia("edit", row);
- },
- disabled: (row) => {
- return row.userId !== userStore.id
- }
- },
- ],
- },
-]);
-const tableData = ref([]);
-const tableLoading = ref(false);
-const page = reactive({
- current: 1,
- size: 100,
- total: 0,
-});
-const selectedRows = ref([]);
-
-// 琛ㄦ牸閫夋嫨鏁版嵁
-const handleSelectionChange = (selection) => {
- selectedRows.value = selection;
-};
-const calibrationDia = ref()
-
-// 鏌ヨ鍒楄〃
-/** 鎼滅储鎸夐挳鎿嶄綔 */
-const handleQuery = () => {
- page.current = 1;
- getList();
-};
-const pagination = (obj) => {
- page.current = obj.page;
- page.size = obj.limit;
- getList();
-};
-const getList = () => {
- tableLoading.value = true;
- ledgerRecordListPage({ ...searchForm.value, ...page }).then((res) => {
- tableLoading.value = false;
- tableData.value = res.data.records;
- page.total = res.data.total;
- }).catch((err) => {
- tableLoading.value = false;
- })
-};
-
-// 鎵撳紑妫�瀹氭牎鍑嗗脊妗�
-const openCalibrationDia = (type, row) => {
- nextTick(() => {
- calibrationDia.value?.openDialog(type, row)
- })
-}
-
-// 瀵煎嚭
-const handleOut = () => {
- ElMessageBox.confirm("閫変腑鐨勫唴瀹瑰皢琚鍑猴紝鏄惁纭瀵煎嚭锛�", "瀵煎嚭", {
- confirmButtonText: "纭",
- cancelButtonText: "鍙栨秷",
- type: "warning",
- })
- .then(() => {
- proxy.download("/measuringInstrumentLedgerRecord/export", {}, "妫�瀹氭牎鍑嗚褰�.xlsx");
- })
- .catch(() => {
- proxy.$modal.msg("宸插彇娑�");
- });
-};
-onMounted(() => {
- getList();
-});
-</script>
-
-<style scoped>
-
-</style>
\ No newline at end of file
diff --git a/src/views/equipmentManagement/gasTank/simple.vue b/src/views/equipmentManagement/gasTank/simple.vue
deleted file mode 100644
index 92e88df..0000000
--- a/src/views/equipmentManagement/gasTank/simple.vue
+++ /dev/null
@@ -1,566 +0,0 @@
-<template>
- <div class="app-container">
- <!-- 椤甸潰鏍囬 -->
- <div class="page-header">
- <h2>閲嶅瀷缃愬紡璐ц溅鐩戞帶</h2>
- <div class="header-actions">
-<!-- <el-button type="primary" @click="addTank">鏂板鍌ㄧ綈</el-button>-->
-<!-- <el-button @click="exportData">瀵煎嚭鏁版嵁</el-button>-->
- </div>
- </div>
-
- <!-- 鍥涗釜涓昏妯″潡 -->
- <div class="modules-container">
- <!-- 1. 鍩烘湰淇℃伅妯″潡 -->
- <el-card class="module-card">
- <template #header>
- <div class="card-header">
- <span>1. 鍩烘湰淇℃伅</span>
- <el-button type="text" @click="handleEditBasicInfo">缂栬緫</el-button>
- </div>
- </template>
- <div class="info-grid">
- <div class="info-item">
- <label>鍌ㄧ綈缂栧彿锛�</label>
- <span>{{ basicInfo.tankCode }}</span>
- </div>
- <div class="info-item">
- <label>鍌ㄧ綈鍚嶇О锛�</label>
- <span>{{ basicInfo.tankName }}</span>
- </div>
- <div class="info-item">
- <label>鍌ㄧ綈绫诲瀷锛�</label>
- <span>{{ basicInfo.tankType }}</span>
- </div>
- <div class="info-item">
- <label>璁捐鍘嬪姏锛�</label>
- <span>{{ basicInfo.designPressure }} MPa</span>
- </div>
- <div class="info-item">
- <label>宸ヤ綔鍘嬪姏锛�</label>
- <span>{{ basicInfo.workingPressure }} MPa</span>
- </div>
- <div class="info-item">
- <label>瀹圭Н锛�</label>
- <span>{{ basicInfo.volume }} m鲁</span>
- </div>
- </div>
- </el-card>
-
- <!-- 2. 鐩戞祴鍙傛暟妯″潡 -->
- <el-card class="module-card">
- <template #header>
- <div class="card-header">
- <span>2. 鐩戞祴鍙傛暟</span>
- <el-button type="text" @click="refreshMonitoring">鍒锋柊</el-button>
- </div>
- </template>
- <div class="monitoring-grid">
- <div class="monitor-item">
- <div class="monitor-label">鍘嬪姏</div>
- <div class="monitor-value" :class="getStatusClass(monitoringData.pressureStatus)">
- {{ monitoringData.pressure }} MPa
- </div>
- <div class="monitor-status">{{ monitoringData.pressureStatus === 'normal' ? '姝e父' : '寮傚父' }}</div>
- </div>
- <div class="monitor-item">
- <div class="monitor-label">娓╁害</div>
- <div class="monitor-value" :class="getStatusClass(monitoringData.temperatureStatus)">
- {{ monitoringData.temperature }} 鈩�
- </div>
- <div class="monitor-status">{{ monitoringData.temperatureStatus === 'normal' ? '姝e父' : '寮傚父' }}</div>
- </div>
- <div class="monitor-item">
- <div class="monitor-label">姘斾綋娴撳害</div>
- <div class="monitor-value" :class="getStatusClass(monitoringData.gasStatus)">
- {{ monitoringData.gasConcentration }} ppm
- </div>
- <div class="monitor-status">{{ monitoringData.gasStatus === 'normal' ? '姝e父' : '寮傚父' }}</div>
- </div>
- <div class="monitor-item">
- <div class="monitor-label">娴侀噺</div>
- <div class="monitor-value" :class="getStatusClass(monitoringData.flowStatus)">
- {{ monitoringData.flow }} m鲁/h
- </div>
- <div class="monitor-status">{{ monitoringData.flowStatus === 'normal' ? '姝e父' : '寮傚父' }}</div>
- </div>
- </div>
- </el-card>
-
- <!-- 3. 瀹夊叏瑁呯疆妯″潡 -->
- <el-card class="module-card">
- <template #header>
- <div class="card-header">
- <span>3. 瀹夊叏瑁呯疆</span>
- <el-button type="text" @click="checkSafetyDevices">妫�鏌�</el-button>
- </div>
- </template>
- <div class="safety-grid">
- <div class="safety-item" v-for="device in safetyDevices" :key="device.name">
-
- <div class="device-info">
- <div class="device-name">{{ device.name }}</div>
- <div class="device-status" :class="device.status">
- {{ device.status === 'normal' ? '姝e父' : '寮傚父' }}
- </div>
- </div>
- </div>
- </div>
- </el-card>
-
- <!-- 4. 缁存姢璁板綍妯″潡 -->
- <el-card class="module-card">
- <template #header>
- <div class="card-header">
- <span>4. 缁存姢璁板綍</span>
- <el-button type="text" @click="addMaintenanceRecord">娣诲姞璁板綍</el-button>
- </div>
- </template>
- <div class="maintenance-list">
- <div class="maintenance-item" v-for="record in maintenanceRecords" :key="record.id">
- <div class="record-header">
- <span class="record-date">{{ record.date }}</span>
- <el-tag :type="record.type === 'inspection' ? 'primary' : 'success'" size="small">
- {{ record.type === 'inspection' ? '妫�楠�' : '缁存姢' }}
- </el-tag>
- </div>
- <div class="record-content">
- <div class="record-title">{{ record.title }}</div>
- <div class="record-desc">{{ record.description }}</div>
- <div class="record-operator">鎿嶄綔浜猴細{{ record.operator }}</div>
- </div>
- </div>
- </div>
- </el-card>
- </div>
-
- <!-- 缂栬緫鍩烘湰淇℃伅寮圭獥 -->
- <el-dialog v-model="basicInfoDialogVisible" title="缂栬緫鍩烘湰淇℃伅" width="600px">
- <el-form :model="editBasicInfo" label-width="120px">
- <el-form-item label="鍌ㄧ綈缂栧彿">
- <el-input v-model="editBasicInfo.tankCode" />
- </el-form-item>
- <el-form-item label="鍌ㄧ綈鍚嶇О">
- <el-input v-model="editBasicInfo.tankName" />
- </el-form-item>
- <el-form-item label="鍌ㄧ綈绫诲瀷">
- <el-select v-model="editBasicInfo.tankType" style="width: 100%">
- <el-option label="娑插寲姘斾綋鍌ㄧ綈" value="娑插寲姘斾綋鍌ㄧ綈" />
- <el-option label="鍘嬪姏瀹瑰櫒" value="鍘嬪姏瀹瑰櫒" />
- <el-option label="甯稿帇鍌ㄧ綈" value="甯稿帇鍌ㄧ綈" />
- </el-select>
- </el-form-item>
- <el-form-item label="璁捐鍘嬪姏">
- <el-input-number v-model="editBasicInfo.designPressure" :precision="2" style="width: 100%" />
- </el-form-item>
- <el-form-item label="宸ヤ綔鍘嬪姏">
- <el-input-number v-model="editBasicInfo.workingPressure" :precision="2" style="width: 100%" />
- </el-form-item>
- <el-form-item label="瀹圭Н">
- <el-input-number v-model="editBasicInfo.volume" :precision="2" style="width: 100%" />
- </el-form-item>
- </el-form>
- <template #footer>
- <el-button @click="basicInfoDialogVisible = false">鍙栨秷</el-button>
- <el-button type="primary" @click="saveBasicInfo">淇濆瓨</el-button>
- </template>
- </el-dialog>
-
- <!-- 娣诲姞缁存姢璁板綍寮圭獥 -->
- <el-dialog v-model="maintenanceDialogVisible" title="娣诲姞缁存姢璁板綍" width="600px">
- <el-form :model="newMaintenanceRecord" label-width="120px">
- <el-form-item label="璁板綍绫诲瀷">
- <el-select v-model="newMaintenanceRecord.type" style="width: 100%">
- <el-option label="妫�楠�" value="inspection" />
- <el-option label="缁存姢" value="maintenance" />
- </el-select>
- </el-form-item>
- <el-form-item label="鏍囬">
- <el-input v-model="newMaintenanceRecord.title" />
- </el-form-item>
- <el-form-item label="鎻忚堪">
- <el-input type="textarea" v-model="newMaintenanceRecord.description" :rows="3" />
- </el-form-item>
- <el-form-item label="鎿嶄綔浜�">
- <el-input v-model="newMaintenanceRecord.operator" />
- </el-form-item>
- </el-form>
- <template #footer>
- <el-button @click="maintenanceDialogVisible = false">鍙栨秷</el-button>
- <el-button type="primary" @click="saveMaintenanceRecord">淇濆瓨</el-button>
- </template>
- </el-dialog>
- </div>
-</template>
-
-<script setup>
-import { ref, reactive, onMounted } from 'vue'
-import { ElMessage } from 'element-plus'
-
-// 鍩烘湰淇℃伅
-const basicInfo = reactive({
- tankCode: 'GT001',
- tankName: '娑插寲姘斿偍缃怉',
- tankType: '娑插寲姘斾綋鍌ㄧ綈',
- designPressure: 1.6,
- workingPressure: 0.8,
- volume: 100.5
-})
-
-// 鐩戞祴鍙傛暟
-const monitoringData = reactive({
- pressure: 0.8,
- pressureStatus: 'normal',
- temperature: 25.5,
- temperatureStatus: 'normal',
- gasConcentration: 0.1,
- gasStatus: 'normal',
- flow: 15.2,
- flowStatus: 'normal'
-})
-
-// 瀹夊叏瑁呯疆
-const safetyDevices = ref([
- { name: '瀹夊叏闃�', status: 'normal' },
- { name: '鍘嬪姏浼犳劅鍣�', status: 'normal' },
- { name: '娓╁害浼犳劅鍣�', status: 'normal' },
- { name: '姘斾綋妫�娴嬪櫒', status: 'normal' },
- { name: '鐖嗙牬鐗�', status: 'normal' },
- { name: '娉勫帇瑁呯疆', status: 'normal' }
-])
-
-// 缁存姢璁板綍
-const maintenanceRecords = ref([
- {
- id: 1,
- date: '2024-01-15',
- type: 'inspection',
- title: '骞村害妫�楠�',
- description: '鎸夌収TSG 21-2016鏍囧噯杩涜骞村害妫�楠岋紝璁惧鐘舵�佽壇濂�',
- operator: '寮犲伐绋嬪笀'
- },
- {
- id: 2,
- date: '2024-02-20',
- type: 'maintenance',
- title: '瀹夊叏闃�缁存姢',
- description: '鏇存崲瀹夊叏闃�瀵嗗皝鍦堬紝鏍″噯鍘嬪姏璁惧畾鍊�',
- operator: '鏉庢妧甯�'
- },
- {
- id: 3,
- date: '2024-03-10',
- type: 'inspection',
- title: '鍘嬪姏娴嬭瘯',
- description: '杩涜鍘嬪姏瀹瑰櫒姘村帇璇曢獙锛岀鍚堣璁¤姹�',
- operator: '鐜嬫楠屽憳'
- }
-])
-
-// 寮圭獥鎺у埗
-const basicInfoDialogVisible = ref(false)
-const maintenanceDialogVisible = ref(false)
-
-// 缂栬緫琛ㄥ崟鏁版嵁
-const editBasicInfo = reactive({ ...basicInfo })
-const newMaintenanceRecord = reactive({
- type: 'inspection',
- title: '',
- description: '',
- operator: ''
-})
-
-// 鑾峰彇鐘舵�佹牱寮忕被
-const getStatusClass = (status) => {
- return status === 'normal' ? 'status-normal' : 'status-warning'
-}
-
-// 鏂板鍌ㄧ綈
-const addTank = () => {
- ElMessage.success('鏂板鍌ㄧ綈鍔熻兘')
-}
-
-// 瀵煎嚭鏁版嵁
-const exportData = () => {
- ElMessage.success('瀵煎嚭鎴愬姛')
-}
-
-// 缂栬緫鍩烘湰淇℃伅
-const handleEditBasicInfo = () => {
- Object.assign(editBasicInfo, basicInfo)
- basicInfoDialogVisible.value = true
-}
-
-// 淇濆瓨鍩烘湰淇℃伅
-const saveBasicInfo = () => {
- Object.assign(basicInfo, editBasicInfo)
- basicInfoDialogVisible.value = false
- ElMessage.success('淇濆瓨鎴愬姛')
-}
-
-// 鍒锋柊鐩戞祴鏁版嵁
-const refreshMonitoring = () => {
- // 妯℃嫙鏁版嵁鏇存柊
- monitoringData.pressure = (Math.random() * 0.5 + 0.6).toFixed(2)
- monitoringData.temperature = (Math.random() * 10 + 20).toFixed(1)
- monitoringData.gasConcentration = (Math.random() * 0.2).toFixed(2)
- monitoringData.flow = (Math.random() * 10 + 10).toFixed(1)
- ElMessage.success('鏁版嵁宸插埛鏂�')
-}
-
-// 妫�鏌ュ畨鍏ㄨ缃�
-const checkSafetyDevices = () => {
- // 妯℃嫙妫�鏌ヨ繃绋�
- safetyDevices.value.forEach(device => {
- device.status = Math.random() > 0.1 ? 'normal' : 'warning'
- })
- ElMessage.success('瀹夊叏瑁呯疆妫�鏌ュ畬鎴�')
-}
-
-// 娣诲姞缁存姢璁板綍
-const addMaintenanceRecord = () => {
- newMaintenanceRecord.type = 'inspection'
- newMaintenanceRecord.title = ''
- newMaintenanceRecord.description = ''
- newMaintenanceRecord.operator = ''
- maintenanceDialogVisible.value = true
-}
-
-// 淇濆瓨缁存姢璁板綍
-const saveMaintenanceRecord = () => {
- const record = {
- id: Date.now(),
- date: new Date().toISOString().split('T')[0],
- ...newMaintenanceRecord
- }
- maintenanceRecords.value.unshift(record)
- maintenanceDialogVisible.value = false
- ElMessage.success('璁板綍娣诲姞鎴愬姛')
-}
-
-// 妯℃嫙瀹炴椂鏁版嵁鏇存柊
-onMounted(() => {
- setInterval(() => {
- monitoringData.pressure = (Math.random() * 0.5 + 0.6).toFixed(2)
- monitoringData.temperature = (Math.random() * 10 + 20).toFixed(1)
- monitoringData.gasConcentration = (Math.random() * 0.2).toFixed(2)
- monitoringData.flow = (Math.random() * 10 + 10).toFixed(1)
- }, 5000)
-})
-</script>
-
-<style lang="scss" scoped>
-.app-container {
- padding: 20px;
- background: #f5f5f5;
- min-height: 100vh;
-}
-
-.page-header {
- display: flex;
- justify-content: space-between;
- align-items: center;
- margin-bottom: 20px;
- padding: 20px;
- background: white;
- border-radius: 8px;
- box-shadow: 0 2px 8px rgba(0, 0, 0, 0.1);
-
- h2 {
- margin: 0;
- color: #303133;
- }
-
- .header-actions {
- display: flex;
- gap: 10px;
- }
-}
-
-.modules-container {
- display: grid;
- grid-template-columns: repeat(2, 1fr);
- gap: 20px;
-}
-
-.module-card {
- .card-header {
- display: flex;
- justify-content: space-between;
- align-items: center;
- font-weight: bold;
- color: #303133;
- }
-}
-
-.info-grid {
- display: grid;
- grid-template-columns: repeat(2, 1fr);
- gap: 15px;
-
- .info-item {
- display: flex;
- justify-content: space-between;
- padding: 10px;
- background: #f8f9fa;
- border-radius: 4px;
-
- label {
- font-weight: bold;
- color: #606266;
- }
-
- span {
- color: #303133;
- }
- }
-}
-
-.monitoring-grid {
- display: grid;
- grid-template-columns: repeat(2, 1fr);
- gap: 15px;
-
- .monitor-item {
- text-align: center;
- padding: 15px;
- background: #f8f9fa;
- border-radius: 8px;
- border: 2px solid transparent;
-
- .monitor-label {
- font-size: 14px;
- color: #606266;
- margin-bottom: 8px;
- }
-
- .monitor-value {
- font-size: 20px;
- font-weight: bold;
- margin-bottom: 5px;
-
- &.status-normal {
- color: #67c23a;
- }
-
- &.status-warning {
- color: #e6a23c;
- }
- }
-
- .monitor-status {
- font-size: 12px;
- color: #909399;
- }
- }
-}
-
-.safety-grid {
- display: grid;
- grid-template-columns: repeat(2, 1fr);
- gap: 15px;
-
- .safety-item {
- display: flex;
- align-items: center;
- padding: 15px;
- background: #f8f9fa;
- border-radius: 8px;
- border: 2px solid transparent;
-
- .device-icon {
- margin-right: 15px;
- }
-
- .device-info {
- flex: 1;
-
- .device-name {
- font-weight: bold;
- color: #303133;
- margin-bottom: 5px;
- }
-
- .device-status {
- font-size: 12px;
- padding: 2px 8px;
- border-radius: 10px;
- display: inline-block;
-
- &.normal {
- background: #f0f9ff;
- color: #409eff;
- }
-
- &.warning {
- background: #fef7e0;
- color: #e6a23c;
- }
- }
- }
- }
-}
-
-.maintenance-list {
- max-height: 300px;
- overflow-y: auto;
-
- .maintenance-item {
- padding: 15px;
- border-bottom: 1px solid #ebeef5;
- margin-bottom: 10px;
-
- &:last-child {
- border-bottom: none;
- margin-bottom: 0;
- }
-
- .record-header {
- display: flex;
- justify-content: space-between;
- align-items: center;
- margin-bottom: 8px;
-
- .record-date {
- font-size: 14px;
- color: #909399;
- }
- }
-
- .record-content {
- .record-title {
- font-weight: bold;
- color: #303133;
- margin-bottom: 5px;
- }
-
- .record-desc {
- font-size: 14px;
- color: #606266;
- margin-bottom: 5px;
- line-height: 1.4;
- }
-
- .record-operator {
- font-size: 12px;
- color: #909399;
- }
- }
- }
-}
-
-// 鍝嶅簲寮忚璁�
-@media (max-width: 1200px) {
- .modules-container {
- grid-template-columns: 1fr;
- }
-}
-
-@media (max-width: 768px) {
- .info-grid,
- .monitoring-grid,
- .safety-grid {
- grid-template-columns: 1fr;
- }
-}
-</style>
diff --git a/src/views/equipmentManagement/iotMonitor/index.vue b/src/views/equipmentManagement/iotMonitor/index.vue
deleted file mode 100644
index b0cd818..0000000
--- a/src/views/equipmentManagement/iotMonitor/index.vue
+++ /dev/null
@@ -1,317 +0,0 @@
-<template>
- <div class="app-container iot-monitor">
- <div class="header">
- <div class="title">瀹炴椂宸ュ喌鐩戞帶锛圛oT锛�</div>
- <div class="actions">
- <el-button type="primary" @click="toggleCollecting">{{ collecting ? '鏆傚仠閲囬泦' : '鍚姩閲囬泦' }}</el-button>
- <el-button @click="resetAll">閲嶇疆</el-button>
- <span class="ts">涓婃鏇存柊鏃堕棿锛歿{ lastUpdatedDisplay }}</span>
- </div>
- </div>
-
-<!-- <el-alert-->
-<!-- title="杈圭紭棰勮瑙勫垯锛氳酱鎵跨(鎹�-鎸姩鍊煎亸绂诲熀绾柯�5%瑙﹀彂鍛婅锛涙俯搴�/鍘嬪姏瓒婄晫瑙﹀彂鎻愰啋"-->
-<!-- type="info"-->
-<!-- :closable="false"-->
-<!-- show-icon-->
-<!-- class="rule-alert"-->
-<!-- />-->
-
- <el-row :gutter="16">
- <el-col v-for="dev in devices" :key="dev.id" :span="12">
- <el-card :class="['device-card', dev.hasAlert ? 'is-alert' : '']">
- <template #header>
- <div class="card-header">
- <div class="card-title">
- <span class="device-name">{{ dev.name }}</span>
- <el-tag :type="dev.hasAlert ? 'danger' : 'success'" size="small">{{ dev.hasAlert ? '鍛婅' : '姝e父' }}</el-tag>
- </div>
- <div class="meta">绫诲瀷锛歿{ dev.type }}锝滃熀绾挎尟鍔細{{ dev.baseline.vibration.toFixed(2) }} mm/s</div>
- </div>
- </template>
-
- <div class="metrics">
- <div class="metric" :class="{ 'metric-alert': dev.alerts.vibration }">
- <div class="metric-head">
- <span>鎸姩(mm/s)</span>
- <el-tag :type="dev.alerts.vibration ? 'danger' : 'info'" size="small">{{ dev.alerts.vibration ? '卤5%瓒婄晫' : '鍩虹嚎卤5%' }}</el-tag>
- </div>
- <div class="metric-value">{{ currentValue(dev.series.vibration).toFixed(2) }}</div>
- <Echarts
- :xAxis="[{ type: 'category', data: xAxisLabels }]"
- :yAxis="[{ type: 'value', name: 'mm/s' }]"
- :series="[{ type: 'line', smooth: true, showSymbol: false, data: dev.series.vibration }]"
- :tooltip="{ trigger: 'axis' }"
- :grid="{ left: 40, right: 10, top: 10, bottom: 20 }"
- :chartStyle="{ height: '160px', width: '100%' }"
- :lineColors="['#409EFF']"
- />
- </div>
-
- <div class="metric" :class="{ 'metric-alert': dev.alerts.temperature }">
- <div class="metric-head">
- <span>娓╁害(掳C)</span>
- <el-tag :type="dev.alerts.temperature ? 'warning' : 'info'" size="small">{{ dev.alerts.temperature ? '瓒婄晫' : '20~80' }}</el-tag>
- </div>
- <div class="metric-value">{{ currentValue(dev.series.temperature).toFixed(1) }}</div>
- <Echarts
- :xAxis="[{ type: 'category', data: xAxisLabels }]"
- :yAxis="[{ type: 'value', name: '掳C' }]"
- :series="[{ type: 'line', smooth: true, showSymbol: false, data: dev.series.temperature }]"
- :tooltip="{ trigger: 'axis' }"
- :grid="{ left: 40, right: 10, top: 10, bottom: 20 }"
- :chartStyle="{ height: '160px', width: '100%' }"
- :lineColors="['#E6A23C']"
- />
- </div>
-
- <div class="metric" :class="{ 'metric-alert': dev.alerts.pressure }">
- <div class="metric-head">
- <span>鍘嬪姏(MPa)</span>
- <el-tag :type="dev.alerts.pressure ? 'warning' : 'info'" size="small">{{ dev.alerts.pressure ? '瓒婄晫' : '0.2~1.5' }}</el-tag>
- </div>
- <div class="metric-value">{{ currentValue(dev.series.pressure).toFixed(2) }}</div>
- <Echarts
- :xAxis="[{ type: 'category', data: xAxisLabels }]"
- :yAxis="[{ type: 'value', name: 'MPa' }]"
- :series="[{ type: 'line', smooth: true, showSymbol: false, data: dev.series.pressure }]"
- :tooltip="{ trigger: 'axis' }"
- :grid="{ left: 40, right: 10, top: 10, bottom: 20 }"
- :chartStyle="{ height: '160px', width: '100%' }"
- :lineColors="['#67C23A']"
- />
- </div>
- </div>
- </el-card>
- </el-col>
- </el-row>
- </div>
-
-</template>
-
-<script setup>
-import { ref, reactive, onMounted, onBeforeUnmount, computed } from 'vue'
-import { ElNotification } from 'element-plus'
-import Echarts from '@/components/Echarts/echarts.vue'
-
-defineOptions({ name: 'IoTMonitor' })
-
-const windowSize = 30
-const collecting = ref(true)
-const lastUpdated = ref(Date.now())
-const lastUpdatedDisplay = computed(() => new Date(lastUpdated.value).toLocaleTimeString())
-
-const xAxisLabels = ref(Array.from({ length: windowSize }, (_, i) => i - (windowSize - 1)).map(n => `${n}s`))
-
-function makeSeries(fill, decimals = 2) {
- return Array.from({ length: windowSize }, () => Number(fill.toFixed(decimals)))
-}
-
-const devices = reactive([
- {
- id: 'water-pump',
- name: '娉ㄦ按娉�1',
- type: '绉诲姩瑁呭',
- baseline: { vibration: 9 },
- initial: { temperature: 40, pressure: 0.70 },
- alerts: { vibration: false, temperature: false, pressure: false },
- hasAlert: false,
- series: {
- vibration: makeSeries(9),
- temperature: makeSeries(40, 1),
- pressure: makeSeries(0.7, 2),
- },
- },
- {
- id: 'fluid-supply-truck',
- name: '娉ㄦ按娉�2',
- type: '绉诲姩瑁呭',
- baseline: { vibration: 7 },
- initial: { temperature: 30, pressure: 0.60 },
- alerts: { vibration: false, temperature: false, pressure: false },
- hasAlert: false,
- series: {
- vibration: makeSeries(7),
- temperature: makeSeries(30, 1),
- pressure: makeSeries(0.6, 2),
- },
- },
- {
- id: 'fracturing-truck',
- name: '娉ㄦ按娉�3',
- type: '绉诲姩瑁呭',
- baseline: { vibration: 12 },
- initial: { temperature: 65, pressure: 1.40 },
- alerts: { vibration: false, temperature: false, pressure: false },
- hasAlert: false,
- series: {
- vibration: makeSeries(12),
- temperature: makeSeries(65, 1),
- pressure: makeSeries(1.4, 2),
- },
- },
- {
- id: 'oil-tank-truck',
- name: '娉ㄦ按娉�4',
- type: '绉诲姩瑁呭',
- baseline: { vibration: 6 },
- initial: { temperature: 28, pressure: 0.50 },
- alerts: { vibration: false, temperature: false, pressure: false },
- hasAlert: false,
- series: {
- vibration: makeSeries(6),
- temperature: makeSeries(28, 1),
- pressure: makeSeries(0.5, 2),
- },
- },
-])
-
-function currentValue(arr) {
- return arr[arr.length - 1] ?? 0
-}
-
-function pushWindow(arr, val) {
- if (arr.length >= windowSize) arr.shift()
- arr.push(val)
-}
-
-function clamp(val, min, max) { return Math.max(min, Math.min(max, val)) }
-
-function tickDevice(dev) {
- const vibBase = dev.baseline.vibration
- // 鎸姩锛氬熀绾柯�2%闅忔満娉㈠姩锛�5%姒傜巼瑙﹀彂8%~12%灏栧嘲妯℃嫙鍛婅
- const spike = Math.random() < 0.05
- const vibNoise = vibBase * (spike ? (1 + (Math.random() * 0.08 + 0.04) * (Math.random() < 0.5 ? -1 : 1)) : (1 + (Math.random() - 0.5) * 0.04))
- const vibVal = Number(vibNoise.toFixed(2))
- pushWindow(dev.series.vibration, vibVal)
-
- // 娓╁害锛氱紦鎱㈤殢鏈烘父璧帮紝骞舵坊鍔犲伓鍙戦珮娓╁亸绉�
- const tPrev = currentValue(dev.series.temperature)
- const tDrift = tPrev + (Math.random() - 0.5) * 0.8 + (Math.random() < 0.02 ? 6 : 0)
- const tVal = Number(clamp(tDrift, 15, 95).toFixed(1))
- pushWindow(dev.series.temperature, tVal)
-
- // 鍘嬪姏锛氬皬骞呮尝鍔紝鍋跺彂浣庡帇/楂樺帇
- const pPrev = currentValue(dev.series.pressure)
- const pDrift = pPrev + (Math.random() - 0.5) * 0.05 + (Math.random() < 0.02 ? (Math.random() < 0.5 ? -0.3 : 0.3) : 0)
- const pVal = Number(clamp(pDrift, 0.05, 2.0).toFixed(2))
- pushWindow(dev.series.pressure, pVal)
-
- // 杈圭紭璁$畻闃堝�煎垽鏂�
- const vibDelta = Math.abs(vibVal - vibBase) / vibBase
- const vibAlert = vibDelta > 0.05
- const tAlert = tVal < 20 || tVal > 80
- const pAlert = pVal < 0.2 || pVal > 1.5
-
- const prevHasAlert = dev.hasAlert
- dev.alerts.vibration = vibAlert
- dev.alerts.temperature = tAlert
- dev.alerts.pressure = pAlert
- dev.hasAlert = vibAlert || tAlert || pAlert
-
- if (dev.hasAlert && !prevHasAlert) {
- const reasons = []
- if (vibAlert) reasons.push(`鎸姩鍋忕卤5% (褰撳墠 ${vibVal} / 鍩虹嚎 ${vibBase})`)
- if (tAlert) reasons.push(`娓╁害瓒婄晫 (褰撳墠 ${tVal}掳C, 鏈熸湜 20~80掳C) `)
- if (pAlert) reasons.push(`鍘嬪姏瓒婄晫 (褰撳墠 ${pVal}MPa, 鏈熸湜 0.2~1.5MPa) `)
- ElNotification({
- title: `${dev.name} 鍛婅`,
- message: reasons.join('锛�'),
- type: vibAlert ? 'error' : 'warning',
- duration: 5000,
- })
- }
-}
-
-let timer = null
-function start() {
- if (timer) return
- timer = setInterval(() => {
- if (!collecting.value) return
- devices.forEach(tickDevice)
- lastUpdated.value = Date.now()
- }, 10000)
-}
-
-function stop() {
- if (timer) {
- clearInterval(timer)
- timer = null
- }
-}
-
-function toggleCollecting() { collecting.value = !collecting.value }
-
-function resetAll() {
- devices.forEach(dev => {
- dev.series.vibration = makeSeries(dev.baseline.vibration)
- const t0 = dev.initial?.temperature ?? 45
- const p0 = dev.initial?.pressure ?? 0.8
- dev.series.temperature = makeSeries(t0, 1)
- dev.series.pressure = makeSeries(p0, 2)
- dev.alerts.vibration = false
- dev.alerts.temperature = false
- dev.alerts.pressure = false
- dev.hasAlert = false
- })
- lastUpdated.value = Date.now()
-}
-
-onMounted(() => {
- start()
-})
-
-onBeforeUnmount(() => {
- stop()
-})
-</script>
-
-<style lang="scss" scoped>
-.iot-monitor {
- .header {
- display: flex;
- align-items: center;
- justify-content: space-between;
- margin-bottom: 12px;
- .title { font-size: 18px; font-weight: 600; }
- .actions { display: flex; align-items: center; gap: 8px; }
- .ts { color: #909399; font-size: 12px; }
- }
- .rule-alert { margin-bottom: 12px; }
-}
-
-.device-card {
- margin-bottom: 16px;
- transition: border-color 0.2s ease, box-shadow 0.2s ease;
- &.is-alert { border-color: #F56C6C; box-shadow: 0 0 0 2px rgba(245,108,108,0.2) inset; }
- .card-header {
- display: flex; flex-direction: column; gap: 4px;
- .card-title { display: flex; align-items: center; gap: 8px; font-weight: 600; }
- .meta { color: #909399; font-size: 12px; }
- }
- .metrics {
- display: grid;
- grid-template-columns: 1fr;
- gap: 12px;
- }
-}
-
-.metric {
- border: 1px solid #ebeef5;
- border-radius: 6px;
- padding: 8px 8px 0 8px;
- &-head { display: flex; align-items: center; justify-content: space-between; margin-bottom: 4px; font-size: 13px; color: #606266; }
- &-value { font-size: 20px; font-weight: 600; margin: 2px 0 6px 0; }
-}
-
-.metric-alert {
- border-color: #F56C6C;
- background: #FFF6F6;
-}
-
-@media (min-width: 1200px) {
- .device-card .metrics { grid-template-columns: 1fr 1fr 1fr; }
-}
-</style>
-
-
diff --git a/src/views/equipmentManagement/iotMonitor/indexWD.vue b/src/views/equipmentManagement/iotMonitor/indexWD.vue
deleted file mode 100644
index 40a2eb0..0000000
--- a/src/views/equipmentManagement/iotMonitor/indexWD.vue
+++ /dev/null
@@ -1,317 +0,0 @@
-<template>
- <div class="app-container iot-monitor">
- <div class="header">
- <div class="title">瀹炴椂宸ュ喌鐩戞帶锛圛oT锛�</div>
- <div class="actions">
- <el-button type="primary" @click="toggleCollecting">{{ collecting ? '鏆傚仠閲囬泦' : '鍚姩閲囬泦' }}</el-button>
- <el-button @click="resetAll">閲嶇疆</el-button>
- <span class="ts">涓婃鏇存柊鏃堕棿锛歿{ lastUpdatedDisplay }}</span>
- </div>
- </div>
-
-<!-- <el-alert-->
-<!-- title="杈圭紭棰勮瑙勫垯锛氳酱鎵跨(鎹�-鎸姩鍊煎亸绂诲熀绾柯�5%瑙﹀彂鍛婅锛涙俯搴�/鍘嬪姏瓒婄晫瑙﹀彂鎻愰啋"-->
-<!-- type="info"-->
-<!-- :closable="false"-->
-<!-- show-icon-->
-<!-- class="rule-alert"-->
-<!-- />-->
-
- <el-row :gutter="16">
- <el-col v-for="dev in devices" :key="dev.id" :span="12">
- <el-card :class="['device-card', dev.hasAlert ? 'is-alert' : '']">
- <template #header>
- <div class="card-header">
- <div class="card-title">
- <span class="device-name">{{ dev.name }}</span>
- <el-tag :type="dev.hasAlert ? 'danger' : 'success'" size="small">{{ dev.hasAlert ? '鍛婅' : '姝e父' }}</el-tag>
- </div>
- <div class="meta">绫诲瀷锛歿{ dev.type }}锝滃熀绾挎尟鍔細{{ dev.baseline.vibration.toFixed(2) }} mm/s</div>
- </div>
- </template>
-
- <div class="metrics">
- <div class="metric" :class="{ 'metric-alert': dev.alerts.vibration }">
- <div class="metric-head">
- <span>鎸姩(mm/s)</span>
- <el-tag :type="dev.alerts.vibration ? 'danger' : 'info'" size="small">{{ dev.alerts.vibration ? '卤5%瓒婄晫' : '鍩虹嚎卤5%' }}</el-tag>
- </div>
- <div class="metric-value">{{ currentValue(dev.series.vibration).toFixed(2) }}</div>
- <Echarts
- :xAxis="[{ type: 'category', data: xAxisLabels }]"
- :yAxis="[{ type: 'value', name: 'mm/s' }]"
- :series="[{ type: 'line', smooth: true, showSymbol: false, data: dev.series.vibration }]"
- :tooltip="{ trigger: 'axis' }"
- :grid="{ left: 40, right: 10, top: 10, bottom: 20 }"
- :chartStyle="{ height: '160px', width: '100%' }"
- :lineColors="['#409EFF']"
- />
- </div>
-
- <div class="metric" :class="{ 'metric-alert': dev.alerts.temperature }">
- <div class="metric-head">
- <span>娓╁害(掳C)</span>
- <el-tag :type="dev.alerts.temperature ? 'warning' : 'info'" size="small">{{ dev.alerts.temperature ? '瓒婄晫' : '20~80' }}</el-tag>
- </div>
- <div class="metric-value">{{ currentValue(dev.series.temperature).toFixed(1) }}</div>
- <Echarts
- :xAxis="[{ type: 'category', data: xAxisLabels }]"
- :yAxis="[{ type: 'value', name: '掳C' }]"
- :series="[{ type: 'line', smooth: true, showSymbol: false, data: dev.series.temperature }]"
- :tooltip="{ trigger: 'axis' }"
- :grid="{ left: 40, right: 10, top: 10, bottom: 20 }"
- :chartStyle="{ height: '160px', width: '100%' }"
- :lineColors="['#E6A23C']"
- />
- </div>
-
- <div class="metric" :class="{ 'metric-alert': dev.alerts.pressure }">
- <div class="metric-head">
- <span>鍘嬪姏(MPa)</span>
- <el-tag :type="dev.alerts.pressure ? 'warning' : 'info'" size="small">{{ dev.alerts.pressure ? '瓒婄晫' : '0.2~1.5' }}</el-tag>
- </div>
- <div class="metric-value">{{ currentValue(dev.series.pressure).toFixed(2) }}</div>
- <Echarts
- :xAxis="[{ type: 'category', data: xAxisLabels }]"
- :yAxis="[{ type: 'value', name: 'MPa' }]"
- :series="[{ type: 'line', smooth: true, showSymbol: false, data: dev.series.pressure }]"
- :tooltip="{ trigger: 'axis' }"
- :grid="{ left: 40, right: 10, top: 10, bottom: 20 }"
- :chartStyle="{ height: '160px', width: '100%' }"
- :lineColors="['#67C23A']"
- />
- </div>
- </div>
- </el-card>
- </el-col>
- </el-row>
- </div>
-
-</template>
-
-<script setup>
-import { ref, reactive, onMounted, onBeforeUnmount, computed } from 'vue'
-import { ElNotification } from 'element-plus'
-import Echarts from '@/components/Echarts/echarts.vue'
-
-defineOptions({ name: 'IoTMonitor' })
-
-const windowSize = 30
-const collecting = ref(true)
-const lastUpdated = ref(Date.now())
-const lastUpdatedDisplay = computed(() => new Date(lastUpdated.value).toLocaleTimeString())
-
-const xAxisLabels = ref(Array.from({ length: windowSize }, (_, i) => i - (windowSize - 1)).map(n => `${n}s`))
-
-function makeSeries(fill, decimals = 2) {
- return Array.from({ length: windowSize }, () => Number(fill.toFixed(decimals)))
-}
-
-const devices = reactive([
- {
- id: 'hydrocyclone-desander',
- name: '鏃嬫祦闄ょ爞鍣�',
- type: '鍒嗙璁惧',
- baseline: { vibration: 8 },
- initial: { temperature: 35, pressure: 0.85 },
- alerts: { vibration: false, temperature: false, pressure: false },
- hasAlert: false,
- series: {
- vibration: makeSeries(8),
- temperature: makeSeries(35, 1),
- pressure: makeSeries(0.85, 2),
- },
- },
- {
- id: 'high-pressure-separator',
- name: '楂樺帇鍒嗙鍣ㄦ挰',
- type: '鍒嗙璁惧',
- baseline: { vibration: 6 },
- initial: { temperature: 45, pressure: 1.20 },
- alerts: { vibration: false, temperature: false, pressure: false },
- hasAlert: false,
- series: {
- vibration: makeSeries(6),
- temperature: makeSeries(45, 1),
- pressure: makeSeries(1.2, 2),
- },
- },
- {
- id: 'heating-throttle-pressure',
- name: '缁勫悎寮忓姞鐑妭娴佽皟鍘�',
- type: '璋冨帇璁惧',
- baseline: { vibration: 10 },
- initial: { temperature: 75, pressure: 1.80 },
- alerts: { vibration: false, temperature: false, pressure: false },
- hasAlert: false,
- series: {
- vibration: makeSeries(10),
- temperature: makeSeries(75, 1),
- pressure: makeSeries(1.8, 2),
- },
- },
- {
- id: 'three-phase-separator',
- name: '涓夌浉鍒嗙鍣�',
- type: '鍒嗙璁惧',
- baseline: { vibration: 7 },
- initial: { temperature: 38, pressure: 0.95 },
- alerts: { vibration: false, temperature: false, pressure: false },
- hasAlert: false,
- series: {
- vibration: makeSeries(7),
- temperature: makeSeries(38, 1),
- pressure: makeSeries(0.95, 2),
- },
- },
-])
-
-function currentValue(arr) {
- return arr[arr.length - 1] ?? 0
-}
-
-function pushWindow(arr, val) {
- if (arr.length >= windowSize) arr.shift()
- arr.push(val)
-}
-
-function clamp(val, min, max) { return Math.max(min, Math.min(max, val)) }
-
-function tickDevice(dev) {
- const vibBase = dev.baseline.vibration
- // 鎸姩锛氬熀绾柯�2%闅忔満娉㈠姩锛�5%姒傜巼瑙﹀彂8%~12%灏栧嘲妯℃嫙鍛婅
- const spike = Math.random() < 0.05
- const vibNoise = vibBase * (spike ? (1 + (Math.random() * 0.08 + 0.04) * (Math.random() < 0.5 ? -1 : 1)) : (1 + (Math.random() - 0.5) * 0.04))
- const vibVal = Number(vibNoise.toFixed(2))
- pushWindow(dev.series.vibration, vibVal)
-
- // 娓╁害锛氱紦鎱㈤殢鏈烘父璧帮紝骞舵坊鍔犲伓鍙戦珮娓╁亸绉�
- const tPrev = currentValue(dev.series.temperature)
- const tDrift = tPrev + (Math.random() - 0.5) * 0.8 + (Math.random() < 0.02 ? 6 : 0)
- const tVal = Number(clamp(tDrift, 15, 95).toFixed(1))
- pushWindow(dev.series.temperature, tVal)
-
- // 鍘嬪姏锛氬皬骞呮尝鍔紝鍋跺彂浣庡帇/楂樺帇
- const pPrev = currentValue(dev.series.pressure)
- const pDrift = pPrev + (Math.random() - 0.5) * 0.05 + (Math.random() < 0.02 ? (Math.random() < 0.5 ? -0.3 : 0.3) : 0)
- const pVal = Number(clamp(pDrift, 0.05, 2.0).toFixed(2))
- pushWindow(dev.series.pressure, pVal)
-
- // 杈圭紭璁$畻闃堝�煎垽鏂�
- const vibDelta = Math.abs(vibVal - vibBase) / vibBase
- const vibAlert = vibDelta > 0.05
- const tAlert = tVal < 20 || tVal > 80
- const pAlert = pVal < 0.2 || pVal > 1.5
-
- const prevHasAlert = dev.hasAlert
- dev.alerts.vibration = vibAlert
- dev.alerts.temperature = tAlert
- dev.alerts.pressure = pAlert
- dev.hasAlert = vibAlert || tAlert || pAlert
-
- if (dev.hasAlert && !prevHasAlert) {
- const reasons = []
- if (vibAlert) reasons.push(`鎸姩鍋忕卤5% (褰撳墠 ${vibVal} / 鍩虹嚎 ${vibBase})`)
- if (tAlert) reasons.push(`娓╁害瓒婄晫 (褰撳墠 ${tVal}掳C, 鏈熸湜 20~80掳C) `)
- if (pAlert) reasons.push(`鍘嬪姏瓒婄晫 (褰撳墠 ${pVal}MPa, 鏈熸湜 0.2~1.5MPa) `)
- ElNotification({
- title: `${dev.name} 鍛婅`,
- message: reasons.join('锛�'),
- type: vibAlert ? 'error' : 'warning',
- duration: 5000,
- })
- }
-}
-
-let timer = null
-function start() {
- if (timer) return
- timer = setInterval(() => {
- if (!collecting.value) return
- devices.forEach(tickDevice)
- lastUpdated.value = Date.now()
- }, 10000)
-}
-
-function stop() {
- if (timer) {
- clearInterval(timer)
- timer = null
- }
-}
-
-function toggleCollecting() { collecting.value = !collecting.value }
-
-function resetAll() {
- devices.forEach(dev => {
- dev.series.vibration = makeSeries(dev.baseline.vibration)
- const t0 = dev.initial?.temperature ?? 45
- const p0 = dev.initial?.pressure ?? 0.8
- dev.series.temperature = makeSeries(t0, 1)
- dev.series.pressure = makeSeries(p0, 2)
- dev.alerts.vibration = false
- dev.alerts.temperature = false
- dev.alerts.pressure = false
- dev.hasAlert = false
- })
- lastUpdated.value = Date.now()
-}
-
-onMounted(() => {
- start()
-})
-
-onBeforeUnmount(() => {
- stop()
-})
-</script>
-
-<style lang="scss" scoped>
-.iot-monitor {
- .header {
- display: flex;
- align-items: center;
- justify-content: space-between;
- margin-bottom: 12px;
- .title { font-size: 18px; font-weight: 600; }
- .actions { display: flex; align-items: center; gap: 8px; }
- .ts { color: #909399; font-size: 12px; }
- }
- .rule-alert { margin-bottom: 12px; }
-}
-
-.device-card {
- margin-bottom: 16px;
- transition: border-color 0.2s ease, box-shadow 0.2s ease;
- &.is-alert { border-color: #F56C6C; box-shadow: 0 0 0 2px rgba(245,108,108,0.2) inset; }
- .card-header {
- display: flex; flex-direction: column; gap: 4px;
- .card-title { display: flex; align-items: center; gap: 8px; font-weight: 600; }
- .meta { color: #909399; font-size: 12px; }
- }
- .metrics {
- display: grid;
- grid-template-columns: 1fr;
- gap: 12px;
- }
-}
-
-.metric {
- border: 1px solid #ebeef5;
- border-radius: 6px;
- padding: 8px 8px 0 8px;
- &-head { display: flex; align-items: center; justify-content: space-between; margin-bottom: 4px; font-size: 13px; color: #606266; }
- &-value { font-size: 20px; font-weight: 600; margin: 2px 0 6px 0; }
-}
-
-.metric-alert {
- border-color: #F56C6C;
- background: #FFF6F6;
-}
-
-@media (min-width: 1200px) {
- .device-card .metrics { grid-template-columns: 1fr 1fr 1fr; }
-}
-</style>
-
-
diff --git a/src/views/equipmentManagement/ledger/Form.vue b/src/views/equipmentManagement/ledger/Form.vue
deleted file mode 100644
index 0951fd8..0000000
--- a/src/views/equipmentManagement/ledger/Form.vue
+++ /dev/null
@@ -1,206 +0,0 @@
-<template>
- <el-form :model="form" label-width="100px" :rules="formRules" ref="formRef">
- <el-row :gutter="20">
- <el-col :span="12">
- <el-form-item label="璁惧鍚嶇О" prop="deviceName">
- <el-input v-model="form.deviceName" placeholder="璇疯緭鍏ヨ澶囧悕绉�" />
- </el-form-item>
- </el-col>
- <el-col :span="12">
- <el-form-item label="瑙勬牸鍨嬪彿" prop="deviceModel">
- <el-input v-model="form.deviceModel" :disabled="(form.deviceModel != null && operationType === 'edit')" placeholder="璇疯緭鍏ヨ鏍煎瀷鍙�" />
- </el-form-item>
- </el-col>
- <el-col :span="12">
- <el-form-item label="渚涘簲鍟�" prop="supplierName">
- <el-input v-model="form.supplierName" placeholder="璇疯緭鍏ヤ緵搴斿晢" />
- </el-form-item>
- </el-col>
- <el-col :span="12">
- <el-form-item label="鍗曚綅" prop="unit">
- <el-input v-model="form.unit" placeholder="璇疯緭鍏ュ崟浣�" />
- </el-form-item>
- </el-col>
- <el-col :span="12">
- <el-form-item label="鏁伴噺" prop="number">
- <el-input-number :step="0.01" :min="0" style="width: 100%"
- v-model="form.number"
- placeholder="璇疯緭鍏ユ暟閲�"
- @change="mathNum"
- />
- </el-form-item>
- </el-col>
- <el-col :span="12">
- <el-form-item label="鍚◣鍗曚环" prop="taxIncludingPriceUnit">
- <el-input-number :step="0.01" :min="0" style="width: 100%"
- v-model="form.taxIncludingPriceUnit"
- placeholder="璇疯緭鍏ュ惈绋庡崟浠�"
- maxlength="10"
- @change="mathNum"
- />
- </el-form-item>
- </el-col>
- <el-col :span="12">
- <el-form-item label="鍚◣鎬讳环" prop="taxIncludingPriceTotal">
- <el-input
- v-model="form.taxIncludingPriceTotal"
- placeholder="鑷姩鐢熸垚"
- type="number"
- disabled
- />
- </el-form-item>
- </el-col>
- <el-col :span="12">
- <el-form-item label="绋庣巼(%)" prop="taxRate">
- <!-- <el-input
- v-model="form.taxRate"
- placeholder="璇疯緭鍏ョ◣鐜�"
- type="number"
- >
- <template #append> % </template>
- </el-input> -->
- <el-select
- v-model="form.taxRate"
- placeholder="璇烽�夋嫨"
- clearable
- @change="mathNum"
- >
- <el-option label="1" :value="1" />
- <el-option label="6" :value="6" />
- <el-option label="13" :value="13" />
- </el-select>
- </el-form-item>
- </el-col>
- <el-col :span="12">
- <el-form-item label="涓嶅惈绋庢�讳环" prop="unTaxIncludingPriceTotal">
- <el-input
- v-model="form.unTaxIncludingPriceTotal"
- placeholder="鑷姩鐢熸垚"
- type="number"
- disabled
- />
- </el-form-item>
- </el-col>
- <!-- <el-col :span="12">
- <el-form-item label="褰曞叆浜�" prop="createUser">
- <el-input v-model="form.createUser" placeholder="璇疯緭鍏ュ綍鍏ヤ汉" />
- </el-form-item>
- </el-col> -->
- <el-col :span="12">
- <el-form-item label="褰曞叆鏃ユ湡" prop="createTime">
- <el-date-picker
- style="width: 100%"
- v-model="form.createTime"
- format="YYYY-MM-DD"
- value-format="YYYY-MM-DD HH:mm:ss"
- type="date"
- placeholder="璇烽�夋嫨褰曞叆鏃ユ湡"
- clearable
- />
- </el-form-item>
- </el-col>
- </el-row>
- </el-form>
-</template>
-
-<script setup>
-import useFormData from "@/hooks/useFormData";
-// import useUserStore from "@/store/modules/user";
-import { getLedgerById } from "@/api/equipmentManagement/ledger";
-import dayjs from "dayjs";
-import {
- calculateTaxIncludeTotalPrice,
- calculateTaxExclusiveTotalPrice,
-} from "@/utils/summarizeTable";
-import { ElMessage } from "element-plus";
-import {ref} from "vue";
-
-defineOptions({
- name: "璁惧鍙拌处琛ㄥ崟",
-});
-const formRef = ref(null);
-const operationType = ref('');
-const formRules = {
- deviceName: [{ required: true, trigger: "blur", message: "璇疯緭鍏�" }],
- deviceModel: [{ required: true, trigger: "blur", message: "璇疯緭鍏�" }],
- supplierName: [{ required: true, trigger: "blur", message: "璇疯緭鍏�" }],
- unit: [{ required: true, trigger: "blur", message: "璇疯緭鍏�" }],
- number: [{ required: true, trigger: "blur", message: "璇疯緭鍏�" }],
- taxIncludingPriceUnit: [{ required: true, trigger: "blur", message: "璇疯緭鍏�" }],
- taxRate: [{ required: true, trigger: "change", message: "璇疯緭鍏�" }],
-}
-
-const { form, resetForm } = useFormData({
- deviceName: undefined, // 璁惧鍚嶇О
- deviceModel: undefined, // 瑙勬牸鍨嬪彿
- supplierName: undefined, // 渚涘簲鍟�
- unit: undefined, // 鍗曚綅
- number: undefined, // 鏁伴噺
- taxIncludingPriceUnit: undefined, // 鍚◣鍗曚环
- taxIncludingPriceTotal: undefined, // 鍚◣鎬讳环
- taxRate: undefined, // 绋庣巼
- unTaxIncludingPriceTotal: undefined, // 涓嶅惈绋庢�讳环
- // createUser: useUserStore().nickName, // 褰曞叆浜�
- createTime: dayjs().format("YYYY-MM-DD HH:mm:ss"), // 褰曞叆鏃ユ湡
-});
-
-const loadForm = async (id) => {
- if (id) {
- operationType.value = 'edit'
- }
- const { code, data } = await getLedgerById(id);
- if (code == 200) {
- form.deviceName = data.deviceName;
- form.deviceModel = data.deviceModel;
- form.supplierName = data.supplierName;
- form.unit = data.unit;
- form.number = data.number;
- form.taxIncludingPriceUnit = data.taxIncludingPriceUnit;
- form.taxIncludingPriceTotal = data.taxIncludingPriceTotal;
- form.taxRate = data.taxRate;
- form.unTaxIncludingPriceTotal = data.unTaxIncludingPriceTotal;
- form.createTime = data.createTime;
- }
-};
-
-const mathNum = () => {
- if (!form.taxIncludingPriceUnit) {
- ElMessage.error("璇疯緭鍏ュ崟浠�");
- return;
- }
- if (!form.number) {
- ElMessage.error("璇疯緭鍏ユ暟閲�");
- return;
- }
- form.taxIncludingPriceTotal = calculateTaxIncludeTotalPrice(
- form.taxIncludingPriceUnit,
- form.number
- );
- if (form.taxRate) {
- form.unTaxIncludingPriceTotal = calculateTaxExclusiveTotalPrice(
- form.taxIncludingPriceTotal,
- form.taxRate
- );
- }
-};
-
-// 娓呴櫎琛ㄥ崟鏍¢獙鐘舵��
-const clearValidate = () => {
- formRef.value?.clearValidate();
-};
-
-// 閲嶇疆琛ㄥ崟鏁版嵁鍜屾牎楠岀姸鎬�
-const resetFormAndValidate = () => {
- resetForm();
- clearValidate();
-};
-
-defineExpose({
- form,
- loadForm,
- resetForm,
- clearValidate,
- resetFormAndValidate,
- formRef,
-});
-</script>
diff --git a/src/views/equipmentManagement/ledger/Modal.vue b/src/views/equipmentManagement/ledger/Modal.vue
deleted file mode 100644
index 0cea56c..0000000
--- a/src/views/equipmentManagement/ledger/Modal.vue
+++ /dev/null
@@ -1,69 +0,0 @@
-<template>
- <el-dialog :title="modalOptions.title" v-model="visible" @close="close">
- <Form ref="formRef"></Form>
- <template #footer>
- <el-button type="primary" @click="sendForm" :loading="loading">
- {{ modalOptions.confirmText }}
- </el-button>
- <el-button @click="closeModal">{{ modalOptions.cancelText }}</el-button>
- </template>
- </el-dialog>
-</template>
-
-<script setup>
-import { useModal } from "@/hooks/useModal";
-import { addLedger, editLedger } from "@/api/equipmentManagement/ledger";
-import Form from "./Form.vue";
-import { ElMessage } from "element-plus";
-const { proxy } = getCurrentInstance()
-
-defineOptions({
- name: "璁惧鍙拌处鏂板缂栬緫",
-});
-
-const emits = defineEmits(["success"]);
-
-const formRef = ref();
-const {
- id,
- visible,
- loading,
- openModal,
- modalOptions,
- handleConfirm,
- closeModal,
-} = useModal({ title: "璁惧鍙拌处" });
-
-const sendForm = () => {
- proxy.$refs.formRef.$refs.formRef.validate(async valid => {
- if (valid) {
- const {code} = id.value
- ? await editLedger({id: id.value, ...formRef.value.form})
- : await addLedger(formRef.value.form);
- if (code == 200) {
- emits("success");
- ElMessage({message: "鎿嶄綔鎴愬姛", type: "success"});
- close();
- } else {
- loading.value = false;
- }
- }
- })
-};
-
-const close = () => {
- formRef.value.resetFormAndValidate();
- closeModal();
-};
-
-const loadForm = async (id) => {
- openModal(id);
- await nextTick();
- formRef.value.loadForm(id);
-};
-
-defineExpose({
- openModal,
- loadForm,
-});
-</script>
diff --git a/src/views/equipmentManagement/ledger/index.vue b/src/views/equipmentManagement/ledger/index.vue
deleted file mode 100644
index decd235..0000000
--- a/src/views/equipmentManagement/ledger/index.vue
+++ /dev/null
@@ -1,330 +0,0 @@
-<template>
- <div class="app-container">
- <el-form :model="filters" :inline="true">
- <el-form-item label="璁惧鍚嶇О">
- <el-input
- v-model="filters.deviceName"
- style="width: 240px"
- placeholder="璇疯緭鍏ヨ澶囧悕绉�"
- clearable
- :prefix-icon="Search"
- @change="getTableData"
- />
- </el-form-item>
- <el-form-item label="瑙勬牸鍨嬪彿">
- <el-input
- v-model="filters.deviceModel"
- style="width: 240px"
- placeholder="璇疯緭鍏ヨ鏍煎瀷鍙�"
- clearable
- :prefix-icon="Search"
- @change="getTableData"
- />
- </el-form-item>
- <el-form-item label="渚涘簲鍟�">
- <el-input
- v-model="filters.supplierName"
- style="width: 240px"
- placeholder="璇疯緭鍏ヤ緵搴斿晢"
- clearable
- :prefix-icon="Search"
- @change="getTableData"
- />
- </el-form-item>
- <el-form-item label="鍗曚綅">
- <el-input
- v-model="filters.unit"
- style="width: 240px"
- placeholder="璇疯緭鍏ュ崟浣�"
- clearable
- :prefix-icon="Search"
- @change="getTableData"
- />
- </el-form-item>
- <el-form-item label="褰曞叆鏃ユ湡:">
- <el-date-picker v-model="filters.entryDate" value-format="YYYY-MM-DD" format="YYYY-MM-DD" type="daterange"
- placeholder="璇烽�夋嫨" clearable @change="changeDaterange" />
- </el-form-item>
- <el-form-item>
- <el-button type="primary" @click="getTableData">鎼滅储</el-button>
- <el-button @click="resetFilters">閲嶇疆</el-button>
- </el-form-item>
- </el-form>
- <div class="table_list">
- <div class="actions">
- <div></div>
- <div>
- <el-button type="primary" @click="add" icon="Plus"> 鏂板 </el-button>
- <el-button @click="handleOut" icon="download">瀵煎嚭</el-button>
- <el-button
- type="danger"
- icon="Delete"
- :disabled="multipleList.length <= 0"
- @click="deleteRow(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,
- }"
- :isShowSummary="true"
- :summaryMethod="summaryMethod"
- @selection-change="handleSelectionChange"
- @pagination="changePage"
- >
- </PIMTable>
- </div>
- <Modal ref="modalRef" @success="getTableData"></Modal>
- <el-dialog v-model="qrDialogVisible" title="浜岀淮鐮�" width="300px">
- <div style="text-align:center;">
- <img :src="qrCodeUrl" alt="浜岀淮鐮�" style="width:200px;height:200px;" />
- <div style="margin:10px 0;">
- <el-button type="primary" @click="downloadQRCode">涓嬭浇浜岀淮鐮佸浘鐗�</el-button>
- </div>
- </div>
- </el-dialog>
- </div>
-</template>
-
-<script setup>
-import { usePaginationApi } from "@/hooks/usePaginationApi";
-// import { Search } from "@element-plus/icons-vue";
-import { getLedgerPage, delLedger } from "@/api/equipmentManagement/ledger";
-import { onMounted, getCurrentInstance } from "vue";
-import Modal from "./Modal.vue";
-import { ElMessageBox, ElMessage } from "element-plus";
-import dayjs from "dayjs";
-import QRCode from "qrcode";
-import { ref } from "vue";
-import { summarizeTable } from "@/utils/summarizeTable";
-import {Search} from "@element-plus/icons-vue";
-
-defineOptions({
- name: "璁惧鍙拌处",
-});
-
-// 琛ㄦ牸澶氶�夋閫変腑椤�
-const multipleList = ref([]);
-const { proxy } = getCurrentInstance();
-const modalRef = ref();
-const qrDialogVisible = ref(false);
-const qrCodeUrl = ref("");
-const qrRowData = ref(null);
-
-const {
- filters,
- columns,
- dataList,
- pagination,
- getTableData,
- resetFilters,
- onCurrentChange,
-} = usePaginationApi(
- getLedgerPage,
- {
- deviceName: undefined,
- deviceModel: undefined,
- supplierName: undefined,
- unit: undefined,
- entryDateStart: undefined,
- entryDateEnd: undefined,
- },
- [
- {
- label: "璁惧鍚嶇О",
- align: "center",
- prop: "deviceName",
- },
- {
- label: "瑙勬牸鍨嬪彿",
- align: "center",
- prop: "deviceModel",
- },
- {
- label: "渚涘簲鍟�",
- align: "center",
- prop: "supplierName",
- },
- {
- label: "鍗曚綅",
- align: "center",
- prop: "unit",
- },
- {
- label: "鏁伴噺",
- align: "center",
- prop: "number",
- },
- {
- label: "鍚◣鍗曚环",
- align: "center",
- prop: "taxIncludingPriceUnit",
- },
- {
- label: "鍚◣鎬讳环",
- align: "center",
- prop: "taxIncludingPriceTotal",
- },
- {
- label: "绋庣巼",
- align: "center",
- prop: "taxRate",
- },
- {
- label: "涓嶅惈绋庢�讳环",
- align: "center",
- prop: "unTaxIncludingPriceTotal",
- },
- {
- label: "褰曞叆浜�",
- align: "center",
- prop: "createUser",
- },
- {
- label: "褰曞叆鏃ユ湡",
- align: "center",
- prop: "createTime",
- },
- {
- dataType: "action",
- label: "鎿嶄綔",
- align: "center",
- fixed: 'right',
- width: 140,
- operation: [
- {
- name: "缂栬緫",
- type: "text",
- clickFun: (row) => {
- edit(row.id)
- },
- },
- {
- name: "鐢熸垚浜岀淮鐮�",
- type: "text",
- clickFun: (row) => {
- showQRCode(row)
- },
- },
- ],
- },
- ]
-);
-
-// 澶氶�夊悗鍋氫粈涔�
-const handleSelectionChange = (selectionList) => {
- multipleList.value = selectionList;
-};
-
-const add = () => {
- modalRef.value.openModal();
-};
-const edit = (id) => {
- modalRef.value.loadForm(id);
-};
-const changePage = ({ page, limit }) => {
- pagination.currentPage = page;
- pagination.pageSize = limit;
- onCurrentChange(page);
-};
-
-// 鍚堣鏂规硶
-const summaryMethod = (param) => {
- return summarizeTable(
- param,
- ['number', 'taxIncludingPriceTotal', 'unTaxIncludingPriceTotal', 'taxIncludingPriceUnit'],
- {
- number: { noDecimal: true },
- taxIncludingPriceTotal: { decimalPlaces: 2 },
- unTaxIncludingPriceTotal: { decimalPlaces: 2 }
- }
- );
-};
-
-const deleteRow = (id) => {
- ElMessageBox.confirm("姝ゆ搷浣滃皢姘镐箙鍒犻櫎璇ユ枃浠�, 鏄惁缁х画?", "鎻愮ず", {
- confirmButtonText: "纭畾",
- cancelButtonText: "鍙栨秷",
- type: "warning",
- }).then(async () => {
- const { code } = await delLedger(id);
- if (code == 200) {
- ElMessage({
- type: "success",
- message: "鍒犻櫎鎴愬姛",
- });
- getTableData();
- }
- });
-};
-
-const changeDaterange = (value) => {
- if (value) {
- filters.entryDateStart = dayjs(value[0]).format("YYYY-MM-DD");
- filters.entryDateEnd = dayjs(value[1]).format("YYYY-MM-DD");
- } else {
- filters.entryDateStart = undefined;
- filters.entryDateEnd = undefined;
- }
- getTableData();
-};
-
-const handleOut = () => {
- ElMessageBox.confirm("閫変腑鐨勫唴瀹瑰皢琚鍑猴紝鏄惁纭瀵煎嚭锛�", "瀵煎嚭", {
- confirmButtonText: "纭",
- cancelButtonText: "鍙栨秷",
- type: "warning",
- })
- .then(() => {
- proxy.download(`/device/ledger/export`, {}, "璁惧鍙拌处妗f.xlsx");
- })
- .catch(() => {
- proxy.$modal.msg("宸插彇娑�");
- });
-};
-
-const showQRCode = async (row) => {
- // 浣犲彲浠ヨ嚜瀹氫箟浜岀淮鐮佸唴瀹癸紝姣斿 row.id 鎴� row.deviceName
- const qrContent = JSON.stringify(row); // 鎴� `${row.id}`
- qrCodeUrl.value = await QRCode.toDataURL(qrContent);
- qrRowData.value = row;
- qrDialogVisible.value = true;
-};
-
-const downloadQRCode = () => {
- const a = document.createElement("a");
- a.href = qrCodeUrl.value;
- a.download = `${qrRowData.value.deviceName || "浜岀淮鐮�"}.png`;
- a.click();
-};
-
-onMounted(() => {
- filters.entryDate = [
- dayjs().format("YYYY-MM-DD"),
- dayjs().add(1, "day").format("YYYY-MM-DD"),
- ]
- filters.entryDateStart = dayjs().format("YYYY-MM-DD")
- filters.entryDateEnd = dayjs().add(1, "day").format("YYYY-MM-DD")
- 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/equipmentManagement/measurementEquipment/components/calibrationDia.vue b/src/views/equipmentManagement/measurementEquipment/components/calibrationDia.vue
deleted file mode 100644
index f9679a0..0000000
--- a/src/views/equipmentManagement/measurementEquipment/components/calibrationDia.vue
+++ /dev/null
@@ -1,267 +0,0 @@
-<template>
- <div>
- <el-dialog
- v-model="dialogFormVisible"
- title="璁¢噺鍣ㄥ叿"
- width="50%"
- @close="closeDia"
- >
- <el-form
- :model="form"
- label-width="140px"
- label-position="top"
- :rules="rules"
- ref="formRef"
- >
- <el-row :gutter="30">
- <el-col :span="12">
- <el-form-item label="璁¢噺鍣ㄥ叿缂栧彿锛�" prop="customerName">
- <el-input
- v-model="form.code"
- placeholder="璇疯緭鍏�"
- clearable
- disabled
- />
- </el-form-item>
- </el-col>
- <el-col :span="12">
- <el-form-item label="璁¢噺鍣ㄥ叿鍚嶇О锛�" prop="proDesc">
- <el-input
- v-model="form.name"
- placeholder="璇疯緭鍏�"
- clearable
- disabled
- />
- </el-form-item>
- </el-col>
- </el-row>
- <el-row :gutter="30">
- <el-col :span="12">
- <el-form-item label="妫�瀹氭棩鏈燂細" prop="recordDate">
- <el-date-picker
- style="width: 100%"
- v-model="form.recordDate"
- value-format="YYYY-MM-DD"
- format="YYYY-MM-DD"
- type="date"
- placeholder="璇烽�夋嫨"
- clearable
- />
- </el-form-item>
- </el-col>
- <el-col :span="12">
- <el-form-item label="鏈夋晥鏈燂細" prop="valid">
- <el-input
- v-model="form.valid"
- placeholder="璇疯緭鍏�"
- clearable
- >
- <template #append>鏃�</template>
- </el-input>
- </el-form-item>
- </el-col>
- </el-row>
- <el-row :gutter="30">
- <el-col :span="12">
- <el-form-item label="褰曞叆浜猴細" prop="userId">
- <el-select
- v-model="form.userId"
- placeholder="璇烽�夋嫨"
- disabled
- clearable
- >
- <el-option
- v-for="item in userList"
- :key="item.userId"
- :label="item.nickName"
- :value="item.userId"
- ></el-option>
- </el-select>
- </el-form-item>
- </el-col>
- <el-col :span="12">
- <el-form-item label="褰曞叆鏃ユ湡锛�" prop="entryDate">
- <el-date-picker
- style="width: 100%"
- v-model="form.entryDate"
- value-format="YYYY-MM-DD"
- format="YYYY-MM-DD"
- type="date"
- placeholder="璇烽�夋嫨"
- disabled
- clearable
- />
- </el-form-item>
- </el-col>
- </el-row>
-<!-- <el-row :gutter="30">-->
-<!-- <el-col :span="24">-->
-<!-- <el-form-item label="闄勪欢鏉愭枡锛�" prop="remark">-->
-<!-- <el-upload v-model:file-list="fileList" :action="upload.url" multiple ref="fileUpload" auto-upload-->
-<!-- :headers="upload.headers" :before-upload="handleBeforeUpload" :on-error="handleUploadError"-->
-<!-- :on-success="handleUploadSuccess" :on-remove="handleRemove">-->
-<!-- <el-button type="primary" v-if="operationType !== 'view'">涓婁紶</el-button>-->
-<!-- <template #tip v-if="operationType !== 'view'">-->
-<!-- <div class="el-upload__tip">-->
-<!-- 鏂囦欢鏍煎紡鏀寔-->
-<!-- doc锛宒ocx锛寈ls锛寈lsx锛宲pt锛宲ptx锛宲df锛宼xt锛寈ml锛宩pg锛宩peg锛宲ng锛実if锛宐mp锛宺ar锛寊ip锛�7z-->
-<!-- </div>-->
-<!-- </template>-->
-<!-- </el-upload>-->
-<!-- </el-form-item>-->
-<!-- </el-col>-->
-<!-- </el-row>-->
- </el-form>
- <template #footer>
- <div class="dialog-footer">
- <el-button type="primary" @click="submitForm">纭</el-button>
- <el-button @click="closeDia">鍙栨秷</el-button>
- </div>
- </template>
- </el-dialog>
- </div>
-</template>
-
-<script setup>
-import {ref} from "vue";
-import useUserStore from "@/store/modules/user.js";
-import {userListNoPageByTenantId} from "@/api/system/user.js";
-import {afterSalesServiceAdd, afterSalesServiceUpdate} from "@/api/customerService/index.js";
-import {getToken} from "@/utils/auth.js";
-import {ledgerRecordUpdate, ledgerRecordVerifying} from "@/api/equipmentManagement/calibration.js";
-import {delLedgerFile} from "@/api/salesManagement/salesLedger.js";
-const { proxy } = getCurrentInstance()
-const emit = defineEmits(['close'])
-const dialogFormVisible = ref(false);
-const operationType = ref('')
-const userStore = useUserStore();
-
-const data = reactive({
- form: {
- code: "",
- name: "",
- valid: "",
- recordDate: "",
- userId: "",
- entryDate: "",
- tempFileIds: []
- },
- rules: {
- code: [{required: true, message: "璇疯緭鍏�", trigger: "blur"}],
- name: [{required: true, message: "璇疯緭鍏�", trigger: "blur"}],
- valid: [{required: true, message: "璇疯緭鍏�", trigger: "blur"}],
- recordDate: [{required: true, message: "璇烽�夋嫨", trigger: "change"}],
- userId: [{required: true, message: "璇烽�夋嫨", trigger: "change"}],
- entryDate: [{required: true, message: "璇烽�夋嫨", trigger: "change"}],
- }
-})
-const { form, rules } = toRefs(data);
-const userList = ref([])
-const fileList = ref([]);
-const upload = reactive({
- // 涓婁紶鐨勫湴鍧�
- url: import.meta.env.VITE_APP_BASE_API + "/file/upload",
- // 璁剧疆涓婁紶鐨勮姹傚ご閮�
- headers: { Authorization: "Bearer " + getToken() },
-});
-
-// 鎵撳紑寮规
-const openDialog = (type, row) => {
- console.log(row)
- operationType.value = type;
- dialogFormVisible.value = true;
- userListNoPageByTenantId().then((res) => {
- userList.value = res.data;
- });
- fileList.value = []
- if(type !== "add"){
- form.value.tempFileIds = [];
- }
- if (type === "edit") {
- form.value.valid = row.valid;
- form.value.recordDate = row.recordDate;
- fileList.value = row.commonFiles;
- }
- if(type === "add"){
- fileList.value = row.commonFiles;
- }
-
- form.value.id = row.id;
- form.value.code = row.code;
- form.value.name = row.name;
- form.value.userId = userStore.id;
- form.value.entryDate = getCurrentDate();
-}
-
-// 涓婁紶鍓嶆牎妫�
-function handleBeforeUpload(file) {
- proxy.$modal.loading("姝e湪涓婁紶鏂囦欢锛岃绋嶅��...");
- return true;
-}
-// 涓婁紶澶辫触
-function handleUploadError(err) {
- proxy.$modal.msgError("涓婁紶鏂囦欢澶辫触");
- proxy.$modal.closeLoading();
-}
-// 涓婁紶鎴愬姛鍥炶皟
-function handleUploadSuccess(res, file, uploadFiles) {
- proxy.$modal.closeLoading();
- if (res.code === 200) {
- file.tempId = res.data.tempId;
- form.value.tempFileIds.push(file.tempId);
- proxy.$modal.msgSuccess("涓婁紶鎴愬姛");
- } else {
- proxy.$modal.msgError(res.msg);
- proxy.$refs.fileUpload.handleRemove(file);
- }
-}
-// 绉婚櫎鏂囦欢
-function handleRemove(file) {
- if (operationType.value === "edit") {
- let ids = [];
- ids.push(file.id);
- delLedgerFile(ids).then((res) => {
- proxy.$modal.msgSuccess("鍒犻櫎鎴愬姛");
- });
- }
-}
-
-const submitForm = () => {
- proxy.$refs["formRef"].validate(valid => {
- if (valid) {
- if (operationType.value === "verifying") {
- ledgerRecordVerifying(form.value).then(response => {
- proxy.$modal.msgSuccess("妫�瀹氭牎鍑嗘垚鍔�")
- closeDia()
- })
- } else {
- ledgerRecordUpdate(form.value).then(response => {
- proxy.$modal.msgSuccess("淇敼鎴愬姛")
- closeDia()
- })
- }
- }
- })
-}
-// 鍏抽棴寮规
-const closeDia = () => {
- proxy.resetForm("formRef");
- dialogFormVisible.value = false;
- emit('close')
-};
-// 鑾峰彇褰撳墠鏃ユ湡骞舵牸寮忓寲涓� YYYY-MM-DD
-function getCurrentDate() {
- const today = new Date();
- const year = today.getFullYear();
- const month = String(today.getMonth() + 1).padStart(2, "0"); // 鏈堜唤浠�0寮�濮�
- const day = String(today.getDate()).padStart(2, "0");
- return `${year}-${month}-${day}`;
-}
-defineExpose({
- openDialog,
-});
-</script>
-
-<style scoped>
-
-</style>
\ No newline at end of file
diff --git a/src/views/equipmentManagement/measurementEquipment/components/formDia.vue b/src/views/equipmentManagement/measurementEquipment/components/formDia.vue
deleted file mode 100644
index a9e08d1..0000000
--- a/src/views/equipmentManagement/measurementEquipment/components/formDia.vue
+++ /dev/null
@@ -1,253 +0,0 @@
-<template>
- <div>
- <el-dialog
- v-model="dialogFormVisible"
- title="璁¢噺鍣ㄥ叿"
- width="50%"
- @close="closeDia"
- >
- <el-form
- :model="form"
- label-width="140px"
- label-position="top"
- :rules="rules"
- ref="formRef"
- >
- <el-row :gutter="30">
- <el-col :span="12">
- <el-form-item label="璁¢噺鍣ㄥ叿缂栧彿锛�" prop="code">
- <el-input
- v-model="form.code"
- placeholder="璇疯緭鍏�"
- clearable
- />
- </el-form-item>
- </el-col>
- <el-col :span="12">
- <el-form-item label="璁¢噺鍣ㄥ叿鍚嶇О锛�" prop="name">
- <el-input
- v-model="form.name"
- placeholder="璇疯緭鍏�"
- clearable
- />
- </el-form-item>
- </el-col>
- </el-row>
- <el-row :gutter="30">
- <el-col :span="12">
- <el-form-item label="瑙勬牸鍨嬪彿锛�" prop="model">
- <el-input
- v-model="form.model"
- placeholder="璇疯緭鍏�"
- clearable
- />
- </el-form-item>
- </el-col>
- <el-col :span="12">
- <el-form-item label="棰勮涓嬫妫�瀹氭棩鏈燂細" prop="nextDate">
- <el-date-picker
- style="width: 100%"
- v-model="form.nextDate"
- value-format="YYYY-MM-DD"
- format="YYYY-MM-DD"
- type="date"
- placeholder="璇烽�夋嫨"
- clearable
- />
- </el-form-item>
- </el-col>
- </el-row>
- <el-row :gutter="30">
- <el-col :span="12">
- <el-form-item label="褰曞叆浜猴細" prop="userId">
- <el-select
- v-model="form.userId"
- placeholder="璇烽�夋嫨"
- clearable
- disabled
- >
- <el-option
- v-for="item in userList"
- :key="item.userId"
- :label="item.nickName"
- :value="item.userId"
- ></el-option>
- </el-select>
- </el-form-item>
- </el-col>
- <el-col :span="12">
- <el-form-item label="褰曞叆鏃ユ湡锛�" prop="recordDate">
- <el-date-picker
- style="width: 100%"
- v-model="form.recordDate"
- value-format="YYYY-MM-DD"
- format="YYYY-MM-DD"
- type="date"
- disabled
- placeholder="璇烽�夋嫨"
- clearable
- />
- </el-form-item>
- </el-col>
- </el-row>
-<!-- <el-row :gutter="30">-->
-<!-- <el-col :span="24">-->
-<!-- <el-form-item label="闄勪欢鏉愭枡锛�" prop="remark">-->
-<!-- <el-upload v-model:file-list="fileList" :action="upload.url" multiple ref="fileUpload" auto-upload-->
-<!-- :headers="upload.headers" :before-upload="handleBeforeUpload" :on-error="handleUploadError"-->
-<!-- :on-success="handleUploadSuccess" :on-remove="handleRemove">-->
-<!-- <el-button type="primary" v-if="operationType !== 'view'">涓婁紶</el-button>-->
-<!-- <template #tip v-if="operationType !== 'view'">-->
-<!-- <div class="el-upload__tip">-->
-<!-- 鏂囦欢鏍煎紡鏀寔-->
-<!-- doc锛宒ocx锛寈ls锛寈lsx锛宲pt锛宲ptx锛宲df锛宼xt锛寈ml锛宩pg锛宩peg锛宲ng锛実if锛宐mp锛宺ar锛寊ip锛�7z-->
-<!-- </div>-->
-<!-- </template>-->
-<!-- </el-upload>-->
-<!-- </el-form-item>-->
-<!-- </el-col>-->
-<!-- </el-row>-->
- </el-form>
- <template #footer>
- <div class="dialog-footer">
- <el-button type="primary" @click="submitForm">纭</el-button>
- <el-button @click="closeDia">鍙栨秷</el-button>
- </div>
- </template>
- </el-dialog>
- </div>
-</template>
-
-<script setup>
-import {ref} from "vue";
-import useUserStore from "@/store/modules/user.js";
-import {userListNoPageByTenantId} from "@/api/system/user.js";
-import {afterSalesServiceAdd, afterSalesServiceUpdate} from "@/api/customerService/index.js";
-import {getToken} from "@/utils/auth.js";
-import {measuringInstrumentAdd, measuringInstrumentUpdate} from "@/api/equipmentManagement/measurementEquipment.js";
-const { proxy } = getCurrentInstance()
-const emit = defineEmits(['close'])
-const dialogFormVisible = ref(false);
-const operationType = ref('')
-const userStore = useUserStore();
-
-const data = reactive({
- form: {
- code: "",
- name: "",
- model: "",
- validDate: "",
- nextDate: "",
- userId: "",
- recordDate: "",
- tempFileIds: []
- },
- rules: {
- code: [{required: true, message: "璇疯緭鍏�", trigger: "blur"}],
- name: [{required: true, message: "璇疯緭鍏�", trigger: "blur"}],
- model: [{required: true, message: "璇疯緭鍏�", trigger: "blur"}],
- validDate: [{required: true, message: "璇疯緭鍏�", trigger: "blur"}],
- nextDate: [{required: true, message: "璇烽�夋嫨", trigger: "change"}],
- userId: [{required: true, message: "璇烽�夋嫨", trigger: "change"}],
- recordDate: [{required: true, message: "璇烽�夋嫨", trigger: "change"}],
- }
-})
-const { form, rules } = toRefs(data);
-const userList = ref([])
-const fileList = ref([]);
-const upload = reactive({
- // 涓婁紶鐨勫湴鍧�
- url: import.meta.env.VITE_APP_BASE_API + "/file/upload",
- // 璁剧疆涓婁紶鐨勮姹傚ご閮�
- headers: { Authorization: "Bearer " + getToken() },
-});
-
-// 鎵撳紑寮规
-const openDialog = (type, row) => {
- operationType.value = type;
- dialogFormVisible.value = true;
- fileList.value = []
- form.value.userId = userStore.id;
- form.value.recordDate = getCurrentDate();
- userListNoPageByTenantId().then((res) => {
- userList.value = res.data;
- });
- if (type === "edit") {
- form.value = {...row}
- }
-}
-
-// 涓婁紶鍓嶆牎妫�
-function handleBeforeUpload(file) {
- proxy.$modal.loading("姝e湪涓婁紶鏂囦欢锛岃绋嶅��...");
- return true;
-}
-// 涓婁紶澶辫触
-function handleUploadError(err) {
- proxy.$modal.msgError("涓婁紶鏂囦欢澶辫触");
- proxy.$modal.closeLoading();
-}
-// 涓婁紶鎴愬姛鍥炶皟
-function handleUploadSuccess(res, file, uploadFiles) {
- proxy.$modal.closeLoading();
- if (res.code === 200) {
- file.tempId = res.data.tempId;
- form.value.tempFileIds.push(res.data.tempId)
- proxy.$modal.msgSuccess("涓婁紶鎴愬姛");
- } else {
- proxy.$modal.msgError(res.msg);
- proxy.$refs.fileUpload.handleRemove(file);
- }
-}
-// 绉婚櫎鏂囦欢
-function handleRemove(file) {
- if (operationType.value === "edit") {
- let ids = [];
- ids.push(file.id);
- delLedgerFile(ids).then((res) => {
- proxy.$modal.msgSuccess("鍒犻櫎鎴愬姛");
- });
- }
-}
-
-const submitForm = () => {
- proxy.$refs["formRef"].validate(valid => {
- if (valid) {
- if (operationType.value === "add") {
- measuringInstrumentAdd(form.value).then(response => {
- proxy.$modal.msgSuccess("鏂板鎴愬姛")
- form.value.tempFileIds = []
- closeDia()
- })
- } else {
- measuringInstrumentUpdate(form.value).then(response => {
- proxy.$modal.msgSuccess("淇敼鎴愬姛")
- form.value.tempFileIds = []
- closeDia()
- })
- }
- }
- })
-}
-// 鍏抽棴寮规
-const closeDia = () => {
- proxy.resetForm("formRef");
- dialogFormVisible.value = false;
- emit('close')
-};
-// 鑾峰彇褰撳墠鏃ユ湡骞舵牸寮忓寲涓� YYYY-MM-DD
-function getCurrentDate() {
- const today = new Date();
- const year = today.getFullYear();
- const month = String(today.getMonth() + 1).padStart(2, "0"); // 鏈堜唤浠�0寮�濮�
- const day = String(today.getDate()).padStart(2, "0");
- return `${year}-${month}-${day}`;
-}
-defineExpose({
- openDialog,
-});
-</script>
-
-<style scoped>
-
-</style>
\ No newline at end of file
diff --git a/src/views/equipmentManagement/measurementEquipment/filesDia.vue b/src/views/equipmentManagement/measurementEquipment/filesDia.vue
deleted file mode 100644
index f752496..0000000
--- a/src/views/equipmentManagement/measurementEquipment/filesDia.vue
+++ /dev/null
@@ -1,202 +0,0 @@
-<template>
- <div>
- <el-dialog
- v-model="dialogFormVisible"
- title="涓婁紶闄勪欢"
- width="50%"
- @close="closeDia"
- >
- <div style="margin-bottom: 10px;text-align: right">
- <el-upload
- v-model:file-list="fileList"
- class="upload-demo"
- :action="uploadUrl"
- :on-success="handleUploadSuccess"
- :on-error="handleUploadError"
- name="file"
- :show-file-list="false"
- :headers="headers"
- style="display: inline;margin-right: 10px"
- >
- <el-button type="primary">涓婁紶闄勪欢</el-button>
- </el-upload>
- <el-button type="danger" plain @click="handleDelete">鍒犻櫎</el-button>
- </div>
- <PIMTable
- rowKey="id"
- :column="tableColumn"
- :tableData="tableData"
- :tableLoading="tableLoading"
- :isSelection="true"
- @selection-change="handleSelectionChange"
- height="500"
- >
- </PIMTable>
- <pagination
- style="margin: 10px 0"
- v-show="total > 0"
- @pagination="paginationSearch"
- :total="total"
- :page="page.current"
- :limit="page.size"
- />
- <template #footer>
- <div class="dialog-footer">
- <el-button @click="closeDia">鍙栨秷</el-button>
- </div>
- </template>
- </el-dialog>
- <filePreview ref="filePreviewRef" />
- </div>
-</template>
-
-<script setup>
-import {ref} from "vue";
-import {ElMessageBox} from "element-plus";
-import {getToken} from "@/utils/auth.js";
-import filePreview from '@/components/filePreview/index.vue'
-import {
- fileAdd,
- fileDel,
- fileListPage
-} from "@/api/financialManagement/revenueManagement.js";
-import Pagination from "@/components/PIMTable/Pagination.vue";
-const { proxy } = getCurrentInstance()
-const emit = defineEmits(['close'])
-
-const dialogFormVisible = ref(false);
-const currentId = ref('')
-const selectedRows = ref([]);
-const filePreviewRef = ref()
-const tableColumn = ref([
- {
- label: "鏂囦欢鍚嶇О",
- prop: "name",
- },
- {
- dataType: "action",
- label: "鎿嶄綔",
- align: "center",
- operation: [
- {
- name: "涓嬭浇",
- type: "text",
- clickFun: (row) => {
- downLoadFile(row);
- },
- },
- {
- name: "棰勮",
- type: "text",
- clickFun: (row) => {
- lookFile(row);
- },
- }
- ],
- },
-]);
-const page = reactive({
- current: 1,
- size: 100,
-});
-const total = ref(0);
-const tableData = ref([]);
-const fileList = ref([]);
-const tableLoading = ref(false);
-const accountType = ref('')
-const headers = ref({
- Authorization: "Bearer " + getToken(),
-});
-const uploadUrl = ref(import.meta.env.VITE_APP_BASE_API + "/file/upload"); // 涓婁紶鐨勫浘鐗囨湇鍔″櫒鍦板潃
-
-// 鎵撳紑寮规
-const openDialog = (row,type) => {
- accountType.value = type;
- dialogFormVisible.value = true;
- currentId.value = row.id;
- getList()
-}
-const paginationSearch = (obj) => {
- page.current = obj.page;
- page.size = obj.limit;
- getList();
-};
-const getList = () => {
- fileListPage({accountId: currentId.value,accountType:accountType.value, ...page}).then(res => {
- tableData.value = res.data.records;
- total.value = res.data.total;
- })
-}
-// 琛ㄦ牸閫夋嫨鏁版嵁
-const handleSelectionChange = (selection) => {
- selectedRows.value = selection;
-};
-
-// 鍏抽棴寮规
-const closeDia = () => {
- dialogFormVisible.value = false;
- emit('close')
-};
-// 涓婁紶鎴愬姛澶勭悊
-function handleUploadSuccess(res, file) {
- // 濡傛灉涓婁紶鎴愬姛
- if (res.code == 200) {
- const fileRow = {}
- fileRow.name = res.data.originalName
- fileRow.url = res.data.tempPath
- uploadFile(fileRow)
- } else {
- proxy.$modal.msgError("鏂囦欢涓婁紶澶辫触");
- }
-}
-function uploadFile(file) {
- file.accountId = currentId.value;
- file.accountType = accountType.value;
- fileAdd(file).then(res => {
- proxy.$modal.msgSuccess("鏂囦欢涓婁紶鎴愬姛");
- getList()
- })
-}
-// 涓婁紶澶辫触澶勭悊
-function handleUploadError() {
- proxy.$modal.msgError("鏂囦欢涓婁紶澶辫触");
-}
-// 涓嬭浇闄勪欢
-const downLoadFile = (row) => {
- proxy.$download.name(row.url);
-}
-// 鍒犻櫎
-const handleDelete = () => {
- let ids = [];
- if (selectedRows.value.length > 0) {
- ids = selectedRows.value.map((item) => item.id);
- } else {
- proxy.$modal.msgWarning("璇烽�夋嫨鏁版嵁");
- return;
- }
- ElMessageBox.confirm("閫変腑鐨勫唴瀹瑰皢琚垹闄わ紝鏄惁纭鍒犻櫎锛�", "瀵煎嚭", {
- confirmButtonText: "纭",
- cancelButtonText: "鍙栨秷",
- type: "warning",
- }).then(() => {
- fileDel(ids).then((res) => {
- proxy.$modal.msgSuccess("鍒犻櫎鎴愬姛");
- getList();
- });
- }).catch(() => {
- proxy.$modal.msg("宸插彇娑�");
- });
-};
-// 棰勮闄勪欢
-const lookFile = (row) => {
- filePreviewRef.value.open(row.url)
-}
-
-defineExpose({
- openDialog,
-});
-</script>
-
-<style scoped>
-
-</style>
\ No newline at end of file
diff --git a/src/views/equipmentManagement/measurementEquipment/index.vue b/src/views/equipmentManagement/measurementEquipment/index.vue
deleted file mode 100644
index e983a99..0000000
--- a/src/views/equipmentManagement/measurementEquipment/index.vue
+++ /dev/null
@@ -1,276 +0,0 @@
-<template>
- <div class="app-container">
- <div class="search_form">
- <div>
- <span class="search_title">褰曞叆鏃ユ湡锛�</span>
- <el-date-picker
- v-model="searchForm.recordDate"
- value-format="YYYY-MM-DD"
- format="YYYY-MM-DD"
- type="date"
- placeholder="璇烽�夋嫨"
- clearable
- style="width: 160px"
- @change="handleQuery"
- />
- <span class="search_title ml10">璁¢噺鍣ㄥ叿缂栧彿锛�</span>
- <el-input v-model="searchForm.code" placeholder="璇疯緭鍏ョ紪鍙�" clearable style="width: 240px" @change="handleQuery"/>
- <span class="search_title ml10">鐘舵�侊細</span>
- <el-select v-model="searchForm.status" placeholder="璇烽�夋嫨鐘舵��" @change="handleQuery" style="width: 160px" clearable>
- <el-option label="鏈夋晥" :value="1"></el-option>
- <el-option label="閫炬湡" :value="2"></el-option>
- </el-select>
- <el-button type="primary" @click="handleQuery" style="margin-left: 10px"
- >鎼滅储</el-button
- >
- </div>
- <div>
- <el-button type="primary" @click="openForm('add')">鏂板璁¢噺鍣ㄥ叿</el-button>
- <el-button type="danger" plain @click="handleDelete">鍒犻櫎</el-button>
- <el-button @click="handleOut">瀵煎嚭</el-button>
- </div>
- </div>
- <div class="table_list">
- <PIMTable
- rowKey="id"
- :column="tableColumn"
- :tableData="tableData"
- :page="page"
- :isSelection="true"
- @selection-change="handleSelectionChange"
- :tableLoading="tableLoading"
- @pagination="pagination"
- ></PIMTable>
- </div>
- <form-dia ref="formDia" @close="handleQuery"></form-dia>
- <calibration-dia ref="calibrationDia" @close="handleQuery"></calibration-dia>
- <files-dia ref="filesDia"></files-dia>
- </div>
-</template>
-
-<script setup>
-import {onMounted, ref} from "vue";
-import FormDia from "@/views/equipmentManagement/measurementEquipment/components/formDia.vue";
-import {ElMessageBox} from "element-plus";
-import useUserStore from "@/store/modules/user.js";
-import CalibrationDia from "@/views/equipmentManagement/measurementEquipment/components/calibrationDia.vue";
-import {
- measuringInstrumentDelete,
- measuringInstrumentListPage
-} from "@/api/equipmentManagement/measurementEquipment.js";
-import FilesDia from "./filesDia.vue";
-const { proxy } = getCurrentInstance();
-const userStore = useUserStore()
-
-const data = reactive({
- searchForm: {
- recordDate: "",
- code: "",
- status: "",
- },
-});
-const { searchForm } = toRefs(data);
-
-const tableColumn = ref([
- {
- label: "鐘舵��",
- prop: "status",
- dataType: "tag",
- formatData: (params) => {
- if (params == 1) {
- return "鏈夋晥";
- } else if (params == 2) {
- return "閫炬湡";
- } else {
- return null;
- }
- },
- formatType: (params) => {
- if (params == 1) {
- return "success";
- } else if (params == 2) {
- return "danger";
- } else {
- return null;
- }
- },
- },
- {
- label: "鏈�杩戜竴娆℃瀹氭棩鏈�",
- prop: "mostDate",
- width: 130,
- },
- {
- label: "璁¢噺鍣ㄥ叿缂栧彿",
- prop: "code",
- width: 150,
- },
- {
- label: "璁¢噺鍣ㄥ叿鍚嶇О",
- prop: "name",
- width: 200,
- },
- {
- label: "瑙勬牸鍨嬪彿",
- prop: "model",
- width:200
- },
- {
- label: "鏈夋晥鏈�",
- prop: "valid",
- width: 130,
- },
- {
- label: "棰勮涓嬫妫�瀹氭棩鏈�",
- prop: "nextDate",
- width: 130,
- },
- {
- label: "褰曞叆浜�",
- prop: "userName",
- },
- {
- label: "褰曞叆鏃ユ湡",
- prop: "recordDate",
- width: 130,
- },
- {
- dataType: "action",
- label: "鎿嶄綔",
- align: "center",
- width: '130',
- fixed: 'right',
- operation: [
- {
- name: "妫�瀹氭牎鍑�",
- type: "text",
- clickFun: (row) => {
- openCalibrationDia("verifying", row);
- },
- },
- {
- name: "闄勪欢",
- type: "text",
- clickFun: (row) => {
- openFilesFormDia(row);
- },
- },
- ],
- },
-]);
-const tableData = ref([]);
-const tableLoading = ref(false);
-const filesDia = ref()
-const page = reactive({
- current: 1,
- size: 100,
- total: 0,
-});
-const selectedRows = ref([]);
-
-// 鎵撳紑闄勪欢寮规
-const openFilesFormDia = (row) => {
- console.log(row)
- nextTick(() => {
- filesDia.value?.openDialog( row,'璁¢噺鍣ㄥ叿鍙拌处')
- })
-};
-
-// 琛ㄦ牸閫夋嫨鏁版嵁
-const handleSelectionChange = (selection) => {
- selectedRows.value = selection;
-};
-const formDia = ref()
-const calibrationDia = ref()
-
-// 鏌ヨ鍒楄〃
-/** 鎼滅储鎸夐挳鎿嶄綔 */
-const handleQuery = () => {
- page.current = 1;
- getList();
-};
-const pagination = (obj) => {
- page.current = obj.page;
- page.size = obj.limit;
- getList();
-};
-const getList = () => {
- tableLoading.value = true;
- measuringInstrumentListPage({ ...searchForm.value, ...page }).then((res) => {
- tableLoading.value = false;
- tableData.value = res.data.records;
- page.total = res.data.total;
- }).catch((err) => {
- tableLoading.value = false;
- })
-};
-
-// 鎵撳紑寮规
-const openForm = (type, row) => {
- nextTick(() => {
- formDia.value?.openDialog(type, row)
- })
-};
-// 鎵撳紑妫�瀹氭牎鍑嗗脊妗�
-const openCalibrationDia = (type, row) => {
- nextTick(() => {
- calibrationDia.value?.openDialog(type, row)
- })
-}
-
-const handleDelete = () => {
- let ids = [];
- if (selectedRows.value.length > 0) {
- // 妫�鏌ユ槸鍚︽湁浠栦汉缁存姢鐨勬暟鎹�
- const unauthorizedData = selectedRows.value.filter(item => item.userId !== userStore.id);
- if (unauthorizedData.length > 0) {
- proxy.$modal.msgWarning("涓嶅彲鍒犻櫎浠栦汉缁存姢鐨勬暟鎹�");
- return;
- }
- ids = selectedRows.value.map((item) => item.id);
- } else {
- proxy.$modal.msgWarning("璇烽�夋嫨鏁版嵁");
- return;
- }
- ElMessageBox.confirm("閫変腑鐨勫唴瀹瑰皢琚垹闄わ紝鏄惁纭鍒犻櫎锛�", "鍒犻櫎鎻愮ず", {
- confirmButtonText: "纭",
- cancelButtonText: "鍙栨秷",
- type: "warning",
- })
- .then(() => {
- tableLoading.value = true;
- measuringInstrumentDelete(ids)
- .then((res) => {
- proxy.$modal.msgSuccess("鍒犻櫎鎴愬姛");
- getList();
- })
- .finally(() => {
- tableLoading.value = false;
- });
- })
- .catch(() => {
- proxy.$modal.msg("宸插彇娑�");
- });
-};
-// 瀵煎嚭
-const handleOut = () => {
- ElMessageBox.confirm("閫変腑鐨勫唴瀹瑰皢琚鍑猴紝鏄惁纭瀵煎嚭锛�", "瀵煎嚭", {
- confirmButtonText: "纭",
- cancelButtonText: "鍙栨秷",
- type: "warning",
- })
- .then(() => {
- proxy.download("/measuringInstrumentLedger/export", {}, "璁¢噺鍣ㄥ叿鍙拌处.xlsx");
- })
- .catch(() => {
- proxy.$modal.msg("宸插彇娑�");
- });
-};
-onMounted(() => {
- getList();
-});
-</script>
-
-<style scoped>
-
-</style>
\ No newline at end of file
diff --git a/src/views/equipmentManagement/repair/Form/MaintainForm.vue b/src/views/equipmentManagement/repair/Form/MaintainForm.vue
deleted file mode 100644
index bbb25c1..0000000
--- a/src/views/equipmentManagement/repair/Form/MaintainForm.vue
+++ /dev/null
@@ -1,58 +0,0 @@
-<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 HH:mm:ss"
- value-format="YYYY-MM-DD HH:mm:ss"
- type="datetime"
- clearable
- style="width: 100%"
- />
- </el-form-item>
- </el-form>
-</template>
-
-<script setup>
-import useFormData from "@/hooks/useFormData";
-import useUserStore from "@/store/modules/user";
-import dayjs from "dayjs";
-
-defineOptions({
- name: "璁惧缁翠慨琛ㄥ崟",
-});
-
-const userStore = useUserStore();
-const { form, resetForm } = useFormData({
- maintenanceName: undefined, // 缁翠慨鍚嶇О
- maintenanceResult: undefined, // 缁翠慨缁撴灉
- maintenanceTime: undefined, // 缁翠慨鏃ユ湡
-});
-
-const setForm = (data) => {
- form.maintenanceName = data.maintenanceName ?? userStore.nickName;
- form.maintenanceResult = data.maintenanceResult;
- form.maintenanceTime =
- dayjs(data.maintenanceTime).format("YYYY-MM-DD HH:mm:ss") ??
- dayjs().format("YYYY-MM-DD HH:mm:ss");
-};
-
-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
deleted file mode 100644
index 1fadde4..0000000
--- a/src/views/equipmentManagement/repair/Form/RepairForm.vue
+++ /dev/null
@@ -1,113 +0,0 @@
-<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 useUserStore from "@/store/modules/user";
-
-defineOptions({
- name: "璁惧鎶ヤ慨琛ㄥ崟",
-});
-
-const userStore = useUserStore();
-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: userStore.nickName, // 鎶ヤ慨浜�
- 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
deleted file mode 100644
index 309be0e..0000000
--- a/src/views/equipmentManagement/repair/Modal/MaintainModal.vue
+++ /dev/null
@@ -1,58 +0,0 @@
-<template>
- <el-dialog v-model="visible" :title="modalOptions.title" direction="ltr">
- <MaintainForm ref="maintainFormRef" />
- <template #footer>
- <el-button type="primary" @click="sendForm" :loading="loading">
- {{ modalOptions.confirmText }}
- </el-button>
- <el-button @click="closeModal">{{ modalOptions.cancelText }}</el-button>
- </template>
- </el-dialog>
-</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
deleted file mode 100644
index 8441da2..0000000
--- a/src/views/equipmentManagement/repair/Modal/RepairModal.vue
+++ /dev/null
@@ -1,77 +0,0 @@
-<template>
- <el-dialog v-model="visible" :title="modalOptions.title" @close="close">
- <RepairForm ref="repairFormRef" />
- <template #footer>
- <el-button type="primary" @click="sendForm" :loading="loading">
- {{ modalOptions.confirmText }}
- </el-button>
- <el-button @click="closeModal">{{ modalOptions.cancelText }}</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 openAdd = async () => {
- openModal();
- await nextTick();
- await repairFormRef.value.loadDeviceName();
-};
-
-const openEdit = async (id) => {
- const { data } = await getRepairById(id);
- openModal(id);
- await nextTick();
- await repairFormRef.value.loadDeviceName();
- await repairFormRef.value.setForm(data);
-};
-
-const close = () => {
- repairFormRef.value.resetForm();
- closeModal();
-};
-
-defineExpose({
- openAdd,
- openEdit,
-});
-</script>
diff --git a/src/views/equipmentManagement/repair/index.vue b/src/views/equipmentManagement/repair/index.vue
deleted file mode 100644
index 3ef3692..0000000
--- a/src/views/equipmentManagement/repair/index.vue
+++ /dev/null
@@ -1,307 +0,0 @@
-<template>
- <div class="app-container">
- <el-form :model="filters" :inline="true">
- <el-form-item label="璁惧鍚嶇О">
- <el-input
- v-model="filters.deviceName"
- style="width: 240px"
- placeholder="璇疯緭鍏ヨ澶囧悕绉�"
- clearable
- :prefix-icon="Search"
- @change="getTableData"
- />
- </el-form-item>
- <el-form-item label="瑙勬牸鍨嬪彿">
- <el-input
- v-model="filters.deviceModel"
- style="width: 240px"
- placeholder="璇烽�夋嫨瑙勬牸鍨嬪彿"
- clearable
- :prefix-icon="Search"
- @change="getTableData"
- />
- </el-form-item>
- <el-form-item label="鏁呴殰鐜拌薄">
- <el-input
- v-model="filters.remark"
- style="width: 240px"
- placeholder="璇疯緭鍏ユ晠闅滅幇璞�"
- clearable
- :prefix-icon="Search"
- @change="getTableData"
- />
- </el-form-item>
- <el-form-item label="缁翠慨浜�">
- <el-input
- v-model="filters.maintenanceName"
- style="width: 240px"
- placeholder="璇疯緭鍏ョ淮淇汉"
- clearable
- :prefix-icon="Search"
- @change="getTableData"
- />
- </el-form-item>
- <el-form-item label="鎶ヤ慨鏃ユ湡">
- <el-date-picker
- v-model="filters.repairTimeStr"
- type="date"
- placeholder="璇烽�夋嫨鎶ヤ慨鏃ユ湡"
- size="default"
- @change="(date) => handleDateChange(date,2)"
- />
- </el-form-item>
- <el-form-item label="缁翠慨鏃ユ湡">
- <el-date-picker
- v-model="filters.maintenanceTimeStr"
- type="date"
- placeholder="璇烽�夋嫨缁翠慨鏃ユ湡"
- size="default"
- @change="(date) => handleDateChange(date,1)"
- />
- </el-form-item>
- <el-form-item>
- <el-button type="primary" @click="getTableData">鎼滅储</el-button>
- <el-button @click="resetFilters">閲嶇疆</el-button>
- </el-form-item>
- </el-form>
- <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"
- @pagination="changePage"
- >
- <template #statusRef="{ row }">
- <el-tag v-if="row.status === 1" type="success">瀹岀粨</el-tag>
- <el-tag v-if="row.status === 0" type="danger">寰呯淮淇�</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";
-import {Search} from "@element-plus/icons-vue";
-
-defineOptions({
- name: "璁惧鎶ヤ慨",
-});
-
-// 妯℃�佹瀹炰緥
-const repairModalRef = ref();
-const maintainModalRef = ref();
-
-// 琛ㄦ牸澶氶�夋閫変腑椤�
-const multipleList = ref([]);
-
-// 琛ㄦ牸閽╁瓙
-const {
- filters,
- columns,
- dataList,
- pagination,
- getTableData,
- resetFilters,
- onCurrentChange,
-} = usePaginationApi(
- getRepairPage,
- {
- deviceName: undefined,
- deviceModel: undefined,
- remark: undefined,
- maintenanceName: undefined,
- repairTimeStr: undefined,
- maintenanceTimeStr: 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",
- },
- ]
-);
-
-// type === 1 缁翠慨 2鎶ヤ慨闂�
-const handleDateChange = (value,type) => {
- filters.maintenanceTimeStr = null
- filters.c = null
- if(type === 1){
- if (value) {
- filters.maintenanceTimeStr = dayjs(value).format("YYYY-MM-DD");
- }
- }else{
- if (value) {
- filters.repairTimeStr = dayjs(value).format("YYYY-MM-DD");
- }
- }
- getTableData();
-};
-
-// 澶氶�夊悗鍋氫粈涔�
-const handleSelectionChange = (selectionList) => {
- multipleList.value = selectionList;
-};
-
-// 鏂板鎶ヤ慨
-const addRepair = () => {
- repairModalRef.value.openAdd();
-};
-
-// 缂栬緫鎶ヤ慨
-const editRepair = (id) => {
- repairModalRef.value.openEdit(id);
-};
-
-// 鏂板缁翠慨
-const addMaintain = () => {
- const row = multipleList.value[0];
- maintainModalRef.value.open(row.id, row);
-};
-
-const changePage = ({ page, limit }) => {
- pagination.currentPage = page;
- pagination.pageSize = limit;
- onCurrentChange(page);
-};
-
-// 鍗曡鍒犻櫎
-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/equipmentManagement/upkeep/Form/MaintenanceForm.vue b/src/views/equipmentManagement/upkeep/Form/MaintenanceForm.vue
deleted file mode 100644
index bc3db70..0000000
--- a/src/views/equipmentManagement/upkeep/Form/MaintenanceForm.vue
+++ /dev/null
@@ -1,65 +0,0 @@
-<template>
- <el-form :model="form" label-width="100px">
- <el-form-item label="瀹為檯淇濆吇浜�">
- <el-input
- v-model="form.maintenanceActuallyName"
- placeholder="璇疯緭鍏ュ疄闄呬繚鍏讳汉"
- ></el-input>
- </el-form-item>
- <el-form-item label="瀹為檯淇濆吇鏃ユ湡">
- <el-date-picker
- v-model="form.maintenanceActuallyTime"
- 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-select v-model="form.maintenanceResult" placeholder="璇烽�夋嫨淇濆吇缁撴灉">
- <el-option label="瀹屽ソ" :value="1"></el-option>
- <el-option label="缁翠慨" :value="0"></el-option>
- </el-select>
- </el-form-item>
- </el-form>
-</template>
-
-<script setup>
-import useFormData from "@/hooks/useFormData";
-import dayjs from "dayjs";
-import useUserStore from "@/store/modules/user";
-
-defineOptions({
- name: "淇濆吇琛ㄥ崟",
-});
-
-const userStore = useUserStore();
-const { form, resetForm } = useFormData({
- maintenanceActuallyName: undefined, // 瀹為檯淇濆吇浜�
- maintenanceActuallyTime: undefined, // 瀹為檯淇濆吇鏃ユ湡
- maintenanceResult: undefined, // 淇濆吇缁撴灉
-});
-
-const setForm = (data) => {
- form.maintenanceActuallyName =
- data.maintenanceActuallyName ?? userStore.nickName;
- form.maintenanceActuallyTime =
- dayjs(data.maintenanceActuallyTime).format("YYYY-MM-DD HH:mm:ss") ??
- dayjs().format("YYYY-MM-DD HH:mm:ss");
- form.maintenanceResult = data.maintenanceResult;
-};
-
-const getForm = () => {
- return form;
-};
-
-defineExpose({
- getForm,
- setForm,
- resetForm,
-});
-</script>
-
-<style lang="scss" scoped></style>
diff --git a/src/views/equipmentManagement/upkeep/Form/PlanForm.vue b/src/views/equipmentManagement/upkeep/Form/PlanForm.vue
deleted file mode 100644
index 1d94b68..0000000
--- a/src/views/equipmentManagement/upkeep/Form/PlanForm.vue
+++ /dev/null
@@ -1,97 +0,0 @@
-<template>
- <el-form :model="form" label-width="100px">
- <el-form-item label="璁惧鍚嶇О">
- <el-select
- v-model="form.deviceLedgerId"
- @change="setDeviceModel"
- placeholder="璇烽�夋嫨璁惧"
- >
- <el-option
- v-for="(item, index) in deviceOptions"
- :key="index"
- :label="item.deviceName"
- :value="item.id"
- ></el-option>
- </el-select>
- </el-form-item>
- <el-form-item label="瑙勬牸鍨嬪彿">
- <el-input
- v-model="form.deviceModel"
- placeholder="璇疯緭鍏ヨ鏍煎瀷鍙�"
- disabled
- />
- </el-form-item>
- <el-form-item label="璁″垝淇濆吇鏃ユ湡">
- <el-date-picker
- style="width: 100%"
- v-model="form.maintenancePlanTime"
- format="YYYY-MM-DD"
- value-format="YYYY-MM-DD HH:mm:ss"
- type="date"
- placeholder="璇烽�夋嫨璁″垝淇濆吇鏃ユ湡鏃ユ湡"
- clearable
- />
- </el-form-item>
- </el-form>
-</template>
-
-<script setup>
-import useFormData from "@/hooks/useFormData";
-import { getDeviceLedger } from "@/api/equipmentManagement/ledger";
-import { onMounted } from "vue";
-import dayjs from "dayjs";
-
-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, // 瑙勬牸鍨嬪彿
- maintenancePlanTime: undefined, // 璁″垝淇濆吇鏃ユ湡
-});
-
-const setDeviceModel = (id) => {
- const option = deviceOptions.value.find((item) => item.id === id);
- form.deviceModel = option.deviceModel;
-};
-
-const getForm = () => {
- return form;
-};
-
-/**
- * @desc 璁剧疆琛ㄥ崟鍐呭
- * @param data 璁惧淇℃伅
- */
-const setForm = (data) => {
- form.deviceLedgerId = data.deviceLedgerId;
- form.deviceName = data.deviceName;
- form.deviceModel = data.deviceModel;
- form.maintenancePlanTime = dayjs(data.maintenancePlanTime).format(
- "YYYY-MM-DD HH:mm:ss"
- );
-};
-
-const loadForm = () => {};
-
-onMounted(() => {
- loadDeviceName();
-});
-
-defineExpose({
- loadForm,
- resetForm,
- getForm,
- setForm,
-});
-</script>
-
-<style lang="scss" scoped></style>
diff --git a/src/views/equipmentManagement/upkeep/Modal/MaintenanceModal.vue b/src/views/equipmentManagement/upkeep/Modal/MaintenanceModal.vue
deleted file mode 100644
index 1b5a7d4..0000000
--- a/src/views/equipmentManagement/upkeep/Modal/MaintenanceModal.vue
+++ /dev/null
@@ -1,60 +0,0 @@
-<template>
- <el-dialog v-model="visible" :title="modalOptions.title" direction="ltr">
- <MaintenanceForm ref="maintenanceFormRef" />
- <template #footer>
- <el-button type="primary" @click="sendForm" :loading="loading">
- {{ modalOptions.confirmText }}
- </el-button>
- <el-button @click="closeModal">{{ modalOptions.cancelText }}</el-button>
- </template>
- </el-dialog>
-</template>
-
-<script setup>
-import MaintenanceForm from "../Form/MaintenanceForm.vue";
-import { useModal } from "@/hooks/useModal";
-import { addMaintenance } from "@/api/equipmentManagement/upkeep";
-
-defineOptions({
- name: "淇濆吇妯℃�佹",
-});
-
-const maintenanceFormRef = ref();
-const emits = defineEmits(["ok"]);
-
-const {
- id,
- visible,
- loading,
- openModal,
- modalOptions,
- handleConfirm,
- closeModal,
-} = useModal({ title: "璁惧缁翠慨" });
-
-/**
- * @desc 淇濆瓨淇濆吇
- */
-const sendForm = async () => {
- loading.value = true;
- const form = await maintenanceFormRef.value.getForm();
- const { code } = await addMaintenance({ id: id.value, ...form });
- if (code == 200) {
- emits("ok");
- maintenanceFormRef.value.resetForm();
- closeModal();
- }
- loading.value = false;
-};
-
-const open = async (id, row) => {
- openModal(id);
- await nextTick();
- maintenanceFormRef.value.setForm(row);
-};
-defineExpose({
- open,
-});
-</script>
-
-<style lang="scss" scoped></style>
diff --git a/src/views/equipmentManagement/upkeep/Modal/PlanModal.vue b/src/views/equipmentManagement/upkeep/Modal/PlanModal.vue
deleted file mode 100644
index d9cf246..0000000
--- a/src/views/equipmentManagement/upkeep/Modal/PlanModal.vue
+++ /dev/null
@@ -1,76 +0,0 @@
-<template>
- <el-dialog
- v-model="visible"
- :title="modalOptions.title"
- width="30%"
- @close="close"
- >
- <PlanForm ref="planFormRef"></PlanForm>
- <template #footer>
- <el-button type="primary" @click="sendForm" :loading="loading">
- {{ modalOptions.confirmText }}
- </el-button>
- <el-button @click="closeModal">{{ modalOptions.cancelText }}</el-button>
- </template>
- </el-dialog>
-</template>
-
-<script setup>
-import { useModal } from "@/hooks/useModal";
-import PlanForm from "../Form/PlanForm";
-import {
- addUpkeep,
- editUpkeep,
- getUpkeepById,
-} from "@/api/equipmentManagement/upkeep";
-import { ElMessage } from "element-plus";
-
-defineOptions({
- name: "璁惧淇濆吇鏂板璁″垝",
-});
-
-const emits = defineEmits(["ok"]);
-const planFormRef = ref();
-const {
- id,
- visible,
- loading,
- openModal,
- modalOptions,
- handleConfirm,
- closeModal,
-} = useModal({ title: "璁惧淇濆吇璁″垝" });
-
-const openEdit = async (id) => {
- const { data } = await getUpkeepById(id);
- openModal(id);
- await nextTick();
- await planFormRef.value.setForm(data);
-};
-
-const sendForm = async () => {
- loading.value = true;
- const form = await planFormRef.value.getForm();
- const { code } = id.value
- ? await editUpkeep({ id: unref(id), ...form })
- : await addUpkeep(form);
- if (code == 200) {
- ElMessage.success(`${id ? "缂栬緫" : "鏂板"}璁″垝鎴愬姛`);
- closeModal();
- emits("ok");
- }
- loading.value = false;
-};
-
-const close = () => {
- planFormRef.value.resetForm();
- closeModal();
-};
-
-defineExpose({
- openModal,
- openEdit,
-});
-</script>
-
-<style lang="scss" scoped></style>
diff --git a/src/views/equipmentManagement/upkeep/index.vue b/src/views/equipmentManagement/upkeep/index.vue
deleted file mode 100644
index 484538c..0000000
--- a/src/views/equipmentManagement/upkeep/index.vue
+++ /dev/null
@@ -1,294 +0,0 @@
-<template>
- <div class="app-container">
- <el-form :model="filters" :inline="true">
- <el-form-item label="璁惧鍚嶇О">
- <el-input
- v-model="filters.deviceName"
- style="width: 240px"
- placeholder="璇疯緭鍏ヨ澶囧悕绉�"
- clearable
- :prefix-icon="Search"
- @change="getTableData"
- />
- </el-form-item>
- <el-form-item label="璁″垝淇濆吇鏃ユ湡">
- <el-date-picker
- v-model="filters.maintenancePlanTime"
- type="date"
- placeholder="璇烽�夋嫨璁″垝淇濆吇鏃ユ湡"
- size="default"
- @change="(date) => handleDateChange(date,2)"
- />
- </el-form-item>
- <el-form-item label="瀹為檯淇濆吇鏃ユ湡">
- <el-date-picker
- v-model="filters.maintenanceActuallyTime"
- type="date"
- placeholder="璇烽�夋嫨瀹為檯淇濆吇鏃ユ湡"
- size="default"
- @change="(date) => handleDateChange(date,1)"
- />
- </el-form-item>
- <el-form-item label="瀹為檯淇濆吇浜�">
- <el-input
- v-model="filters.maintenanceActuallyName"
- style="width: 240px"
- placeholder="璇疯緭鍏ュ疄闄呬繚鍏讳汉"
- clearable
- :prefix-icon="Search"
- @change="getTableData"
- />
- </el-form-item>
- <el-form-item>
- <el-button type="primary" @click="getTableData">鎼滅储</el-button>
- <el-button @click="resetFilters">閲嶇疆</el-button>
- </el-form-item>
- </el-form>
- <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="addPlan">
- 鏂板璁″垝
- </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"
- @pagination="changePage"
- >
- <template #maintenanceResultRef="{ row }">
- <el-tag v-if="row.maintenanceResult === 1" type="success">
- 瀹屽ソ
- </el-tag>
- <el-tag v-if="row.maintenanceResult === 0" type="danger">
- 缁翠慨
- </el-tag>
- </template>
- <template #statusRef="{ row }">
- <el-tag v-if="row.status === 1" type="success">瀹岀粨</el-tag>
- <el-tag v-if="row.status === 0" type="danger">寰呬繚鍏�</el-tag>
- </template>
- <template #operation="{ row }">
- <el-button
- type="primary"
- text
- icon="editPen"
- @click="editPlan(row.id)"
- >
- 缂栬緫
- </el-button>
- <el-button
- type="danger"
- text
- icon="delete"
- @click="delRepairByIds(row.id)"
- >
- 鍒犻櫎
- </el-button>
- </template>
- </PIMTable>
- </div>
- <PlanModal ref="planModalRef" @ok="getTableData" />
- <MaintenanceModal ref="maintainModalRef" @ok="getTableData" />
- </div>
-</template>
-
-<script setup>
-import { usePaginationApi } from "@/hooks/usePaginationApi";
-import { getUpkeepPage, delUpkeep } from "@/api/equipmentManagement/upkeep";
-import { onMounted } from "vue";
-import PlanModal from "./Modal/PlanModal.vue";
-import MaintenanceModal from "./Modal/MaintenanceModal.vue";
-import dayjs from "dayjs";
-import { ElMessageBox, ElMessage } from "element-plus";
-import {Search} from "@element-plus/icons-vue";
-
-defineOptions({
- name: "璁惧淇濆吇",
-});
-
-// 璁″垝寮圭獥鎺у埗鍣�
-const planModalRef = ref();
-// 淇濆吇寮圭獥鎺у埗鍣�
-const maintainModalRef = ref();
-
-// 琛ㄦ牸澶氶�夋閫変腑椤�
-const multipleList = ref([]);
-
-// 澶氶�夊悗鍋氫粈涔�
-const handleSelectionChange = (selectionList) => {
- multipleList.value = selectionList;
-};
-
-// 琛ㄦ牸閽╁瓙
-const {
- filters,
- columns,
- dataList,
- pagination,
- getTableData,
- resetFilters,
- onCurrentChange,
-} = usePaginationApi(getUpkeepPage, {
- deviceName: undefined,
- maintenancePlanTime: undefined,
- maintenanceActuallyTime: undefined,
- maintenanceActuallyName: undefined,
-}, [
- {
- label: "璁惧鍚嶇О",
- align: "center",
- prop: "deviceName",
- },
- {
- label: "瑙勬牸鍨嬪彿",
- align: "center",
- prop: "deviceModel",
- },
- {
- label: "璁″垝淇濆吇鏃ユ湡",
- align: "center",
- prop: "maintenancePlanTime",
- formatData: (cell) => dayjs(cell).format("YYYY-MM-DD"),
- },
- {
- label: "褰曞叆浜�",
- align: "center",
- prop: "createUserName",
- },
- {
- label: "褰曞叆鏃ユ湡",
- align: "center",
- prop: "createTime",
- formatData: (cell) => dayjs(cell).format("YYYY-MM-DD HH:mm:ss"),
- width: 200,
- },
- {
- label: "瀹為檯淇濆吇浜�",
- align: "center",
- prop: "maintenanceActuallyName",
- },
- {
- label: "瀹為檯淇濆吇鏃ユ湡",
- align: "center",
- prop: "maintenanceActuallyTime",
- formatData: (cell) =>
- cell ? dayjs(cell).format("YYYY-MM-DD HH:mm:ss") : "-",
- },
- {
- label: "淇濆吇缁撴灉",
- align: "center",
- prop: "maintenanceResult",
- dataType: "slot",
- slot: "maintenanceResultRef",
- },
- {
- label: "鐘舵��",
- align: "center",
- prop: "status",
- dataType: "slot",
- slot: "statusRef",
- },
- {
- fixed: "right",
- label: "鎿嶄綔",
- dataType: "slot",
- slot: "operation",
- align: "center",
- width: "200px",
- },
-]);
-// type == 1瀹為檯淇濆吇鏃堕棿 2璁″垝淇濆吇鏃堕棿
-const handleDateChange = (value,type) => {
- filters.maintenanceActuallyTimeReq = null
- filters.maintenancePlanTimeReq = null
- if(type === 1){
- if (value) {
- filters.maintenanceActuallyTimeReq = dayjs(value).format("YYYY-MM-DD");
- }
- }else{
- if (value) {
- filters.maintenancePlanTimeReq = dayjs(value).format("YYYY-MM-DD");
- }
- }
- getTableData();
-};
-
-// 鏂板淇濆吇
-const addMaintain = () => {
- const row = multipleList.value[0];
- maintainModalRef.value.open(row.id, row);
-};
-
-// 鏂板璁″垝
-const addPlan = () => {
- planModalRef.value.openModal();
-};
-
-// 缂栬緫璁″垝
-const editPlan = (id) => {
- planModalRef.value.openEdit(id);
-};
-
-const changePage = ({ page, limit }) => {
- pagination.currentPage = page;
- pagination.pageSize = limit;
- onCurrentChange(page);
-};
-
-// 鍗曡鍒犻櫎
-const delRepairByIds = async (ids) => {
- ElMessageBox.confirm("纭鍒犻櫎鎶ヤ慨鏁版嵁, 姝ゆ搷浣滀笉鍙��?", "璀﹀憡", {
- confirmButtonText: "纭畾",
- cancelButtonText: "鍙栨秷",
- type: "warning",
- }).then(async () => {
- const { code } = await delUpkeep(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/financialManagement/expenseManagement/Form.vue b/src/views/financialManagement/expenseManagement/Form.vue
deleted file mode 100644
index 9cfe5da..0000000
--- a/src/views/financialManagement/expenseManagement/Form.vue
+++ /dev/null
@@ -1,123 +0,0 @@
-<template>
- <el-form :model="form" label-width="100px" :rules="formRules" ref="formRef">
- <el-form-item label="鏀嚭鏃ユ湡" prop="expenseDate">
- <el-date-picker
- style="width: 100%"
- v-model="form.expenseDate"
- format="YYYY-MM-DD"
- value-format="YYYY-MM-DD"
- type="date"
- placeholder="璇烽�夋嫨鏃ユ湡"
- clearable
- />
- </el-form-item>
- <el-form-item label="鏀嚭绫诲瀷" prop="expenseType">
- <el-select
- v-model="form.expenseType"
- placeholder="璇烽�夋嫨"
- clearable
- >
- <el-option :label="item.label" :value="item.value" v-for="(item,index) in expense_types" :key="index" />
- </el-select>
- </el-form-item>
- <el-form-item label="渚涘簲鍟嗗悕绉�" prop="supplierName">
- <el-input v-model="form.supplierName" placeholder="璇疯緭鍏�" />
- </el-form-item>
- <el-form-item label="鏀嚭閲戦" prop="expenseMoney">
- <el-input-number :step="0.01" :min="0" style="width: 100%"
- v-model="form.expenseMoney"
- placeholder="璇疯緭鍏�"
- />
- </el-form-item>
- <el-form-item label="鏀嚭鎻忚堪" prop="expenseDescribed">
- <el-input v-model="form.expenseDescribed" placeholder="璇疯緭鍏�" />
- </el-form-item>
- <el-form-item label="浠樻鏂瑰紡" prop="expenseMethod">
- <el-select
- v-model="form.expenseMethod"
- placeholder="璇烽�夋嫨"
- clearable
- >
- <el-option :label="item.label" :value="item.value" v-for="(item,index) in checkout_payment" :key="index" />
- </el-select>
- </el-form-item>
- <el-form-item label="鍙戠エ鍙风爜" prop="invoiceNumber">
- <el-input v-model="form.invoiceNumber" placeholder="璇疯緭鍏�" />
- </el-form-item>
- <el-form-item label="澶囨敞" prop="note">
- <el-input
- v-model="form.note"
- placeholder="澶囨敞"
- />
- </el-form-item>
-
- </el-form>
-</template>
-
-<script setup>
-import useFormData from "@/hooks/useFormData";
-import { getAccountExpense } from "@/api/financialManagement/expenseManagement";
-import {ref} from "vue";
-const { proxy } = getCurrentInstance();
-
-
-defineOptions({
- name: "鏂板鏀嚭",
-});
-const { expense_types } = proxy.useDict("expense_types");
-const { checkout_payment } = proxy.useDict("checkout_payment");
-const formRef = ref(null);
-const formRules = {
- supplierName: [{ required: true, trigger: "blur", message: "璇疯緭鍏�" }],
- expenseMoney: [{ required: true, trigger: "blur", message: "璇疯緭鍏�" }],
- expenseDescribed: [{ required: true, trigger: "blur", message: "璇疯緭鍏�" }],
- expenseDate: [{ required: true, trigger: "change", message: "璇烽�夋嫨" }],
- expenseType: [{ required: true, trigger: "change", message: "璇烽�夋嫨" }],
- expenseMethod: [{ required: true, trigger: "change", message: "璇烽�夋嫨" }],
-}
-
-const { form, resetForm } = useFormData({
- expenseDate: undefined, // 鏀嚭鏃ユ湡
- expenseType: undefined, // 鏀嚭绫诲瀷
- supplierName: undefined, // 瀹㈡埛鍚嶇О
- expenseMoney: undefined, // 鏀嚭閲戦
- expenseDescribed: undefined, // 鏀嚭鎻忚堪
- expenseMethod: undefined, // 鏀舵鏂瑰紡
- invoiceNumber: undefined, // 鍙戠エ鍙风爜
- note: undefined, // 澶囨敞
-});
-
-const loadForm = async (id) => {
- const { code, data } = await getAccountExpense(id);
- if (code == 200) {
- form.expenseDate = data.expenseDate;
- form.expenseType = data.expenseType;
- form.supplierName = data.supplierName;
- form.expenseMoney = data.expenseMoney;
- form.expenseDescribed = data.expenseDescribed;
- form.expenseMethod = data.expenseMethod;
- form.invoiceNumber = data.invoiceNumber;
- form.note = data.note;
- }
-};
-
-// 娓呴櫎琛ㄥ崟鏍¢獙鐘舵��
-const clearValidate = () => {
- formRef.value?.clearValidate();
-};
-
-// 閲嶇疆琛ㄥ崟鏁版嵁鍜屾牎楠岀姸鎬�
-const resetFormAndValidate = () => {
- resetForm();
- clearValidate();
-};
-
-defineExpose({
- form,
- loadForm,
- resetForm,
- clearValidate,
- resetFormAndValidate,
- formRef,
-});
-</script>
diff --git a/src/views/financialManagement/expenseManagement/Modal.vue b/src/views/financialManagement/expenseManagement/Modal.vue
deleted file mode 100644
index 8e5b171..0000000
--- a/src/views/financialManagement/expenseManagement/Modal.vue
+++ /dev/null
@@ -1,69 +0,0 @@
-<template>
- <el-dialog :title="modalOptions.title" v-model="visible" @close="close" width="30%">
- <Form ref="formRef"></Form>
- <template #footer>
- <el-button type="primary" @click="sendForm" :loading="loading">
- {{ modalOptions.confirmText }}
- </el-button>
- <el-button @click="closeModal">{{ modalOptions.cancelText }}</el-button>
- </template>
- </el-dialog>
-</template>
-
-<script setup>
-import { useModal } from "@/hooks/useModal";
-import { add, update } from "@/api/financialManagement/expenseManagement";
-import Form from "./Form.vue";
-import { ElMessage } from "element-plus";
-const { proxy } = getCurrentInstance()
-
-defineOptions({
- name: "鏀嚭鏂板缂栬緫",
-});
-
-const emits = defineEmits(["success"]);
-
-const formRef = ref();
-const {
- id,
- visible,
- loading,
- openModal,
- modalOptions,
- handleConfirm,
- closeModal,
-} = useModal({ title: "鏀嚭" });
-
-const sendForm = () => {
- proxy.$refs.formRef.$refs.formRef.validate(async valid => {
- if (valid) {
- const {code} = id.value
- ? await update({id: id.value, ...formRef.value.form})
- : await add(formRef.value.form);
- if (code == 200) {
- emits("success");
- ElMessage({message: "鎿嶄綔鎴愬姛", type: "success"});
- close();
- } else {
- loading.value = false;
- }
- }
- })
-};
-
-const close = () => {
- formRef.value.resetFormAndValidate();
- closeModal();
-};
-
-const loadForm = async (id) => {
- openModal(id);
- await nextTick();
- formRef.value.loadForm(id);
-};
-
-defineExpose({
- openModal,
- loadForm,
-});
-</script>
diff --git a/src/views/financialManagement/expenseManagement/index.vue b/src/views/financialManagement/expenseManagement/index.vue
deleted file mode 100644
index b1e9fb1..0000000
--- a/src/views/financialManagement/expenseManagement/index.vue
+++ /dev/null
@@ -1,279 +0,0 @@
-<template>
- <div class="app-container">
- <el-form :model="filters" :inline="true">
- <el-form-item label="鏀嚭鏃ユ湡:">
- <el-date-picker v-model="filters.entryDate" value-format="YYYY-MM-DD" format="YYYY-MM-DD" type="daterange"
- placeholder="璇烽�夋嫨" clearable @change="changeDaterange" />
- </el-form-item>
- <el-form-item label="浠樻鏂瑰紡:">
- <el-select
- v-model="filters.expenseMethod"
- placeholder="璇烽�夋嫨"
- clearable
- style="width: 200px;"
- >
- <el-option
- v-for="item in checkout_payment"
- :key="item.value"
- :label="item.label"
- :value="item.value"
- />
- </el-select>
- </el-form-item>
- <el-form-item>
- <el-button type="primary" @click="getTableData">鎼滅储</el-button>
- <el-button @click="resetFilters">閲嶇疆</el-button>
- </el-form-item>
- </el-form>
- <div class="table_list">
- <div class="actions">
- <div></div>
- <div>
- <el-button type="primary" @click="add" icon="Plus"> 鏂板 </el-button>
- <el-button @click="handleOut" icon="download">瀵煎嚭</el-button>
- <el-button
- type="danger"
- icon="Delete"
- :disabled="multipleList.length <= 0"
- @click="deleteRow(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"
- @pagination="changePage"
- >
- <template #operation="{ row }">
- <el-button type="primary" text @click="edit(row.id)" icon="editPen">
- 缂栬緫
- </el-button>
- <el-button
- type="primary"
- text
- @click="openFilesFormDia(row)"
- >
- 闄勪欢
- </el-button>
- </template>
- </PIMTable>
- </div>
- <Modal ref="modalRef" @success="getTableData"></Modal>
- <files-dia ref="filesDia"></files-dia>
- </div>
-</template>
-
-<script setup>
-import { usePaginationApi } from "@/hooks/usePaginationApi";
-import { listPage, delAccountExpense } from "@/api/financialManagement/expenseManagement";
-import { onMounted, getCurrentInstance } from "vue";
-import Modal from "./Modal.vue";
-import { ElMessageBox, ElMessage } from "element-plus";
-import dayjs from "dayjs";
-import FilesDia from "../revenueManagement/filesDia.vue";
-
-defineOptions({
- name: "鏀嚭绠$悊",
-});
-
-// 琛ㄦ牸澶氶�夋閫変腑椤�
-const multipleList = ref([]);
-const { proxy } = getCurrentInstance();
-const modalRef = ref();
-const { checkout_payment } = proxy.useDict("checkout_payment");
-const { expense_types } = proxy.useDict("expense_types");
-const filesDia = ref()
-
-const {
- filters,
- columns,
- dataList,
- pagination,
- getTableData,
- resetFilters,
- onCurrentChange,
-} = usePaginationApi(
- listPage,
- {
- expenseMethod: undefined,
- },
- [
- {
- label: "鏀嚭鏃ユ湡",
- align: "center",
- prop: "expenseDate",
- },
- {
- label: "鏀嚭绫诲瀷",
- align: "center",
- prop: "expenseType",
- dataType: "tag",
- formatData: (params) => {
- if (expense_types.value.find((m) => m.value == params)) {
- return expense_types.value.find((m) => m.value == params).label;
- } else {
- return null
- }
- },
- },
- {
- label: "渚涘簲鍟嗗悕绉�",
- align: "center",
- prop: "supplierName",
-
- },
- {
- label: "鏀嚭閲戦",
- align: "center",
- prop: "expenseMoney",
-
- },
- {
- label: "鏀嚭鎻忚堪",
- align: "center",
- prop: "expenseDescribed",
-
- },
- {
- label: "浠樻鏂瑰紡",
- align: "center",
- prop: "expenseMethod",
- dataType: "tag",
- formatData: (params) => {
- if (checkout_payment.value.find((m) => m.value == params)) {
- return checkout_payment.value.find((m) => m.value == params).label;
- } else {
- return null
- }
- },
- },
- {
- label: "鍙戠エ鍙风爜",
- align: "center",
- prop: "invoiceNumber",
-
- },
- {
- label: "澶囨敞",
- align: "center",
- prop: "note",
-
- },
- {
- label: "褰曞叆浜�",
- align: "center",
- prop: "inputUser",
- },
- {
- label: "褰曞叆鏃ユ湡",
- align: "center",
- prop: "inputTime",
-
- },
- {
- fixed: "right",
- label: "鎿嶄綔",
- dataType: "slot",
- slot: "operation",
- align: "center",
- width: "200px",
- },
- ]
-);
-
-// 澶氶�夊悗鍋氫粈涔�
-const handleSelectionChange = (selectionList) => {
- multipleList.value = selectionList;
-};
-
-const add = () => {
- modalRef.value.openModal();
-};
-const edit = (id) => {
- modalRef.value.loadForm(id);
-};
-const changePage = ({ page, limit }) => {
- pagination.currentPage = page;
- pagination.pageSize = limit;
- onCurrentChange(page);
-};
-const deleteRow = (id) => {
- ElMessageBox.confirm("姝ゆ搷浣滃皢姘镐箙鍒犻櫎璇ユ暟鎹�, 鏄惁缁х画?", "鎻愮ず", {
- confirmButtonText: "纭畾",
- cancelButtonText: "鍙栨秷",
- type: "warning",
- }).then(async () => {
- const { code } = await delAccountExpense(id);
- if (code == 200) {
- ElMessage({
- type: "success",
- message: "鍒犻櫎鎴愬姛",
- });
- getTableData();
- }
- });
-};
-
-const changeDaterange = (value) => {
- if (value) {
- filters.entryDateStart = dayjs(value[0]).format("YYYY-MM-DD");
- filters.entryDateEnd = dayjs(value[1]).format("YYYY-MM-DD");
- } else {
- filters.entryDateStart = undefined;
- filters.entryDateEnd = undefined;
- }
- getTableData();
-};
-
-const handleOut = () => {
- ElMessageBox.confirm("閫変腑鐨勫唴瀹瑰皢琚鍑猴紝鏄惁纭瀵煎嚭锛�", "瀵煎嚭", {
- confirmButtonText: "纭",
- cancelButtonText: "鍙栨秷",
- type: "warning",
- })
- .then(() => {
- proxy.download(`/account/accountExpense/export`, {}, "鏀嚭鍙拌处.xlsx");
- })
- .catch(() => {
- proxy.$modal.msg("宸插彇娑�");
- });
-};
-// 鎵撳紑闄勪欢寮规
-const openFilesFormDia = (row) => {
- nextTick(() => {
- filesDia.value?.openDialog( row,'鏀嚭')
- })
-};
-
-onMounted(() => {
- filters.entryDate = [
- dayjs().format("YYYY-MM-DD"),
- dayjs().add(1, "day").format("YYYY-MM-DD"),
- ]
- filters.entryDateStart = dayjs().format("YYYY-MM-DD")
- filters.entryDateEnd = dayjs().add(1, "day").format("YYYY-MM-DD")
- 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/financialManagement/financialStatements/index.vue b/src/views/financialManagement/financialStatements/index.vue
deleted file mode 100644
index 430fe6a..0000000
--- a/src/views/financialManagement/financialStatements/index.vue
+++ /dev/null
@@ -1,513 +0,0 @@
-<template>
- <div style="padding: 20px;">
- <!-- 椤甸潰鏍囬鍜屾棩鏈熺瓫閫� -->
- <div class="w-full md:w-auto flex items-center gap-3" style="margin-bottom: 20px;">
- <el-date-picker
- v-model="dateRange"
- type="daterange"
- format="YYYY-MM-DD"
- value-format="YYYY-MM-DD"
- range-separator="鑷�"
- start-placeholder="寮�濮嬫棩鏈�"
- end-placeholder="缁撴潫鏃ユ湡"
- :default-value="[new Date(firstDayOfMonth), new Date()]"
- @change="handleDateChange"
- class="w-full md:w-auto"
- style="margin-right: 30px;"
- />
-
- <el-button
- type="primary"
- icon="Refresh"
- @click="resetDateRange"
- size="default"
- >
- 閲嶇疆
- </el-button>
- </div>
-
- <main class="container mx-auto px-4 pb-10">
- <!-- 璐㈠姟鎸囨爣鍗$墖 -->
- <div class="grid-container">
- <!-- 鎬绘敹鍏� -->
- <el-card class="bg1">
- <p>鎬绘敹鍏�</p>
- <h3>
- 楼{{ pageInfo.totalIncome }}
- </h3>
- </el-card>
-
- <!-- 鏀跺叆绗旀暟 -->
- <el-card class="bg2">
- <p>鏀跺叆绗旀暟</p>
- <h3>
- {{ pageInfo.incomeNumber }}
- </h3>
- </el-card>
-
- <!-- 鎬绘敮鍑� -->
- <el-card class="bg3">
- <p>鎬绘敮鍑�</p>
- <h3>
- 楼{{ pageInfo.totalExpense }}
- </h3>
- </el-card>
-
- <!-- 鏀嚭绗旀暟 -->
- <el-card class="bg4">
- <p>鏀嚭绗旀暟</p>
- <h3>
- {{ pageInfo.expenseNumber }}
- </h3>
- </el-card>
-
- <!-- 鍑�鏀跺叆 -->
- <el-card class="bg5">
- <p>鍑�鏀跺叆</p>
- <h3>
- 楼{{ pageInfo.netRevenue }}
- </h3>
- </el-card>
- </div>
-
- <!-- 鏀跺叆缁熻鍥捐〃 -->
- <div class="grid-layout">
- <el-card style="margin-bottom: 20px;">
- <h2 class="section-title">鏀跺叆缁熻(鍏�)</h2>
- <div class="echarts">
- <Echarts :legend="pieLegend0" :chartStyle="chartStylePie"
- :series="materialPieSeries0"
- :tooltip="pieTooltip" style="height: 260px;width: 35%;">
- <div class="chart-num">
- <span style="font-size: 22px;">鏀跺叆</span>
- <span style="font-size: 36px;
- font-weight: 500;
- font-family: 'MyCustomFont', sans-serif;">{{ pageInfo.totalIncome }}</span>
- </div>
- </Echarts>
- <Echarts ref="chart"
- :chartStyle="chartStyle"
- :grid="grid"
- :legend="lineLegend"
- :series="lineSeries0"
- :tooltip="tooltip"
- :xAxis="xAxis0"
- :yAxis="yAxis0"
- style="height: 260px;width: 64%;"></Echarts>
- </div>
- </el-card>
-
- <!-- 鏀嚭缁熻鍥捐〃 -->
- <el-card>
- <h2 class="section-title">鏀嚭缁熻(鍏�)</h2>
- <div class="echarts">
- <Echarts ref="chart"
- :legend="pieLegend1"
- :chartStyle="chartStylePie"
- :series="materialPieSeries1"
- :tooltip="pieTooltip"
- style="height: 260px;width: 35%;">
- <div class="chart-num">
- <span style="font-size: 22px;">鏀嚭</span>
- <span style="font-size: 36px;
- font-weight: 500;
- font-family: 'MyCustomFont', sans-serif;">{{ pageInfo.totalExpense }}</span>
- </div></Echarts>
- <Echarts ref="chart"
- :chartStyle="chartStyle"
- :grid="grid"
- :legend="lineLegend"
- :series="lineSeries1"
- :tooltip="tooltip"
- :xAxis="xAxis1"
- :yAxis="yAxis1"
- style="height: 260px;width: 64%;"></Echarts>
- </div>
- </el-card>
- </div>
- </main>
- </div>
-</template>
-
-<script setup>
-import { ref, computed, onMounted, reactive } from 'vue';
-import 'element-plus/dist/index.css';
-import Echarts from "@/components/Echarts/echarts.vue";
-import { reportForms,reportIncome,reportExpense } from "@/api/financialManagement/financialStatements";
-import dayjs from "dayjs";
-
-// 鏃ユ湡鑼冨洿
-const dateRange = ref([]);
-const firstDayOfMonth = ref(null);
-const chartStyle = {
- width: '100%',
- height: '100%', // 璁剧疆鍥捐〃瀹瑰櫒鐨勯珮搴�
- position:'relative',
-}
-const grid = {
- left: '3%',
- right: '4%',
- bottom: '3%',
- containLabel: true
-}
-const lineLegend = {
- show: false,
-}
-// 鎶樼嚎鍥炬彁绀烘
-const tooltip = reactive({
- trigger: 'axis',
- axisPointer: {
- type: 'line',
- lineStyle: { color: '#aaa' }
- },
- // 鑷畾涔夊唴瀹�
- formatter: function (params) {
- if (!params || !params.length) return ''
- const axisLabel = params[0].axisValueLabel || params[0].axisValue || ''
- const rows = params
- .map(p => {
- const colorDot = `<span style="display:inline-block;margin-right:6px;width:8px;height:8px;border-radius:50%;background:${p.color}"></span>`
- return `${colorDot}${p.seriesName}: ${p.value}`
- })
- .join('<br/>')
- return `<div>${axisLabel}</div><div>${rows}</div>`
- }
-})
-const months = ['1鏈�','2鏈�','3鏈�','4鏈�','5鏈�','6鏈�','7鏈�','8鏈�','9鏈�','10鏈�','11鏈�','12鏈�'];
-const lineSeries0 = ref([])
-const lineSeries1 = ref([])
-
-const xAxis0 = ref([
- {
- type: 'category',
- axisTick: { show: true, alignWithLabel: true },
- data: months,
- },
-]);
-const xAxis1 = ref([
- {
- type: 'category',
- axisTick: { show: true, alignWithLabel: true },
- data: months,
- },
-]);
-const yAxis0 = [
-{
- type: 'value',
- name: '鏀跺叆缁熻', // 宸︿晶y杞�
- position: 'left',
- min: 0,
- // 鍧愭爣杞村悕绉版牱寮�
- nameTextStyle: {
- color: '#000',
- fontSize: 14,
- },
- }
-]
-
-const yAxis1 = [
-{
- type: 'value',
- name: '鏀嚭缁熻', // 宸︿晶y杞�
- position: 'left',
- min: 0,
- // 鍧愭爣杞村悕绉版牱寮�
- nameTextStyle: {
- color: '#000',
- fontSize: 14,
- },
- }
-]
-
-const chartStylePie = {
- width: '100%',
- height: '100%' // 璁剧疆鍥捐〃瀹瑰櫒鐨勯珮搴�
-}
-const pieColors = ['#F04864','#FACC14', '#8543E0', '#1890FF', '#13C2C2','#2FC25B']; // 鍙牴鎹疄闄呰皟鏁�
-const pieData0 = ref([]);
-const pieData1 = ref([]);
-
-const pieLegend0 = computed(() => ({
- show: true,
- top: 'center',
- left: '60%',
- orient: 'vertical',
- icon: 'circle',
- data: pieData0.value.map(item => item.name),
- formatter: function(name) {
- const item = pieData0.value.find(i => i.name === name);
- if (!item) return name;
- return `${name} | ${item.percent} ${item.amount}`;
- },
- textStyle: {
- color: '#333',
- fontSize: 14,
- lineHeight: 26,
- }
-}));
-const pieLegend1 = computed(() => ({
- show: true,
- top: 'center',
- left: '60%',
- orient: 'vertical',
- icon: 'circle',
- data: pieData1.value.map(item => item.name),
- formatter: function(name) {
- const item = pieData1.value.find(i => i.name === name);
- if (!item) return name;
- return `${name} | ${item.percent} ${item.amount}`;
- },
- textStyle: {
- color: '#333',
- fontSize: 14,
- lineHeight: 26,
- }
-}));
-
-const materialPieSeries0 = computed(() => [
- {
- type: 'pie',
- radius: ['50%', '65%'],
- center: ['25%', '50%'],
- avoidLabelOverlap: false,
- itemStyle: {
- borderColor: '#fff',
- borderWidth: 2
- },
- label: {
- show: false
- },
- data: pieData0.value,
- color: pieColors
- }
-]);
-const materialPieSeries1 = computed(() => [
- {
- type: 'pie',
- radius: ['50%', '65%'],
- center: ['25%', '50%'],
- avoidLabelOverlap: false,
- itemStyle: {
- borderColor: '#fff',
- borderWidth: 2
- },
- label: {
- show: false
- },
- data: pieData1.value,
- color: pieColors
- }
-]);
-const pieTooltip = reactive({
- trigger: 'item',
- formatter: function(params) {
- // 妫�鏌ユ暟鎹槸鍚﹀瓨鍦�
- if (!params.data) return params.name;
- // 鎷兼帴瀹屾暣鍐呭
- return `
- <div>
- <div style="color:${params.color};font-size:16px;">鈼�</div>
- <div>${params.name}</div>
- <div>鍗犳瘮锛�${params.data.percent}</div>
- <div>閲戦锛�${params.data.amount}</div>
- </div>
- `;
- }
-})
-
-
-const pageInfo = ref({
-})
-
-const getData = async () => {
- try {
- const {code,data} = await reportForms({entryDateStart:dateRange.value[0], entryDateEnd:dateRange.value[1]});
- if(code === 200) {
- pageInfo.value = data
- pieData0.value = data.incomeType.map(item=>({
- name:item.typeName,
- value:item.account,
- percent:`${item.proportion*100}%`,
- amount:`楼${item.account}`
- }))
- pieData1.value = data.expenseType.map(item=>({
- name:item.typeName,
- value:item.account,
- percent:`${item.proportion*100}%`,
- amount:`楼${item.account}`
- }))
-
- }
- } catch (error) {
- console.error('鑾峰彇璐㈠姟鎸囨爣鏁版嵁澶辫触锛�', error);
- }
- try{
- const {code,data} = await reportIncome();
- if(code==200){
- lineSeries0.value = data.map(item=>({
- name:item.typeName,
- type: 'line',
- data:item.account.map(item=>Number(item))
- }))
-
- }
- }catch (error) {
- console.error('鑾峰彇璐㈠姟鎸囨爣鏁版嵁澶辫触锛�', error);
- }
- try{
- const {code,data} = await reportExpense();
- if(code==200){
- lineSeries1.value = data.map(item=>({
- name:item.typeName,
- type: 'line',
- data:item.account.map(item=>Number(item))
- }))
-
- }
- }catch (error) {
- console.error('鑾峰彇璐㈠姟鎸囨爣鏁版嵁澶辫触锛�', error);
- }
-};
-
-
-// 鍒濆鍖栨棩鏈熻寖鍥达紙榛樿褰撴湀锛�
-onMounted(() => {
- const today = new Date();
- const firstDay = new Date(today.getFullYear(), today.getMonth(), 1);
- firstDayOfMonth.value = firstDay;
- dateRange.value = [dayjs(firstDay).format("YYYY-MM-DD"), dayjs(today).format("YYYY-MM-DD")];
- getData()
-
-});
-
-// 澶勭悊鏃ユ湡鑼冨洿鍙樺寲
-const handleDateChange = (newRange) => {
- if (newRange && newRange.length === 2) {
- dateRange.value = newRange;
- getData()
- }
-};
-
-// 閲嶇疆鏃ユ湡鑼冨洿
-const resetDateRange = () => {
- const today = new Date();
- const firstDay = new Date(today.getFullYear(), today.getMonth(), 1);
- dateRange.value = [dayjs(firstDay).format("YYYY-MM-DD"), dayjs(today).format("YYYY-MM-DD")];
- getData()
-};
-
-</script>
-
-<style scoped lang="scss">
-/* 鍩虹鏍峰紡琛ュ厖 */
-:root {
- --el-color-primary: #4f46e5;
-}
-.el-card{
- position: relative;
- border-radius: 12px;
- padding: 14px 10px 10px 10px;
- box-shadow: 0 2px 8px #eee;
- :deep(.el-card__body){
- padding: 10px 20px !important;
- }
- &.bg1{
- background: url(@/assets/icons/png/1.png) no-repeat 100% 100% !important;
- }
- &.bg2{
- background: url(@/assets/icons/png/2.png) no-repeat 100% 100% !important;
- }
- &.bg3{
- background: url(@/assets/icons/png/3.png) no-repeat 100% 100% !important;
- }
- &.bg4{
- background: url(@/assets/icons/png/4.png) no-repeat 100% 100% !important;
- }
- &.bg5{
- background: url(@/assets/icons/png/5.png) no-repeat 100% 100% !important;
- }
-}
-
-.grid-container {
- /* grid 瀹瑰櫒鍩虹鏍峰紡 */
- display: grid;
- gap: 1rem; /* gap-4 瀵瑰簲 1rem (16px) */
- margin-bottom: 2rem; /* mb-8 瀵瑰簲 2rem (32px) */
-
- p{
- font-size: 22px;
- margin-top: 0px;
- color: #fff;
- }
- h3{
- font-size: 36px;
- font-weight: 500;
- font-family: 'MyCustomFont', sans-serif;
- margin: 10px 0;
- color: #fff;
- }
-
-}
-
-/* 绉诲姩绔粯璁ゆ牱寮� (grid-cols-1) */
-.grid-container {
- grid-template-columns: repeat(1, minmax(0, 1fr));
-}
-
-/* 灏忓睆骞曞強浠ヤ笂 (sm:grid-cols-2) */
-@media (min-width: 640px) {
- .grid-container {
- grid-template-columns: repeat(2, minmax(0, 1fr));
- }
-}
-
-/* 澶у睆骞曞強浠ヤ笂 (lg:grid-cols-5) */
-@media (min-width: 1024px) {
- .grid-container {
- grid-template-columns: repeat(5, minmax(0, 1fr));
- }
-}
-
-/* 鍗$墖鎮仠鏁堟灉澧炲己 */
-.el-card:hover {
- transform: translateY(-2px);
-}
-.echarts{
- display: flex;
- justify-content: space-between;
-}
-
-/* 鍥捐〃瀹瑰櫒鏍峰紡 */
-.el-chart {
- width: 100%;
- height: 100%;
-}
-.section-title {
- position: relative;
- font-size: 18px;
- color: #333;
- padding-left: 10px;
- margin-bottom: 10px;
- font-weight: 700;
-}
-
-.section-title::before {
- position: absolute;
- left: 0;
- top: 0px;
- content: '';
- width: 4px;
- height: 18px;
- background-color: #002FA7;
- border-radius: 2px;
-}
-.chart-num{
- position: absolute;
- z-index: 3;
- top: 92px;
- left: 92px;
- display: flex;
- flex-direction: column;
- justify-content: center;
-}
-</style>
diff --git a/src/views/financialManagement/revenueManagement/Form.vue b/src/views/financialManagement/revenueManagement/Form.vue
deleted file mode 100644
index 67b175e..0000000
--- a/src/views/financialManagement/revenueManagement/Form.vue
+++ /dev/null
@@ -1,123 +0,0 @@
-<template>
- <el-form :model="form" label-width="100px" :rules="formRules" ref="formRef">
- <el-form-item label="鏀跺叆鏃ユ湡" prop="incomeDate">
- <el-date-picker
- style="width: 100%"
- v-model="form.incomeDate"
- format="YYYY-MM-DD"
- value-format="YYYY-MM-DD"
- type="date"
- placeholder="璇烽�夋嫨鏃ユ湡"
- clearable
- />
- </el-form-item>
- <el-form-item label="鏀跺叆绫诲瀷" prop="incomeType">
- <el-select
- v-model="form.incomeType"
- placeholder="璇烽�夋嫨"
- clearable
- >
- <el-option :label="item.label" :value="item.value" v-for="(item,index) in income_types" :key="index" />
- </el-select>
- </el-form-item>
- <el-form-item label="瀹㈡埛鍚嶇О" prop="customerName">
- <el-input v-model="form.customerName" placeholder="璇疯緭鍏�" />
- </el-form-item>
- <el-form-item label="鏀跺叆閲戦" prop="incomeMoney">
- <el-input-number :step="0.01" :min="0" style="width: 100%"
- v-model="form.incomeMoney"
- placeholder="璇疯緭鍏�"
- />
- </el-form-item>
- <el-form-item label="鏀跺叆鎻忚堪" prop="incomeDescribed">
- <el-input v-model="form.incomeDescribed" placeholder="璇疯緭鍏�" />
- </el-form-item>
- <el-form-item label="鏀舵鏂瑰紡" prop="incomeMethod">
- <el-select
- v-model="form.incomeMethod"
- placeholder="璇烽�夋嫨"
- clearable
- >
- <el-option :label="item.label" :value="item.value" v-for="(item,index) in payment_methods" :key="index" />
- </el-select>
- </el-form-item>
- <el-form-item label="鍙戠エ鍙风爜" prop="invoiceNumber">
- <el-input v-model="form.invoiceNumber" placeholder="璇疯緭鍏�" />
- </el-form-item>
- <el-form-item label="澶囨敞" prop="note">
- <el-input
- v-model="form.note"
- placeholder="澶囨敞"
- />
- </el-form-item>
-
- </el-form>
-</template>
-
-<script setup>
-import useFormData from "@/hooks/useFormData";
-import { getAccountIncome } from "@/api/financialManagement/revenueManagement";
-import {ref} from "vue";
-const { proxy } = getCurrentInstance();
-
-
-defineOptions({
- name: "鏂板鏀跺叆",
-});
-const { income_types } = proxy.useDict("income_types");
-const { payment_methods } = proxy.useDict("payment_methods");
-const formRef = ref(null);
-const formRules = {
- customerName: [{ required: true, trigger: "blur", message: "璇疯緭鍏�" }],
- incomeMoney: [{ required: true, trigger: "blur", message: "璇疯緭鍏�" }],
- incomeDescribed: [{ required: true, trigger: "blur", message: "璇疯緭鍏�" }],
- incomeDate: [{ required: true, trigger: "change", message: "璇烽�夋嫨" }],
- incomeType: [{ required: true, trigger: "change", message: "璇烽�夋嫨" }],
- incomeMethod: [{ required: true, trigger: "change", message: "璇烽�夋嫨" }],
-}
-
-const { form, resetForm } = useFormData({
- incomeDate: undefined, // 鏀跺叆鏃ユ湡
- incomeType: undefined, // 鏀跺叆绫诲瀷
- customerName: undefined, // 瀹㈡埛鍚嶇О
- incomeMoney: undefined, // 鏀跺叆閲戦
- incomeDescribed: undefined, // 鏀跺叆鎻忚堪
- incomeMethod: undefined, // 鏀舵鏂瑰紡
- invoiceNumber: undefined, // 鍙戠エ鍙风爜
- note: undefined, // 澶囨敞
-});
-
-const loadForm = async (id) => {
- const { code, data } = await getAccountIncome(id);
- if (code == 200) {
- form.incomeDate = data.incomeDate;
- form.incomeType = data.incomeType;
- form.customerName = data.customerName;
- form.incomeMoney = data.incomeMoney;
- form.incomeDescribed = data.incomeDescribed;
- form.incomeMethod = data.incomeMethod;
- form.invoiceNumber = data.invoiceNumber;
- form.note = data.note;
- }
-};
-
-// 娓呴櫎琛ㄥ崟鏍¢獙鐘舵��
-const clearValidate = () => {
- formRef.value?.clearValidate();
-};
-
-// 閲嶇疆琛ㄥ崟鏁版嵁鍜屾牎楠岀姸鎬�
-const resetFormAndValidate = () => {
- resetForm();
- clearValidate();
-};
-
-defineExpose({
- form,
- loadForm,
- resetForm,
- clearValidate,
- resetFormAndValidate,
- formRef,
-});
-</script>
diff --git a/src/views/financialManagement/revenueManagement/Modal.vue b/src/views/financialManagement/revenueManagement/Modal.vue
deleted file mode 100644
index 480b4fd..0000000
--- a/src/views/financialManagement/revenueManagement/Modal.vue
+++ /dev/null
@@ -1,69 +0,0 @@
-<template>
- <el-dialog :title="modalOptions.title" v-model="visible" @close="close" width="30%">
- <Form ref="formRef"></Form>
- <template #footer>
- <el-button type="primary" @click="sendForm" :loading="loading">
- {{ modalOptions.confirmText }}
- </el-button>
- <el-button @click="closeModal">{{ modalOptions.cancelText }}</el-button>
- </template>
- </el-dialog>
-</template>
-
-<script setup>
-import { useModal } from "@/hooks/useModal";
-import { add, update } from "@/api/financialManagement/revenueManagement";
-import Form from "./Form.vue";
-import { ElMessage } from "element-plus";
-const { proxy } = getCurrentInstance()
-
-defineOptions({
- name: "鏀跺叆鏂板缂栬緫",
-});
-
-const emits = defineEmits(["success"]);
-
-const formRef = ref();
-const {
- id,
- visible,
- loading,
- openModal,
- modalOptions,
- handleConfirm,
- closeModal,
-} = useModal({ title: "鏀跺叆" });
-
-const sendForm = () => {
- proxy.$refs.formRef.$refs.formRef.validate(async valid => {
- if (valid) {
- const {code} = id.value
- ? await update({id: id.value, ...formRef.value.form})
- : await add(formRef.value.form);
- if (code == 200) {
- emits("success");
- ElMessage({message: "鎿嶄綔鎴愬姛", type: "success"});
- close();
- } else {
- loading.value = false;
- }
- }
- })
-};
-
-const close = () => {
- formRef.value.resetFormAndValidate();
- closeModal();
-};
-
-const loadForm = async (id) => {
- openModal(id);
- await nextTick();
- formRef.value.loadForm(id);
-};
-
-defineExpose({
- openModal,
- loadForm,
-});
-</script>
diff --git a/src/views/financialManagement/revenueManagement/filesDia.vue b/src/views/financialManagement/revenueManagement/filesDia.vue
deleted file mode 100644
index f752496..0000000
--- a/src/views/financialManagement/revenueManagement/filesDia.vue
+++ /dev/null
@@ -1,202 +0,0 @@
-<template>
- <div>
- <el-dialog
- v-model="dialogFormVisible"
- title="涓婁紶闄勪欢"
- width="50%"
- @close="closeDia"
- >
- <div style="margin-bottom: 10px;text-align: right">
- <el-upload
- v-model:file-list="fileList"
- class="upload-demo"
- :action="uploadUrl"
- :on-success="handleUploadSuccess"
- :on-error="handleUploadError"
- name="file"
- :show-file-list="false"
- :headers="headers"
- style="display: inline;margin-right: 10px"
- >
- <el-button type="primary">涓婁紶闄勪欢</el-button>
- </el-upload>
- <el-button type="danger" plain @click="handleDelete">鍒犻櫎</el-button>
- </div>
- <PIMTable
- rowKey="id"
- :column="tableColumn"
- :tableData="tableData"
- :tableLoading="tableLoading"
- :isSelection="true"
- @selection-change="handleSelectionChange"
- height="500"
- >
- </PIMTable>
- <pagination
- style="margin: 10px 0"
- v-show="total > 0"
- @pagination="paginationSearch"
- :total="total"
- :page="page.current"
- :limit="page.size"
- />
- <template #footer>
- <div class="dialog-footer">
- <el-button @click="closeDia">鍙栨秷</el-button>
- </div>
- </template>
- </el-dialog>
- <filePreview ref="filePreviewRef" />
- </div>
-</template>
-
-<script setup>
-import {ref} from "vue";
-import {ElMessageBox} from "element-plus";
-import {getToken} from "@/utils/auth.js";
-import filePreview from '@/components/filePreview/index.vue'
-import {
- fileAdd,
- fileDel,
- fileListPage
-} from "@/api/financialManagement/revenueManagement.js";
-import Pagination from "@/components/PIMTable/Pagination.vue";
-const { proxy } = getCurrentInstance()
-const emit = defineEmits(['close'])
-
-const dialogFormVisible = ref(false);
-const currentId = ref('')
-const selectedRows = ref([]);
-const filePreviewRef = ref()
-const tableColumn = ref([
- {
- label: "鏂囦欢鍚嶇О",
- prop: "name",
- },
- {
- dataType: "action",
- label: "鎿嶄綔",
- align: "center",
- operation: [
- {
- name: "涓嬭浇",
- type: "text",
- clickFun: (row) => {
- downLoadFile(row);
- },
- },
- {
- name: "棰勮",
- type: "text",
- clickFun: (row) => {
- lookFile(row);
- },
- }
- ],
- },
-]);
-const page = reactive({
- current: 1,
- size: 100,
-});
-const total = ref(0);
-const tableData = ref([]);
-const fileList = ref([]);
-const tableLoading = ref(false);
-const accountType = ref('')
-const headers = ref({
- Authorization: "Bearer " + getToken(),
-});
-const uploadUrl = ref(import.meta.env.VITE_APP_BASE_API + "/file/upload"); // 涓婁紶鐨勫浘鐗囨湇鍔″櫒鍦板潃
-
-// 鎵撳紑寮规
-const openDialog = (row,type) => {
- accountType.value = type;
- dialogFormVisible.value = true;
- currentId.value = row.id;
- getList()
-}
-const paginationSearch = (obj) => {
- page.current = obj.page;
- page.size = obj.limit;
- getList();
-};
-const getList = () => {
- fileListPage({accountId: currentId.value,accountType:accountType.value, ...page}).then(res => {
- tableData.value = res.data.records;
- total.value = res.data.total;
- })
-}
-// 琛ㄦ牸閫夋嫨鏁版嵁
-const handleSelectionChange = (selection) => {
- selectedRows.value = selection;
-};
-
-// 鍏抽棴寮规
-const closeDia = () => {
- dialogFormVisible.value = false;
- emit('close')
-};
-// 涓婁紶鎴愬姛澶勭悊
-function handleUploadSuccess(res, file) {
- // 濡傛灉涓婁紶鎴愬姛
- if (res.code == 200) {
- const fileRow = {}
- fileRow.name = res.data.originalName
- fileRow.url = res.data.tempPath
- uploadFile(fileRow)
- } else {
- proxy.$modal.msgError("鏂囦欢涓婁紶澶辫触");
- }
-}
-function uploadFile(file) {
- file.accountId = currentId.value;
- file.accountType = accountType.value;
- fileAdd(file).then(res => {
- proxy.$modal.msgSuccess("鏂囦欢涓婁紶鎴愬姛");
- getList()
- })
-}
-// 涓婁紶澶辫触澶勭悊
-function handleUploadError() {
- proxy.$modal.msgError("鏂囦欢涓婁紶澶辫触");
-}
-// 涓嬭浇闄勪欢
-const downLoadFile = (row) => {
- proxy.$download.name(row.url);
-}
-// 鍒犻櫎
-const handleDelete = () => {
- let ids = [];
- if (selectedRows.value.length > 0) {
- ids = selectedRows.value.map((item) => item.id);
- } else {
- proxy.$modal.msgWarning("璇烽�夋嫨鏁版嵁");
- return;
- }
- ElMessageBox.confirm("閫変腑鐨勫唴瀹瑰皢琚垹闄わ紝鏄惁纭鍒犻櫎锛�", "瀵煎嚭", {
- confirmButtonText: "纭",
- cancelButtonText: "鍙栨秷",
- type: "warning",
- }).then(() => {
- fileDel(ids).then((res) => {
- proxy.$modal.msgSuccess("鍒犻櫎鎴愬姛");
- getList();
- });
- }).catch(() => {
- proxy.$modal.msg("宸插彇娑�");
- });
-};
-// 棰勮闄勪欢
-const lookFile = (row) => {
- filePreviewRef.value.open(row.url)
-}
-
-defineExpose({
- openDialog,
-});
-</script>
-
-<style scoped>
-
-</style>
\ No newline at end of file
diff --git a/src/views/financialManagement/revenueManagement/index.vue b/src/views/financialManagement/revenueManagement/index.vue
deleted file mode 100644
index 285b73f..0000000
--- a/src/views/financialManagement/revenueManagement/index.vue
+++ /dev/null
@@ -1,279 +0,0 @@
-<template>
- <div class="app-container">
- <el-form :model="filters" :inline="true">
- <el-form-item label="鏀跺叆鏃ユ湡:">
- <el-date-picker v-model="filters.entryDate" value-format="YYYY-MM-DD" format="YYYY-MM-DD" type="daterange"
- placeholder="璇烽�夋嫨" clearable @change="changeDaterange" />
- </el-form-item>
- <el-form-item label="鏀舵鏂瑰紡:">
- <el-select
- v-model="filters.incomeMethod"
- placeholder="璇烽�夋嫨"
- clearable
- style="width: 200px;"
- >
- <el-option
- v-for="item in payment_methods"
- :key="item.value"
- :label="item.label"
- :value="item.value"
- />
- </el-select>
- </el-form-item>
- <el-form-item>
- <el-button type="primary" @click="getTableData">鎼滅储</el-button>
- <el-button @click="resetFilters">閲嶇疆</el-button>
- </el-form-item>
- </el-form>
- <div class="table_list">
- <div class="actions">
- <div></div>
- <div>
- <el-button type="primary" @click="add" icon="Plus"> 鏂板 </el-button>
- <el-button @click="handleOut" icon="download">瀵煎嚭</el-button>
- <el-button
- type="danger"
- icon="Delete"
- :disabled="multipleList.length <= 0"
- @click="deleteRow(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"
- @pagination="changePage"
- >
- <template #operation="{ row }">
- <el-button type="primary" text @click="edit(row.id)" icon="editPen">
- 缂栬緫
- </el-button>
- <el-button
- type="primary"
- text
- @click="openFilesFormDia(row)"
- >
- 闄勪欢
- </el-button>
- </template>
- </PIMTable>
- </div>
- <Modal ref="modalRef" @success="getTableData"></Modal>
- <files-dia ref="filesDia"></files-dia>
- </div>
-</template>
-
-<script setup>
-import { usePaginationApi } from "@/hooks/usePaginationApi";
-import { listPage, delAccountIncome } from "@/api/financialManagement/revenueManagement";
-import { onMounted, getCurrentInstance } from "vue";
-import Modal from "./Modal.vue";
-import { ElMessageBox, ElMessage } from "element-plus";
-import dayjs from "dayjs";
-import FilesDia from "./filesDia.vue";
-
-defineOptions({
- name: "鏀跺叆绠$悊",
-});
-
-// 琛ㄦ牸澶氶�夋閫変腑椤�
-const multipleList = ref([]);
-const { proxy } = getCurrentInstance();
-const modalRef = ref();
-const { payment_methods } = proxy.useDict("payment_methods");
-const { income_types } = proxy.useDict("income_types");
-const filesDia = ref()
-
-const {
- filters,
- columns,
- dataList,
- pagination,
- getTableData,
- resetFilters,
- onCurrentChange,
-} = usePaginationApi(
- listPage,
- {
- incomeMethod: undefined,
- },
- [
- {
- label: "鏀跺叆鏃ユ湡",
- align: "center",
- prop: "incomeDate",
- },
- {
- label: "鏀跺叆绫诲瀷",
- align: "center",
- prop: "incomeType",
- dataType: "tag",
- formatData: (params) => {
- if (income_types.value.find((m) => m.value == params)) {
- return income_types.value.find((m) => m.value == params).label;
- } else {
- return null
- }
- },
- },
- {
- label: "瀹㈡埛鍚嶇О",
- align: "center",
- prop: "customerName",
-
- },
- {
- label: "鏀跺叆閲戦",
- align: "center",
- prop: "incomeMoney",
-
- },
- {
- label: "鏀跺叆鎻忚堪",
- align: "center",
- prop: "incomeDescribed",
-
- },
- {
- label: "鏀舵鏂瑰紡",
- align: "center",
- prop: "incomeMethod",
- dataType: "tag",
- formatData: (params) => {
- if (payment_methods.value.find((m) => m.value == params)) {
- return payment_methods.value.find((m) => m.value == params).label;
- } else {
- return null
- }
- },
- },
- {
- label: "鍙戠エ鍙风爜",
- align: "center",
- prop: "invoiceNumber",
-
- },
- {
- label: "澶囨敞",
- align: "center",
- prop: "note",
-
- },
- {
- label: "褰曞叆浜�",
- align: "center",
- prop: "inputUser",
- },
- {
- label: "褰曞叆鏃ユ湡",
- align: "center",
- prop: "inputTime",
-
- },
- {
- fixed: "right",
- label: "鎿嶄綔",
- dataType: "slot",
- slot: "operation",
- align: "center",
- width: "200px",
- },
- ]
-);
-
-// 澶氶�夊悗鍋氫粈涔�
-const handleSelectionChange = (selectionList) => {
- multipleList.value = selectionList;
-};
-
-const add = () => {
- modalRef.value.openModal();
-};
-const edit = (id) => {
- modalRef.value.loadForm(id);
-};
-const changePage = ({ page, limit }) => {
- pagination.currentPage = page;
- pagination.pageSize = limit;
- onCurrentChange(page);
-};
-const deleteRow = (id) => {
- ElMessageBox.confirm("姝ゆ搷浣滃皢姘镐箙鍒犻櫎璇ユ暟鎹�, 鏄惁缁х画?", "鎻愮ず", {
- confirmButtonText: "纭畾",
- cancelButtonText: "鍙栨秷",
- type: "warning",
- }).then(async () => {
- const { code } = await delAccountIncome(id);
- if (code == 200) {
- ElMessage({
- type: "success",
- message: "鍒犻櫎鎴愬姛",
- });
- getTableData();
- }
- });
-};
-
-const changeDaterange = (value) => {
- if (value) {
- filters.entryDateStart = dayjs(value[0]).format("YYYY-MM-DD");
- filters.entryDateEnd = dayjs(value[1]).format("YYYY-MM-DD");
- } else {
- filters.entryDateStart = undefined;
- filters.entryDateEnd = undefined;
- }
- getTableData();
-};
-
-const handleOut = () => {
- ElMessageBox.confirm("閫変腑鐨勫唴瀹瑰皢琚鍑猴紝鏄惁纭瀵煎嚭锛�", "瀵煎嚭", {
- confirmButtonText: "纭",
- cancelButtonText: "鍙栨秷",
- type: "warning",
- })
- .then(() => {
- proxy.download(`/account/accountIncome/export`, {}, "鏀跺叆鍙拌处.xlsx");
- })
- .catch(() => {
- proxy.$modal.msg("宸插彇娑�");
- });
-};
-// 鎵撳紑闄勪欢寮规
-const openFilesFormDia = (row) => {
- nextTick(() => {
- filesDia.value?.openDialog( row,'鏀跺叆')
- })
-};
-
-onMounted(() => {
- filters.entryDate = [
- dayjs().format("YYYY-MM-DD"),
- dayjs().add(1, "day").format("YYYY-MM-DD"),
- ]
- filters.entryDateStart = dayjs().format("YYYY-MM-DD")
- filters.entryDateEnd = dayjs().add(1, "day").format("YYYY-MM-DD")
- 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/index.vue b/src/views/index.vue
index 67c8654..afd379b 100644
--- a/src/views/index.vue
+++ b/src/views/index.vue
@@ -2,82 +2,58 @@
<div class="dashboard">
<!-- 椤堕儴妯悜涓ゆ爮 -->
<div class="dashboard-top">
- <!-- 宸︼細浼佷笟淇℃伅+涓夊ぇ鏁版嵁鍗$墖锛堜笂涓嬫帓鍒楋級 -->
+ <!-- 宸︼細绯荤粺姒傝+鏁版嵁鍗$墖 -->
<div class="top-left">
- <div class="company-info">
- <div class="section-title">鐧婚檰淇℃伅</div>
+ <div class="system-info">
+ <div class="section-title">宸ヨ壓鎶ヨ浼樺寲绠$悊绯荤粺</div>
<div style="display: flex;align-items: center;gap: 20px">
- <img :src="userStore.avatar" class="avatar" alt=""/>
- <div class="company-card">
- <div class="company-name">{{userStore.name}}</div>
- <div class="company-meta">{{userStore.roleName}}</div>
+ <div class="system-card">
+ <div class="system-name">宸ヨ壓鎶ヨ浼樺寲绠$悊绯荤粺</div>
+ <div class="system-meta">瀹炴椂鐩戞帶 路 鏅鸿兘鍒嗘瀽 路 楂樻晥澶勭悊</div>
</div>
<div style="display: flex;align-items: center;gap: 8px">
<el-icon color="#5053B5" size="22"><Clock /></el-icon>
- <span>鐧婚檰鏃ユ湡锛歿{userStore.currentLoginTime}}</span>
+ <span>褰撳墠鏃堕棿锛歿{ currentTime }}</span>
</div>
</div>
</div>
<div class="data-cards">
- <div class="data-card sales">
- <div class="data-title">閿�鍞暟鎹�</div>
- <div class="data-num">
- <div>
- <div class="data-desc">鏈湀閿�鍞/鍏�</div>
- <div class="data-value">{{businessInfo.monthSaleMoney}}</div>
- </div>
- <div>
- <div class="data-desc">鏈紑绁ㄩ噾棰�/鍏�</div>
- <div class="data-value">{{businessInfo.monthSaleHaveMoney}}</div>
- </div>
- </div>
-
+ <div class="data-card total">
+ <div class="data-title">鎬绘姤璀︽暟</div>
+ <div class="data-value">{{ alarmStats.total }}</div>
+ <div class="data-desc">宸插鐞� {{ alarmStats.handled }} | 鏈鐞� {{ alarmStats.pending }}</div>
</div>
- <div class="data-card purchase">
- <div class="data-title">閲囪喘鏁版嵁</div>
- <div class="data-num">
- <div>
- <div class="data-desc">鏈湀閲囪喘棰�/鍏�</div>
- <div class="data-value">{{businessInfo.monthPurchaseMoney}}</div>
- </div>
- <div>
- <div class="data-desc">寰呬粯娆鹃噾棰�/鍏�</div>
- <div class="data-value">{{businessInfo.monthPurchaseHaveMoney}}</div>
- </div>
- </div>
+ <div class="data-card pending">
+ <div class="data-title">鏈鐞嗘姤璀�</div>
+ <div class="data-value">{{ alarmStats.pending }}</div>
+ <div class="data-desc">涓ラ噸 {{ alarmStats.severePending }} | 涓瓑 {{ alarmStats.moderatePending }} | 杞诲井 {{ alarmStats.minorPending }}</div>
</div>
- <div class="data-card inventory">
- <div class="data-title">搴撳瓨鏁版嵁</div>
- <div class="data-num">
- <div>
- <div class="data-desc">褰撳墠搴撳瓨鎬婚噺/浠�</div>
- <div class="data-value">{{businessInfo.inventoryNum}}</div>
- </div>
- <div>
- <div class="data-desc">浠婃棩鍏ュ簱/浠�</div>
- <div class="data-value">{{businessInfo.todayInventoryNum}}</div>
- </div>
- </div>
+ <div class="data-card today">
+ <div class="data-title">浠婃棩鎶ヨ</div>
+ <div class="data-value">{{ alarmStats.today }}</div>
+ <div class="data-desc">鍚屾瘮 {{ alarmStats.today鍚屾瘮 }}% | 鐜瘮 {{ alarmStats.today鐜瘮 }}%</div>
</div>
</div>
</div>
- <!-- 鍙筹細寰呭姙浜嬮」 -->
- <div class="todo-panel">
- <div class="section-title">寰呭姙浜嬮」</div>
- <ul class="todo-list" v-if="todoList.length > 0">
- <li v-for="item in todoList" :key="item.id">
- <div style="display: flex;flex-direction: column;justify-content: space-between;width: 100%;gap: 20px">
+ <!-- 鍙筹細寰呭鐞嗘姤璀﹀垪琛� -->
+ <div class="alarm-panel">
+ <div class="section-title">寰呭鐞嗘姤璀�</div>
+ <ul class="alarm-list" v-if="pendingAlarms.length > 0">
+ <li v-for="item in pendingAlarms" :key="item.id">
+ <div style="display: flex;flex-direction: column;justify-content: space-between;width: 100%;gap: 10px">
<div style="display: flex;justify-content: space-between;align-items: center;">
- <div class="todo-title">娴佺▼缂栧彿锛歿{item.approveId}}</div>
- <div class="todo-division">鐢宠閮ㄩ棬锛歿{item.approveDeptName}}</div>
- <div class="todo-time">{{item.approveTime}}</div>
+ <div class="alarm-title">{{ item.equipmentName }} - {{ item.parameter }}</div>
+ <el-tag :type="getAlarmLevelType(item.alarmLevel)">{{ item.alarmLevel }}</el-tag>
</div>
- <div class="todo-division">瀹℃壒浜嬬敱锛歿{item.approveReason}}</div>
+ <div style="display: flex;justify-content: space-between;align-items: center;">
+ <div class="alarm-value">鎶ヨ鍊�: {{ item.alarmValue }} | 闃堝��: {{ item.threshold }}</div>
+ <div class="alarm-time">{{ item.alarmTime }}</div>
+ </div>
</div>
</li>
</ul>
- <div v-else style="text-align: center">
- 鏆傛棤鏁版嵁
+ <div v-else style="text-align: center; color: #909399; padding: 20px;">
+ 鏆傛棤寰呭鐞嗘姤璀�
</div>
</div>
</div>
@@ -85,216 +61,200 @@
<!-- 涓儴妯悜涓ゆ爮 -->
<div class="dashboard-row">
<div class="main-panel">
- <div class="section-title">瀹㈡埛鍚堝悓閲戦鍒嗘瀽</div>
- <div class="contract-summary">
- <div class="contract-info">
- <img src="../assets/images/khtitle.png" alt="" style="width: 42px"/>
- <div class="contract-card">
- <div class="contract-name">鎬诲悎鍚岄噾棰�(鍏�)</div>
- <div class="contract-meta">
- <div class="main-amount">{{sum}}</div>
- <div>鍛ㄥ悓姣�: <span class="up">{{yny}}% </span> 鏃ョ幆姣�: <span class="up">{{chain}}% </span></div>
- </div>
- </div>
+ <div class="section-title">鎶ヨ瓒嬪娍鍒嗘瀽</div>
+ <Echarts ref="chart" :chartStyle="chartStyle" :grid="grid" :legend="lineLegend" :series="lineSeries" :tooltip="tooltipLine" :xAxis="xAxis" :yAxis="yAxis" style="height: 300px;"></Echarts>
+ </div>
+ <div class="main-panel">
+ <div class="section-title">鎶ヨ绾у埆鍒嗗竷</div>
+ <div style="display: flex;align-items: center;gap: 20px;justify-content: space-evenly;height: 300px;">
+ <div style="width: 50%;">
+ <Echarts ref="chart" :legend="pieLegend" :chartStyle="chartStylePie" :series="levelPieSeries" :tooltip="pieTooltip"></Echarts>
</div>
- </div>
- <div style="display: flex;align-items: center;gap: 20px;justify-content: space-evenly;height: 180px;margin-top: 20px">
- <div>
- <Echarts ref="chart" :legend="pieLegend" :chartStyle="chartStylePie"
- :series="materialPieSeries"
- :tooltip="pieTooltip"></Echarts>
- </div>
- <ul class="contract-list">
- <li v-for="item in materialPieSeries[0].data" :key="item.name">
+ <ul class="level-list" style="width: 50%;">
+ <li v-for="item in levelPieSeries[0].data" :key="item.name">
<div style="display: flex;align-items: center;justify-content: space-between;width: 100%">
- <div class="line" :style="{color: item.itemStyle.color}">鈼弡{item.name}}</div>
- <div style="width: 70px">{{item.rate}}%</div>
- <div>锟{item.value}}</div>
+ <div class="line" :style="{color: item.itemStyle.color}">鈼弡{ item.name }}</div>
+ <div style="width: 60px;">{{ item.value }}娆�</div>
+ <div style="width: 60px;">{{ item.rate }}%</div>
</div>
</li>
</ul>
</div>
</div>
- <div class="main-panel">
- <div style="display: flex;justify-content: space-between;">
- <div class="section-title">搴旀敹搴斾粯缁熻</div>
-<!-- <el-radio-group v-model="radio1" size="large" @change="statisticsReceivable">-->
-<!-- <el-radio-button label="鎸夊懆" :value="1" />-->
-<!-- <el-radio-button label="鎸夋湀" :value="2" />-->
-<!-- <el-radio-button label="鎸夊搴�" :value="3" />-->
-<!-- </el-radio-group>-->
- </div>
- <Echarts ref="chart"
- :color="barColors2"
- :chartStyle="chartStyle"
- :grid="grid"
- :series="barSeries"
- :tooltip="tooltip"
- :xAxis="xAxis"
- :yAxis="yAxis"
- style="height: 260px"></Echarts>
- </div>
</div>
<!-- 搴曢儴妯悜涓ゆ爮 -->
<div class="dashboard-row">
-<!-- <div class="main-panel">-->
-<!-- <div class="section-title">璐ㄩ噺缁熻</div>-->
-<!-- <div class="quality-cards">-->
-<!-- <div class="quality-card one">鍘熸潗鏂欏凡妫�娴嬫暟 <span>{{qualityStatisticsObject.supplierNum}}浠�</span></div>-->
-<!-- <div class="quality-card two">杩囩▼妫�楠屾暟閲� <span>{{qualityStatisticsObject.processNum}}浠�</span></div>-->
-<!-- <div class="quality-card three">鍑哄巶宸叉鏁伴噺 <span>{{qualityStatisticsObject.factoryNum}}浠�</span></div>-->
-<!-- </div>-->
-<!-- <Echarts ref="chart"-->
-<!-- :chartStyle="chartStyle"-->
-<!-- :grid="grid"-->
-<!-- :legend="barLegend"-->
-<!-- :series="barSeries1"-->
-<!-- :tooltip="tooltip"-->
-<!-- :xAxis="xAxis1"-->
-<!-- :yAxis="yAxis1"-->
-<!-- style="height: 260px"></Echarts>-->
-<!-- </div>-->
<div class="main-panel">
- <div class="section-title">鍥炴涓庡紑绁ㄥ垎鏋�</div>
- <Echarts ref="chart" :chartStyle="chartStyle" :grid="grid" :legend="lineLegend" :series="lineSeries"
- :tooltip="tooltipLine" :xAxis="xAxis2" :yAxis="yAxis2" style="height: 270px;"></Echarts>
+ <div class="section-title">璁惧鎶ヨ缁熻</div>
+ <Echarts ref="chart" :color="barColors" :chartStyle="chartStyle" :grid="grid" :series="equipmentBarSeries" :tooltip="tooltip" :xAxis="equipmentXAxis" :yAxis="yAxis" style="height: 300px;"></Echarts>
+ </div>
+ <div class="main-panel">
+ <div class="section-title">鎶ヨ澶勭悊鏃舵晥鍒嗘瀽</div>
+ <Echarts ref="chart" :color="barColors" :chartStyle="chartStyle" :grid="grid" :series="handlingTimeSeries" :tooltip="tooltip" :xAxis="handlingTimeXAxis" :yAxis="yAxis" style="height: 300px;"></Echarts>
</div>
</div>
</div>
</template>
<script setup>
-import { ref, onMounted } from 'vue'
+import { ref, onMounted, reactive, computed } from 'vue'
import Echarts from "@/components/Echarts/echarts.vue";
-import * as echarts from 'echarts';
-import useUserStore from "@/store/modules/user.js";
-import {
- analysisCustomerContractAmounts, getAmountHalfYear,
- getBusiness,
- homeTodos,
- qualityStatistics,
- statisticsReceivablePayable
-} from "@/api/viewIndex.js";
+import { Clock } from '@element-plus/icons-vue';
-const userStore = useUserStore()
+// 褰撳墠鏃堕棿
+const currentTime = computed(() => {
+ const now = new Date();
+ return now.toLocaleString('zh-CN');
+});
-const businessInfo = ref({
- inventoryNum: 0,
- monthPurchaseHaveMoney: 0,
- monthPurchaseMoney: 0,
- monthSaleHaveMoney: 0,
- monthSaleMoney: 0,
- todayInventoryNum: 0,
-})
-const qualityStatisticsObject = ref({
- supplierNum: 0,
- processNum: 0,
- factoryNum: 0,
-})
-const sum = ref(0)
-const yny = ref(0)
-const chain = ref(0)
+// 鎶ヨ缁熻鏁版嵁
+const alarmStats = reactive({
+ total: 425,
+ handled: 398,
+ pending: 27,
+ severePending: 8,
+ moderatePending: 12,
+ minorPending: 7,
+ today: 35,
+ today鍚屾瘮: '+12.5',
+ today鐜瘮: '-8.3'
+});
-const pieLegend = reactive({
- show: false,
-})
-const barSeries = ref([
+// 寰呭鐞嗘姤璀﹀垪琛�
+const pendingAlarms = ref([
{
- type: 'bar',
- data: [],
- label: {
- show: true,
- }
- },
-])
-const barSeries1 = ref([
- {
- name: '鍘熸潗鏂欎笉鍚堟牸鏁�',
- type: 'bar',
- barGap: 0,
- emphasis: {
- focus: 'series'
- },
- data: []
+ id: 1,
+ equipmentName: '鍙嶅簲閲淎',
+ parameter: '娓╁害',
+ alarmValue: '185掳C',
+ threshold: '鈮�180掳C',
+ alarmLevel: '涓ラ噸',
+ alarmTime: '2025-12-16 14:30:23'
},
{
- name: '杩囩▼涓嶅悎鏍兼暟',
- type: 'bar',
- emphasis: {
- focus: 'series'
- },
- data: []
+ id: 2,
+ equipmentName: '绂诲績鏈築',
+ parameter: '鎸姩',
+ alarmValue: '0.8mm/s',
+ threshold: '鈮�0.5mm/s',
+ alarmLevel: '涓瓑',
+ alarmTime: '2025-12-16 14:28:15'
},
{
- name: '鍑哄巶涓嶅悎鏍兼暟',
- type: 'bar',
- emphasis: {
- focus: 'series'
- },
- data: []
+ id: 3,
+ equipmentName: '鍙嶅簲閲淒',
+ parameter: 'pH鍊�',
+ alarmValue: '4.2',
+ threshold: '5.0-7.0',
+ alarmLevel: '涓瓑',
+ alarmTime: '2025-12-16 14:22:18'
},
-])
+ {
+ id: 4,
+ equipmentName: '骞茬嚗鏈篍',
+ parameter: '婀垮害',
+ alarmValue: '15%',
+ threshold: '鈮�10%',
+ alarmLevel: '杞诲井',
+ alarmTime: '2025-12-16 14:18:55'
+ }
+]);
+
+// 鍥捐〃鏍峰紡
const chartStyle = {
width: '100%',
- height: '100%' // 璁剧疆鍥捐〃瀹瑰櫒鐨勯珮搴�
-}
+ height: '100%'
+};
+
const chartStylePie = {
- width: '140%',
- height: '140%' // 璁剧疆鍥捐〃瀹瑰櫒鐨勯珮搴�
-}
+ width: '100%',
+ height: '100%'
+};
+
const grid = {
left: '3%',
- right: '4%',
- bottom: '3%',
- containLabel: true
-}
-const barLegend = {
- show: true,
- data: ['鍘熸潗鏂欎笉鍚堟牸鏁�', '杩囩▼涓嶅悎鏍兼暟', '鍑哄巶涓嶅悎鏍兼暟']
-}
-const barLegend1 = {
- show: true,
- data: ['棰勪粯璐︽', '搴斾粯璐︽', '棰勬敹璐︽', '搴旀敹璐︽']
-}
+ right: '4%',
+ bottom: '3%',
+ containLabel: true
+};
+
+// 鎶ヨ瓒嬪娍鍒嗘瀽 - 鎶樼嚎鍥�
const lineLegend = {
show: true,
- data: ['寮�绁�', '鍥炴']
-}
-const tooltip = {
+ data: ['涓ラ噸', '涓瓑', '杞诲井']
+};
+
+const tooltipLine = {
trigger: 'axis',
axisPointer: {
- type: 'shadow'
+ type: 'cross'
}
-}
-const xAxis = [{
+};
+
+const xAxis = ref({
+ type: 'category',
+ data: ['12-01', '12-02', '12-03', '12-04', '12-05', '12-06', '12-07']
+});
+
+const yAxis = ref({
type: 'value',
-}]
-const xAxis1 = ref([{
- type: 'category',
- axisTick: { show: false },
- data: []
-}])
-const yAxis = [{
- type: 'category',
- data: [ '搴斾粯璐︽', '搴旀敹璐︽',]
-}]
-const yAxis1 = [{
- type: 'value'
-}]
-const pieTooltip = reactive({
- trigger: 'item',
- formatter: function (params) {
- // 鍔ㄦ�佺敓鎴愭彁绀轰俊鎭紝鍩轰簬鏁版嵁椤圭殑 name 灞炴��
- const description = params.name === '鏈湀鍥炴閲戦' ? '鏈湀鍥炴閲戦' : '搴旀敹娆鹃噾棰�';
- return `${description} ${formatNumber(params.value)}鍏� ${params.percent}%`;
+ name: '鎶ヨ鏁伴噺'
+});
+
+const lineSeries = ref([
+ {
+ name: '涓ラ噸',
+ type: 'line',
+ data: [8, 12, 9, 15, 11, 13, 10],
+ itemStyle: {
+ color: '#f56c6c'
+ },
+ lineStyle: {
+ width: 2
+ },
+ showSymbol: true
},
- position: 'right'
-})
-const materialPieSeries = ref([
+ {
+ name: '涓瓑',
+ type: 'line',
+ data: [22, 25, 20, 28, 24, 26, 23],
+ itemStyle: {
+ color: '#e6a23c'
+ },
+ lineStyle: {
+ width: 2
+ },
+ showSymbol: true
+ },
+ {
+ name: '杞诲井',
+ type: 'line',
+ data: [35, 38, 32, 40, 36, 39, 34],
+ itemStyle: {
+ color: '#67c23a'
+ },
+ lineStyle: {
+ width: 2
+ },
+ showSymbol: true
+ }
+]);
+
+// 鎶ヨ绾у埆鍒嗗竷 - 楗煎浘
+const pieLegend = {
+ show: false
+};
+
+const pieTooltip = {
+ trigger: 'item',
+ formatter: '{b}: {c}娆� ({d}%)'
+};
+
+const levelPieSeries = ref([
{
type: 'pie',
- radius: ['66%', '90%'],
+ radius: ['60%', '80%'],
avoidLabelOverlap: false,
itemStyle: {
borderColor: '#fff',
@@ -303,188 +263,97 @@
label: {
show: false
},
- data: []
- }
-])
-const lineSeries = ref([
- {
- type: 'line',
- data: [],
- label: {
- show: true
- },
- showSymbol: true, // 鏄剧ず鍦嗙偣
- },
-])
-const tooltipLine = {
- trigger: 'axis',
-}
-const yAxis2 = ref([
- {
- type: 'value',
- }
-])
-const xAxis2 = ref([
- {
- type: 'category',
- data: [],
- axisLabel: {
- interval: 0,
- formatter: function(value) {
- return value.replace(/~/g, '\n');
+ data: [
+ {
+ name: '涓ラ噸',
+ value: 78,
+ rate: 18.35,
+ itemStyle: { color: '#f56c6c' }
},
+ {
+ name: '涓瓑',
+ value: 178,
+ rate: 41.88,
+ itemStyle: { color: '#e6a23c' }
+ },
+ {
+ name: '杞诲井',
+ value: 169,
+ rate: 39.76,
+ itemStyle: { color: '#67c23a' }
+ }
+ ]
+ }
+]);
+
+// 璁惧鎶ヨ缁熻 - 鏌辩姸鍥�
+const barColors = ['#409eff', '#67c23a', '#e6a23c', '#f56c6c', '#909399'];
+
+const tooltip = {
+ trigger: 'axis',
+ axisPointer: {
+ type: 'shadow'
+ }
+};
+
+const equipmentXAxis = ref({
+ type: 'category',
+ data: ['鍙嶅簲閲�', '绂诲績鏈�', '杈撻�佹车', '骞茬嚗鏈�', '鍘嬬缉鏈�']
+});
+
+const equipmentBarSeries = ref([
+ {
+ name: '鎶ヨ鏁伴噺',
+ type: 'bar',
+ data: [125, 85, 78, 65, 72],
+ itemStyle: {
+ color: function(params) {
+ return barColors[params.dataIndex % barColors.length];
+ }
+ },
+ label: {
+ show: true,
+ position: 'top'
}
}
-])
+]);
-// 寰呭姙浜嬮」
-const todoList = ref([])
-const radio1 = ref(1)
+// 鎶ヨ澶勭悊鏃舵晥鍒嗘瀽 - 鏌辩姸鍥�
+const handlingTimeXAxis = ref({
+ type: 'category',
+ data: ['0-30鍒嗛挓', '30-60鍒嗛挓', '1-2灏忔椂', '2灏忔椂浠ヤ笂']
+});
-// 鍥捐〃寮曠敤
-const barChart = ref(null)
-const lineChart = ref(null)
-const barColors2 = ['#5181DB', '#D369E0', '#F2CA6D', '#60CCA8']
+const handlingTimeSeries = ref([
+ {
+ name: '澶勭悊鏁伴噺',
+ type: 'bar',
+ data: [280, 75, 45, 25],
+ itemStyle: {
+ color: function(params) {
+ return barColors[params.dataIndex % barColors.length];
+ }
+ },
+ label: {
+ show: true,
+ position: 'top'
+ }
+ }
+]);
-// 闅忔満棰滆壊鐢熸垚鍑芥暟
-const getRandomColor = () => {
- return '#' + Math.floor(Math.random() * 0xffffff).toString(16).padStart(6, '0');
-}
+// 鑾峰彇鎶ヨ绾у埆鏍峰紡
+const getAlarmLevelType = (level) => {
+ switch(level) {
+ case '涓ラ噸': return 'danger';
+ case '涓瓑': return 'warning';
+ case '杞诲井': return 'info';
+ default: return 'info';
+ }
+};
onMounted(() => {
- getBusinessData()
- analysisCustomer()
- todoInfoS()
- statisticsReceivable()
- qualityStatisticsInfo()
- getAmountHalfYearNum()
-})
-// 鏁版嵁缁熻
-const getBusinessData = () => {
- getBusiness().then((res) => {
- businessInfo.value = {...res.data}
- })
-}
-// 鍚堝悓閲戦
-const analysisCustomer = () => {
- analysisCustomerContractAmounts().then((res) => {
- sum.value = res.data.sum
- yny.value = res.data.yny
- chain.value = res.data.chain
- // 涓烘瘡涓暟鎹」鍒嗛厤闅忔満棰滆壊
- materialPieSeries.value[0].data = res.data.item.map(item => ({
- ...item,
- itemStyle: { color: getRandomColor() }
- }))
- })
-}
-// 寰呭姙浜嬮」
-const todoInfoS = () => {
- homeTodos().then((res) => {
- todoList.value = res.data
- })
-}
-// 搴斾粯搴旀敹缁熻
-const statisticsReceivable = (type) => {
- console.log(type)
- statisticsReceivablePayable({type: radio1.value}).then((res) => {
- barSeries.value[0].data = [
- // { value: res.data.prepayMoney, itemStyle: { color: barColors2[0] } },
- { value: res.data.payableMoney, itemStyle: { color: barColors2[0] } },
- // { value: res.data.advanceMoney, itemStyle: { color: barColors2[2] } },
- { value: res.data.receivableMoney, itemStyle: { color: barColors2[1] } }
- ]
- })
-}
-// 璐ㄦ缁熻
-const qualityStatisticsInfo = () => {
- qualityStatistics().then((res) => {
- res.data.item.forEach(item => {
- xAxis1.value[0].data.push(item.date)
- barSeries1.value[0].data.push(item.supplierNum)
- barSeries1.value[1].data.push(item.processNum)
- barSeries1.value[2].data.push(item.factoryNum)
- })
- qualityStatisticsObject.value.supplierNum = res.data.supplierNum
- qualityStatisticsObject.value.processNum = res.data.processNum
- qualityStatisticsObject.value.factoryNum = res.data.factoryNum
- })
-}
-const getAmountHalfYearNum = async () => {
- const res = await getAmountHalfYear()
- console.log(res)
- const monthName = []
- const receiptAmount = []
- const invoiceAmount = []
- res.data.forEach(item => {
- monthName.push(item.month)
- receiptAmount.push(item.receiptAmount)
- invoiceAmount.push(item.invoiceAmount)
- })
- // 姝g‘鍝嶅簲寮忚祴鍊硷細鍒涘缓鏂扮殑 xAxis 鍜� series 瀵硅薄
- xAxis2.value[0].data = monthName
- xAxis2.value[0].data = monthName.map(item => item.replace(/~/g, '\n~'));
- lineSeries.value = [
- {
- name: '寮�绁�',
- type: 'line',
- data: receiptAmount,
- stack: 'Total',
- areaStyle: {
- color: new echarts.graphic.LinearGradient(0, 0, 0, 1, [
- {
- offset: 0,
- color: 'rgba(131, 207, 255, 1)'
- },
- {
- offset: 1,
- color: 'rgba(186, 228, 255, 1)'
- }
- ])
- },
- itemStyle: {
- color: '#2D99FF',
- borderColor: '#2D99FF'
- },
- emphasis: {
- focus: 'series'
- },
- lineStyle: {
- width: 0
- },
- showSymbol: true,
- },
- {
- name: '鍥炴',
- type: 'line',
- data: invoiceAmount,
- stack: 'Total',
- lineStyle: {
- width: 0
- },
- itemStyle: {
- color: '#83CFFF',
- borderColor: '#83CFFF'
- },
- showSymbol: true,
- areaStyle: {
- color: new echarts.graphic.LinearGradient(0, 0, 0, 1, [
- {
- offset: 0,
- color: 'rgba(54, 153, 255, 1)'
- },
- {
- offset: 1,
- color: 'rgba(89, 169, 254, 1)'
- }
- ])
- },
- emphasis: {
- focus: 'series'
- },
- }
- ]
-}
+ // 椤甸潰鍔犺浇瀹屾垚鍚庣殑鍒濆鍖栨搷浣�
+});
</script>
<style scoped>
@@ -494,34 +363,25 @@
padding: 20px;
box-sizing: border-box;
}
+
.dashboard-top {
display: flex;
gap: 20px;
margin-bottom: 20px;
}
-.company-info {
+
+.system-info {
display: flex;
flex-direction: column;
gap: 8px;
padding: 20px;
min-width: 0;
- background-color: #EFF2FB; /* 浣跨敤鎸囧畾鐨勮儗鏅鑹� */
- background-image: url("../assets/images/denglu.png");
- background-size: cover;
- background-position: center;
- background-repeat: no-repeat;
+ background-color: #EFF2FB;
border-radius: 12px;
height: 138px;
}
-.avatar {
- width: 60px;
- height: 60px;
- border-radius: 50%;
- object-fit: contain;
- background: #fff;
- border: 1px solid #eee;
-}
-.company-card {
+
+.system-card {
display: flex;
flex-direction: column;
gap: 10px;
@@ -529,26 +389,18 @@
padding-right: 15px;
}
-.company-card::after {
- content: '';
- position: absolute;
- right: 0;
- top: 0;
- bottom: 0;
- width: 1px;
- background-color: #C9C5C5;
- border-radius: 2px;
-}
-.company-name {
- font-weight: 400;
- font-size: 16px;
+.system-name {
+ font-weight: 600;
+ font-size: 18px;
color: #161A9A;
}
-.company-meta {
+
+.system-meta {
font-weight: 400;
font-size: 12px;
color: #818185;
}
+
.data-cards {
display: flex;
gap: 16px;
@@ -557,123 +409,121 @@
border-radius: 12px;
padding: 20px;
}
-.data-title {
- font-weight: 700;
- font-size: 26px;
- color: #FFFFFF;
-}
-.data-num {
- display: flex;
- align-items: center;
- justify-content: space-between;
- margin-top: 20px;
-}
+
.data-card {
background: #fff;
border-radius: 12px;
- padding: 14px 10px 10px 10px;
+ padding: 16px;
min-width: 160px;
box-shadow: 0 2px 8px #eee;
display: flex;
flex-direction: column;
+ align-items: center;
+ justify-content: center;
width: 32%;
height: 140px;
+ transition: all 0.3s ease;
}
-.data-card.sales {
- background-image: url("../assets/images/xioashoushuju.png");
- background-size: cover;
- background-position: center;
- background-repeat: no-repeat;
+
+.data-card:hover {
+ transform: translateY(-2px);
+ box-shadow: 0 4px 12px rgba(0, 0, 0, 0.15);
}
-.data-card.purchase {
- background-image: url("../assets/images/caigou.png");
- background-size: cover;
- background-position: center;
- background-repeat: no-repeat;
+
+.data-card.total {
+ background: linear-gradient(135deg, #409eff 0%, #66b1ff 100%);
+ color: #fff;
}
-.data-card.inventory {
- background-image: url("../assets/images/kucun.png");
- background-size: cover;
- background-position: center;
- background-repeat: no-repeat;
+
+.data-card.pending {
+ background: linear-gradient(135deg, #f56c6c 0%, #f78989 100%);
+ color: #fff;
}
-.data-desc {
- font-weight: 500;
- font-size: 13px;
- color: #FFFFFF;
+
+.data-card.today {
+ background: linear-gradient(135deg, #67c23a 0%, #85ce61 100%);
+ color: #fff;
}
+
+.data-title {
+ font-weight: 600;
+ font-size: 16px;
+ margin-bottom: 12px;
+}
+
.data-value {
- font-size: 18px;
- font-weight: 500;
- margin: 10px 0;
- color: #FFFFFF;
+ font-size: 32px;
+ font-weight: bold;
+ margin-bottom: 8px;
}
+
+.data-desc {
+ font-size: 12px;
+ opacity: 0.9;
+}
+
.top-left {
display: flex;
flex-direction: column;
gap: 20px;
- width: 50%;
+ width: 60%;
}
-.todo-panel {
+
+.alarm-panel {
background: #fff;
border-radius: 12px;
padding: 20px;
- width: 50%;
+ width: 40%;
}
-.todo-list {
+
+.alarm-list {
list-style: none;
padding: 0;
margin: 0;
- font-size: 15px;
+ font-size: 14px;
overflow-y: auto;
height: 260px;
}
-.todo-list li {
+
+.alarm-list li {
border-radius: 8px;
margin-bottom: 12px;
- padding: 8px 20px;
- height: 74px;
+ padding: 12px 20px;
display: flex;
justify-content: space-between;
align-items: center;
- background: rgba(225,227,250,0.62);
+ background: #f8f9fa;
+ border-left: 4px solid #409eff;
+ transition: all 0.3s ease;
}
-.todo-title {
- font-weight: 400;
+
+.alarm-list li:hover {
+ background: #e9ecef;
+ transform: translateX(4px);
+}
+
+.alarm-title {
+ font-weight: 600;
+ font-size: 14px;
+ color: #303133;
+}
+
+.alarm-value {
font-size: 12px;
- color: #000000;
- position: relative;
+ color: #606266;
}
-.todo-title::before {
- content: ''; /* 蹇呴渶锛岃〃绀鸿繖閲屾湁涓�涓唴瀹� */
- position: absolute;
- left: -10px; /* 瀹氫綅鍒板乏渚� */
- top: 50%; /* 鍨傜洿灞呬腑 */
- transform: translateY(-50%); /* 寰皟鍨傜洿灞呬腑 */
- width: 6px; /* 鍦嗙殑鐩村緞 */
- height: 6px; /* 鍦嗙殑鐩村緞 */
- background: #498CEB;
- border-radius: 50%; /* 璁╁叾鍙樻垚鍦嗗舰 */
-}
-.todo-division {
- font-weight: 400;
+
+.alarm-time {
font-size: 12px;
- color: #000000;
+ color: #909399;
}
-.todo-time {
- font-weight: 400;
- font-size: 12px;
- color: #000000;
-}
-.todo-meta {
- color: #888;
- font-size: 13px;
-}
+
.dashboard-row {
display: flex;
gap: 20px;
margin-bottom: 20px;
}
+
.main-panel {
background: #fff;
border-radius: 12px;
@@ -683,12 +533,13 @@
display: flex;
flex-direction: column;
}
+
.section-title {
position: relative;
font-size: 18px;
color: #333;
padding-left: 10px;
- margin-bottom: 10px;
+ margin-bottom: 20px;
font-weight: 700;
}
@@ -699,107 +550,34 @@
content: '';
width: 4px;
height: 18px;
- background-color: #002FA7;
+ background-color: #409eff;
border-radius: 2px;
}
-.contract-info {
- display: flex;
- align-items: center;
- gap: 20px;
- height: 90px;
- background: rgba(245,245,245,0.59);
- width: 100%;
- border-radius: 10px;
- padding: 10px 30px;
-}
-.contract-summary {
- display: flex;
- align-items: center;
- gap: 30px;
-}
-.contract-card {
- display: flex;
- flex-direction: column;
- gap: 10px;
-}
-.contract-name {
- font-weight: 400;
- font-size: 14px;
- color: #050505;
-}
-.contract-meta {
- display: flex;
- align-items: center;
- width: 100%;
- gap: 80px;
-}
-.main-amount {
- font-size: 24px;
- color: rgba(51,50,50,0.85);
-}
-.up { color: #e57373; }
-.contract-list {
- margin-top: 16px;
- font-size: 14px;
- color: #666;
- list-style: none;
+
+.level-list {
+ margin: 0;
padding: 0;
- height: 190px;
+ list-style: none;
+ height: 200px;
overflow-y: auto;
- width: 460px;
+ width: 100%;
}
+
+.level-list li {
+ margin-bottom: 15px;
+ padding: 10px;
+ background: #f8f9fa;
+ border-radius: 6px;
+ transition: all 0.3s ease;
+}
+
+.level-list li:hover {
+ background: #e9ecef;
+}
+
.line {
position: relative;
- width: 230px;
-}
-.line::after {
- content: '';
- position: absolute;
- right: 2px;
- top: 0;
- bottom: 0;
- width: 1px;
- background-color: #C9C5C5;
- border-radius: 2px;
-}
-.contract-list li {
- margin-top: 10px;
-}
-.quality-cards {
- display: flex;
- gap: 12px;
- margin-bottom: 12px;
-}
-.quality-card {
- border-radius: 8px;
- padding: 15px 10px 10px 50px;
- font-weight: 400;
- font-size: 12px;
- color: rgba(0,0,0,0.67);
- width: 236px;
- height: 49px;
- background-size: cover;
- background-position: center;
- background-repeat: no-repeat;
-}
-.quality-card.one {
- background-image: url("../assets/images/yuancailiao.png");
-}
-.quality-card.two {
- background-image: url("../assets/images/guocheng.png");
-}
-.quality-card.three {
- background-image: url("../assets/images/chuchang.png");
-
-}
-.quality-card span {
- color: #4fc3f7;
- font-weight: bold;
- margin-left: 6px;
-}
-.chart {
- width: 100%;
- height: 220px;
- margin-top: 10px;
+ width: 80px;
+ font-weight: 500;
}
</style>
\ No newline at end of file
diff --git a/src/views/inventoryManagement/dispatchLog/index.vue b/src/views/inventoryManagement/dispatchLog/index.vue
deleted file mode 100644
index 6fe0473..0000000
--- a/src/views/inventoryManagement/dispatchLog/index.vue
+++ /dev/null
@@ -1,285 +0,0 @@
-<template>
- <div class="app-container">
- <div class="search_form">
- <div>
- <span class="search_title">渚涘簲鍟嗗悕绉帮細</span>
- <el-input
- v-model="searchForm.supplierName"
- style="width: 240px"
- placeholder="璇疯緭鍏�"
- @change="handleQuery"
- clearable
- prefix-icon="Search"
- />
- <el-button type="primary" @click="handleQuery" style="margin-left: 10px"
- >鎼滅储</el-button
- >
- </div>
- <div>
- <!-- <el-button type="primary" @click="openForm('add')">鏂板</el-button> -->
- <el-button @click="handleOut">瀵煎嚭</el-button>
- <el-button type="danger" plain @click="handleDelete">鍒犻櫎</el-button>
- </div>
- </div>
- <div class="table_list">
- <el-table
- :data="tableData"
- border
- v-loading="tableLoading"
- @selection-change="handleSelectionChange"
- :expand-row-keys="expandedRowKeys"
- :row-key="(row) => row.id"
- show-summary
- style="width: 100%"
- :summary-method="summarizeMainTable"
- height="calc(100vh - 18.5em)"
- stripe
- >
- <el-table-column align="center" type="selection" width="55" />
- <el-table-column align="center" label="搴忓彿" type="index" width="60" />
- <el-table-column
- label="鍑哄簱鏃ユ湡"
- prop="createTime"
- min-width="130"
- show-overflow-tooltip
- />
- <el-table-column
- label="渚涘簲鍟嗗悕绉�"
- prop="supplierName"
- width="250"
- show-overflow-tooltip
- />
- <el-table-column
- label="浜у搧澶х被"
- prop="productCategory"
- width="100"
- show-overflow-tooltip
- />
- <el-table-column
- label="瑙勬牸鍨嬪彿"
- prop="specificationModel"
- width="100"
- show-overflow-tooltip
- />
- <el-table-column
- label="鍗曚綅"
- prop="unit"
- width="80"
- show-overflow-tooltip
- />
- <el-table-column
- label="鍑哄簱鏁伴噺"
- prop="inboundNum"
- width="100"
- show-overflow-tooltip
- />
- <el-table-column
- label="鍚◣鍗曚环(鍏�)"
- prop="taxInclusiveUnitPrice"
- width="200"
- show-overflow-tooltip
- />
- <el-table-column
- label="鍚◣鎬讳环(鍏�)"
- prop="taxInclusiveTotalPrice"
- width="200"
- show-overflow-tooltip
- />
- <el-table-column
- label="绋庣巼(%)"
- prop="taxRate"
- width="100"
- show-overflow-tooltip
- />
- <el-table-column
- label="涓嶅惈绋庢�讳环(鍏�)"
- prop="taxExclusiveTotalPrice"
- width="180"
- show-overflow-tooltip
- />
- <el-table-column
- label="鍑哄簱浜�"
- prop="createBy"
- width="80"
- show-overflow-tooltip
- />
- <!-- <el-table-column
- fixed="right"
- label="鎿嶄綔"
- min-width="60"
- align="center"
- >
- <template #default="scope">
- <el-button
- link
- type="primary"
- size="small"
- @click="openForm('edit', scope.row)"
- >缂栬緫</el-button
- >
- </template>
- </el-table-column> -->
- </el-table>
- <pagination
- v-show="total > 0"
- :total="total"
- layout="total, sizes, prev, pager, next, jumper"
- :page="page.current"
- :limit="page.size"
- @pagination="paginationChange"
- />
- </div>
- </div>
-</template>
-
-<script setup>
-import pagination from "@/components/PIMTable/Pagination.vue";
-import { ref } from "vue";
-import { ElMessageBox } from "element-plus";
-import useUserStore from "@/store/modules/user";
-import { userListNoPage } from "@/api/system/user.js";
-import {
- getStockOutPage,
- delStockOut,
-} from "@/api/inventoryManagement/stockOut.js";
-
-const userStore = useUserStore();
-const { proxy } = getCurrentInstance();
-const tableData = ref([]);
-const selectedRows = ref([]);
-const userList = ref([]);
-const tableLoading = ref(false);
-const productList = ref([])
-const page = reactive({
- current: 1,
- size: 100,
-});
-const total = ref(0);
-const fileList = ref([]);
-
-// 鐢ㄦ埛淇℃伅琛ㄥ崟寮规鏁版嵁
-const operationType = ref("");
-const dialogFormVisible = ref(false);
-const data = reactive({
- searchForm: {
- supplierName: "",
- },
- form: {
- supplierId: null,
- supplierName: '',
- productId: null,
- productName: '',
- userId: userStore.userId,
- nickname: '',
- model: '',
- productModelId: null,
- unit: '',
- productrecordId: null,
- taxInclusiveUnitPrice: '',
- taxInclusiveTotalPrice: '',
- taxRate: '',
- taxExclusiveTotalPrice: '',
- inboundTime: '',
- inboundBatch: '',
- inboundQuantity: ''
- },
-});
-const { searchForm } = toRefs(data);
-
-// 鏌ヨ鍒楄〃
-/** 鎼滅储鎸夐挳鎿嶄綔 */
-const handleQuery = () => {
- page.current = 1;
- getList();
-};
-const paginationChange = (obj) => {
- page.current = obj.page;
- page.size = obj.limit;
- getList();
-};
-const getList = () => {
- tableLoading.value = true;
- getStockOutPage({ ...searchForm.value, ...page })
- .then((res) => {
- tableLoading.value = false;
- tableData.value = res.data.records;
- tableData.value.map((item) => {
- item.children = [];
- });
- total.value = res.data.total;
- })
- .catch(() => {
- tableLoading.value = false;
- });
-};
-
-// 琛ㄦ牸閫夋嫨鏁版嵁
-const handleSelectionChange = (selection) => {
- // 杩囨护鎺夊瓙鏁版嵁
- selectedRows.value = selection.filter((item) => item.id);
- console.log("selection", selectedRows.value);
-};
-const expandedRowKeys = ref([]);
-
-// 涓昏〃鍚堣鏂规硶
-const summarizeMainTable = (param) => {
- return proxy.summarizeTable(param, [
- "contractAmount",
- "taxInclusiveTotalPrice",
- "taxExclusiveTotalPrice",
- ]);
-};
-
-// 瀵煎嚭
-const handleOut = () => {
- ElMessageBox.confirm("鏄惁纭瀵煎嚭锛�", "瀵煎嚭", {
- confirmButtonText: "纭",
- cancelButtonText: "鍙栨秷",
- type: "warning",
- })
- .then(() => {
- proxy.download("/stockmanagement/export", {}, "鍑哄簱鍙拌处.xlsx");
- })
- .catch(() => {
- proxy.$modal.msg("宸插彇娑�");
- });
-};
-
-// 鍒犻櫎
-const handleDelete = () => {
- let ids = [];
- if (selectedRows.value.length > 0) {
- ids = selectedRows.value.map((item) => item.id);
- } else {
- proxy.$modal.msgWarning("璇烽�夋嫨鏁版嵁");
- return;
- }
- ElMessageBox.confirm("閫変腑鐨勫唴瀹瑰皢琚垹闄わ紝鏄惁纭鍒犻櫎锛�", "瀵煎嚭", {
- confirmButtonText: "纭",
- cancelButtonText: "鍙栨秷",
- type: "warning",
- })
- .then(() => {
- delStockOut({ids:ids}).then((res) => {
- proxy.$modal.msgSuccess("鍒犻櫎鎴愬姛");
- getList();
- });
- })
- .catch(() => {
- proxy.$modal.msg("宸插彇娑�");
- });
-};
-// 鑾峰彇褰撳墠鏃ユ湡骞舵牸寮忓寲涓� YYYY-MM-DD
-function getCurrentDate() {
- const today = new Date();
- const year = today.getFullYear();
- const month = String(today.getMonth() + 1).padStart(2, "0"); // 鏈堜唤浠�0寮�濮�
- const day = String(today.getDate()).padStart(2, "0");
- return `${year}-${month}-${day}`;
-}
-onMounted(() => {
- getList();
-});
-</script>
-
-<style scoped lang="scss"></style>
diff --git a/src/views/inventoryManagement/issueManagement/index.vue b/src/views/inventoryManagement/issueManagement/index.vue
deleted file mode 100644
index cc4d8e1..0000000
--- a/src/views/inventoryManagement/issueManagement/index.vue
+++ /dev/null
@@ -1,282 +0,0 @@
-<template>
- <div class="app-container">
- <div class="search_form">
- <div>
- <span class="search_title">渚涘簲鍟嗗悕绉帮細</span>
- <el-input v-model="searchForm.supplierName" style="width: 240px" placeholder="璇疯緭鍏�" @change="handleQuery"
- clearable prefix-icon="Search" />
- <el-button type="primary" @click="handleQuery" style="margin-left: 10px">鎼滅储</el-button>
- </div>
- <div>
- <!-- <el-button type="primary" @click="openForm('add')">鏂板鍑哄簱</el-button> -->
- <el-button @click="handleOut">瀵煎嚭</el-button>
- <!-- <el-button type="danger" plain @click="handleDelete">鍒犻櫎</el-button> -->
- </div>
- </div>
- <div class="table_list">
- <el-table :data="tableData" border v-loading="tableLoading" @selection-change="handleSelectionChange"
- :expand-row-keys="expandedRowKeys" :row-key="row => row.id" show-summary style="width: 100%"
- :summary-method="summarizeMainTable" height="calc(100vh - 18.5em)" stripe>
- <el-table-column align="center" type="selection" width="55" />
- <el-table-column align="center" label="搴忓彿" type="index" width="60" />
- <el-table-column label="鍏ュ簱鏃堕棿" prop="createTime" width="100" show-overflow-tooltip />
- <el-table-column label="鍏ュ簱鎵规" prop="inboundBatches" width="160" show-overflow-tooltip />
- <el-table-column label="渚涘簲鍟嗗悕绉�" prop="supplierName" width="240" show-overflow-tooltip />
- <el-table-column label="浜у搧澶х被" prop="productCategory" width="100" show-overflow-tooltip />
- <el-table-column label="瑙勬牸鍨嬪彿" prop="specificationModel" width="200" show-overflow-tooltip />
- <el-table-column label="鍗曚綅" prop="unit" width="70" show-overflow-tooltip />
- <el-table-column label="鍏ュ簱鏁伴噺" prop="inboundNum" width="90" show-overflow-tooltip />
- <el-table-column label="搴撳瓨鏁伴噺" prop="inboundNum0" width="90" show-overflow-tooltip />
- <el-table-column label="鍚◣鍗曚环" prop="taxInclusiveUnitPrice" width="100" show-overflow-tooltip />
- <el-table-column label="鍚◣鎬讳环" prop="taxInclusiveTotalPrice" width="100" show-overflow-tooltip />
- <el-table-column label="绋庣巼(%)" prop="taxRate" width="80" show-overflow-tooltip />
- <el-table-column label="涓嶅惈绋庢�讳环" prop="taxExclusiveTotalPrice" width="100" show-overflow-tooltip />
- <el-table-column label="鍏ュ簱浜�" prop="createBy" width="80" show-overflow-tooltip />
- <el-table-column fixed="right" label="鎿嶄綔" min-width="60" align="center">
- <template #default="scope">
- <el-button link type="primary" size="small" @click="openForm(scope.row);">棰嗙敤</el-button>
- </template>
- </el-table-column>
- </el-table>
- <pagination v-show="total > 0" :total="total" layout="total, sizes, prev, pager, next, jumper"
- :page="page.current" :limit="page.size" @pagination="paginationChange" />
- </div>
- <el-dialog v-model="dialogFormVisible" :title="'鏂板鍑哄簱'" width="40%" @close="closeDia">
- <el-form :model="form" label-width="140px" label-position="top" :rules="rules" ref="formRef">
- <el-form-item label="鍑哄簱鏁伴噺锛�" prop="salesContractNo">
- <el-input-number :step="0.01" :min="0" style="width: 100%" v-model="form.inboundQuantity" placeholder="璇疯緭鍏�" clearable />
- </el-form-item>
- <el-form-item label="鍑哄簱鏃ユ湡锛�" prop="projectName">
- <el-date-picker style="width: 100%" v-model="form.inboundTime" value-format="YYYY-MM-DD" format="YYYY-MM-DD"
- type="date" placeholder="璇烽�夋嫨" clearable />
- </el-form-item>
- <el-form-item label="鍑哄簱浜猴細" prop="entryPerson">
- <el-select v-model="form.nickName" placeholder="璇烽�夋嫨" clearable>
- <el-option v-for="item in userList" :key="item.userId" :label="item.nickName" :value="item.userId" />
- </el-select>
- </el-form-item>
- </el-form>
- <template #footer>
- <div class="dialog-footer">
- <el-button type="primary" @click="submitForm">纭</el-button>
- <el-button @click="closeDia">鍙栨秷</el-button>
- </div>
- </template>
- </el-dialog>
- </div>
-</template>
-
-<script setup>
-import pagination from '@/components/PIMTable/Pagination.vue'
-import { ref } from 'vue'
-import { ElMessageBox } from "element-plus";
-import useUserStore from '@/store/modules/user'
-import { userListNoPageByTenantId } from "@/api/system/user.js";
-import {
- getStockInPage
-} from "@/api/inventoryManagement/stockIn.js";
-import {
- getStockManagePage,
- delStockManage,
- stockOut,
-} from "@/api/inventoryManagement/stockManage.js";
-
-const userStore = useUserStore()
-const { proxy } = getCurrentInstance()
-const tableData = ref([])
-const selectedRows = ref([])
-const userList = ref([])
-const tableLoading = ref(false)
-const page = reactive({
- current: 1,
- size: 100,
-})
-const total = ref(0)
-const fileList = ref([])
-
-// 鐢ㄦ埛淇℃伅琛ㄥ崟寮规鏁版嵁
-const dialogFormVisible = ref(false)
-const data = reactive({
- searchForm: {
- supplierName: '',
- inboundQuantity:'',
- inboundTime:'',
- nickName: '',
- userId: '',
- },
- form: {
- productrecordId: '',
- },
- rules: {
- inboundTime: [{ required: true, message: "璇烽�夋嫨", trigger: "change" }],
- inboundQuantity: [{ required: true, message: "璇疯緭鍏�", trigger: "blur" }],
- nickname: [{ required: true, message: "璇烽�夋嫨", trigger: "change" }]
- }
-})
-const { searchForm, form, rules } = toRefs(data)
-
-// 鏌ヨ鍒楄〃
-/** 鎼滅储鎸夐挳鎿嶄綔 */
-const handleQuery = () => {
- page.current = 1
- getList()
-}
-const paginationChange = (obj) => {
- page.current = obj.page;
- page.size = obj.limit;
- getList()
-}
-const getList = () => {
- tableLoading.value = true
- getStockInPage({ ...searchForm.value, ...page }).then(res => {
- tableLoading.value = false
- tableData.value = res.data.records
- total.value = res.data.total
- console.log('res', res.data.records)
- }).catch(() => {
- tableLoading.value = false
- })
-}
-
-const findNodeById = (nodes, productId) => {
- for (let i = 0; i < nodes.length; i++) {
- if (nodes[i].value === productId) {
- return nodes[i].label; // 鎵惧埌鑺傜偣锛岃繑鍥炶鑺傜偣
- }
- if (nodes[i].children && nodes[i].children.length > 0) {
- const foundNode = findNodeById(nodes[i].children, productId);
- if (foundNode) {
- return foundNode.label; // 鍦ㄥ瓙鑺傜偣涓壘鍒帮紝杩斿洖璇ヨ妭鐐�
- }
- }
- }
- return null; // 娌℃湁鎵惧埌鑺傜偣锛岃繑鍥瀗ull
-};
-// 琛ㄦ牸閫夋嫨鏁版嵁
-const handleSelectionChange = (selection) => {
- // 杩囨护鎺夊瓙鏁版嵁
- selectedRows.value = selection.filter(item => item.id);
- console.log('selection', selectedRows.value)
-}
-const expandedRowKeys = ref([])
-
-// 涓昏〃鍚堣鏂规硶
-const summarizeMainTable = (param) => {
- return proxy.summarizeTable(param, ['contractAmount', 'taxInclusiveTotalPrice', 'taxExclusiveTotalPrice']);
-};
-const currentRowId = ref(null) // 鏂板锛氬瓨鍌ㄥ綋鍓嶆搷浣滅殑琛孖D
-
-const currentRowNum = ref(0)
-const salesLedgerProductId = ref(null);
-
-// 鎵撳紑寮规
-const openForm = async (row) => {
- dialogFormVisible.value = true
- currentRowId.value = row.id
- currentRowNum.value = row.inboundNum0
- salesLedgerProductId.value = row.salesLedgerProductId
- form.value = {}
- // 鍒濆鍖栬〃鍗曟暟鎹�
- form.value = {
- productrecordId: '',
- inboundQuantity: '', // 鍑哄簱鏁伴噺娓呯┖
- inboundTime: getCurrentDate(), // 榛樿褰撳墠鏃ユ湡
- nickName: '', // 榛樿褰撳墠鐢ㄦ埛
- }
- console.log('form',form.value)
- // 鍔犺浇鐢ㄦ埛鍒楄〃
- try {
- const userLists = await userListNoPageByTenantId()
- userList.value = userLists.data
- } catch (error) {
- console.error('鍔犺浇鐢ㄦ埛鍒楄〃澶辫触:', error)
- }
-}
-
-// 鎻愪氦琛ㄥ崟
-const submitForm = () => {
- let num = Number(form.value.inboundQuantity)
- if(num < 1 || num > currentRowNum.value){
- return proxy.$modal.msgWarning("璇峰~鍏ユ湁鏁堟暟瀛�")
- }
- proxy.$refs["formRef"].validate(valid => {
- if (valid && currentRowId.value) {
- const outData = {
- id: currentRowId.value, // 鍘熷璁板綍ID
- salesLedgerProductId: salesLedgerProductId.value,
- quantity: form.value.inboundQuantity, // 鍑哄簱鏁伴噺
- time: form.value.inboundTime, // 鍑哄簱鏃堕棿
- userId: form.value.nickName // 鎿嶄綔浜�
- }
- console.log(outData)
-
- stockOut(outData).then(res => {
- proxy.$modal.msgSuccess("鎻愪氦鎴愬姛")
- closeDia()
- getList()
- }).catch(err => {
- proxy.$modal.msgError("鍑哄簱澶辫触")
- })
- }
- })
-}
-// 鍏抽棴寮规
-const closeDia = () => {
- proxy.resetForm("formRef")
- dialogFormVisible.value = false
-}
-
-// 瀵煎嚭
-const handleOut = () => {
- ElMessageBox.confirm(
- '鏄惁纭瀵煎嚭锛�',
- '瀵煎嚭', {
- confirmButtonText: '纭',
- cancelButtonText: '鍙栨秷',
- type: 'warning',
- }
- ).then(() => {
- proxy.download("/stockin/export", {}, '鍏ュ簱鍙拌处.xlsx')
- }).catch(() => {
- proxy.$modal.msg("宸插彇娑�")
- })
-}
-// 鍒犻櫎
-const handleDelete = () => {
- let ids = []
- if (selectedRows.value.length > 0) {
- ids = selectedRows.value.map(item => item.id);
- } else {
- proxy.$modal.msgWarning('璇烽�夋嫨鏁版嵁')
- return
- }
- ElMessageBox.confirm(
- '閫変腑鐨勫唴瀹瑰皢琚垹闄わ紝鏄惁纭鍒犻櫎锛�',
- '瀵煎嚭', {
- confirmButtonText: '纭',
- cancelButtonText: '鍙栨秷',
- type: 'warning',
- }
- ).then(() => {
- delStockManage(ids).then(res => {
- proxy.$modal.msgSuccess("鍒犻櫎鎴愬姛")
- getList()
- })
- }).catch(() => {
- proxy.$modal.msg("宸插彇娑�")
- })
-}
-// 鑾峰彇褰撳墠鏃ユ湡骞舵牸寮忓寲涓� YYYY-MM-DD
-function getCurrentDate() {
- const today = new Date();
- const year = today.getFullYear();
- const month = String(today.getMonth() + 1).padStart(2, '0'); // 鏈堜唤浠�0寮�濮�
- const day = String(today.getDate()).padStart(2, '0');
- return `${year}-${month}-${day}`;
-}
-onMounted(() => {
- getList()
-})
-</script>
-
-<style scoped lang="scss"></style>
diff --git a/src/views/inventoryManagement/receiptManagement/index.vue b/src/views/inventoryManagement/receiptManagement/index.vue
deleted file mode 100644
index 238f3fd..0000000
--- a/src/views/inventoryManagement/receiptManagement/index.vue
+++ /dev/null
@@ -1,452 +0,0 @@
-<template>
- <div class="app-container">
- <div class="search_form">
- <div>
- <span class="search_title">渚涘簲鍟嗗悕绉帮細</span>
- <el-input v-model="searchForm.supplierName" style="width: 240px" placeholder="璇疯緭鍏�" @change="handleQuery"
- clearable prefix-icon="Search" />
- <el-button type="primary" @click="handleQuery" style="margin-left: 10px">鎼滅储</el-button>
- </div>
- <div>
- <el-button type="primary" @click="openForm('add')">鏂板鍏ュ簱</el-button>
- <el-button @click="handleOut">瀵煎嚭</el-button>
- <el-button type="danger" plain @click="handleDelete">鍒犻櫎</el-button>
- </div>
- </div>
- <div class="table_list">
- <el-table :data="tableData" border v-loading="tableLoading" @selection-change="handleSelectionChange"
- :expand-row-keys="expandedRowKeys" :row-key="row => row.id" show-summary style="width: 100%"
- :summary-method="summarizeMainTable" height="calc(100vh - 18.5em)" stripe>
- <el-table-column align="center" type="selection" width="55" />
- <el-table-column align="center" label="搴忓彿" type="index" width="60" />
- <el-table-column label="鍏ュ簱鏃堕棿" prop="createTime" width="100" show-overflow-tooltip />
- <el-table-column label="鍏ュ簱鎵规" prop="inboundBatches" width="160" show-overflow-tooltip />
- <el-table-column label="渚涘簲鍟嗗悕绉�" prop="supplierName" width="240" show-overflow-tooltip />
- <el-table-column label="浜у搧澶х被" prop="productCategory" width="100" show-overflow-tooltip />
- <el-table-column label="瑙勬牸鍨嬪彿" prop="specificationModel" width="200" show-overflow-tooltip />
- <el-table-column label="鍗曚綅" prop="unit" width="70" show-overflow-tooltip />
- <el-table-column label="鍏ュ簱鏁伴噺" prop="inboundNum" width="90" show-overflow-tooltip />
- <el-table-column label="鍚◣鍗曚环" prop="taxInclusiveUnitPrice" width="100" show-overflow-tooltip />
- <el-table-column label="鍚◣鎬讳环" prop="taxInclusiveTotalPrice" width="100" show-overflow-tooltip />
- <el-table-column label="绋庣巼(%)" prop="taxRate" width="80" show-overflow-tooltip />
- <el-table-column label="涓嶅惈绋庢�讳环" prop="taxExclusiveTotalPrice" width="100" show-overflow-tooltip />
- <el-table-column label="鍏ュ簱浜�" prop="createBy" width="80" show-overflow-tooltip />
- <el-table-column fixed="right" label="鎿嶄綔" min-width="60" align="center">
- <template #default="scope">
- <el-button link type="primary" size="small" @click="openForm('edit', scope.row);" :disabled="scope.row.createUser !== userStore.id">缂栬緫</el-button>
- </template>
- </el-table-column>
- </el-table>
- <pagination v-show="total > 0" :total="total" layout="total, sizes, prev, pager, next, jumper"
- :page="page.current" :limit="page.size" @pagination="paginationChange" />
- </div>
-
- <el-dialog v-model="dialogFormVisible" :title="operationType === 'add' ? '鏂板鍏ュ簱' : '缂栬緫鍏ュ簱'" width="70%"
- @close="closeDia">
- <el-form :model="form" label-width="140px" label-position="top" :rules="rules" ref="formRef">
- <el-form-item label="閲囪喘璁㈠崟鍙�" prop="salesContractNo">
- <el-input
- v-model="form.purchaseContractNumber"
- placeholder="璇疯緭鍏ュ悎鍚屽彿"
- clearable
- @change="searchByContractNo"
- :disabled="operationType === 'edit'"
- >
- <template #append>
- <el-button
- icon="Search"
- @click="searchByContractNo"
- :loading="loadingProducts"
- />
- </template>
- </el-input>
- </el-form-item>
- <el-table
- :data="productList"
- border
- v-loading="loadingProducts"
- @selection-change="handleSelectionChange"
- stripe
- >
- <el-table-column align="center" type="selection" width="55" />
- <el-table-column
- align="center"
- label="搴忓彿"
- type="index"
- width="60"
- />
- <el-table-column label="浜у搧澶х被" prop="productCategory" />
- <el-table-column label="瑙勬牸鍨嬪彿" prop="specificationModel" />
- <el-table-column label="鍗曚綅" prop="unit" width="70" />
- <el-table-column label="渚涘簲鍟�" prop="supplierName" width="100" />
- <el-table-column label="閲囪喘鏁伴噺" prop="quantity" width="100" />
- <el-table-column label="寰呭叆搴撴暟閲�" prop="quantity0" width="100" />
- <el-table-column label="鏈鍏ュ簱鏁伴噺" prop="quantityStock" width="150">
- <template #default="scope">
- <el-input-number :step="0.01" :min="0" style="width: 100%" v-model="scope.row.quantityStock" :max="scope.row.quantity0" />
- </template>
- </el-table-column>
- <el-table-column label="绋庣巼(%)" prop="taxRate" width="120" />
- <el-table-column
- label="鍚◣鍗曚环(鍏�)"
- prop="taxInclusiveUnitPrice"
- :formatter="formattedNumber"
- width="150"
- />
- <el-table-column
- label="鍚◣鎬讳环(鍏�)"
- prop="taxInclusiveTotalPrice"
- :formatter="formattedNumber"
- width="150"
- />
- <el-table-column
- label="涓嶅惈绋庢�讳环(鍏�)"
- prop="taxExclusiveTotalPrice"
- :formatter="formattedNumber"
- width="150"
- />
- </el-table>
- </el-form>
- <template #footer>
- <div class="dialog-footer">
- <el-button type="primary" @click="submitForm">纭</el-button>
- <el-button @click="closeDia">鍙栨秷</el-button>
- </div>
- </template>
- </el-dialog>
- </div>
-</template>
-
-<script setup>
-import pagination from '@/components/PIMTable/Pagination.vue'
-import { ref } from 'vue'
-import { ElMessageBox } from "element-plus";
-import useUserStore from '@/store/modules/user'
-import {
- getStockInPage,
- updateStockIn,
- addSutockIn,
- delStockIn,
- selectProductRecordListByPuechaserId
-} from "@/api/inventoryManagement/stockIn.js";
-
-const userStore = useUserStore()
-const { proxy } = getCurrentInstance()
-
-const tableData = ref([])
-const selectedRows = ref([])
-const userList = ref([])
-
-
-const loading = ref(false);
-const tableLoading = ref(false)
-
-const page = reactive({
- current: 1,
- size: 100,
-})
-const total = ref(0)
-
-// 鐢ㄦ埛淇℃伅琛ㄥ崟寮规鏁版嵁
-const operationType = ref('')// 鎿嶄綔绫诲瀷: 'add' 鎴� 'edit'
-const dialogFormVisible = ref(false)// 寮规鏄剧ず鐘舵��
-const productList = ref([]);// 浜у搧鍒楄〃鏁版嵁
-const loadingProducts = ref(false);// 浜у搧鍔犺浇鐘舵��
-const productSelectedRows = ref([]) // 浜у搧琛ㄦ牸閫変腑琛�
-const data = reactive({
- searchForm: {
- supplierName: '',
- },
- form: {
- id: null,
- purchaseContractNumber: '', // 閲囪喘璁㈠崟鍙�
- supplierId: null, // 渚涘簲鍟咺D
- supplierName: '', // 渚涘簲鍟嗗悕绉�
- inboundTime: '', // 鍏ュ簱鏃堕棿
- inboundBatch: '', // 鍏ュ簱鎵规
- recorderId: userStore.userId, // 褰曞叆浜篒D
- recorderName: userStore.name, // 褰曞叆浜哄鍚�
- entryDate: getCurrentDate(), // 褰曞叆鏃ユ湡
- remark: '', // 澶囨敞
- },
- rules: {
- purchaseContractNumber: [{ required: true, message: "璇疯緭鍏ラ噰璐悎鍚屽彿", trigger: "blur" }],
- supplierId: [{ required: true, message: "璇烽�夋嫨渚涘簲鍟�", trigger: "change" }],
- inboundTime: [{ required: true, message: "璇烽�夋嫨鍏ュ簱鏃堕棿", trigger: "change" }],
- inboundBatch: [{ required: true, message: "璇疯緭鍏ュ叆搴撴壒娆�", trigger: "blur" }]
- }
-})
-const { searchForm, form, rules } = toRefs(data)
-
-// 鏌ヨ鍒楄〃
-/** 鎼滅储鎸夐挳鎿嶄綔 */
-const handleQuery = () => {
- page.current = 1
- getList()
-}
-const paginationChange = (obj) => {
- page.current = obj.page;
- page.size = obj.limit;
- getList()
-}
-const getList = () => {
- tableLoading.value = true
- getStockInPage({ ...searchForm.value, ...page }).then(res => {
- tableLoading.value = false
- tableData.value = res.data.records
- total.value = res.data.total
- console.log('tableData:', tableData.value)
- }).catch(() => {
- tableLoading.value = false
- })
-}
-
-
-// 璋冪敤selectProductRecordListByPuechaserId杩欎釜鏂规硶鏍规嵁鍚堝悓鏌ヨ鍒癷d锛屽啀璋冪敤getProductRecordByhetong杩欎釜鏂规硶鏍规嵁id鏌ヨ鍒颁骇鍝佽鍗曡褰�
-// 鏂板鏍规嵁鍚堝悓鍙锋煡璇骇鍝佽褰曠殑鏂规硶
-const searchByContractNo = async () =>
-{
- if (!form.value.purchaseContractNumber) {
- proxy.$modal.msgWarning('璇疯緭鍏ュ悎鍚屽彿')
- return
- }
- try {
- loadingProducts.value = true
- // 鏍规嵁鍚堝悓鏌ヨ浜у搧璁板綍
- const productRes = await selectProductRecordListByPuechaserId({
- purchaseContractNumber: form.value.purchaseContractNumber
- });
- console.log('productRes:', productRes)
- if (!productRes.data || productRes.data.length === 0) {
- proxy.$modal.msgWarning('璇ュ悎鍚屼笅娌℃湁浜у搧璁板綍')
- productList.value = [];
- return
- }
- // 澶勭悊浜у搧鏁版嵁锛屾坊鍔犳湰娆″叆搴撴暟閲忓瓧娈�
- productList.value = productRes.data.map(item => ({
- ...item,
- quantityStock: 0 // 鍒濆鍖栨湰娆″叆搴撴暟閲忎负0
- }))
- } catch (error) {
- console.error('鏌ヨ浜у搧璁板綍澶辫触:', error)
- proxy.$modal.msgError('鏌ヨ浜у搧璁板綍澶辫触')
- productList.value = [];
- } finally {
- loadingProducts.value = false
- }
-}
-
-
-// 鎵撳紑寮规
- const openForm = async (type, row) => {
- operationType.value = type
- dialogFormVisible.value = true
- selectedRows.value = []
-
- if (type === 'add') {
- // 鏂板鏃跺垵濮嬪寲琛ㄥ崟
- form.value = {
- id: null,
- purchaseContractNumber: '',
- supplierId: null,
- supplierName: '',
- inboundTime: '',
- inboundBatch: '',
- recorderId: userStore.userId,
- recorderName: userStore.name,
- entryDate: getCurrentDate(),
- remark: ''
- }
- productList.value = [] // 娓呯┖浜у搧鍒楄〃
- } else {
- form.value = JSON.parse(JSON.stringify(row))
- try {
- loadingProducts.value = true
- // 鏍规嵁鍚堝悓鍙峰姞杞藉搴旂殑浜у搧鍒楄〃锛堝亣璁� getProductByContract 鏄彲鐢ㄦ帴鍙o級
- const res = await selectProductRecordListByPuechaserId({
- purchaseContractNumber: form.value.purchaseContractNumber,
- id: row.id
- });
- productList.value = res.data.map(item => ({
- ...item,
- quantityStock: row.inboundNum // 濡傛灉宸叉湁鍏ュ簱鏁伴噺鍒欎繚鐣�
- }))
- selectedRows.value = productList.value
- } catch (error) {
- console.error('鍔犺浇浜у搧澶辫触:', error)
- proxy.$modal.msgError('鍔犺浇浜у搧澶辫触')
- productList.value = []
- } finally {
- loadingProducts.value = false
- }
- }
- }
-
- const updatePro = async () => {
- // 鍑嗗鎻愪氦鏁版嵁
- // 鍑嗗鎻愪氦鏁版嵁 - 淇敼涓哄悗绔渶瑕佺殑鏍煎紡
- const stockInData = {
- id: selectedRows.value[0].recordId,
- quantityStock: Number(selectedRows.value[0].quantityStock),// 浣跨敤鏂版牸寮忓寲鍑芥暟
- };
- await updateStockIn(stockInData)
- proxy.$modal.msgSuccess('淇敼鍏ュ簱鎴愬姛')
- closeDia()
- getList() // 鍒锋柊鍒楄〃
- }
-
-// 鎻愪氦琛ㄥ崟
- const submitForm = async () => {
- // 楠岃瘉鑷冲皯閫夋嫨浜嗕竴涓骇鍝�
- if (selectedRows.value.length === 0) {
- proxy.$modal.msgError('璇峰厛鏌ヨ骞堕�夋嫨浜у搧')
- return
- }
- if(operationType.value !== 'add'){
- await updatePro()
- return
- }
- try {
- await proxy.$refs.formRef.validate()
- // 楠岃瘉鍏ュ簱鏁伴噺
- const invalidProducts = selectedRows.value.filter(
- product => product.quantityStock <= 0 || product.quantityStock > product.quantity0
- )
-
- if (invalidProducts.length > 0) {
- proxy.$modal.msgError('璇蜂负鎵�鏈変骇鍝佽緭鍏ユ湁鏁堢殑鍏ュ簱鏁伴噺')
- return
- }
-
- // 鍑嗗鎻愪氦鏁版嵁
- // 鍑嗗鎻愪氦鏁版嵁 - 淇敼涓哄悗绔渶瑕佺殑鏍煎紡
- const stockInData = {
- // 鍏ュ簱鍗曞熀鏈俊鎭�
- ...form.value,
- inboundTime: formatDateTime(form.value.inboundTime),
- nickName: userStore.nickName,// 浣跨敤鏂版牸寮忓寲鍑芥暟
- details: selectedRows.value.map(product => ({
- id: product.id,
- inboundQuantity: Number(product.quantityStock)
- })),
- };
- console.log('鍑嗗鎻愪氦鐨勬暟鎹�:', JSON.parse(JSON.stringify(stockInData)));
- // 璋冪敤API
- loading.value = true
- await addSutockIn(stockInData)
-
- proxy.$modal.msgSuccess('鏂板鍏ュ簱鎴愬姛')
- closeDia()
- getList() // 鍒锋柊鍒楄〃
-
- } catch (error) {
- console.error('鎻愪氦澶辫触:', error)
- if (!error.errors) {
- proxy.$modal.msgError('鎿嶄綔澶辫触锛岃閲嶈瘯')
- }
- } finally {
- loading.value = false
- }
- }
-
-// 鍏抽棴寮规
- const closeDia = () => {
- proxy.$refs.formRef.resetFields()
- dialogFormVisible.value = false
-
- }
-// 琛ㄦ牸閫夋嫨鏁版嵁
- const handleSelectionChange = (selection) => {
- // 杩囨护鎺夊瓙鏁版嵁
- selectedRows.value = selection.filter(item => item.id);
- console.log('selection', selectedRows.value)
- }
-
- const expandedRowKeys = ref([])
-
-// 涓昏〃鍚堣鏂规硶
- const summarizeMainTable = (param) => {
- return proxy.summarizeTable(param, ['contractAmount', 'taxInclusiveTotalPrice', 'taxExclusiveTotalPrice']);
- };
-
-// 瀵煎嚭
- const handleOut = () => {
- ElMessageBox.confirm(
- '鏄惁纭瀵煎嚭锛�',
- '瀵煎嚭', {
- confirmButtonText: '纭',
- cancelButtonText: '鍙栨秷',
- type: 'warning',
- }
- ).then(() => {
- proxy.download("/stockin/export", {}, '鍏ュ簱鍙拌处.xlsx')
- }).catch(() => {
- proxy.$modal.msg("宸插彇娑�")
- })
- }
-// 鍒犻櫎
- const handleDelete = () => {
- let ids = []
- if (selectedRows.value.length > 0) {
- // 妫�鏌ユ槸鍚︽湁浠栦汉缁存姢鐨勬暟鎹�
- const unauthorizedData = selectedRows.value.filter(item => item.createUser !== userStore.id);
- if (unauthorizedData.length > 0) {
- proxy.$modal.msgWarning("涓嶅彲鍒犻櫎浠栦汉缁存姢鐨勬暟鎹�");
- return;
- }
- ids = selectedRows.value.map(item => item.id);
- } else {
- proxy.$modal.msgWarning('璇烽�夋嫨鏁版嵁')
- return
- }
- ElMessageBox.confirm(
- '閫変腑鐨勫唴瀹瑰皢琚垹闄わ紝鏄惁纭鍒犻櫎锛�',
- '瀵煎嚭', {
- confirmButtonText: '纭',
- cancelButtonText: '鍙栨秷',
- type: 'warning',
- }
- ).then(() => {
- delStockIn({ids:ids}).then(res => {
- proxy.$modal.msgSuccess("鍒犻櫎鎴愬姛")
- getList()
- })
- }).catch(() => {
- proxy.$modal.msg("宸插彇娑�")
- })
- }
-
-// 鑾峰彇褰撳墠鏃ユ湡骞舵牸寮忓寲涓� YYYY-MM-DD
-// 淇敼涓烘洿閫氱敤鐨勬棩鏈熸椂闂存牸寮忓寲鍑芥暟
-function formatDateTime(date = new Date(), includeTime = true) {
- const d = new Date(date);
- const year = d.getFullYear();
- const month = String(d.getMonth() + 1).padStart(2, '0');
- const day = String(d.getDate()).padStart(2, '0');
-
- if (!includeTime) {
- return `${year}-${month}-${day}`; // 淇濇寔鍘熸湁 getCurrentDate 鍔熻兘
- }
-
- // 鏂板鏃堕棿閮ㄥ垎鏍煎紡鍖�
- const hours = String(d.getHours()).padStart(2, '0');
- const minutes = String(d.getMinutes()).padStart(2, '0');
- const seconds = String(d.getSeconds()).padStart(2, '0');
-
- return `${year}-${month}-${day} ${hours}:${minutes}:${seconds}`;
-}
-
-// 淇濇寔鍘熸湁 getCurrentDate 鐨勫吋瀹规��
-function getCurrentDate() {
- return formatDateTime(new Date(), false);
-}
-
-
-
-
- onMounted(() => {
- getList()
- })
-</script>
-
-<style scoped lang="scss"></style>
diff --git a/src/views/inventoryManagement/stockManagement/index.vue b/src/views/inventoryManagement/stockManagement/index.vue
deleted file mode 100644
index 06fcaf8..0000000
--- a/src/views/inventoryManagement/stockManagement/index.vue
+++ /dev/null
@@ -1,382 +0,0 @@
-<template>
- <div class="app-container">
- <div class="search_form">
- <div>
- <span class="search_title">渚涘簲鍟嗗悕绉帮細</span>
- <el-input v-model="searchForm.supplierName" style="width: 240px" placeholder="璇疯緭鍏�" @change="handleQuery"
- clearable prefix-icon="Search" />
- <el-button type="primary" @click="handleQuery" style="margin-left: 10px">鎼滅储</el-button>
- </div>
- <div>
- <!-- <el-button type="primary" @click="openForm('add')">鏂板</el-button> -->
- <el-button @click="handleOut">瀵煎嚭</el-button>
- <el-button type="danger" plain @click="handleDelete">鍒犻櫎</el-button>
- </div>
- </div>
- <div class="table_list">
- <el-table :data="tableData" border v-loading="tableLoading" @selection-change="handleSelectionChange"
- :expand-row-keys="expandedRowKeys" :row-key="row => row.id" show-summary style="width: 100%"
- :summary-method="summarizeMainTable" height="calc(100vh - 18.5em)" stripe>
- <el-table-column align="center" type="selection" width="55" />
- <el-table-column align="center" label="搴忓彿" type="index" width="60" />
- <el-table-column label="搴撳瓨鏃ユ湡" prop="createTime" width="100" show-overflow-tooltip />
- <el-table-column label="鍏ュ簱鏃ユ湡" prop="createTime" width="100" show-overflow-tooltip />
- <el-table-column label="渚涘簲鍟嗗悕绉�" prop="supplierName" width="240" show-overflow-tooltip />
- <el-table-column label="浜у搧澶х被" prop="productCategory" width="100" show-overflow-tooltip />
- <el-table-column label="瑙勬牸鍨嬪彿" prop="specificationModel" width="200" show-overflow-tooltip />
- <el-table-column label="鍗曚綅" prop="unit" width="80" show-overflow-tooltip />
- <el-table-column label="搴撳瓨鏁伴噺" prop="inboundNum0" width="100" show-overflow-tooltip />
- <el-table-column label="鍚◣鍗曚环" prop="taxInclusiveUnitPrice" width="100" show-overflow-tooltip />
- <el-table-column label="鍚◣鎬讳环" prop="taxInclusiveTotalPrice" width="100" show-overflow-tooltip />
- <el-table-column label="绋庣巼(%)" prop="taxRate" width="100" show-overflow-tooltip />
- <el-table-column label="涓嶅惈绋庢�讳环" prop="taxExclusiveTotalPrice" width="100" show-overflow-tooltip />
- <el-table-column label="鍏ュ簱浜�" prop="createBy" width="80" show-overflow-tooltip />
- <el-table-column fixed="right" label="鎿嶄綔" min-width="60" align="center">
- <template #default="scope">
- <el-button link type="primary" size="small" @click="openForm('edit', scope.row);" :disabled="scope.row.createUser !== userStore.id">缂栬緫</el-button>
- </template>
- </el-table-column>
- </el-table>
- <pagination v-show="total > 0" :total="total" layout="total, sizes, prev, pager, next, jumper"
- :page="page.current" :limit="page.size" @pagination="paginationChange" />
- </div>
- <el-dialog v-model="dialogFormVisible" :title="operationType === 'add' ? '鏂板搴撳瓨' : '缂栬緫搴撳瓨'" width="70%"
- @close="closeDia">
- <el-form :model="form" label-width="140px" label-position="top" :rules="rules" ref="formRef">
- <el-row :gutter="30">
- <el-col :span="12">
- <el-form-item label="渚涘簲鍟嗗悕绉帮細" prop="supplierName">
- <el-input disabled v-model="form.supplierName" placeholder="璇疯緭鍏�" clearable />
- </el-form-item>
- </el-col>
- <el-col :span="12">
- <el-form-item label="浜у搧澶х被锛�" prop="productId">
- <el-select disabled v-model="form.productCategory" placeholder="璇烽�夋嫨" clearable filterable @change="handleProductChange">
- <el-option v-for="item in productList" :key="item.id" :label="item.productName"
- :value="item.productName" />
- </el-select>
- </el-form-item>
- </el-col>
- </el-row>
- <el-row :gutter="30">
- <el-col :span="12">
- <el-form-item label="瑙勬牸鍨嬪彿锛�" prop="productManageId">
- <el-select disabled v-model="form.specificationModel" placeholder="璇峰厛閫夋嫨浜у搧澶х被" clearable filterable :disabled="!form.productCategory"
- @change="handleModelChange">
- <el-option v-for="item in productModelList" :key="item.id" :label="item.model"
- :value="item.id" />
- </el-select>
- </el-form-item>
- </el-col>
- <el-col :span="12">
- <el-form-item label="鍗曚綅锛�" prop="customerId">
- <el-input disabled v-model="form.unit" placeholder="璇疯緭鍏�" clearable />
- </el-form-item>
- </el-col>
- </el-row>
- <el-row :gutter="30">
- <el-col :span="12">
- <el-form-item label="搴撳瓨鏃堕棿锛�" prop="projectName">
- <el-date-picker style="width: 100%" v-model="form.updateTime" value-format="YYYY-MM-DD" format="YYYY-MM-DD"
- type="date" placeholder="璇烽�夋嫨" clearable />
- </el-form-item>
- </el-col>
- <el-col :span="12">
- <el-form-item label="鍏ュ簱鏃堕棿锛�" prop="projectName">
- <el-date-picker style="width: 100%" v-model="form.createTime" value-format="YYYY-MM-DD" format="YYYY-MM-DD"
- type="date" placeholder="璇烽�夋嫨" clearable />
- </el-form-item>
- </el-col>
- </el-row>
- <el-row :gutter="30">
-
- <el-col :span="12">
- <el-form-item label="鍚◣鍗曚环锛�" prop="customerId">
- <el-input disabled v-model="form.taxInclusiveUnitPrice" placeholder="璇疯緭鍏�" clearable />
- </el-form-item>
- </el-col>
- <el-col :span="12">
- <el-form-item label="鍚◣鎬讳环锛�" prop="customerContractNo">
- <el-input disabled v-model="form.taxInclusiveTotalPrice" placeholder="璇疯緭鍏�" clearable />
- </el-form-item>
- </el-col>
- </el-row>
- <el-row :gutter="30">
-
- <el-col :span="12">
- <el-form-item label="绋庣巼锛�" prop="customerId">
- <el-input disabled v-model="form.taxRate" placeholder="璇疯緭鍏�" clearable />
- </el-form-item>
- </el-col>
- <el-col :span="12">
- <el-form-item label="涓嶅惈绋庢�讳环锛�" prop="entryDate">
- <el-input disabled v-model="form.taxExclusiveTotalPrice" placeholder="璇疯緭鍏�" clearable />
- </el-form-item>
- </el-col>
- </el-row>
- <el-row :gutter="30">
-
- <el-col :span="12">
- <el-form-item label="鍑哄簱浜猴細" prop="entryPerson">
- <el-select v-model="form.createUser" placeholder="璇烽�夋嫨" clearable>
- <el-option v-for="item in userList" :key="item.userId" :label="item.nickName" :value="item.userId" />
- </el-select>
- </el-form-item>
- </el-col>
- </el-row>
- </el-form>
- <template #footer>
- <div class="dialog-footer">
- <el-button type="primary" @click="submitForm">纭</el-button>
- <el-button @click="closeDia">鍙栨秷</el-button>
- </div>
- </template>
- </el-dialog>
- </div>
-</template>
-
-<script setup>
-import pagination from '@/components/PIMTable/Pagination.vue'
-import { ref } from 'vue'
-import { ElMessageBox } from "element-plus";
-import useUserStore from '@/store/modules/user'
-import { userListNoPageByTenantId } from "@/api/system/user.js";
-import { productTreeList,modelList } from "@/api/basicData/product.js"
-import {
- getStockManagePage ,
- updateStockManage,
- delStockManage,
- exportStockManage
-} from "@/api/inventoryManagement/stockManage.js";
-import {
- updateManagement
-} from "@/api/inventoryManagement/stockIn.js";
-const userStore = useUserStore()
-const { proxy } = getCurrentInstance()
-const tableData = ref([])
-const productData = ref([])
-const selectedRows = ref([])
-const userList = ref([])
-const productList = ref([])
-const productModelList = ref([])
-// const customerOption = ref([])
-const tableLoading = ref(false)
-const page = reactive({
- current: 1,
- size: 100,
-})
-const total = ref(0)
-const fileList = ref([])
-
-// 鐢ㄦ埛淇℃伅琛ㄥ崟寮规鏁版嵁
-const operationType = ref('')
-const dialogFormVisible = ref(false)
-const data = reactive({
- searchForm: {
- supplierName: '',
- },
- form: {
- supplierId: null,
- supplierName: '',
- productId: null,
- productName: '',
- userId: userStore.userId,
- nickName: '',
- productModelId: null,
- model: '',
- unit: '',
- productrecordId: null,
- taxInclusiveUnitPrice: '',
- taxInclusiveTotalPrice: '',
- taxRate: '',
- taxExclusiveTotalPrice: '',
- inboundTime: '',
- inboundBatch: '',
- stockQuantity: '',
- boundTime: '',
- },
- rules: {
- supplierName: [{ required: true, message: '璇疯緭鍏ヤ緵搴斿晢鍚嶇О', trigger: 'blur' }],
- productCategory: [{ required: true, message: '璇烽�夋嫨浜у搧澶х被', trigger: 'change' }],
- specificationModel: [{ required: true, message: '璇疯緭鍏ヨ鏍煎瀷鍙�', trigger: 'blur' }],
- unit: [{ required: true, message: '璇疯緭鍏ュ崟浣�', trigger: 'blur' }],
- stockQuantity: [{ required: true, message: '璇疯緭鍏ュ嚭搴撴暟閲�', trigger: 'blur' }],
- taxInclusiveUnitPrice: [{ required: true, message: '璇疯緭鍏ュ惈绋庡崟浠�', trigger: 'blur' }],
- taxInclusiveTotalPrice: [{ required: true, message: '璇疯緭鍏ュ惈绋庢�讳环', trigger: 'blur' }],
- taxRate: [{ required: true, message: '璇疯緭鍏ョ◣鐜�', trigger: 'blur' }],
- taxExclusiveTotalPrice: [{ required: true, message: '璇疯緭鍏ヤ笉鍚◣鎬讳环', trigger: 'blur' }],
- boundTime: [{ required: true, message: '璇烽�夋嫨搴撳瓨鏃堕棿', trigger: 'change' }],
- inboundTime: [{ required: true, message: '璇烽�夋嫨鍏ュ簱鏃堕棿', trigger: 'change' }],
- inboundPerson: [{ required: true, message: '璇烽�夋嫨鍑哄簱浜�', trigger: 'change' }]
- }
-})
-const { searchForm, form, rules } = toRefs(data)
-
-// 鏌ヨ鍒楄〃
-/** 鎼滅储鎸夐挳鎿嶄綔 */
-const handleQuery = () => {
- page.current = 1
- getList()
-}
-const paginationChange = (obj) => {
- page.current = obj.page;
- page.size = obj.limit;
- getList()
-}
-const getList = () => {
- tableLoading.value = true
- getStockManagePage({ ...searchForm.value, ...page }).then(res => {
- tableLoading.value = false
- tableData.value = res.data.records
- console.log('res', res)
- // tableData.value.map(item => {
- // item.children = []
- // })
- total.value = res.data.total
- }).catch(() => {
- tableLoading.value = false
- })
-}
-
-// 琛ㄦ牸閫夋嫨鏁版嵁
-const handleSelectionChange = (selection) => {
-
- // 杩囨护鎺夊瓙鏁版嵁
- selectedRows.value = selection.filter(item => item.id);
- console.log('selection', selectedRows.value)
-}
-const expandedRowKeys = ref([])
-
-// 涓昏〃鍚堣鏂规硶
-const summarizeMainTable = (param) => {
- return proxy.summarizeTable(param, ['contractAmount', 'taxInclusiveTotalPrice', 'taxExclusiveTotalPrice']);
-};
-
-// 鎵撳紑寮规
-const openForm = async (type, row) => {
- operationType.value = type
- form.value = {}
- productData.value = []
- let userLists = await userListNoPageByTenantId()
- userList.value = userLists.data
- // customerList().then(res => {
- // customerOption.value = res
- // })
- // console.log('userStore.id', userStore.id)
- // form.value.entryPerson = userStore.id
- if (type === 'edit') {
- form.value = { ...row }
- productTreeList().then(res =>{
- productList.value = res
- productList.value.forEach(i =>{
- if (i.label === row.productCategory) {
- modelList({ id: i.id }).then((res) => {
- productModelList.value = res;
- });
- }
- })
- })
-
-
- // getSalesLedgerWithProducts({ id: row.id, type: 1 }).then(res => {
-
- // form.value.entryPerson = Number(res.entryPerson)
- // productData.value = form.value.productData
- // fileList.value = form.value.salesLedgerFiles
- // })
- }
- form.value.entryDate = getCurrentDate() // 璁剧疆榛樿褰曞叆鏃ユ湡涓哄綋鍓嶆棩鏈�
- dialogFormVisible.value = true
-}
-
-// 鎻愪氦琛ㄥ崟
-const submitForm = () => {
- console.log(form.value)
- proxy.$refs["formRef"].validate(valid => {
- if (valid) {
- // if (productData.value.length > 0) {
- // form.value.productData = proxy.HaveJson(productData.value)
- // } else {
- // proxy.$modal.msgWarning('璇锋坊鍔犱骇鍝佷俊鎭�')
- // return
- // }
- // let tempFileIds = []
- // if (fileList.value.length > 0) {
- // tempFileIds = fileList.value.map(item => item.tempId)
- // }
- // form.value.tempFileIds = tempFileIds
- // form.value.type = 1
- updateManagement(form.value).then(res => {
- proxy.$modal.msgSuccess("鎻愪氦鎴愬姛")
- closeDia()
- getList()
- })
- }
- })
-}
-// 鍏抽棴寮规
-const closeDia = () => {
- proxy.resetForm("formRef")
- dialogFormVisible.value = false
-}
-
-// 瀵煎嚭
-const handleOut = () => {
- ElMessageBox.confirm(
- '鏄惁纭瀵煎嚭锛�',
- '瀵煎嚭', {
- confirmButtonText: '纭',
- cancelButtonText: '鍙栨秷',
- type: 'warning',
- }
- ).then(() => {
- proxy.download("/stockin/exportCopy", {}, '搴撳瓨淇℃伅.xlsx')
- }).catch(() => {
- proxy.$modal.msg("宸插彇娑�")
- })
-}
-// 鍒犻櫎
-const handleDelete = () => {
- let ids = []
- if (selectedRows.value.length > 0) {
- // 妫�鏌ユ槸鍚︽湁浠栦汉缁存姢鐨勬暟鎹�
- const unauthorizedData = selectedRows.value.filter(item => item.createUser !== userStore.id);
- if (unauthorizedData.length > 0) {
- proxy.$modal.msgWarning("涓嶅彲鍒犻櫎浠栦汉缁存姢鐨勬暟鎹�");
- return;
- }
- ids = selectedRows.value.map(item => item.id);
- } else {
- proxy.$modal.msgWarning('璇烽�夋嫨鏁版嵁')
- return
- }
- ElMessageBox.confirm(
- '閫変腑鐨勫唴瀹瑰皢琚垹闄わ紝鏄惁纭鍒犻櫎锛�',
- '瀵煎嚭', {
- confirmButtonText: '纭',
- cancelButtonText: '鍙栨秷',
- type: 'warning',
- }
- ).then(() => {
- delStockManage({ids:ids}).then(res => {
- proxy.$modal.msgSuccess("鍒犻櫎鎴愬姛")
- getList()
- })
- }).catch(() => {
- proxy.$modal.msg("宸插彇娑�")
- })
-}
-// 鑾峰彇褰撳墠鏃ユ湡骞舵牸寮忓寲涓� YYYY-MM-DD
-function getCurrentDate() {
- const today = new Date();
- const year = today.getFullYear();
- const month = String(today.getMonth() + 1).padStart(2, '0'); // 鏈堜唤浠�0寮�濮�
- const day = String(today.getDate()).padStart(2, '0');
- return `${year}-${month}-${day}`;
-}
-onMounted(() => {
- getList()
-})
-</script>
-
-<style scoped lang="scss"></style>
diff --git a/src/views/inventoryManagement/stockWarning/index.vue b/src/views/inventoryManagement/stockWarning/index.vue
deleted file mode 100644
index 4193352..0000000
--- a/src/views/inventoryManagement/stockWarning/index.vue
+++ /dev/null
@@ -1,1138 +0,0 @@
-<template>
- <div class="app-container">
- <!-- 鎼滅储琛ㄥ崟 -->
- <div class="search_form">
- <el-form :model="searchForm" :inline="true">
- <el-form-item label="鍌ㄦ皵缃愬悕绉帮細">
- <el-input v-model="searchForm.tankName" placeholder="璇疯緭鍏ュ偍姘旂綈鍚嶇О" clearable style="width: 200px" />
- </el-form-item>
- <el-form-item label="鍌ㄦ皵缃愮被鍨嬶細">
- <el-select v-model="searchForm.tankType" placeholder="璇烽�夋嫨鍌ㄦ皵缃愮被鍨�" clearable style="width: 200px">
- <el-option label="娑插寲姘斿偍缃�" value="娑插寲姘斿偍缃�" />
- <el-option label="鍘嬬缉姘斿偍缃�" value="鍘嬬缉姘斿偍缃�" />
- <el-option label="澶╃劧姘斿偍缃�" value="澶╃劧姘斿偍缃�" />
- <el-option label="姘ф皵鍌ㄧ綈" value="姘ф皵鍌ㄧ綈" />
- </el-select>
- </el-form-item>
- <el-form-item label="棰勮绫诲瀷锛�">
- <el-select v-model="searchForm.warningType" placeholder="璇烽�夋嫨棰勮绫诲瀷" clearable style="width: 200px">
- <el-option label="姘斾綋涓嶈冻" value="姘斾綋涓嶈冻" />
- <el-option label="鍘嬪姏寮傚父" value="鍘嬪姏寮傚父" />
- <el-option label="娓╁害寮傚父" value="娓╁害寮傚父" />
- <el-option label="娉勬紡棰勮" value="娉勬紡棰勮" />
- </el-select>
- </el-form-item>
- <el-form-item label="棰勮绾у埆锛�">
- <el-select v-model="searchForm.warningLevel" placeholder="璇烽�夋嫨棰勮绾у埆" clearable style="width: 200px">
- <el-option label="绱ф��" value="绱ф��" />
- <el-option label="閲嶈" value="閲嶈" />
- <el-option label="涓�鑸�" value="涓�鑸�" />
- </el-select>
- </el-form-item>
- <el-form-item>
- <el-button type="primary" @click="handleQuery">鎼滅储</el-button>
- <el-button @click="resetQuery">閲嶇疆</el-button>
- </el-form-item>
- </el-form>
- </div>
-
- <!-- 鏁版嵁琛ㄦ牸 -->
- <div class="table_list">
- <!-- 鎿嶄綔鎸夐挳 -->
- <div class="table-operations">
- <el-button type="primary" @click="handleAdd">鏂板棰勮瑙勫垯</el-button>
- <el-button type="success" @click="handleBatchProcess">鎵归噺澶勭悊</el-button>
- <el-button @click="handleExport">瀵煎嚭</el-button>
- </div>
- <el-table
- :data="tableData"
- border
- v-loading="tableLoading"
- @selection-change="handleSelectionChange"
- style="width: 100%"
- height="calc(100vh - 280px)"
- stripe
- >
- <el-table-column align="center" type="selection" width="55" />
- <el-table-column align="center" label="搴忓彿" type="index" width="60" />
-
- <!-- 鍩虹淇℃伅瀛楁 -->
- <el-table-column label="鍌ㄦ皵缃愮紪鐮�" prop="tankCode" width="120" show-overflow-tooltip />
- <el-table-column label="鍌ㄦ皵缃愬悕绉�" prop="tankName" width="200" show-overflow-tooltip />
- <el-table-column label="鍌ㄦ皵缃愮被鍨�" prop="tankType" width="120" show-overflow-tooltip />
- <el-table-column label="瑙勬牸鍨嬪彿" prop="specificationModel" width="150" show-overflow-tooltip />
- <el-table-column label="瀹圭Н(m鲁)" prop="volume" width="100" show-overflow-tooltip />
-
- <!-- 搴撳瓨鐩稿叧瀛楁 -->
- <el-table-column label="褰撳墠姘斾綋閲�" prop="currentGasLevel" width="120" show-overflow-tooltip>
- <template #default="scope">
- <span :class="getGasLevelClass(scope.row)">{{ scope.row.currentGasLevel }}%</span>
- </template>
- </el-table-column>
- <el-table-column label="瀹夊叏姘斾綋閲�" prop="safetyGasLevel" width="120" show-overflow-tooltip />
- <el-table-column label="鏈�浣庢皵浣撻噺" prop="minGasLevel" width="120" show-overflow-tooltip />
- <el-table-column label="鏈�楂樻皵浣撻噺" prop="maxGasLevel" width="120" show-overflow-tooltip />
- <el-table-column label="褰撳墠鍘嬪姏(MPa)" prop="currentPressure" width="140" show-overflow-tooltip />
-
- <!-- 棰勮瑙勫垯瀛楁 -->
- <el-table-column label="棰勮绫诲瀷" prop="warningType" width="100" show-overflow-tooltip>
- <template #default="scope">
- <el-tag :type="getWarningTypeTag(scope.row.warningType)">
- {{ scope.row.warningType }}
- </el-tag>
- </template>
- </el-table-column>
- <el-table-column label="棰勮绾у埆" prop="warningLevel" width="100" show-overflow-tooltip>
- <template #default="scope">
- <el-tag :type="getWarningLevelTag(scope.row.warningLevel)">
- {{ scope.row.warningLevel }}
- </el-tag>
- </template>
- </el-table-column>
- <el-table-column label="棰勮闃堝��" prop="warningThreshold" width="100" show-overflow-tooltip />
- <el-table-column label="鏄惁鍚敤" prop="isEnabled" width="100" show-overflow-tooltip>
- <template #default="scope">
- <el-switch v-model="scope.row.isEnabled" @change="handleEnableChange(scope.row)" />
- </template>
- </el-table-column>
-
- <!-- 鏃堕棿鐩稿叧瀛楁 -->
- <el-table-column label="棰勮鏃堕棿" prop="warningTime" width="150" show-overflow-tooltip />
- <el-table-column label="棰勮鎸佺画澶╂暟" prop="warningDuration" width="120" show-overflow-tooltip />
- <el-table-column label="鏈�鍚庢洿鏂版椂闂�" prop="lastUpdateTime" width="150" show-overflow-tooltip />
- <el-table-column label="棰勮鍏呰鏃堕棿" prop="expectedRefillTime" width="150" show-overflow-tooltip />
- <el-table-column label="棰勮缂烘皵鏃堕棿" prop="expectedShortageTime" width="150" show-overflow-tooltip>
- <template #default="scope">
- <div v-if="scope.row.expectedShortageTime">
- <div v-if="getCountdown(scope.row.expectedShortageTime).isExpired" class="countdown-expired">
- <el-tag type="danger">宸茬己姘�</el-tag>
- </div>
- <div v-else class="countdown-timer">
- <span :class="getCountdownClass(scope.row.expectedShortageTime)">
- {{ getCountdown(scope.row.expectedShortageTime).text }}
- </span>
- </div>
- </div>
- <span v-else>-</span>
- </template>
- </el-table-column>
-
- <!-- 鎿嶄綔鍒� -->
- <el-table-column fixed="right" label="鎿嶄綔" width="200" align="center">
- <template #default="scope">
- <el-button link type="primary" size="small" @click="handleEdit(scope.row)">缂栬緫</el-button>
- <el-button link type="success" size="small" @click="handleProcess(scope.row)">澶勭悊</el-button>
- <el-button link type="danger" size="small" @click="handleDelete(scope.row)">鍒犻櫎</el-button>
- </template>
- </el-table-column>
- </el-table>
-
- <!-- 鍒嗛〉 -->
- <pagination
- v-show="total > 0"
- :total="total"
- layout="total, sizes, prev, pager, next, jumper"
- :page="page.current"
- :limit="page.size"
- @pagination="paginationChange"
- />
- </div>
-
- <!-- 鏂板/缂栬緫棰勮瑙勫垯寮圭獥 -->
- <el-dialog
- v-model="dialogFormVisible"
- :title="operationType === 'add' ? '鏂板棰勮瑙勫垯' : '缂栬緫棰勮瑙勫垯'"
- width="50%"
- @close="closeDialog"
- >
- <el-form :model="form" :rules="rules" ref="formRef" label-width="140px">
- <el-row :gutter="20">
- <!-- 鍩虹淇℃伅 -->
- <el-col :span="12">
- <el-form-item label="鍌ㄦ皵缃愮紪鐮侊細" prop="tankCode">
- <el-input v-model="form.tankCode" placeholder="璇疯緭鍏ュ偍姘旂綈缂栫爜" />
- </el-form-item>
- </el-col>
- <el-col :span="12">
- <el-form-item label="鍌ㄦ皵缃愬悕绉帮細" prop="tankName">
- <el-input v-model="form.tankName" placeholder="璇疯緭鍏ュ偍姘旂綈鍚嶇О" />
- </el-form-item>
- </el-col>
- </el-row>
-
- <el-row :gutter="20">
- <el-col :span="12">
- <el-form-item label="鍌ㄦ皵缃愮被鍨嬶細" prop="tankType">
- <el-select v-model="form.tankType" placeholder="璇烽�夋嫨鍌ㄦ皵缃愮被鍨�" style="width: 100%">
- <el-option label="娑插寲姘斿偍缃�" value="娑插寲姘斿偍缃�" />
- <el-option label="鍘嬬缉姘斿偍缃�" value="鍘嬬缉姘斿偍缃�" />
- <el-option label="澶╃劧姘斿偍缃�" value="澶╃劧姘斿偍缃�" />
- <el-option label="姘ф皵鍌ㄧ綈" value="姘ф皵鍌ㄧ綈" />
- </el-select>
- </el-form-item>
- </el-col>
- <el-col :span="12">
- <el-form-item label="瑙勬牸鍨嬪彿锛�" prop="specificationModel">
- <el-input v-model="form.specificationModel" placeholder="璇疯緭鍏ヨ鏍煎瀷鍙�" />
- </el-form-item>
- </el-col>
- </el-row>
-
- <el-row :gutter="20">
- <el-col :span="12">
- <el-form-item label="瀹圭Н(m鲁)锛�" prop="volume">
- <el-input-number v-model="form.volume" :min="0" :precision="2" style="width: 100%" />
- </el-form-item>
- </el-col>
- <el-col :span="12">
- <el-form-item label="褰撳墠姘斾綋閲�(%)锛�" prop="currentGasLevel">
- <el-input-number v-model="form.currentGasLevel" :min="0" :max="100" :precision="1" style="width: 100%" />
- </el-form-item>
- </el-col>
- </el-row>
-
- <!-- 搴撳瓨鐩稿叧 -->
- <el-row :gutter="20">
- <el-col :span="12">
- <el-form-item label="瀹夊叏姘斾綋閲�(%)锛�" prop="safetyGasLevel">
- <el-input-number v-model="form.safetyGasLevel" :min="0" :max="100" :precision="1" style="width: 100%" />
- </el-form-item>
- </el-col>
- <el-col :span="12">
- <el-form-item label="鏈�浣庢皵浣撻噺(%)锛�" prop="minGasLevel">
- <el-input-number v-model="form.minGasLevel" :min="0" :max="100" :precision="1" style="width: 100%" />
- </el-form-item>
- </el-col>
- </el-row>
-
- <el-row :gutter="20">
- <el-col :span="12">
- <el-form-item label="鏈�楂樻皵浣撻噺(%)锛�" prop="maxGasLevel">
- <el-input-number v-model="form.maxGasLevel" :min="0" :max="100" :precision="1" style="width: 100%" />
- </el-form-item>
- </el-col>
- <el-col :span="12">
- <el-form-item label="褰撳墠鍘嬪姏(MPa)锛�" prop="currentPressure">
- <el-input-number v-model="form.currentPressure" :min="0" :precision="2" style="width: 100%" />
- </el-form-item>
- </el-col>
- </el-row>
-
- <!-- 棰勮瑙勫垯 -->
- <el-row :gutter="20">
- <el-col :span="12">
- <el-form-item label="棰勮绫诲瀷锛�" prop="warningType">
- <el-select v-model="form.warningType" placeholder="璇烽�夋嫨棰勮绫诲瀷" style="width: 100%">
- <el-option label="姘斾綋涓嶈冻" value="姘斾綋涓嶈冻" />
- <el-option label="鍘嬪姏寮傚父" value="鍘嬪姏寮傚父" />
- <el-option label="娓╁害寮傚父" value="娓╁害寮傚父" />
- <el-option label="娉勬紡棰勮" value="娉勬紡棰勮" />
- </el-select>
- </el-form-item>
- </el-col>
- <el-col :span="12">
- <el-form-item label="棰勮绾у埆锛�" prop="warningLevel">
- <el-select v-model="form.warningLevel" placeholder="璇烽�夋嫨棰勮绾у埆" style="width: 100%">
- <el-option label="绱ф��" value="绱ф��" />
- <el-option label="閲嶈" value="閲嶈" />
- <el-option label="涓�鑸�" value="涓�鑸�" />
- </el-select>
- </el-form-item>
- </el-col>
- </el-row>
-
- <el-row :gutter="20">
- <el-col :span="12">
- <el-form-item label="棰勮闃堝�硷細" prop="warningThreshold">
- <el-input-number v-model="form.warningThreshold" :min="0" :precision="2" style="width: 100%" />
- </el-form-item>
- </el-col>
- <el-col :span="12">
- <el-form-item label="鏄惁鍚敤锛�" prop="isEnabled">
- <el-switch v-model="form.isEnabled" />
- </el-form-item>
- </el-col>
- </el-row>
-
- <!-- 鏃堕棿鐩稿叧 -->
- <el-row :gutter="20">
- <el-col :span="12">
- <el-form-item label="棰勮鏃堕棿锛�" prop="warningTime">
- <el-date-picker
- v-model="form.warningTime"
- type="datetime"
- placeholder="璇烽�夋嫨棰勮鏃堕棿"
- style="width: 100%"
- value-format="YYYY-MM-DD HH:mm:ss"
- />
- </el-form-item>
- </el-col>
- <el-col :span="12">
- <el-form-item label="棰勮鍏呰鏃堕棿锛�" prop="expectedRefillTime">
- <el-date-picker
- v-model="form.expectedRefillTime"
- type="datetime"
- placeholder="璇烽�夋嫨棰勮鍏呰鏃堕棿"
- style="width: 100%"
- value-format="YYYY-MM-DD HH:mm:ss"
- />
- </el-form-item>
- </el-col>
- </el-row>
-
- <el-row :gutter="20">
- <el-col :span="12">
- <el-form-item label="棰勮缂烘皵鏃堕棿锛�" prop="expectedShortageTime">
- <el-date-picker
- v-model="form.expectedShortageTime"
- type="datetime"
- placeholder="璇烽�夋嫨棰勮缂烘皵鏃堕棿"
- style="width: 100%"
- value-format="YYYY-MM-DD HH:mm:ss"
- />
- </el-form-item>
- </el-col>
- <el-col :span="12">
- <el-form-item label="棰勮瑙勫垯鎻忚堪锛�" prop="warningRule">
- <el-input
- v-model="form.warningRule"
- type="textarea"
- :rows="3"
- placeholder="璇疯緭鍏ラ璀﹁鍒欐弿杩�"
- />
- </el-form-item>
- </el-col>
- </el-row>
- </el-form>
-
- <template #footer>
- <div class="dialog-footer">
- <el-button @click="closeDialog">鍙栨秷</el-button>
- <el-button type="primary" @click="submitForm">纭</el-button>
- </div>
- </template>
- </el-dialog>
-
- <!-- 缂烘皵棰勮寮规 -->
- <el-dialog
- v-model="shortageWarningVisible"
- title="鈿狅笍 缂烘皵棰勮"
- width="400px"
- :close-on-click-modal="false"
- :close-on-press-escape="false"
- :show-close="false"
- >
- <div class="shortage-warning-content">
- <div class="warning-icon">
- <el-icon size="48" color="#f56c6c"><WarningFilled /></el-icon>
- </div>
- <div class="warning-message">
- <h3>{{ currentWarningTank.tankName }}</h3>
- <p>鍌ㄦ皵缃愬凡缂烘皵锛岃鍙婃椂澶勭悊锛�</p>
- <p class="warning-details">
- 鍌ㄦ皵缃愮紪鐮侊細{{ currentWarningTank.tankCode }}<br>
- 鍌ㄦ皵缃愮被鍨嬶細{{ currentWarningTank.tankType }}<br>
- 褰撳墠姘斾綋閲忥細{{ currentWarningTank.currentGasLevel }}%
- </p>
- </div>
- </div>
- <template #footer>
- <div class="dialog-footer">
- <el-button type="primary" @click="handleShortageWarning">绔嬪嵆澶勭悊</el-button>
- <el-button @click="closeShortageWarning">绋嶅悗澶勭悊</el-button>
- </div>
- </template>
- </el-dialog>
-
- <!-- 缂烘皵棰勮寮规 -->
- <el-dialog
- v-model="shortageWarningVisible"
- title="鈿狅笍 缂烘皵棰勮"
- width="400px"
- :close-on-click-modal="false"
- :close-on-press-escape="false"
- :show-close="false"
- >
- <div class="shortage-warning-content">
- <div class="warning-icon">
- <el-icon size="48" color="#f56c6c"><WarningFilled /></el-icon>
- </div>
- <div class="warning-message">
- <h3>{{ currentWarningTank.tankName }}</h3>
- <p>鍌ㄦ皵缃愬凡缂烘皵锛岃鍙婃椂澶勭悊锛�</p>
- <p class="warning-details">
- 鍌ㄦ皵缃愮紪鐮侊細{{ currentWarningTank.tankCode }}<br>
- 鍌ㄦ皵缃愮被鍨嬶細{{ currentWarningTank.tankType }}<br>
- 褰撳墠姘斾綋閲忥細{{ currentWarningTank.currentGasLevel }}%
- </p>
- </div>
- </div>
- <template #footer>
- <div class="dialog-footer">
- <el-button type="primary" @click="handleShortageWarning">绔嬪嵆澶勭悊</el-button>
- <el-button @click="closeShortageWarning">绋嶅悗澶勭悊</el-button>
- </div>
- </template>
- </el-dialog>
- </div>
-</template>
-
-<script setup>
-import { ref, reactive, onMounted, onUnmounted } from 'vue'
-import { ElMessage, ElMessageBox } from 'element-plus'
-import { WarningFilled } from '@element-plus/icons-vue'
-import pagination from '@/components/PIMTable/Pagination.vue'
-// 娉ㄩ噴鎺堿PI瀵煎叆锛屼娇鐢ㄥ亣鏁版嵁
-// import {
-// getStockWarningPage,
-// addStockWarning,
-// updateStockWarning,
-// deleteStockWarning,
-// batchProcessStockWarning,
-// exportStockWarning,
-// toggleStockWarningStatus
-// } from '@/api/inventoryManagement/stockWarning.js'
-
-const { proxy } = getCurrentInstance()
-
-// 鍝嶅簲寮忔暟鎹�
-const tableData = ref([])
-const tableLoading = ref(false)
-const selectedRows = ref([])
-const dialogFormVisible = ref(false)
-const operationType = ref('add')
-const total = ref(0)
-
-// 缂烘皵棰勮鐩稿叧
-const shortageWarningVisible = ref(false)
-const currentWarningTank = ref({})
-const countdownTimer = ref(null)
-
-// 鍒嗛〉鍙傛暟
-const page = reactive({
- current: 1,
- size: 10
-})
-
-// 鎼滅储琛ㄥ崟
-const searchForm = reactive({
- tankName: '',
- tankType: '',
- warningType: '',
- warningLevel: ''
-})
-
-// 琛ㄥ崟鏁版嵁
-const form = reactive({
- id: null,
- tankCode: '',
- tankName: '',
- tankType: '',
- specificationModel: '',
- volume: 0,
- currentGasLevel: 0,
- safetyGasLevel: 0,
- minGasLevel: 0,
- maxGasLevel: 0,
- currentPressure: 0,
- warningType: '',
- warningLevel: '',
- warningThreshold: 0,
- isEnabled: true,
- warningTime: '',
- warningDuration: 0,
- lastUpdateTime: '',
- expectedRefillTime: '',
- expectedShortageTime: '',
- warningRule: ''
-})
-
-// 琛ㄥ崟楠岃瘉瑙勫垯
-const rules = {
- tankCode: [{ required: true, message: '璇疯緭鍏ュ偍姘旂綈缂栫爜', trigger: 'blur' }],
- tankName: [{ required: true, message: '璇疯緭鍏ュ偍姘旂綈鍚嶇О', trigger: 'blur' }],
- tankType: [{ required: true, message: '璇烽�夋嫨鍌ㄦ皵缃愮被鍨�', trigger: 'change' }],
- warningType: [{ required: true, message: '璇烽�夋嫨棰勮绫诲瀷', trigger: 'change' }],
- warningLevel: [{ required: true, message: '璇烽�夋嫨棰勮绾у埆', trigger: 'change' }],
- warningThreshold: [{ required: true, message: '璇疯緭鍏ラ璀﹂槇鍊�', trigger: 'blur' }]
-}
-
-// 鑾峰彇鍊掕鏃朵俊鎭�
-const getCountdown = (expectedTime) => {
- if (!expectedTime) return { text: '-', isExpired: false }
-
- const now = new Date().getTime()
- const expected = new Date(expectedTime).getTime()
- const diff = expected - now
-
- if (diff <= 0) {
- return { text: '宸茬己姘�', isExpired: true }
- }
-
- const days = Math.floor(diff / (1000 * 60 * 60 * 24))
- const hours = Math.floor((diff % (1000 * 60 * 60 * 24)) / (1000 * 60 * 60))
- const minutes = Math.floor((diff % (1000 * 60 * 60)) / (1000 * 60))
-
- if (days > 0) {
- return { text: `${days}澶�${hours}灏忔椂`, isExpired: false }
- } else if (hours > 0) {
- return { text: `${hours}灏忔椂${minutes}鍒嗛挓`, isExpired: false }
- } else {
- return { text: `${minutes}鍒嗛挓`, isExpired: false }
- }
-}
-
-// 鑾峰彇鍊掕鏃舵牱寮忕被
-const getCountdownClass = (expectedTime) => {
- if (!expectedTime) return ''
-
- const now = new Date().getTime()
- const expected = new Date(expectedTime).getTime()
- const diff = expected - now
-
- if (diff <= 0) {
- return 'countdown-expired'
- } else if (diff <= 24 * 60 * 60 * 1000) { // 24灏忔椂鍐�
- return 'countdown-urgent'
- } else if (diff <= 7 * 24 * 60 * 60 * 1000) { // 7澶╁唴
- return 'countdown-warning'
- } else {
- return 'countdown-normal'
- }
-}
-
-// 妫�鏌ョ己姘旈璀�
-const checkShortageWarnings = () => {
- tableData.value.forEach(tank => {
- if (tank.expectedShortageTime) {
- const countdown = getCountdown(tank.expectedShortageTime)
- if (countdown.isExpired && !tank.warningShown) {
- // 鏍囪宸叉樉绀洪璀︼紝閬垮厤閲嶅寮规
- tank.warningShown = true
- showShortageWarning(tank)
- }
- }
- })
-}
-
-// 鏄剧ず缂烘皵棰勮寮规
-const showShortageWarning = (tank) => {
- currentWarningTank.value = tank
- shortageWarningVisible.value = true
-
- // 鎾斁鎻愮ず闊筹紙鍙�夛級
- // const audio = new Audio('/path/to/warning-sound.mp3')
- // audio.play()
-}
-
-// 澶勭悊缂烘皵棰勮
-const handleShortageWarning = () => {
- ElMessage.success(`姝e湪澶勭悊鍌ㄦ皵缃� ${currentWarningTank.value.tankName} 鐨勭己姘旈棶棰榒)
- shortageWarningVisible.value = false
- // 杩欓噷鍙互璋冪敤澶勭悊API
-}
-// 澶勭悊缂烘皵棰勮
-const closeShortageWarning = () => {
- // ElMessage.success(`姝e湪澶勭悊鍌ㄦ皵缃� ${currentWarningTank.value.tankName} 鐨勭己姘旈棶棰榒)
- shortageWarningVisible.value = false
- // 杩欓噷鍙互璋冪敤澶勭悊API
-}
-
-
-
-// 鐢熸垚鍋囨暟鎹�
-const generateMockData = () => {
- const mockData = [
- {
- id: 1,
- tankCode: 'TANK001',
- tankName: '娑插寲姘斿偍缃怉',
- tankType: '娑插寲姘斿偍缃�',
- specificationModel: 'LPG-5000L',
- volume: 5000,
- currentGasLevel: 15,
- safetyGasLevel: 30,
- minGasLevel: 10,
- maxGasLevel: 95,
- currentPressure: 2.5,
- warningType: '姘斾綋涓嶈冻',
- warningLevel: '绱ф��',
- warningThreshold: 20,
- isEnabled: true,
- warningTime: '2024-01-15 08:30:00',
- warningDuration: 3,
- lastUpdateTime: '2024-01-15 10:00:00',
- expectedRefillTime: '2024-01-16 14:00:00',
- expectedShortageTime: '2024-01-15 18:30:00', // 浠婂ぉ涓嬪崍6:30缂烘皵
- warningRule: '褰撴皵浣撻噺浣庝簬20%鏃惰Е鍙戦璀�'
- },
- {
- id: 2,
- tankCode: 'TANK002',
- tankName: '鍘嬬缉姘斿偍缃怋',
- tankType: '鍘嬬缉姘斿偍缃�',
- specificationModel: 'COMP-3000L',
- volume: 3000,
- currentGasLevel: 45,
- safetyGasLevel: 25,
- minGasLevel: 15,
- maxGasLevel: 90,
- currentPressure: 8.2,
- warningType: '鍘嬪姏寮傚父',
- warningLevel: '閲嶈',
- warningThreshold: 10,
- isEnabled: true,
- warningTime: '2024-01-14 16:20:00',
- warningDuration: 2,
- lastUpdateTime: '2024-01-15 09:15:00',
- expectedRefillTime: '2024-01-17 09:00:00',
- expectedShortageTime: '2024-01-18 12:00:00', // 3澶╁悗缂烘皵
- warningRule: '褰撳帇鍔涜秴杩�8MPa鏃惰Е鍙戦璀�'
- },
- {
- id: 3,
- tankCode: 'TANK003',
- tankName: '澶╃劧姘斿偍缃怌',
- tankType: '澶╃劧姘斿偍缃�',
- specificationModel: 'NG-8000L',
- volume: 8000,
- currentGasLevel: 75,
- safetyGasLevel: 20,
- minGasLevel: 10,
- maxGasLevel: 95,
- currentPressure: 4.8,
- warningType: '娓╁害寮傚父',
- warningLevel: '涓�鑸�',
- warningThreshold: 5,
- isEnabled: true,
- warningTime: '2024-01-13 11:45:00',
- warningDuration: 1,
- lastUpdateTime: '2024-01-15 08:45:00',
- expectedRefillTime: '2024-01-20 10:00:00',
- expectedShortageTime: '2024-01-22 15:30:00', // 7澶╁悗缂烘皵
- warningRule: '褰撴俯搴﹁秴杩�60掳C鏃惰Е鍙戦璀�'
- },
- {
- id: 4,
- tankCode: 'TANK004',
- tankName: '姘ф皵鍌ㄧ綈D',
- tankType: '姘ф皵鍌ㄧ綈',
- specificationModel: 'O2-2000L',
- volume: 2000,
- currentGasLevel: 8,
- safetyGasLevel: 25,
- minGasLevel: 5,
- maxGasLevel: 90,
- currentPressure: 6.5,
- warningType: '娉勬紡棰勮',
- warningLevel: '绱ф��',
- warningThreshold: 15,
- isEnabled: true,
- warningTime: '2024-01-15 07:15:00',
- warningDuration: 4,
- lastUpdateTime: '2024-01-15 11:30:00',
- expectedRefillTime: '2024-01-15 16:00:00',
- expectedShortageTime: '2024-01-15 14:00:00', // 浠婂ぉ涓嬪崍2鐐圭己姘�
- warningRule: '褰撴娴嬪埌姘斾綋娉勬紡鏃惰Е鍙戦璀�'
- },
- {
- id: 5,
- tankCode: 'TANK005',
- tankName: '娑插寲姘斿偍缃怑',
- tankType: '娑插寲姘斿偍缃�',
- specificationModel: 'LPG-6000L',
- volume: 6000,
- currentGasLevel: 35,
- safetyGasLevel: 30,
- minGasLevel: 15,
- maxGasLevel: 95,
- currentPressure: 3.2,
- warningType: '姘斾綋涓嶈冻',
- warningLevel: '閲嶈',
- warningThreshold: 20,
- isEnabled: false,
- warningTime: '2024-01-14 14:30:00',
- warningDuration: 2,
- lastUpdateTime: '2024-01-15 09:00:00',
- expectedRefillTime: '2024-01-19 08:00:00',
- expectedShortageTime: '2024-01-21 10:00:00', // 6澶╁悗缂烘皵
- warningRule: '褰撴皵浣撻噺浣庝簬20%鏃惰Е鍙戦璀�'
- },
- {
- id: 6,
- tankCode: 'TANK006',
- tankName: '鍘嬬缉姘斿偍缃怓',
- tankType: '鍘嬬缉姘斿偍缃�',
- specificationModel: 'COMP-4000L',
- volume: 4000,
- currentGasLevel: 85,
- safetyGasLevel: 20,
- minGasLevel: 10,
- maxGasLevel: 90,
- currentPressure: 7.8,
- warningType: '鍘嬪姏寮傚父',
- warningLevel: '涓�鑸�',
- warningThreshold: 8,
- isEnabled: true,
- warningTime: '2024-01-12 09:20:00',
- warningDuration: 1,
- lastUpdateTime: '2024-01-15 08:30:00',
- expectedRefillTime: '2024-01-25 14:00:00',
- expectedShortageTime: '2024-01-28 16:00:00', // 13澶╁悗缂烘皵
- warningRule: '褰撳帇鍔涜秴杩�8MPa鏃惰Е鍙戦璀�'
- },
- {
- id: 7,
- tankCode: 'TANK007',
- tankName: '澶╃劧姘斿偍缃怗',
- tankType: '澶╃劧姘斿偍缃�',
- specificationModel: 'NG-10000L',
- volume: 10000,
- currentGasLevel: 92,
- safetyGasLevel: 15,
- minGasLevel: 8,
- maxGasLevel: 95,
- currentPressure: 5.2,
- warningType: '娓╁害寮傚父',
- warningLevel: '閲嶈',
- warningThreshold: 6,
- isEnabled: true,
- warningTime: '2024-01-11 16:45:00',
- warningDuration: 1,
- lastUpdateTime: '2024-01-15 07:45:00',
- expectedRefillTime: '2024-01-30 09:00:00',
- expectedShortageTime: '2024-02-05 12:00:00', // 21澶╁悗缂烘皵
- warningRule: '褰撴俯搴﹁秴杩�60掳C鏃惰Е鍙戦璀�'
- },
- {
- id: 8,
- tankCode: 'TANK008',
- tankName: '姘ф皵鍌ㄧ綈H',
- tankType: '姘ф皵鍌ㄧ綈',
- specificationModel: 'O2-1500L',
- volume: 1500,
- currentGasLevel: 12,
- safetyGasLevel: 30,
- minGasLevel: 8,
- maxGasLevel: 90,
- currentPressure: 4.5,
- warningType: '娉勬紡棰勮',
- warningLevel: '绱ф��',
- warningThreshold: 12,
- isEnabled: true,
- warningTime: '2024-01-15 06:30:00',
- warningDuration: 5,
- lastUpdateTime: '2024-01-15 12:15:00',
- expectedRefillTime: '2024-01-15 20:00:00',
- expectedShortageTime: '2024-01-15 17:30:00', // 浠婂ぉ涓嬪崍5:30缂烘皵
- warningRule: '褰撴娴嬪埌姘斾綋娉勬紡鏃惰Е鍙戦璀�'
- }
- ]
-
- // 鏍规嵁鎼滅储鏉′欢杩囨护鏁版嵁
- let filteredData = mockData.filter(item => {
- if (searchForm.tankName && !item.tankName.includes(searchForm.tankName)) return false
- if (searchForm.tankType && item.tankType !== searchForm.tankType) return false
- if (searchForm.warningType && item.warningType !== searchForm.warningType) return false
- if (searchForm.warningLevel && item.warningLevel !== searchForm.warningLevel) return false
- return true
- })
-
- // 鍒嗛〉澶勭悊
- const start = (page.current - 1) * page.size
- const end = start + page.size
- const paginatedData = filteredData.slice(start, end)
-
- return {
- records: paginatedData,
- total: filteredData.length
- }
-}
-
-// 鑾峰彇鍒楄〃鏁版嵁
-const getList = async () => {
- tableLoading.value = true
- try {
- // 妯℃嫙缃戠粶寤惰繜
- await new Promise(resolve => setTimeout(resolve, 500))
-
- const result = generateMockData()
- tableData.value = result.records
- total.value = result.total
-
- // 妫�鏌ョ己姘旈璀�
- checkShortageWarnings()
- } catch (error) {
- console.error('鑾峰彇鍒楄〃澶辫触:', error)
- ElMessage.error('鑾峰彇鍒楄〃澶辫触')
- } finally {
- tableLoading.value = false
- }
-}
-
-// 鎼滅储
-const handleQuery = () => {
- page.current = 1
- getList()
-}
-
-// 閲嶇疆鎼滅储
-const resetQuery = () => {
- Object.keys(searchForm).forEach(key => {
- searchForm[key] = ''
- })
- handleQuery()
-}
-
-// 鍒嗛〉鍙樺寲
-const paginationChange = (obj) => {
- page.current = obj.page
- page.size = obj.limit
- getList()
-}
-
-// 琛ㄦ牸閫夋嫨鍙樺寲
-const handleSelectionChange = (selection) => {
- selectedRows.value = selection
-}
-
-// 鏂板
-const handleAdd = () => {
- operationType.value = 'add'
- resetForm()
- dialogFormVisible.value = true
-}
-
-// 缂栬緫
-const handleEdit = (row) => {
- operationType.value = 'edit'
- Object.assign(form, row)
- dialogFormVisible.value = true
-}
-
-// 澶勭悊棰勮
-const handleProcess = async (row) => {
- try {
- // 妯℃嫙API璋冪敤寤惰繜
- await new Promise(resolve => setTimeout(resolve, 300))
- ElMessage.success(`姝e湪澶勭悊棰勮锛�${row.tankName}`)
- getList()
- } catch (error) {
- ElMessage.error('澶勭悊棰勮澶辫触')
- }
-}
-
-// 鍒犻櫎
-const handleDelete = async (row) => {
- try {
- await ElMessageBox.confirm(`纭畾瑕佸垹闄ら璀﹁鍒欙細${row.tankName}鍚楋紵`, '鎻愮ず', {
- confirmButtonText: '纭畾',
- cancelButtonText: '鍙栨秷',
- type: 'warning'
- })
-
- // 妯℃嫙API璋冪敤寤惰繜
- await new Promise(resolve => setTimeout(resolve, 300))
- ElMessage.success('鍒犻櫎鎴愬姛')
- getList()
- } catch (error) {
- if (error !== 'cancel') {
- ElMessage.error('鍒犻櫎澶辫触')
- }
- }
-}
-
-// 鎵归噺澶勭悊
-const handleBatchProcess = async () => {
- if (selectedRows.value.length === 0) {
- ElMessage.warning('璇烽�夋嫨瑕佸鐞嗙殑棰勮')
- return
- }
-
- try {
- // 妯℃嫙API璋冪敤寤惰繜
- await new Promise(resolve => setTimeout(resolve, 500))
- ElMessage.success(`鎵归噺澶勭悊浜� ${selectedRows.value.length} 鏉¢璀)
- getList()
- } catch (error) {
- ElMessage.error('鎵归噺澶勭悊澶辫触')
- }
-}
-
-// 瀵煎嚭
-const handleExport = async () => {
- try {
- // 妯℃嫙API璋冪敤寤惰繜
- await new Promise(resolve => setTimeout(resolve, 800))
-
- // 鐢熸垚瀵煎嚭鏁版嵁
- const exportData = generateMockData().records
- const csvContent = generateCSV(exportData)
-
- // 鍒涘缓涓嬭浇閾炬帴
- const blob = new Blob([csvContent], { type: 'text/csv;charset=utf-8;' })
- const url = window.URL.createObjectURL(blob)
- const link = document.createElement('a')
- link.href = url
- link.download = `鍌ㄦ皵缃愰璀︽暟鎹甠${new Date().getTime()}.csv`
- link.click()
- window.URL.revokeObjectURL(url)
-
- ElMessage.success('瀵煎嚭鎴愬姛')
- } catch (error) {
- ElMessage.error('瀵煎嚭澶辫触')
- }
-}
-
-// 鐢熸垚CSV鍐呭
-const generateCSV = (data) => {
- const headers = [
- '鍌ㄦ皵缃愮紪鐮�', '鍌ㄦ皵缃愬悕绉�', '鍌ㄦ皵缃愮被鍨�', '瑙勬牸鍨嬪彿', '瀹圭Н(m鲁)',
- '褰撳墠姘斾綋閲�(%)', '瀹夊叏姘斾綋閲�(%)', '鏈�浣庢皵浣撻噺(%)', '鏈�楂樻皵浣撻噺(%)',
- '褰撳墠鍘嬪姏(MPa)', '棰勮绫诲瀷', '棰勮绾у埆', '棰勮闃堝��', '鏄惁鍚敤',
- '棰勮鏃堕棿', '棰勮鎸佺画澶╂暟', '鏈�鍚庢洿鏂版椂闂�', '棰勮鍏呰鏃堕棿', '棰勮缂烘皵鏃堕棿', '棰勮瑙勫垯鎻忚堪'
- ]
-
- const csvRows = [headers.join(',')]
-
- data.forEach(item => {
- const row = [
- item.tankCode,
- item.tankName,
- item.tankType,
- item.specificationModel,
- item.volume,
- item.currentGasLevel,
- item.safetyGasLevel,
- item.minGasLevel,
- item.maxGasLevel,
- item.currentPressure,
- item.warningType,
- item.warningLevel,
- item.warningThreshold,
- item.isEnabled ? '鏄�' : '鍚�',
- item.warningTime,
- item.warningDuration,
- item.lastUpdateTime,
- item.expectedRefillTime,
- item.expectedShortageTime,
- item.warningRule
- ]
- csvRows.push(row.join(','))
- })
-
- return csvRows.join('\n')
-}
-
-// 鍚敤鐘舵�佸彉鍖�
-const handleEnableChange = async (row) => {
- try {
- // 妯℃嫙API璋冪敤寤惰繜
- await new Promise(resolve => setTimeout(resolve, 200))
- ElMessage.success(`${row.tankName} 鐨勫惎鐢ㄧ姸鎬佸凡鏇存柊`)
- } catch (error) {
- ElMessage.error('鐘舵�佹洿鏂板け璐�')
- // 鎭㈠鍘熺姸鎬�
- row.isEnabled = !row.isEnabled
- }
-}
-
-// 鎻愪氦琛ㄥ崟
-const submitForm = async () => {
- try {
- await proxy.$refs.formRef.validate()
-
- // 妯℃嫙API璋冪敤寤惰繜
- await new Promise(resolve => setTimeout(resolve, 500))
-
- if (operationType.value === 'add') {
- ElMessage.success('鏂板鎴愬姛')
- } else {
- ElMessage.success('缂栬緫鎴愬姛')
- }
-
- closeDialog()
- getList()
- } catch (error) {
- if (!error.errors) {
- ElMessage.error(operationType.value === 'add' ? '鏂板澶辫触' : '缂栬緫澶辫触')
- }
- }
-}
-
-// 鍏抽棴寮圭獥
-const closeDialog = () => {
- dialogFormVisible.value = false
- resetForm()
-}
-
-// 閲嶇疆琛ㄥ崟
-const resetForm = () => {
- Object.keys(form).forEach(key => {
- if (key === 'isEnabled') {
- form[key] = true
- } else if (typeof form[key] === 'number') {
- form[key] = 0
- } else {
- form[key] = ''
- }
- })
- proxy.$refs.formRef?.resetFields()
-}
-
-// 鑾峰彇姘斾綋閲忔牱寮忕被
-const getGasLevelClass = (row) => {
- if (row.currentGasLevel < row.minGasLevel) {
- return 'text-danger'
- } else if (row.currentGasLevel > row.maxGasLevel) {
- return 'text-warning'
- }
- return 'text-success'
-}
-
-// 鑾峰彇棰勮绫诲瀷鏍囩鏍峰紡
-const getWarningTypeTag = (type) => {
- const typeMap = {
- '姘斾綋涓嶈冻': 'danger',
- '鍘嬪姏寮傚父': 'warning',
- '娓╁害寮傚父': 'info',
- '娉勬紡棰勮': 'danger'
- }
- return typeMap[type] || 'info'
-}
-
-// 鑾峰彇棰勮绾у埆鏍囩鏍峰紡
-const getWarningLevelTag = (level) => {
- const levelMap = {
- '绱ф��': 'danger',
- '閲嶈': 'warning',
- '涓�鑸�': 'info'
- }
- return levelMap[level] || 'info'
-}
-
-// 鍚姩鍊掕鏃跺畾鏃跺櫒
-const startCountdownTimer = () => {
- countdownTimer.value = setInterval(() => {
- checkShortageWarnings()
- }, 60000) // 姣忓垎閽熸鏌ヤ竴娆�
-}
-
-// 鍋滄鍊掕鏃跺畾鏃跺櫒
-const stopCountdownTimer = () => {
- if (countdownTimer.value) {
- clearInterval(countdownTimer.value)
- countdownTimer.value = null
- }
-}
-
-// 椤甸潰鍔犺浇
-onMounted(() => {
- getList()
- startCountdownTimer()
-})
-
-// 椤甸潰鍗歌浇
-onUnmounted(() => {
- stopCountdownTimer()
-})
-</script>
-
-<style scoped lang="scss">
-.app-container {
- padding: 20px;
-
- .table-operations {
- text-align: right;
- margin-bottom: 20px;
-
- .el-button {
- margin-right: 10px;
- }
- }
-
- .table_list {
- background: #fff;
- border-radius: 4px;
- box-shadow: 0 2px 4px rgba(0, 0, 0, 0.1);
- }
-
- .text-danger {
- color: #f56c6c;
- font-weight: bold;
- }
-
- .text-warning {
- color: #e6a23c;
- font-weight: bold;
- }
-
- .text-success {
- color: #67c23a;
- font-weight: bold;
- }
-
- .dialog-footer {
- text-align: right;
- }
-
- // 鍊掕鏃舵牱寮�
- .countdown-timer {
- font-weight: bold;
- }
-
- .countdown-normal {
- color: #67c23a;
- }
-
- .countdown-warning {
- color: #e6a23c;
- }
-
- .countdown-urgent {
- color: #f56c6c;
- animation: blink 1s infinite;
- }
-
- .countdown-expired {
- color: #f56c6c;
- font-weight: bold;
- }
-
- @keyframes blink {
- 0%, 50% { opacity: 1; }
- 51%, 100% { opacity: 0.5; }
- }
-
- // 缂烘皵棰勮寮规鏍峰紡
- .shortage-warning-content {
- text-align: center;
- padding: 20px 0;
-
- .warning-icon {
- margin-bottom: 20px;
- }
-
- .warning-message {
- h3 {
- color: #f56c6c;
- margin-bottom: 10px;
- }
-
- p {
- margin-bottom: 10px;
- color: #606266;
- }
-
- .warning-details {
- background: #f5f7fa;
- padding: 15px;
- border-radius: 4px;
- text-align: left;
- font-size: 14px;
- line-height: 1.6;
- }
- }
- }
-}
-</style>
diff --git a/src/views/personnelManagement/contractManagement/components/formDia.vue b/src/views/personnelManagement/contractManagement/components/formDia.vue
deleted file mode 100644
index 6538273..0000000
--- a/src/views/personnelManagement/contractManagement/components/formDia.vue
+++ /dev/null
@@ -1,73 +0,0 @@
-<template>
- <div>
- <el-dialog
- v-model="dialogFormVisible"
- title="璇︽儏"
- width="70%"
- @close="closeDia"
- >
- <PIMTable
- rowKey="id"
- :column="tableColumn"
- :tableData="tableData"
- :tableLoading="tableLoading"
- height="600"
- ></PIMTable>
- <template #footer>
- <div class="dialog-footer">
- <el-button @click="closeDia">鍙栨秷</el-button>
- </div>
- </template>
- </el-dialog>
- </div>
-</template>
-
-<script setup>
-import {ref} from "vue";
-import {staffOnJobInfo} from "@/api/personnelManagement/employeeRecord.js";
-const { proxy } = getCurrentInstance()
-const emit = defineEmits(['close'])
-
-const dialogFormVisible = ref(false);
-const operationType = ref('')
-const tableColumn = ref([
- {
- label: "鍚堝悓骞撮檺",
- prop: "contractTerm",
- },
- {
- label: "鍚堝悓寮�濮嬫棩鏈�",
- prop: "contractStartTime",
- },
- {
- label: "鍚堝悓缁撴潫鏃ユ湡",
- prop: "contractEndTime",
- },
-]);
-const tableData = ref([]);
-const tableLoading = ref(false);
-
-// 鎵撳紑寮规
-const openDialog = (type, row) => {
- operationType.value = type;
- dialogFormVisible.value = true;
- if (operationType.value === 'edit') {
- staffOnJobInfo({staffNo: row.staffNo}).then(res => {
- tableData.value = res.data
- })
- }
-}
-
-// 鍏抽棴寮规
-const closeDia = () => {
- dialogFormVisible.value = false;
- emit('close')
-};
-defineExpose({
- openDialog,
-});
-</script>
-
-<style scoped>
-
-</style>
\ No newline at end of file
diff --git a/src/views/personnelManagement/contractManagement/filesDia.vue b/src/views/personnelManagement/contractManagement/filesDia.vue
deleted file mode 100644
index f752496..0000000
--- a/src/views/personnelManagement/contractManagement/filesDia.vue
+++ /dev/null
@@ -1,202 +0,0 @@
-<template>
- <div>
- <el-dialog
- v-model="dialogFormVisible"
- title="涓婁紶闄勪欢"
- width="50%"
- @close="closeDia"
- >
- <div style="margin-bottom: 10px;text-align: right">
- <el-upload
- v-model:file-list="fileList"
- class="upload-demo"
- :action="uploadUrl"
- :on-success="handleUploadSuccess"
- :on-error="handleUploadError"
- name="file"
- :show-file-list="false"
- :headers="headers"
- style="display: inline;margin-right: 10px"
- >
- <el-button type="primary">涓婁紶闄勪欢</el-button>
- </el-upload>
- <el-button type="danger" plain @click="handleDelete">鍒犻櫎</el-button>
- </div>
- <PIMTable
- rowKey="id"
- :column="tableColumn"
- :tableData="tableData"
- :tableLoading="tableLoading"
- :isSelection="true"
- @selection-change="handleSelectionChange"
- height="500"
- >
- </PIMTable>
- <pagination
- style="margin: 10px 0"
- v-show="total > 0"
- @pagination="paginationSearch"
- :total="total"
- :page="page.current"
- :limit="page.size"
- />
- <template #footer>
- <div class="dialog-footer">
- <el-button @click="closeDia">鍙栨秷</el-button>
- </div>
- </template>
- </el-dialog>
- <filePreview ref="filePreviewRef" />
- </div>
-</template>
-
-<script setup>
-import {ref} from "vue";
-import {ElMessageBox} from "element-plus";
-import {getToken} from "@/utils/auth.js";
-import filePreview from '@/components/filePreview/index.vue'
-import {
- fileAdd,
- fileDel,
- fileListPage
-} from "@/api/financialManagement/revenueManagement.js";
-import Pagination from "@/components/PIMTable/Pagination.vue";
-const { proxy } = getCurrentInstance()
-const emit = defineEmits(['close'])
-
-const dialogFormVisible = ref(false);
-const currentId = ref('')
-const selectedRows = ref([]);
-const filePreviewRef = ref()
-const tableColumn = ref([
- {
- label: "鏂囦欢鍚嶇О",
- prop: "name",
- },
- {
- dataType: "action",
- label: "鎿嶄綔",
- align: "center",
- operation: [
- {
- name: "涓嬭浇",
- type: "text",
- clickFun: (row) => {
- downLoadFile(row);
- },
- },
- {
- name: "棰勮",
- type: "text",
- clickFun: (row) => {
- lookFile(row);
- },
- }
- ],
- },
-]);
-const page = reactive({
- current: 1,
- size: 100,
-});
-const total = ref(0);
-const tableData = ref([]);
-const fileList = ref([]);
-const tableLoading = ref(false);
-const accountType = ref('')
-const headers = ref({
- Authorization: "Bearer " + getToken(),
-});
-const uploadUrl = ref(import.meta.env.VITE_APP_BASE_API + "/file/upload"); // 涓婁紶鐨勫浘鐗囨湇鍔″櫒鍦板潃
-
-// 鎵撳紑寮规
-const openDialog = (row,type) => {
- accountType.value = type;
- dialogFormVisible.value = true;
- currentId.value = row.id;
- getList()
-}
-const paginationSearch = (obj) => {
- page.current = obj.page;
- page.size = obj.limit;
- getList();
-};
-const getList = () => {
- fileListPage({accountId: currentId.value,accountType:accountType.value, ...page}).then(res => {
- tableData.value = res.data.records;
- total.value = res.data.total;
- })
-}
-// 琛ㄦ牸閫夋嫨鏁版嵁
-const handleSelectionChange = (selection) => {
- selectedRows.value = selection;
-};
-
-// 鍏抽棴寮规
-const closeDia = () => {
- dialogFormVisible.value = false;
- emit('close')
-};
-// 涓婁紶鎴愬姛澶勭悊
-function handleUploadSuccess(res, file) {
- // 濡傛灉涓婁紶鎴愬姛
- if (res.code == 200) {
- const fileRow = {}
- fileRow.name = res.data.originalName
- fileRow.url = res.data.tempPath
- uploadFile(fileRow)
- } else {
- proxy.$modal.msgError("鏂囦欢涓婁紶澶辫触");
- }
-}
-function uploadFile(file) {
- file.accountId = currentId.value;
- file.accountType = accountType.value;
- fileAdd(file).then(res => {
- proxy.$modal.msgSuccess("鏂囦欢涓婁紶鎴愬姛");
- getList()
- })
-}
-// 涓婁紶澶辫触澶勭悊
-function handleUploadError() {
- proxy.$modal.msgError("鏂囦欢涓婁紶澶辫触");
-}
-// 涓嬭浇闄勪欢
-const downLoadFile = (row) => {
- proxy.$download.name(row.url);
-}
-// 鍒犻櫎
-const handleDelete = () => {
- let ids = [];
- if (selectedRows.value.length > 0) {
- ids = selectedRows.value.map((item) => item.id);
- } else {
- proxy.$modal.msgWarning("璇烽�夋嫨鏁版嵁");
- return;
- }
- ElMessageBox.confirm("閫変腑鐨勫唴瀹瑰皢琚垹闄わ紝鏄惁纭鍒犻櫎锛�", "瀵煎嚭", {
- confirmButtonText: "纭",
- cancelButtonText: "鍙栨秷",
- type: "warning",
- }).then(() => {
- fileDel(ids).then((res) => {
- proxy.$modal.msgSuccess("鍒犻櫎鎴愬姛");
- getList();
- });
- }).catch(() => {
- proxy.$modal.msg("宸插彇娑�");
- });
-};
-// 棰勮闄勪欢
-const lookFile = (row) => {
- filePreviewRef.value.open(row.url)
-}
-
-defineExpose({
- openDialog,
-});
-</script>
-
-<style scoped>
-
-</style>
\ No newline at end of file
diff --git a/src/views/personnelManagement/contractManagement/index.vue b/src/views/personnelManagement/contractManagement/index.vue
deleted file mode 100644
index 98f0272..0000000
--- a/src/views/personnelManagement/contractManagement/index.vue
+++ /dev/null
@@ -1,329 +0,0 @@
-<template>
- <div class="app-container">
- <div class="search_form">
- <div>
- <span class="search_title">濮撳悕锛�</span>
- <el-input v-model="searchForm.staffName" style="width: 240px" placeholder="璇疯緭鍏ュ鍚嶆悳绱�" @change="handleQuery"
- clearable :prefix-icon="Search" />
- <span style="margin-left: 10px" class="search_title">鍚堝悓缁撴潫鏃ユ湡锛�</span>
- <el-date-picker v-model="searchForm.entryDate" value-format="YYYY-MM-DD" format="YYYY-MM-DD" type="daterange"
- placeholder="璇烽�夋嫨" clearable @change="changeDaterange" />
- <el-button type="primary" @click="handleQuery" style="margin-left: 10px">鎼滅储</el-button>
- </div>
- <div>
- <!-- <el-button type="primary" @click="openForm('add')">鏂板鍏ヨ亴</el-button>-->
-<!-- <el-button type="info" @click="handleImport">瀵煎叆</el-button>-->
- <el-button @click="handleOut">瀵煎嚭</el-button>
- <!-- <el-button type="danger" plain @click="handleDelete">鍒犻櫎</el-button>-->
- </div>
- </div>
- <div class="table_list">
- <PIMTable rowKey="id" :column="tableColumn" :tableData="tableData" :page="page" :isSelection="true"
- @selection-change="handleSelectionChange" :tableLoading="tableLoading" @pagination="pagination"
- :total="page.total"></PIMTable>
- </div>
- <form-dia ref="formDia" @close="handleQuery"></form-dia>
-
- <!-- 鍚堝悓瀵煎叆瀵硅瘽妗� -->
- <el-dialog
- :title="upload.title"
- v-model="upload.open"
- width="400px"
- append-to-body
- >
- <el-upload
- ref="uploadRef"
- :limit="1"
- accept=".xlsx, .xls"
- :headers="upload.headers"
- :action="upload.url + '?updateSupport=' + upload.updateSupport"
- :disabled="upload.isUploading"
- :on-progress="handleFileUploadProgress"
- :on-success="handleFileSuccess"
- :auto-upload="false"
- drag
- >
- <el-icon class="el-icon--upload"><upload-filled /></el-icon>
- <div class="el-upload__text">灏嗘枃浠舵嫋鍒版澶勶紝鎴�<em>鐐瑰嚮涓婁紶</em></div>
- <template #tip>
- <div class="el-upload__tip text-center">
- <span>浠呭厑璁稿鍏ls銆亁lsx鏍煎紡鏂囦欢銆�</span>
- <!-- <el-link
- type="primary"
- :underline="false"
- style="font-size: 12px; vertical-align: baseline"
- @click="importTemplate"
- >涓嬭浇妯℃澘</el-link
- > -->
- </div>
- </template>
- </el-upload>
- <template #footer>
- <div class="dialog-footer">
- <el-button type="primary" @click="submitFileForm">纭� 瀹�</el-button>
- <el-button @click="upload.open = false">鍙� 娑�</el-button>
- </div>
- </template>
- </el-dialog>
- <files-dia ref="filesDia"></files-dia>
- </div>
-</template>
-
-<script setup>
-import { Search } from "@element-plus/icons-vue";
-import { onMounted, ref } from "vue";
-import FormDia from "@/views/personnelManagement/contractManagement/components/formDia.vue";
-import { ElMessageBox } from "element-plus";
-import { staffOnJobListPage } from "@/api/personnelManagement/employeeRecord.js";
-import dayjs from "dayjs";
-import { getToken } from "@/utils/auth.js";
-import FilesDia from "./filesDia.vue";
-const data = reactive({
- searchForm: {
- staffName: "",
- entryDate: [
- dayjs().format("YYYY-MM-DD"),
- dayjs().add(1, "day").format("YYYY-MM-DD"),
- ], // 褰曞叆鏃ユ湡
- entryDateStart: dayjs().format("YYYY-MM-DD"),
- entryDateEnd: dayjs().add(1, "day").format("YYYY-MM-DD"),
- },
-});
-const { searchForm } = toRefs(data);
-const tableColumn = ref([
- {
- label: "鐘舵��",
- prop: "staffState",
- dataType: "tag",
- formatData: (params) => {
- if (params == 0) {
- return "绂昏亴";
- } else if (params == 1) {
- return "鍦ㄨ亴";
- } else {
- return null;
- }
- },
- formatType: (params) => {
- if (params == 0) {
- return "danger";
- } else if (params == 1) {
- return "primary";
- } else {
- return null;
- }
- },
- },
- {
- label: "鍛樺伐缂栧彿",
- prop: "staffNo",
- },
- {
- label: "濮撳悕",
- prop: "staffName",
- },
- {
- label: "鎬у埆",
- prop: "sex",
- },
- {
- label: "绫嶈疮",
- prop: "nativePlace",
- },
- {
- label: "宀椾綅",
- prop: "postJob",
- },
- {
- label: "瀹跺涵浣忓潃",
- prop: "adress",
- width: 200
- },
- {
- label: "绗竴瀛﹀巻",
- prop: "firstStudy",
- },
- {
- label: "涓撲笟",
- prop: "profession",
- width: 100
- },
- {
- label: "韬唤璇佸彿",
- prop: "identityCard",
- width: 200
- },
- {
- label: "骞撮緞",
- prop: "age",
- },
- {
- label: "鑱旂郴鐢佃瘽",
- prop: "phone",
- width: 150
- },
- {
- label: "绱ф�ヨ仈绯讳汉",
- prop: "emergencyContact",
- width: 120
- },
- {
- label: "绱ф�ヨ仈绯讳汉鐢佃瘽",
- prop: "emergencyContactPhone",
- width: 150
- },
- {
- label: "鍚堝悓骞撮檺",
- prop: "contractTerm",
- },
- // {
- // label: "鍚堝悓寮�濮嬫棩鏈�",
- // prop: "contractStartTime",
- // width: 120
- // },
- {
- label: "鍚堝悓缁撴潫鏃ユ湡",
- prop: "contractExpireTime",
- width: 120
- },
- {
- dataType: "action",
- label: "鎿嶄綔",
- align: "center",
- fixed: 'right',
- width: 120,
- operation: [
- {
- name: "璇︽儏",
- type: "text",
- clickFun: (row) => {
- openForm("edit", row);
- },
- },
- {
- name: "闄勪欢",
- type: "text",
- clickFun: (row) => {
- openFilesFormDia(row);
- },
- },
- ],
- },
-]);
-const filesDia = ref()
-const tableData = ref([]);
-const selectedRows = ref([]);
-const tableLoading = ref(false);
-const page = reactive({
- current: 1,
- size: 100,
- total: 0,
-});
-const formDia = ref()
-const { proxy } = getCurrentInstance()
-
-const changeDaterange = (value) => {
- searchForm.value.entryDateStart = undefined;
- searchForm.value.entryDateEnd = undefined;
- if (value) {
- searchForm.value.entryDateStart = dayjs(value[0]).format("YYYY-MM-DD");
- searchForm.value.entryDateEnd = dayjs(value[1]).format("YYYY-MM-DD");
- }
- getList();
-};
-// 鎵撳紑闄勪欢寮规
-const openFilesFormDia = (row) => {
- console.log(row)
- nextTick(() => {
- filesDia.value?.openDialog( row,'鍚堝悓')
- })
-};
-// 鏌ヨ鍒楄〃
-/** 鎼滅储鎸夐挳鎿嶄綔 */
-const handleQuery = () => {
- page.current = 1;
- getList();
-};
-const pagination = (obj) => {
- page.current = obj.page;
- page.size = obj.limit;
- getList();
-};
-const getList = () => {
- tableLoading.value = true;
- const params = { ...searchForm.value, ...page };
- params.entryDate = undefined
- staffOnJobListPage(params).then(res => {
- tableLoading.value = false;
- tableData.value = res.data.records
- page.total = res.data.total;
- }).catch(err => {
- tableLoading.value = false;
- })
-};
-// 琛ㄦ牸閫夋嫨鏁版嵁
-const handleSelectionChange = (selection) => {
- selectedRows.value = selection;
-};
-
-// 鎵撳紑寮规
-const openForm = (type, row) => {
- nextTick(() => {
- formDia.value?.openDialog(type, row)
- })
-};
-// 瀵煎嚭
-const handleOut = () => {
- ElMessageBox.confirm("閫変腑鐨勫唴瀹瑰皢琚鍑猴紝鏄惁纭瀵煎嚭锛�", "瀵煎嚭", {
- confirmButtonText: "纭",
- cancelButtonText: "鍙栨秷",
- type: "warning",
- })
- .then(() => {
- proxy.download("/staff/staffOnJob/export", {}, "鍚堝悓绠$悊.xlsx");
- })
- .catch(() => {
- proxy.$modal.msg("宸插彇娑�");
- });
-};
-const upload = reactive({
- // 鏄惁鏄剧ず寮瑰嚭灞傦紙鍚堝悓瀵煎叆锛�
- open: false,
- // 寮瑰嚭灞傛爣棰橈紙鍚堝悓瀵煎叆锛�
- title: "",
- // 鏄惁绂佺敤涓婁紶
- isUploading: false,
- // 鏄惁鏇存柊宸茬粡瀛樺湪鐨勭敤鎴锋暟鎹�
- updateSupport: 1,
- // 璁剧疆涓婁紶鐨勮姹傚ご閮�
- headers: { Authorization: "Bearer " + getToken() },
- // 涓婁紶鐨勫湴鍧�
- url: import.meta.env.VITE_APP_BASE_API + "/staff/staffOnJob/import",
-});
-/** 瀵煎叆鎸夐挳鎿嶄綔 */
-function handleImport() {
- upload.title = "鍚堝悓瀵煎叆";
- upload.open = true;
-}
-/** 鎻愪氦涓婁紶鏂囦欢 */
-function submitFileForm() {
- console.log(upload.url + '?updateSupport=' + upload.updateSupport)
- proxy.$refs["uploadRef"].submit();
-}
-/**鏂囦欢涓婁紶涓鐞� */
-const handleFileUploadProgress = (event, file, fileList) => {
- upload.isUploading = true;
-};
-/** 鏂囦欢涓婁紶鎴愬姛澶勭悊 */
-const handleFileSuccess = (response, file, fileList) => {
- upload.open = false;
- upload.isUploading = false;
- proxy.$refs["uploadRef"].handleRemove(file);
- getList();
-};
-onMounted(() => {
- getList();
-});
-</script>
-
-<style scoped></style>
diff --git a/src/views/personnelManagement/dimission/components/formDia.vue b/src/views/personnelManagement/dimission/components/formDia.vue
deleted file mode 100644
index f63b011..0000000
--- a/src/views/personnelManagement/dimission/components/formDia.vue
+++ /dev/null
@@ -1,290 +0,0 @@
-<template>
- <div>
- <el-dialog
- v-model="dialogFormVisible"
- :title="operationType === 'add' ? '鏂板绂昏亴' : '缂栬緫绂昏亴'"
- width="70%"
- @close="closeDia"
- >
- <el-form :model="form" label-width="140px" label-position="top" :rules="rules" ref="formRef">
- <el-row :gutter="30">
- <el-col :span="12">
- <el-form-item label="濮撳悕锛�" prop="staffName">
- <!-- <el-input v-model="form.staffName" placeholder="璇疯緭鍏�" clearable/> -->
- <el-select v-model="form.staffName" placeholder="璇烽�夋嫨浜哄憳" style="width: 100%" @change="handleSelect">
- <el-option
- v-for="item in personList"
- :key="item.id"
- :label="item.staffName"
- :value="item.staffName"
- />
- </el-select>
- </el-form-item>
- </el-col>
- <el-col :span="12">
- <el-form-item label="鍛樺伐缂栧彿锛�" prop="staffNo">
- <el-input v-model="form.staffNo" placeholder="璇疯緭鍏�" clearable disabled/>
- </el-form-item>
- </el-col>
- </el-row>
- <el-row :gutter="30">
- <el-col :span="12">
- <el-form-item label="鎬у埆锛�" prop="sex">
- <el-select v-model="form.sex" disabled>
- <el-option label="鐢�" value="鐢�" />
- <el-option label="濂�" value="濂�" />
- </el-select>
- </el-form-item>
- </el-col>
- <el-col :span="12">
- <el-form-item label="绫嶈疮锛�" prop="nativePlace">
- <el-input v-model="form.nativePlace" placeholder="璇疯緭鍏�" clearable disabled/>
- </el-form-item>
- </el-col>
- </el-row>
- <el-row :gutter="30">
- <el-col :span="12">
- <el-form-item label="宀椾綅锛�" prop="postJob">
- <el-input v-model="form.postJob" placeholder="璇疯緭鍏�" clearable disabled/>
- </el-form-item>
- </el-col>
- <el-col :span="12">
- <el-form-item label="瀹跺涵浣忓潃锛�" prop="adress">
- <el-input v-model="form.adress" placeholder="璇疯緭鍏�" clearable disabled/>
- </el-form-item>
- </el-col>
- </el-row>
- <el-row :gutter="30">
- <el-col :span="12">
- <el-form-item label="绗竴瀛﹀巻锛�" prop="firstStudy">
- <el-input v-model="form.firstStudy" placeholder="璇疯緭鍏�" clearable disabled/>
- </el-form-item>
- </el-col>
- <el-col :span="12">
- <el-form-item label="涓撲笟锛�" prop="profession">
- <el-input v-model="form.profession" placeholder="璇疯緭鍏�" clearable disabled/>
- </el-form-item>
- </el-col>
- </el-row>
- <el-row :gutter="30">
- <el-col :span="12">
- <el-form-item label="韬唤璇佸彿锛�" prop="identityCard">
- <el-input v-model="form.identityCard" placeholder="璇疯緭鍏�" clearable disabled/>
- </el-form-item>
- </el-col>
- <el-col :span="12">
- <el-form-item label="骞撮緞锛�" prop="age">
- <el-input-number v-model="form.age" :precision="0" :step="1" style="width: 100%" disabled/>
- </el-form-item>
- </el-col>
- </el-row>
- <el-row :gutter="30">
- <el-col :span="12">
- <el-form-item label="鑱旂郴鐢佃瘽锛�" prop="phone">
- <el-input v-model="form.phone" placeholder="璇疯緭鍏�" clearable disabled/>
- </el-form-item>
- </el-col>
- <el-col :span="12">
- <el-form-item label="绱ф�ヨ仈绯讳汉锛�" prop="emergencyContact">
- <el-input v-model="form.emergencyContact" placeholder="璇疯緭鍏�" clearable disabled/>
- </el-form-item>
- </el-col>
- </el-row>
- <el-row :gutter="30">
- <el-col :span="12">
- <el-form-item label="绱ф�ヨ仈绯讳汉鑱旂郴鐢佃瘽锛�" prop="emergencyContactPhone">
- <el-input v-model="form.emergencyContactPhone" placeholder="璇疯緭鍏�" clearable disabled/>
- </el-form-item>
- </el-col>
- <el-col :span="12">
- <el-form-item label="鍚堝悓骞撮檺锛�" prop="contractTerm">
- <el-input-number v-model="form.contractTerm" :precision="0" :step="1" style="width: 100%" disabled/>
- </el-form-item>
- </el-col>
- </el-row>
- <el-row :gutter="30">
- <el-col :span="12">
- <el-form-item label="鍚堝悓寮�濮嬫棩鏈燂細" prop="contractStartTime">
- <el-date-picker
- disabled
- v-model="form.contractStartTime"
- type="date"
- placeholder="璇烽�夋嫨鏃ユ湡"
- value-format="YYYY-MM-DD"
- format="YYYY-MM-DD"
- clearable
- style="width: 100%"
- />
- </el-form-item>
- </el-col>
- <el-col :span="12">
- <el-form-item label="鍚堝悓缁撴潫鏃ユ湡锛�" prop="contractEndTime">
- <el-date-picker
- disabled
- v-model="form.contractEndTime"
- type="date"
- placeholder="璇烽�夋嫨鏃ユ湡"
- value-format="YYYY-MM-DD"
- format="YYYY-MM-DD"
- clearable
- style="width: 100%"
- />
- </el-form-item>
- </el-col>
- </el-row>
- </el-form>
- <template #footer>
- <div class="dialog-footer">
- <el-button type="primary" @click="submitForm">纭</el-button>
- <el-button @click="closeDia">鍙栨秷</el-button>
- </div>
- </template>
- </el-dialog>
- </div>
-</template>
-
-<script setup>
-import {ref} from "vue";
-import {getStaffJoinInfo, staffJoinAdd, staffJoinUpdate,getStaffOnJob} from "@/api/personnelManagement/onboarding.js";
-const { proxy } = getCurrentInstance()
-const emit = defineEmits(['close'])
-
-const dialogFormVisible = ref(false);
-const operationType = ref('')
-const data = reactive({
- form: {
- staffNo: "",
- staffName: "",
- sex: "",
- nativePlace: "",
- postJob: "",
- adress: "",
- firstStudy: "",
- profession: "",
- identityCard: "",
- age: 0,
- phone: "",
- emergencyContact: "",
- emergencyContactPhone: "",
- contractTerm: 0,
- contractStartTime: "",
- contractEndTime: "",
- staffState: "",
- },
- rules: {
- staffNo: [{ required: true, message: "璇疯緭鍏�", trigger: "blur" },],
- staffName: [{ required: true, message: "璇疯緭鍏�", trigger: "blur" }],
- sex: [{ required: true, message: "璇疯緭鍏�", trigger: "blur" }],
- nativePlace: [{ required: true, message: "璇疯緭鍏�", trigger: "blur" }],
- postJob: [{ required: true, message: "璇疯緭鍏�", trigger: "blur" }],
- adress: [{ required: true, message: "璇疯緭鍏�", trigger: "blur" }],
- firstStudy: [{ required: true, message: "璇疯緭鍏�", trigger: "blur" }],
- profession: [{ required: true, message: "璇疯緭鍏�", trigger: "blur" }],
- identityCard: [{ required: true, message: "璇疯緭鍏�", trigger: "blur" }],
- age: [{ required: true, message: "璇疯緭鍏�", trigger: "blur" }],
- phone: [{ required: true, message: "璇疯緭鍏�", trigger: "blur" }],
- emergencyContact: [{ required: true, message: "璇疯緭鍏�", trigger: "blur" }],
- emergencyContactPhone: [{ required: true, message: "璇疯緭鍏�", trigger: "blur" }],
- contractTerm: [{ required: true, message: "璇疯緭鍏�", trigger: "blur" }],
- contractStartTime: [{ required: true, message: "璇疯緭鍏�", trigger: "blur" }],
- contractEndTime: [{ required: true, message: "璇疯緭鍏�", trigger: "blur" }],
- },
-});
-const { form, rules } = toRefs(data);
-
-// 鎵撳紑寮规
-const openDialog = (type, row) => {
- getList()
- operationType.value = type;
- dialogFormVisible.value = true;
- if (operationType.value === 'edit') {
- getStaffJoinInfo(row.id).then(res => {
- form.value = {...res.data}
- })
- }
-}
-// 鎻愪氦浜у搧琛ㄥ崟
-const submitForm = () => {
- proxy.$refs.formRef.validate(valid => {
- if (valid) {
- form.value.staffState = 0
- if (operationType.value === "add") {
- staffJoinAdd(form.value).then(res => {
- proxy.$modal.msgSuccess("鎻愪氦鎴愬姛");
- closeDia();
- })
- } else {
- staffJoinUpdate(form.value).then(res => {
- proxy.$modal.msgSuccess("鎻愪氦鎴愬姛");
- closeDia();
- })
- }
- }
- })
-}
-// 鍏抽棴寮规
-const closeDia = () => {
- proxy.resetForm("formRef");
- dialogFormVisible.value = false;
- emit('close')
-};
-
-const personList = ref([]);
-
-/**
- * 鑾峰彇褰撳墠鍦ㄨ亴浜哄憳鍒楄〃
- */
-const getList = () => {
- getStaffOnJob().then(res => {
- personList.value = res.data
- })
-};
-
-const handleSelect = (val) => {
- let obj = personList.value.find(item => item.staffName === val)
- let {
- sex,
- phone,
- staffNo,
- nativePlace,
- postJob,
- adress,
- firstStudy,
- profession,
- identityCard,
- age,
- emergencyContact,
- emergencyContactPhone,
- contractTerm,
- contractStartTime,
- contractEndTime,
- staffName
- } = obj
- form.value = {
- sex,
- phone,
- staffNo,
- nativePlace,
- postJob,
- adress,
- firstStudy,
- profession,
- identityCard,
- age,
- emergencyContact,
- emergencyContactPhone,
- contractTerm,
- contractStartTime,
- contractEndTime,
- staffName
- }
-
-}
-defineExpose({
- openDialog,
-});
-</script>
-
-<style scoped>
-
-</style>
\ No newline at end of file
diff --git a/src/views/personnelManagement/dimission/index.vue b/src/views/personnelManagement/dimission/index.vue
deleted file mode 100644
index 6e20b1e..0000000
--- a/src/views/personnelManagement/dimission/index.vue
+++ /dev/null
@@ -1,284 +0,0 @@
-<template>
- <div class="app-container">
- <div class="search_form">
- <div>
- <span class="search_title">濮撳悕锛�</span>
- <el-input
- v-model="searchForm.staffName"
- style="width: 240px"
- placeholder="璇疯緭鍏ュ鍚嶆悳绱�"
- @change="handleQuery"
- clearable
- :prefix-icon="Search"
- />
- <span style="margin-left: 10px;" class="search_title">鍚堝悓寮�濮嬫棩鏈燂細</span>
- <el-date-picker
- v-model="searchForm.entryDateStart"
- type="date"
- placeholder="璇烽�夋嫨鍚堝悓寮�濮嬫棩鏈�"
- size="default"
- @change="(date) => handleDateChange(date,1)"
- />
- <span style="margin-left: 10px;" class="search_title">鍚堝悓缁撴潫鏃ユ湡锛�</span>
- <el-date-picker
- v-model="searchForm.entryDateEnd"
- type="date"
- placeholder="璇烽�夋嫨鍚堝悓缁撴潫鏃ユ湡"
- size="default"
- @change="(date) => handleDateChange(date,2)"
- />
- <el-button type="primary" @click="handleQuery" style="margin-left: 10px"
- >鎼滅储</el-button
- >
- </div>
- <div>
- <el-button type="primary" @click="openForm('add')">鏂板绂昏亴</el-button>
- <el-button @click="handleOut">瀵煎嚭</el-button>
- <el-button type="danger" plain @click="handleDelete">鍒犻櫎</el-button>
- </div>
- </div>
- <div class="table_list">
- <PIMTable
- rowKey="id"
- :column="tableColumn"
- :tableData="tableData"
- :page="page"
- :isSelection="true"
- @selection-change="handleSelectionChange"
- :tableLoading="tableLoading"
- @pagination="pagination"
- :total="page.total"
- ></PIMTable>
- </div>
- <form-dia ref="formDia" @close="handleQuery"></form-dia>
- </div>
-</template>
-
-<script setup>
-import { Search } from "@element-plus/icons-vue";
-import {onMounted, ref} from "vue";
-import FormDia from "@/views/personnelManagement/dimission/components/formDia.vue";
-import {staffJoinDel, staffJoinListPage} from "@/api/personnelManagement/onboarding.js";
-import {ElMessageBox} from "element-plus";
-import dayjs from "dayjs";
-
-const data = reactive({
- searchForm: {
- staffName: "",
- },
-});
-const { searchForm } = toRefs(data);
-const tableColumn = ref([
- {
- label: "鐘舵��",
- prop: "staffState",
- dataType: "tag",
- formatData: (params) => {
- if (params == 0) {
- return "绂昏亴";
- } else if (params == 1) {
- return "鍦ㄨ亴";
- } else {
- return null;
- }
- },
- formatType: (params) => {
- if (params == 0) {
- return "danger";
- } else if (params == 1) {
- return "primary";
- } else {
- return null;
- }
- },
- },
- {
- label: "鍛樺伐缂栧彿",
- prop: "staffNo",
- },
- {
- label: "濮撳悕",
- prop: "staffName",
- },
- {
- label: "鎬у埆",
- prop: "sex",
- },
- {
- label: "绫嶈疮",
- prop: "nativePlace",
- },
- {
- label: "宀椾綅",
- prop: "postJob",
- },
- {
- label: "瀹跺涵浣忓潃",
- prop: "adress",
- width:200
- },
- {
- label: "绗竴瀛﹀巻",
- prop: "firstStudy",
- },
- {
- label: "涓撲笟",
- prop: "profession",
- width:100
- },
- {
- label: "韬唤璇佸彿",
- prop: "identityCard",
- width:200
- },
- {
- label: "骞撮緞",
- prop: "age",
- },
- {
- label: "鑱旂郴鐢佃瘽",
- prop: "phone",
- width:150
- },
- {
- label: "绱ф�ヨ仈绯讳汉",
- prop: "emergencyContact",
- width: 120
- },
- {
- label: "绱ф�ヨ仈绯讳汉鐢佃瘽",
- prop: "emergencyContactPhone",
- width:150
- },
- {
- label: "鍚堝悓骞撮檺",
- prop: "contractTerm",
- },
- {
- label: "鍚堝悓寮�濮嬫棩鏈�",
- prop: "contractStartTime",
- width: 120
- },
- {
- label: "鍚堝悓缁撴潫鏃ユ湡",
- prop: "contractEndTime",
- width: 120
- },
- {
- dataType: "action",
- label: "鎿嶄綔",
- align: "center",
- operation: [
- {
- name: "缂栬緫",
- type: "text",
- clickFun: (row) => {
- openForm("edit", row);
- },
- },
- ],
- },
-]);
-const tableData = ref([]);
-const selectedRows = ref([]);
-const tableLoading = ref(false);
-const page = reactive({
- current: 1,
- size: 100,
- total: 0,
-});
-const formDia = ref()
-const { proxy } = getCurrentInstance()
-
-
-const handleDateChange = (value,type) => {
- searchForm.value.entryDateEnd = null
- searchForm.value.entryDateStart = null
- if(type === 1){
- if (value) {
- searchForm.value.entryDateStart = dayjs(value).format("YYYY-MM-DD");
- }
- }else{
- if (value) {
- searchForm.value.entryDateEnd = dayjs(value).format("YYYY-MM-DD");
- }
- }
- getList();
-};
-// 鏌ヨ鍒楄〃
-/** 鎼滅储鎸夐挳鎿嶄綔 */
-const handleQuery = () => {
- page.current = 1;
- getList();
-};
-const pagination = (obj) => {
- page.current = obj.page;
- page.size = obj.limit;
- getList();
-};
-const getList = () => {
- tableLoading.value = true;
- staffJoinListPage({...page, ...searchForm.value, staffState: 0}).then(res => {
- tableLoading.value = false;
- tableData.value = res.data.records
- page.total = res.data.total;
- }).catch(err => {
- tableLoading.value = false;
- })
-};
-// 琛ㄦ牸閫夋嫨鏁版嵁
-const handleSelectionChange = (selection) => {
- selectedRows.value = selection;
-};
-
-// 鎵撳紑寮规
-const openForm = (type, row) => {
- nextTick(() => {
- formDia.value?.openDialog(type, row)
- })
-};
-
-// 鍒犻櫎
-const handleDelete = () => {
- let ids = [];
- if (selectedRows.value.length > 0) {
- ids = selectedRows.value.map((item) => item.id);
- } else {
- proxy.$modal.msgWarning("璇烽�夋嫨鏁版嵁");
- return;
- }
- ElMessageBox.confirm("閫変腑鐨勫唴瀹瑰皢琚垹闄わ紝鏄惁纭鍒犻櫎锛�", "瀵煎嚭", {
- confirmButtonText: "纭",
- cancelButtonText: "鍙栨秷",
- type: "warning",
- })
- .then(() => {
- staffJoinDel(ids).then((res) => {
- proxy.$modal.msgSuccess("鍒犻櫎鎴愬姛");
- getList();
- });
- })
- .catch(() => {
- proxy.$modal.msg("宸插彇娑�");
- });
-};
-// 瀵煎嚭
-const handleOut = () => {
- ElMessageBox.confirm("閫変腑鐨勫唴瀹瑰皢琚鍑猴紝鏄惁纭瀵煎嚭锛�", "瀵煎嚭", {
- confirmButtonText: "纭",
- cancelButtonText: "鍙栨秷",
- type: "warning",
- })
- .then(() => {
- proxy.download("/staff/staffJoinLeaveRecord/export", {staffState: 0}, "浜哄憳绂昏亴.xlsx");
- })
- .catch(() => {
- proxy.$modal.msg("宸插彇娑�");
- });
-};
-onMounted(() => {
- getList();
-});
-</script>
-
-<style scoped></style>
diff --git a/src/views/personnelManagement/employeeRecord/components/formDia.vue b/src/views/personnelManagement/employeeRecord/components/formDia.vue
deleted file mode 100644
index 6538273..0000000
--- a/src/views/personnelManagement/employeeRecord/components/formDia.vue
+++ /dev/null
@@ -1,73 +0,0 @@
-<template>
- <div>
- <el-dialog
- v-model="dialogFormVisible"
- title="璇︽儏"
- width="70%"
- @close="closeDia"
- >
- <PIMTable
- rowKey="id"
- :column="tableColumn"
- :tableData="tableData"
- :tableLoading="tableLoading"
- height="600"
- ></PIMTable>
- <template #footer>
- <div class="dialog-footer">
- <el-button @click="closeDia">鍙栨秷</el-button>
- </div>
- </template>
- </el-dialog>
- </div>
-</template>
-
-<script setup>
-import {ref} from "vue";
-import {staffOnJobInfo} from "@/api/personnelManagement/employeeRecord.js";
-const { proxy } = getCurrentInstance()
-const emit = defineEmits(['close'])
-
-const dialogFormVisible = ref(false);
-const operationType = ref('')
-const tableColumn = ref([
- {
- label: "鍚堝悓骞撮檺",
- prop: "contractTerm",
- },
- {
- label: "鍚堝悓寮�濮嬫棩鏈�",
- prop: "contractStartTime",
- },
- {
- label: "鍚堝悓缁撴潫鏃ユ湡",
- prop: "contractEndTime",
- },
-]);
-const tableData = ref([]);
-const tableLoading = ref(false);
-
-// 鎵撳紑寮规
-const openDialog = (type, row) => {
- operationType.value = type;
- dialogFormVisible.value = true;
- if (operationType.value === 'edit') {
- staffOnJobInfo({staffNo: row.staffNo}).then(res => {
- tableData.value = res.data
- })
- }
-}
-
-// 鍏抽棴寮规
-const closeDia = () => {
- dialogFormVisible.value = false;
- emit('close')
-};
-defineExpose({
- openDialog,
-});
-</script>
-
-<style scoped>
-
-</style>
\ No newline at end of file
diff --git a/src/views/personnelManagement/employeeRecord/index.vue b/src/views/personnelManagement/employeeRecord/index.vue
deleted file mode 100644
index 6965e96..0000000
--- a/src/views/personnelManagement/employeeRecord/index.vue
+++ /dev/null
@@ -1,249 +0,0 @@
-<template>
- <div class="app-container">
- <div class="search_form">
- <div>
- <span class="search_title">濮撳悕锛�</span>
- <el-input
- v-model="searchForm.staffName"
- style="width: 240px"
- placeholder="璇疯緭鍏ュ鍚嶆悳绱�"
- @change="handleQuery"
- clearable
- :prefix-icon="Search"
- />
- <span style="margin-left: 10px" class="search_title">鍚堝悓缁撴潫鏃ユ湡锛�</span>
- <el-date-picker v-model="searchForm.entryDate" value-format="YYYY-MM-DD" format="YYYY-MM-DD" type="daterange"
- placeholder="璇烽�夋嫨" clearable @change="changeDaterange" />
- <el-button type="primary" @click="handleQuery" style="margin-left: 10px"
- >鎼滅储</el-button
- >
- </div>
- <div>
-<!-- <el-button type="primary" @click="openForm('add')">鏂板鍏ヨ亴</el-button>-->
- <el-button @click="handleOut">瀵煎嚭</el-button>
-<!-- <el-button type="danger" plain @click="handleDelete">鍒犻櫎</el-button>-->
- </div>
- </div>
- <div class="table_list">
- <PIMTable
- rowKey="id"
- :column="tableColumn"
- :tableData="tableData"
- :page="page"
- :isSelection="true"
- @selection-change="handleSelectionChange"
- :tableLoading="tableLoading"
- @pagination="pagination"
- :total="page.total"
- ></PIMTable>
- </div>
- <form-dia ref="formDia" @close="handleQuery"></form-dia>
- </div>
-</template>
-
-<script setup>
-import { Search } from "@element-plus/icons-vue";
-import {onMounted, ref} from "vue";
-import FormDia from "@/views/personnelManagement/employeeRecord/components/formDia.vue";
-import {ElMessageBox} from "element-plus";
-import {staffOnJobListPage} from "@/api/personnelManagement/employeeRecord.js";
-import dayjs from "dayjs";
-
-const data = reactive({
- searchForm: {
- staffName: "",
- entryDate: [
- dayjs().format("YYYY-MM-DD"),
- dayjs().add(1, "day").format("YYYY-MM-DD"),
- ], // 褰曞叆鏃ユ湡
- entryDateStart: dayjs().format("YYYY-MM-DD"),
- entryDateEnd: dayjs().add(1, "day").format("YYYY-MM-DD"),
- },
-});
-const { searchForm } = toRefs(data);
-const tableColumn = ref([
- {
- label: "鐘舵��",
- prop: "staffState",
- dataType: "tag",
- formatData: (params) => {
- if (params == 0) {
- return "绂昏亴";
- } else if (params == 1) {
- return "鍦ㄨ亴";
- } else {
- return null;
- }
- },
- formatType: (params) => {
- if (params == 0) {
- return "danger";
- } else if (params == 1) {
- return "primary";
- } else {
- return null;
- }
- },
- },
- {
- label: "鍛樺伐缂栧彿",
- prop: "staffNo",
- },
- {
- label: "濮撳悕",
- prop: "staffName",
- },
- {
- label: "鎬у埆",
- prop: "sex",
- },
- {
- label: "绫嶈疮",
- prop: "nativePlace",
- },
- {
- label: "宀椾綅",
- prop: "postJob",
- },
- {
- label: "瀹跺涵浣忓潃",
- prop: "adress",
- width:200
- },
- {
- label: "绗竴瀛﹀巻",
- prop: "firstStudy",
- },
- {
- label: "涓撲笟",
- prop: "profession",
- width:100
- },
- {
- label: "韬唤璇佸彿",
- prop: "identityCard",
- width:200
- },
- {
- label: "骞撮緞",
- prop: "age",
- },
- {
- label: "鑱旂郴鐢佃瘽",
- prop: "phone",
- width:150
- },
- {
- label: "绱ф�ヨ仈绯讳汉",
- prop: "emergencyContact",
- width: 120
- },
- {
- label: "绱ф�ヨ仈绯讳汉鐢佃瘽",
- prop: "emergencyContactPhone",
- width:150
- },
- {
- label: "鍚堝悓骞撮檺",
- prop: "contractTerm",
- },
- // {
- // label: "鍚堝悓寮�濮嬫棩鏈�",
- // prop: "contractStartTime",
- // width: 120
- // },
- {
- label: "鍚堝悓缁撴潫鏃ユ湡",
- prop: "contractExpireTime",
- width: 120
- },
- {
- dataType: "action",
- label: "鎿嶄綔",
- align: "center",
- fixed: 'right',
- operation: [
- {
- name: "璇︽儏",
- type: "text",
- clickFun: (row) => {
- openForm("edit", row);
- },
- },
- ],
- },
-]);
-const tableData = ref([]);
-const selectedRows = ref([]);
-const tableLoading = ref(false);
-const page = reactive({
- current: 1,
- size: 100,
- total: 0
-});
-const formDia = ref()
-const { proxy } = getCurrentInstance()
-
-const changeDaterange = (value) => {
- searchForm.value.entryDateStart = undefined;
- searchForm.value.entryDateEnd = undefined;
- if (value) {
- searchForm.value.entryDateStart = dayjs(value[0]).format("YYYY-MM-DD");
- searchForm.value.entryDateEnd = dayjs(value[1]).format("YYYY-MM-DD");
- }
- getList();
-};
-// 鏌ヨ鍒楄〃
-/** 鎼滅储鎸夐挳鎿嶄綔 */
-const handleQuery = () => {
- page.current = 1;
- getList();
-};
-const pagination = (obj) => {
- page.current = obj.page;
- page.size = obj.limit;
- getList();
-};
-const getList = () => {
- tableLoading.value = true;
- const params = { ...searchForm.value, ...page };
- params.entryDate = undefined
- staffOnJobListPage({...params, staffState: 1}).then(res => {
- tableLoading.value = false;
- tableData.value = res.data.records
- page.total = res.data.total;
- }).catch(err => {
- tableLoading.value = false;
- })
-};
-// 琛ㄦ牸閫夋嫨鏁版嵁
-const handleSelectionChange = (selection) => {
- selectedRows.value = selection;
-};
-
-// 鎵撳紑寮规
-const openForm = (type, row) => {
- nextTick(() => {
- formDia.value?.openDialog(type, row)
- })
-};
-// 瀵煎嚭
-const handleOut = () => {
- ElMessageBox.confirm("閫変腑鐨勫唴瀹瑰皢琚鍑猴紝鏄惁纭瀵煎嚭锛�", "瀵煎嚭", {
- confirmButtonText: "纭",
- cancelButtonText: "鍙栨秷",
- type: "warning",
- })
- .then(() => {
- proxy.download("/staff/staffOnJob/export", {staffState: 1}, "鍦ㄨ亴鍛樺伐鍙拌处.xlsx");
- })
- .catch(() => {
- proxy.$modal.msg("宸插彇娑�");
- });
-};
-onMounted(() => {
- getList();
-});
-</script>
-
-<style scoped></style>
diff --git a/src/views/personnelManagement/onboarding/components/formDia.vue b/src/views/personnelManagement/onboarding/components/formDia.vue
deleted file mode 100644
index 7244ab0..0000000
--- a/src/views/personnelManagement/onboarding/components/formDia.vue
+++ /dev/null
@@ -1,280 +0,0 @@
-<template>
- <div>
- <el-dialog
- v-model="dialogFormVisible"
- :title="operationType === 'add' ? '鏂板鍏ヨ亴' : '缂栬緫浜哄憳'"
- width="70%"
- @close="closeDia"
- >
- <el-form :model="form" label-width="140px" label-position="top" :rules="rules" ref="formRef">
- <el-row :gutter="30">
- <el-col :span="12">
- <el-form-item label="鍛樺伐缂栧彿锛�" prop="staffNo">
- <el-input v-model="form.staffNo" placeholder="璇疯緭鍏�" clearable :disabled="operationType !== 'add'"/>
- </el-form-item>
- </el-col>
- <el-col :span="12">
- <el-form-item label="濮撳悕锛�" prop="staffName">
- <el-input v-model="form.staffName" placeholder="璇疯緭鍏�" clearable/>
- </el-form-item>
- </el-col>
- </el-row>
- <el-row :gutter="30">
- <el-col :span="12">
- <el-form-item label="鎬у埆锛�" prop="sex">
- <el-select v-model="form.sex">
- <el-option label="鐢�" value="鐢�" />
- <el-option label="濂�" value="濂�" />
- </el-select>
- </el-form-item>
- </el-col>
- <el-col :span="12">
- <el-form-item label="绫嶈疮锛�" prop="nativePlace">
- <el-input v-model="form.nativePlace" placeholder="璇疯緭鍏�" clearable/>
- </el-form-item>
- </el-col>
- </el-row>
- <el-row :gutter="30">
- <el-col :span="12">
- <el-form-item label="宀椾綅锛�" prop="postJob">
- <el-input v-model="form.postJob" placeholder="璇疯緭鍏�" clearable/>
- </el-form-item>
- </el-col>
- <el-col :span="12">
- <el-form-item label="瀹跺涵浣忓潃锛�" prop="adress">
- <el-input v-model="form.adress" placeholder="璇疯緭鍏�" clearable/>
- </el-form-item>
- </el-col>
- </el-row>
- <el-row :gutter="30">
- <el-col :span="12">
- <el-form-item label="绗竴瀛﹀巻锛�" prop="firstStudy">
- <el-input v-model="form.firstStudy" placeholder="璇疯緭鍏�" clearable/>
- </el-form-item>
- </el-col>
- <el-col :span="12">
- <el-form-item label="涓撲笟锛�" prop="profession">
- <el-input v-model="form.profession" placeholder="璇疯緭鍏�" clearable/>
- </el-form-item>
- </el-col>
- </el-row>
- <el-row :gutter="30">
- <el-col :span="12">
- <el-form-item label="韬唤璇佸彿锛�" prop="identityCard">
- <el-input v-model="form.identityCard" placeholder="璇疯緭鍏�" clearable/>
- </el-form-item>
- </el-col>
- <el-col :span="12">
- <el-form-item label="骞撮緞锛�" prop="age">
- <el-input-number v-model="form.age" :precision="0" :step="1" style="width: 100%"/>
- </el-form-item>
- </el-col>
- </el-row>
- <el-row :gutter="30">
- <el-col :span="12">
- <el-form-item label="鑱旂郴鐢佃瘽锛�" prop="phone">
- <el-input v-model="form.phone" placeholder="璇疯緭鍏�" clearable/>
- </el-form-item>
- </el-col>
- <el-col :span="12">
- <el-form-item label="绱ф�ヨ仈绯讳汉锛�" prop="emergencyContact">
- <el-input v-model="form.emergencyContact" placeholder="璇疯緭鍏�" clearable/>
- </el-form-item>
- </el-col>
- </el-row>
- <el-row :gutter="30">
- <el-col :span="12">
- <el-form-item label="绱ф�ヨ仈绯讳汉鑱旂郴鐢佃瘽锛�" prop="emergencyContactPhone">
- <el-input v-model="form.emergencyContactPhone" placeholder="璇疯緭鍏�" clearable/>
- </el-form-item>
- </el-col>
- <el-col :span="12">
- <el-form-item label="鍚堝悓骞撮檺锛�" prop="contractTerm">
- <el-input-number v-model="form.contractTerm" :precision="0" :step="1" style="width: 100%" :disabled="true"/>
- </el-form-item>
- </el-col>
- </el-row>
- <el-row :gutter="30">
- <el-col :span="12">
- <el-form-item label="鍚堝悓寮�濮嬫棩鏈燂細" prop="contractStartTime">
- <el-date-picker
- v-model="form.contractStartTime"
- type="date"
- placeholder="璇烽�夋嫨鏃ユ湡"
- value-format="YYYY-MM-DD"
- format="YYYY-MM-DD"
- clearable
- style="width: 100%"
- @change="calculateContractTerm"
- />
- </el-form-item>
- </el-col>
- <el-col :span="12">
- <el-form-item label="鍚堝悓缁撴潫鏃ユ湡锛�" prop="contractEndTime">
- <el-date-picker
- v-model="form.contractEndTime"
- type="date"
- placeholder="璇烽�夋嫨鏃ユ湡"
- value-format="YYYY-MM-DD"
- format="YYYY-MM-DD"
- clearable
- style="width: 100%"
- @change="calculateContractTerm"
- />
- </el-form-item>
- </el-col>
- </el-row>
- <el-row :gutter="30">
- <el-col :span="12">
- <el-form-item label="璇曠敤鏈燂紙鏈堬級锛�" prop="probationPeriod">
- <el-input-number v-model="form.probationPeriod" :precision="0" :step="1" min="0" style="width: 100%"/>
- </el-form-item>
- </el-col>
- <!-- <el-col :span="12">
- <el-form-item label="鍏ヨ亴鏃ユ湡锛�" prop="entryDate">
- <el-date-picker
- v-model="form.entryDate"
- type="date"
- placeholder="璇烽�夋嫨鏃ユ湡"
- value-format="YYYY-MM-DD"
- format="YYYY-MM-DD"
- clearable
- style="width: 100%"
- />
- </el-form-item>
- </el-col> -->
- </el-row>
- </el-form>
- <template #footer>
- <div class="dialog-footer">
- <el-button type="primary" @click="submitForm">纭</el-button>
- <el-button @click="closeDia">鍙栨秷</el-button>
- </div>
- </template>
- </el-dialog>
- </div>
-</template>
-
-<script setup>
-import {ref, reactive, toRefs} from "vue";
-import {getStaffJoinInfo, staffJoinAdd, staffJoinUpdate} from "@/api/personnelManagement/onboarding.js";
-const { proxy } = getCurrentInstance()
-const emit = defineEmits(['close'])
-
-const dialogFormVisible = ref(false);
-const operationType = ref('')
-const data = reactive({
- form: {
- staffNo: "",
- staffName: "",
- sex: "",
- nativePlace: "",
- postJob: "",
- adress: "",
- firstStudy: "",
- profession: "",
- identityCard: "",
- age: 0,
- phone: "",
- emergencyContact: "",
- emergencyContactPhone: "",
- contractTerm: 0,
- contractStartTime: "",
- contractEndTime: "",
- staffState: "",
- probationPeriod: 3, // 榛樿璇曠敤鏈�3涓湀
- },
- rules: {
- staffNo: [{ required: true, message: "璇疯緭鍏�", trigger: "blur" },],
- staffName: [{ required: true, message: "璇疯緭鍏�", trigger: "blur" }],
- sex: [{ required: true, message: "璇疯緭鍏�", trigger: "blur" }],
- nativePlace: [{ required: true, message: "璇疯緭鍏�", trigger: "blur" }],
- postJob: [{ required: true, message: "璇疯緭鍏�", trigger: "blur" }],
- adress: [{ required: true, message: "璇疯緭鍏�", trigger: "blur" }],
- firstStudy: [{ required: true, message: "璇疯緭鍏�", trigger: "blur" }],
- profession: [{ required: true, message: "璇疯緭鍏�", trigger: "blur" }],
- identityCard: [{ required: true, message: "璇疯緭鍏�", trigger: "blur" }],
- age: [{ required: true, message: "璇疯緭鍏�", trigger: "blur" }],
- phone: [{ required: true, message: "璇疯緭鍏�", trigger: "blur" }],
- emergencyContact: [{ required: true, message: "璇疯緭鍏�", trigger: "blur" }],
- emergencyContactPhone: [{ required: true, message: "璇疯緭鍏�", trigger: "blur" }],
- contractTerm: [{ required: true, message: "璇疯緭鍏�", trigger: "blur" }],
- contractStartTime: [{ required: true, message: "璇疯緭鍏�", trigger: "blur" }],
- contractEndTime: [{ required: true, message: "璇疯緭鍏�", trigger: "blur" }],
- },
-});
-const { form, rules } = toRefs(data);
-
-// 鎵撳紑寮规
-const openDialog = (type, row) => {
- operationType.value = type;
- dialogFormVisible.value = true;
- if (operationType.value === 'edit') {
- getStaffJoinInfo(row.id).then(res => {
- form.value = {...res.data}
- // 缂栬緫鏃朵篃璁$畻涓�娆″悎鍚屽勾闄�
- calculateContractTerm();
- })
- }
-}
-// 鎻愪氦浜у搧琛ㄥ崟
-const submitForm = () => {
- proxy.$refs.formRef.validate(valid => {
- if (valid) {
- form.value.staffState = 1
- if (operationType.value === "add") {
- staffJoinAdd(form.value).then(res => {
- proxy.$modal.msgSuccess("鎻愪氦鎴愬姛");
- closeDia();
- })
- } else {
- staffJoinUpdate(form.value).then(res => {
- proxy.$modal.msgSuccess("鎻愪氦鎴愬姛");
- closeDia();
- })
- }
- }
- })
-}
-// 璁$畻鍚堝悓骞撮檺
-const calculateContractTerm = () => {
- if (form.value.contractStartTime && form.value.contractEndTime) {
- const startDate = new Date(form.value.contractStartTime);
- const endDate = new Date(form.value.contractEndTime);
-
- if (endDate > startDate) {
- // 璁$畻骞翠唤宸�
- const yearDiff = endDate.getFullYear() - startDate.getFullYear();
- const monthDiff = endDate.getMonth() - startDate.getMonth();
- const dayDiff = endDate.getDate() - startDate.getDate();
-
- let years = yearDiff;
-
- // 濡傛灉缁撴潫鏃ユ湡鐨勬湀鏃ュ皬浜庡紑濮嬫棩鏈熺殑鏈堟棩锛屽垯鍑忓幓1骞�
- if (monthDiff < 0 || (monthDiff === 0 && dayDiff < 0)) {
- years = yearDiff - 1;
- }
-
- form.value.contractTerm = Math.max(0, years);
- } else {
- form.value.contractTerm = 0;
- }
- } else {
- form.value.contractTerm = 0;
- }
-};
-
-// 鍏抽棴寮规
-const closeDia = () => {
- proxy.resetForm("formRef");
- dialogFormVisible.value = false;
- emit('close')
-};
-defineExpose({
- openDialog,
-});
-</script>
-
-<style scoped>
-
-</style>
\ No newline at end of file
diff --git a/src/views/personnelManagement/onboarding/index.vue b/src/views/personnelManagement/onboarding/index.vue
deleted file mode 100644
index d993ee6..0000000
--- a/src/views/personnelManagement/onboarding/index.vue
+++ /dev/null
@@ -1,348 +0,0 @@
-<template>
- <div class="app-container">
- <div class="search_form">
- <div>
- <span class="search_title">濮撳悕锛�</span>
- <el-input
- v-model="searchForm.staffName"
- style="width: 240px"
- placeholder="璇疯緭鍏ュ鍚嶆悳绱�"
- @change="handleQuery"
- clearable
- :prefix-icon="Search"
- />
- <span style="margin-left: 10px;" class="search_title">鍚堝悓寮�濮嬫棩鏈燂細</span>
- <el-date-picker
- v-model="searchForm.entryDateStart"
- type="date"
- placeholder="璇烽�夋嫨鍚堝悓寮�濮嬫棩鏈�"
- size="default"
- @change="(date) => handleDateChange(date,1)"
- />
- <span style="margin-left: 10px;" class="search_title">鍚堝悓缁撴潫鏃ユ湡锛�</span>
- <el-date-picker
- v-model="searchForm.entryDateEnd"
- type="date"
- placeholder="璇烽�夋嫨鍚堝悓缁撴潫鏃ユ湡"
- size="default"
- @change="(date) => handleDateChange(date,2)"
- />
- <el-button type="primary" @click="handleQuery" style="margin-left: 10px"
- >鎼滅储</el-button
- >
- </div>
- <div>
- <el-button type="primary" @click="openForm('add')">鏂板鍏ヨ亴</el-button>
- <el-button @click="handleOut">瀵煎嚭</el-button>
- <el-button type="danger" plain @click="handleDelete">鍒犻櫎</el-button>
- </div>
- </div>
- <div class="table_list">
- <PIMTable
- rowKey="id"
- :column="tableColumn"
- :tableData="tableData"
- :page="page"
- :isSelection="true"
- @selection-change="handleSelectionChange"
- :tableLoading="tableLoading"
- @pagination="pagination"
- :total="page.total"
- ></PIMTable>
- </div>
- <form-dia ref="formDia" @close="handleQuery"></form-dia>
- </div>
-</template>
-
-<script setup>
-import { Search } from "@element-plus/icons-vue";
-import {onMounted, ref} from "vue";
-import FormDia from "@/views/personnelManagement/onboarding/components/formDia.vue";
-import {staffJoinDel, staffJoinListPage} from "@/api/personnelManagement/onboarding.js";
-import {ElMessageBox} from "element-plus";
-import dayjs from "dayjs";
-
-const data = reactive({
- searchForm: {
- staffName: "",
- },
-});
-const { searchForm } = toRefs(data);
-const tableColumn = ref([
- {
- label: "鐘舵��",
- prop: "staffState",
- dataType: "tag",
- formatData: (params) => {
- if (params == 0) {
- return "绂昏亴";
- } else if (params == 1) {
- return "鍏ヨ亴";
- } else {
- return null;
- }
- },
- formatType: (params) => {
- if (params == 0) {
- return "danger";
- } else if (params == 1) {
- return "primary";
- } else {
- return null;
- }
- },
- },
- {
- label: "鍛樺伐缂栧彿",
- prop: "staffNo",
- },
- {
- label: "濮撳悕",
- prop: "staffName",
- },
- {
- label: "鎬у埆",
- prop: "sex",
- },
- {
- label: "绫嶈疮",
- prop: "nativePlace",
- },
- {
- label: "宀椾綅",
- prop: "postJob",
- },
- {
- label: "瀹跺涵浣忓潃",
- prop: "adress",
- width:200
- },
- {
- label: "绗竴瀛﹀巻",
- prop: "firstStudy",
- },
- {
- label: "涓撲笟",
- prop: "profession",
- width:100
- },
- {
- label: "韬唤璇佸彿",
- prop: "identityCard",
- width:200
- },
- {
- label: "骞撮緞",
- prop: "age",
- },
- {
- label: "鑱旂郴鐢佃瘽",
- prop: "phone",
- width:150
- },
- {
- label: "绱ф�ヨ仈绯讳汉",
- prop: "emergencyContact",
- width: 120
- },
- {
- label: "鑱旂郴鐢佃瘽",
- prop: "emergencyContactPhone",
- width:150
- },
- {
- label: "璇曠敤鏈燂紙鏈堬級",
- prop: "probationPeriod",
- width: 120,
- },
- // {
- // label: "杞鏃ユ湡",
- // prop: "probationEndDate",
- // width: 120,
- // formatData: (row) => {
- // // 淇敼涓轰娇鐢ㄥ悎鍚屽紑濮嬫棩鏈熻绠楄浆姝f棩鏈�
- // if (row.contractStartTime && row.probationPeriod) {
- // // 璁$畻杞鏃ユ湡锛堝悎鍚屽紑濮嬫棩鏈熷姞涓婅瘯鐢ㄦ湡鏈堟暟锛�
- // return dayjs(row.contractStartTime).add(row.probationPeriod, 'month').format('YYYY-MM-DD');
- // }
- // return '';
- // },
- // formatType: (row) => {
- // // 淇敼涓轰娇鐢ㄥ悎鍚屽紑濮嬫棩鏈熸鏌ユ槸鍚︿复杩戣浆姝o紙7澶╁唴锛�
- // if (row.contractStartTime && row.probationPeriod) {
- // const probationEndDate = dayjs(row.contractStartTime).add(row.probationPeriod, 'month');
- // const daysUntilProbationEnd = probationEndDate.diff(dayjs(), 'day');
-
- // if (daysUntilProbationEnd >= 0 && daysUntilProbationEnd <= 7) {
- // return 'warning'; // 浣跨敤璀﹀憡鏍峰紡鏍囪涓磋繎杞鐨勫憳宸�
- // }
- // }
- // return '';
- // }
- // },
- {
- label: "鍚堝悓骞撮檺锛堝勾锛�",
- prop: "contractTerm",
- width: 120,
- },
- {
- label: "鍚堝悓寮�濮嬫棩鏈�",
- prop: "contractStartTime",
- width: 120
- },
- {
- label: "鍚堝悓缁撴潫鏃ユ湡",
- prop: "contractEndTime",
- width: 120
- },
- {
- dataType: "action",
- label: "鎿嶄綔",
- align: "center",
- fixed: 'right',
- operation: [
- {
- name: "缂栬緫",
- type: "text",
- clickFun: (row) => {
- openForm("edit", row);
- },
- },
- ],
- },
-]);
-const tableData = ref([]);
-const selectedRows = ref([]);
-const tableLoading = ref(false);
-const page = reactive({
- current: 1,
- size: 100,
- total: 0,
-});
-const formDia = ref()
-const { proxy } = getCurrentInstance()
-
-const handleDateChange = (value,type) => {
- searchForm.value.entryDateEnd = null
- searchForm.value.entryDateStart = null
- if(type === 1){
- if (value) {
- searchForm.value.entryDateStart = dayjs(value).format("YYYY-MM-DD");
- }
- }else{
- if (value) {
- searchForm.value.entryDateEnd = dayjs(value).format("YYYY-MM-DD");
- }
- }
- getList();
-};
-// 鏌ヨ鍒楄〃
-/** 鎼滅储鎸夐挳鎿嶄綔 */
-const handleQuery = () => {
- page.current = 1;
- getList();
-};
-const pagination = (obj) => {
- page.current = obj.page;
- page.size = obj.limit;
- getList();
-};
-const getList = () => {
- tableLoading.value = true;
- staffJoinListPage({...page, ...searchForm.value, staffState: 1}).then(res => {
- tableLoading.value = false;
- tableData.value = res.data.records
- page.total = res.data.total;
-
- // 妫�鏌ユ槸鍚︽湁涓磋繎杞鐨勫憳宸ュ苟鎻愰啋
- checkProbationEnding(tableData.value);
- }).catch(err => {
- tableLoading.value = false;
- })
-};
-// 妫�鏌ヤ复杩戣浆姝g殑鍛樺伐骞舵彁閱�
-const checkProbationEnding = (data) => {
- const probationEndingSoon = [];
-
- data.forEach(item => {
- // 淇敼涓轰娇鐢ㄥ悎鍚屽紑濮嬫棩鏈熸鏌�
- if (item.contractStartTime && item.probationPeriod) {
- const probationEndDate = dayjs(item.contractStartTime).add(item.probationPeriod, 'month');
- const daysUntilProbationEnd = probationEndDate.diff(dayjs(), 'day');
-
- if (daysUntilProbationEnd >= 0 && daysUntilProbationEnd <= 7) {
- probationEndingSoon.push({
- staffName: item.staffName,
- probationEndDate: probationEndDate.format('YYYY-MM-DD'),
- daysLeft: daysUntilProbationEnd
- });
- }
- }
- });
-
- if (probationEndingSoon.length > 0) {
- let message = '浠ヤ笅鍛樺伐灏嗗湪7澶╁唴杞锛歕n';
- probationEndingSoon.forEach(item => {
- message += `${item.staffName}锛�${item.probationEndDate}锛岃繕鏈�${item.daysLeft}澶╋級\n`;
- });
-
- // 鏄剧ず鎻愰啋娑堟伅
- proxy.$modal.msgInfo(message);
- }
-};
-// 琛ㄦ牸閫夋嫨鏁版嵁
-const handleSelectionChange = (selection) => {
- selectedRows.value = selection;
-};
-
-// 鎵撳紑寮规
-const openForm = (type, row) => {
- nextTick(() => {
- formDia.value?.openDialog(type, row)
- })
-};
-
-// 鍒犻櫎
-const handleDelete = () => {
- let ids = [];
- if (selectedRows.value.length > 0) {
- ids = selectedRows.value.map((item) => item.id);
- } else {
- proxy.$modal.msgWarning("璇烽�夋嫨鏁版嵁");
- return;
- }
- ElMessageBox.confirm("閫変腑鐨勫唴瀹瑰皢琚垹闄わ紝鏄惁纭鍒犻櫎锛�", "瀵煎嚭", {
- confirmButtonText: "纭",
- cancelButtonText: "鍙栨秷",
- type: "warning",
- })
- .then(() => {
- staffJoinDel(ids).then((res) => {
- proxy.$modal.msgSuccess("鍒犻櫎鎴愬姛");
- getList();
- });
- })
- .catch(() => {
- proxy.$modal.msg("宸插彇娑�");
- });
-};
-// 瀵煎嚭
-const handleOut = () => {
- ElMessageBox.confirm("閫変腑鐨勫唴瀹瑰皢琚鍑猴紝鏄惁纭瀵煎嚭锛�", "瀵煎嚭", {
- confirmButtonText: "纭",
- cancelButtonText: "鍙栨秷",
- type: "warning",
- })
- .then(() => {
- proxy.download("/staff/staffJoinLeaveRecord/export", {staffState: 1}, "浜哄憳鍏ヨ亴.xlsx");
- })
- .catch(() => {
- proxy.$modal.msg("宸插彇娑�");
- });
-};
-onMounted(() => {
- getList();
-});
-</script>
-
-<style scoped></style>
diff --git a/src/views/personnelManagement/payrollManagement/components/formDia.vue b/src/views/personnelManagement/payrollManagement/components/formDia.vue
deleted file mode 100644
index 6dbc326..0000000
--- a/src/views/personnelManagement/payrollManagement/components/formDia.vue
+++ /dev/null
@@ -1,315 +0,0 @@
-<template>
- <div>
- <el-dialog
- v-model="dialogFormVisible"
- :title="operationType === 'add' ? '鏂板鍏ヨ亴' : '缂栬緫浜哄憳'"
- width="50%"
- @close="closeDia"
- >
- <el-form :model="form" label-width="140px" label-position="top" :rules="rules" ref="formRef">
- <el-row :gutter="30">
- <el-col :span="12">
- <el-form-item label="鏈堜唤锛�" prop="payDate">
- <el-date-picker
- v-model="form.payDate"
- type="month"
- value-format="YYYY-MM-DD"
- format="YYYY-MM"
- placeholder="璇烽�夋嫨鏈堜唤"
- clearable
- :disabled="operationType === 'edit'"
- style="width: 100%"
- />
- </el-form-item>
- </el-col>
- <el-col :span="12">
- <el-form-item label="濮撳悕锛�" prop="staffId">
- <el-select v-model="form.staffId" placeholder="璇烽�夋嫨浜哄憳" style="width: 100%" @change="handleSelect" :disabled="operationType === 'edit'">
- <el-option
- v-for="item in personList"
- :key="item.id"
- :label="item.staffName"
- :value="item.id"
- />
- </el-select>
- </el-form-item>
- </el-col>
- </el-row>
- <el-row :gutter="30">
- <el-col :span="12">
- <el-form-item label="搴斿嚭鍕ゅぉ鏁帮細" prop="shouldAttendedNum">
- <el-input v-model="form.shouldAttendedNum" placeholder="璇疯緭鍏�" clearable type="number"/>
- </el-form-item>
- </el-col>
- <el-col :span="12">
- <el-form-item label="瀹為檯鍑哄嫟澶╂暟锛�" prop="actualAttendedNum">
- <el-input v-model="form.actualAttendedNum" placeholder="璇疯緭鍏�" clearable type="number"/>
- </el-form-item>
- </el-col>
- </el-row>
- <el-row :gutter="30">
- <el-col :span="12">
- <el-form-item label="鍩烘湰宸ヨ祫锛�" prop="basicSalary">
- <el-input v-model="form.basicSalary" placeholder="璇疯緭鍏�" clearable type="number"/>
- </el-form-item>
- </el-col>
- <el-col :span="12">
- <el-form-item label="宀椾綅宸ヨ祫锛�" prop="postSalary">
- <el-input v-model="form.postSalary" placeholder="璇疯緭鍏�" clearable type="number"/>
- </el-form-item>
- </el-col>
- </el-row>
- <el-row :gutter="30">
- <el-col :span="12">
- <el-form-item label="鍏ョ鑱岀己鍕ゆ墸娆撅細" prop="deductionAbsenteeism">
- <el-input v-model="form.deductionAbsenteeism" placeholder="璇疯緭鍏�" clearable type="number"/>
- </el-form-item>
- </el-col>
- <el-col :span="12">
- <el-form-item label="鐥呭亣鎵f锛�" prop="sickLeaveDeductions">
- <el-input v-model="form.sickLeaveDeductions" placeholder="璇疯緭鍏�" clearable type="number"/>
- </el-form-item>
- </el-col>
- </el-row>
- <el-row :gutter="30">
- <el-col :span="12">
- <el-form-item label="浜嬪亣鎵f锛�" prop="deductionPersonalLeave">
- <el-input v-model="form.deductionPersonalLeave" placeholder="璇疯緭鍏�" clearable type="number"/>
- </el-form-item>
- </el-col>
- <el-col :span="12">
- <el-form-item label="蹇樿鎵撳崱鎵f锛�" prop="forgetClockDeduct">
- <el-input v-model="form.forgetClockDeduct" style="width: 100%" type="number"/>
- </el-form-item>
- </el-col>
- </el-row>
- <el-row :gutter="30">
- <el-col :span="12">
- <el-form-item label="缁╂晥寰楀垎锛�" prop="performanceScore">
- <el-input v-model="form.performanceScore" placeholder="璇疯緭鍏�" clearable type="number"/>
- </el-form-item>
- </el-col>
- <el-col :span="12">
- <el-form-item label="缁╂晥宸ヨ祫锛�" prop="performancePay">
- <el-input v-model="form.performancePay" placeholder="璇疯緭鍏�" clearable type="number"/>
- </el-form-item>
- </el-col>
- </el-row>
- <el-row :gutter="30">
- <el-col :span="12">
- <el-form-item label="搴斿彂鍚堣锛�" prop="payableWages">
- <el-input v-model="form.payableWages" placeholder="璇疯緭鍏�" clearable type="number"/>
- </el-form-item>
- </el-col>
- <el-col :span="12">
- <el-form-item label="绀句繚涓汉锛�" prop="socialSecurityIndividuals">
- <el-input v-model="form.socialSecurityIndividuals" :precision="0" :step="1" style="width: 100%" type="number"/>
- </el-form-item>
- </el-col>
- </el-row>
- <el-row :gutter="30">
- <el-col :span="12">
- <el-form-item label="绀句繚鍏徃锛�" prop="socialSecurityCompanies">
- <el-input v-model="form.socialSecurityCompanies" :precision="0" :step="1" style="width: 100%" type="number"/>
- </el-form-item>
- </el-col>
- <el-col :span="12">
- <el-form-item label="绀句繚鍚堣锛�" prop="socialSecurityTotal">
- <el-input v-model="form.socialSecurityTotal" :precision="0" :step="1" style="width: 100%" type="number"/>
- </el-form-item>
- </el-col>
- </el-row>
- <el-row :gutter="30">
- <el-col :span="12">
- <el-form-item label="鍏Н閲戜釜浜猴細" prop="providentFundIndividuals">
- <el-input v-model="form.providentFundIndividuals" :precision="0" :step="1" style="width: 100%" type="number"/>
- </el-form-item>
- </el-col>
- <el-col :span="12">
- <el-form-item label="鍏Н閲戝叕鍙革細" prop="providentFundCompany">
- <el-input v-model="form.providentFundCompany" :precision="0" :step="1" style="width: 100%" type="number"/>
- </el-form-item>
- </el-col>
- </el-row>
- <el-row :gutter="30">
- <el-col :span="12">
- <el-form-item label="鍏Н閲戝悎璁★細" prop="providentFundTotal">
- <el-input v-model="form.providentFundTotal" :precision="0" :step="1" style="width: 100%" type="number"/>
- </el-form-item>
- </el-col>
- <el-col :span="12">
- <el-form-item label="搴旂◣宸ヨ祫锛�" prop="taxableWaget">
- <el-input v-model="form.taxableWaget" :precision="0" :step="1" style="width: 100%" type="number"/>
- </el-form-item>
- </el-col>
- </el-row>
- <el-row :gutter="30">
- <el-col :span="12">
- <el-form-item label="涓汉鎵�寰楃◣锛�" prop="personalIncomeTax">
- <el-input v-model="form.personalIncomeTax" :step="0.1" style="width: 100%" type="number"/>
- </el-form-item>
- </el-col>
- <el-col :span="12">
- <el-form-item label="瀹炲彂宸ヨ祫锛�" prop="actualWages">
- <el-input v-model="form.actualWages" style="width: 100%" type="number"/>
- </el-form-item>
- </el-col>
- </el-row>
- </el-form>
- <template #footer>
- <div class="dialog-footer">
- <el-button type="primary" @click="submitForm">纭</el-button>
- <el-button @click="closeDia">鍙栨秷</el-button>
- </div>
- </template>
- </el-dialog>
- </div>
-</template>
-
-<script setup>
-import {ref} from "vue";
-import {getStaffJoinInfo, getStaffOnJob, staffJoinAdd, staffJoinUpdate} from "@/api/personnelManagement/onboarding.js";
-import {compensationAdd, compensationUpdate} from "@/api/personnelManagement/payrollManagement.js";
-const { proxy } = getCurrentInstance()
-const emit = defineEmits(['close'])
-
-const dialogFormVisible = ref(false);
-const operationType = ref('')
-const data = reactive({
- form: {
- payDate: "",
- staffId: "",
- name: "",
- shouldAttendedNum: "",
- actualAttendedNum: "",
- basicSalary: "",
- postSalary: "",
- deductionAbsenteeism: "",
- sickLeaveDeductions: "",
- deductionPersonalLeave: "",
- forgetClockDeduct: "",
- performanceScore: "",
- performancePay: "",
- payableWages: "",
- socialSecurityIndividuals: "",
- socialSecurityCompanies: "",
- socialSecurityTotal: "",
- providentFundIndividuals: "",
- providentFundCompany: "",
- providentFundTotal: "",
- taxableWaget: "",
- personalIncomeTax: "",
- actualWages: "",
- },
- rules: {
- payDate: [{ required: true, message: "璇烽�夋嫨", trigger: "change" },],
- staffId: [{ required: true, message: "璇烽�夋嫨", trigger: "change" },],
- staffName: [{ required: true, message: "璇疯緭鍏�", trigger: "blur" }],
- shouldAttendedNum: [{ required: true, message: "璇疯緭鍏�", trigger: "blur" }],
- actualAttendedNum: [{ required: true, message: "璇疯緭鍏�", trigger: "blur" }],
- basicSalary: [{ required: true, message: "璇疯緭鍏�", trigger: "blur" }],
- postSalary: [{ required: true, message: "璇疯緭鍏�", trigger: "blur" }],
- deductionAbsenteeism: [{ required: true, message: "璇疯緭鍏�", trigger: "blur" }],
- sickLeaveDeductions: [{ required: true, message: "璇疯緭鍏�", trigger: "blur" }],
- deductionPersonalLeave: [{ required: true, message: "璇疯緭鍏�", trigger: "blur" }],
- forgetClockDeduct: [{ required: true, message: "璇疯緭鍏�", trigger: "blur" }],
- performanceScore: [{ required: true, message: "璇疯緭鍏�", trigger: "blur" }],
- performancePay: [{ required: true, message: "璇疯緭鍏�", trigger: "blur" }],
- payableWages: [{ required: true, message: "璇疯緭鍏�", trigger: "blur" }],
- socialSecurityIndividuals: [{ required: true, message: "璇疯緭鍏�", trigger: "blur" }],
- socialSecurityCompanies: [{ required: true, message: "璇疯緭鍏�", trigger: "blur" }],
- socialSecurityTotal: [{ required: true, message: "璇疯緭鍏�", trigger: "blur" }],
- providentFundIndividuals: [{ required: true, message: "璇疯緭鍏�", trigger: "blur" }],
- providentFundCompany: [{ required: true, message: "璇疯緭鍏�", trigger: "blur" }],
- providentFundTotal: [{ required: true, message: "璇疯緭鍏�", trigger: "blur" }],
- taxableWaget: [{ required: true, message: "璇疯緭鍏�", trigger: "blur" }],
- personalIncomeTax: [{ required: true, message: "璇疯緭鍏�", trigger: "blur" }],
- actualWages: [{ required: true, message: "璇疯緭鍏�", trigger: "blur" }],
- },
-});
-const { form, rules } = toRefs(data);
-const personList = ref([]);
-
-// 鎵撳紑寮规
-const openDialog = (type, row) => {
- operationType.value = type;
- dialogFormVisible.value = true;
- getStaffOnJob().then(res => {
- personList.value = res.data
- })
- form.value = {}
- if (operationType.value === 'edit') {
- getStaffJoinInfo(row.id).then(res => {
- form.value = {...row}
- form.value.payDate = form.value.payDate + '-01'
- })
- }
-}
-const handleSelect = (value) => {
- console.log('value', value)
- const index = personList.value.findIndex(row => row.id === value)
- if (index > -1) {
- form.value.name = personList.value[index].staffName
- }
-}
-// 鎻愪氦浜у搧琛ㄥ崟
-const submitForm = () => {
- proxy.$refs.formRef.validate(valid => {
- if (valid) {
- form.value.staffState = 1
- if (operationType.value === "add") {
- compensationAdd(form.value).then(res => {
- proxy.$modal.msgSuccess("鎻愪氦鎴愬姛");
- closeDia();
- })
- } else {
- compensationUpdate(form.value).then(res => {
- proxy.$modal.msgSuccess("鎻愪氦鎴愬姛");
- closeDia();
- })
- }
- }
- })
-}
-// 璁$畻鍚堝悓骞撮檺
-const calculateContractTerm = () => {
- if (form.value.contractStartTime && form.value.contractEndTime) {
- const startDate = new Date(form.value.contractStartTime);
- const endDate = new Date(form.value.contractEndTime);
-
- if (endDate > startDate) {
- // 璁$畻骞翠唤宸�
- const yearDiff = endDate.getFullYear() - startDate.getFullYear();
- const monthDiff = endDate.getMonth() - startDate.getMonth();
- const dayDiff = endDate.getDate() - startDate.getDate();
-
- let years = yearDiff;
-
- // 濡傛灉缁撴潫鏃ユ湡鐨勬湀鏃ュ皬浜庡紑濮嬫棩鏈熺殑鏈堟棩锛屽垯鍑忓幓1骞�
- if (monthDiff < 0 || (monthDiff === 0 && dayDiff < 0)) {
- years = yearDiff - 1;
- }
-
- form.value.contractTerm = Math.max(0, years);
- } else {
- form.value.contractTerm = 0;
- }
- } else {
- form.value.contractTerm = 0;
- }
-};
-
-// 鍏抽棴寮规
-const closeDia = () => {
- proxy.resetForm("formRef");
- dialogFormVisible.value = false;
- emit('close')
-};
-defineExpose({
- openDialog,
-});
-</script>
-
-<style scoped>
-
-</style>
\ No newline at end of file
diff --git a/src/views/personnelManagement/payrollManagement/index.vue b/src/views/personnelManagement/payrollManagement/index.vue
deleted file mode 100644
index 1de23e4..0000000
--- a/src/views/personnelManagement/payrollManagement/index.vue
+++ /dev/null
@@ -1,291 +0,0 @@
-<template>
- <div class="app-container">
- <div class="search_form">
- <div>
- <span class="search_title">濮撳悕锛�</span>
- <el-input
- v-model="searchForm.name"
- style="width: 240px"
- placeholder="璇疯緭鍏ュ鍚嶆悳绱�"
- @change="handleQuery"
- clearable
- :prefix-icon="Search"
- />
- <span class="search_title ml10">鏈堜唤锛�</span>
- <el-date-picker
- v-model="searchForm.payDateStr"
- type="month"
- @change="handleQuery"
- value-format="YYYY-MM"
- format="YYYY-MM"
- placeholder="璇烽�夋嫨鏈堜唤"
- style="width: 240px"
- clearable
- />
- <el-button type="primary" @click="handleQuery" style="margin-left: 10px"
- >鎼滅储</el-button
- >
- </div>
- <div>
- <el-button type="primary" @click="openForm('add')">鏂板钖祫</el-button>
-<!-- <el-button @click="handleOut">瀵煎嚭</el-button>-->
- <el-button type="danger" plain @click="handleDelete">鍒犻櫎</el-button>
- </div>
- </div>
- <div class="table_list">
- <PIMTable
- rowKey="id"
- :column="tableColumn"
- :tableData="tableData"
- :page="page"
- :isSelection="true"
- @selection-change="handleSelectionChange"
- :tableLoading="tableLoading"
- @pagination="pagination"
- :total="page.total"
- ></PIMTable>
- </div>
- <form-dia ref="formDia" @close="handleQuery"></form-dia>
- </div>
-</template>
-
-<script setup>
-import { Search } from "@element-plus/icons-vue";
-import {onMounted, ref} from "vue";
-import FormDia from "@/views/personnelManagement/payrollManagement/components/formDia.vue";
-import {staffJoinDel} from "@/api/personnelManagement/onboarding.js";
-import {ElMessageBox} from "element-plus";
-import dayjs from "dayjs";
-import {compensationDelete, compensationListPage} from "@/api/personnelManagement/payrollManagement.js";
-
-const data = reactive({
- searchForm: {
- name: "",
- payDateStr: "",
- },
-});
-const { searchForm } = toRefs(data);
-const tableColumn = ref([
- {
- label: "钖祫鏈堜唤",
- prop: "payDate",
- },
- {
- label: "濮撳悕",
- prop: "name",
- },
- {
- label: "搴斿嚭鍕ゅぉ鏁�",
- prop: "shouldAttendedNum",
- width:100
- },
- {
- label: "瀹為檯鍑哄嫟澶╂暟",
- prop: "actualAttendedNum",
- width:110
- },
- {
- label: "鍩烘湰宸ヨ祫",
- prop: "basicSalary",
- },
- {
- label: "宀椾綅宸ヨ祫",
- prop: "postSalary",
- width:100
- },
- {
- label: "鍏ョ鑱岀己鍕ゆ墸娆�",
- prop: "deductionAbsenteeism",
- width:130
- },
- {
- label: "鐥呭亣鎵f",
- prop: "sickLeaveDeductions",
- width:100
- },
- {
- label: "浜嬪亣鎵f",
- prop: "deductionPersonalLeave",
- width:100
- },
- {
- label: "蹇樿鎵撳崱鎵f",
- prop: "forgetClockDeduct",
- width:110
- },
- {
- label: "缁╂晥寰楀垎",
- prop: "performanceScore",
- width:150
- },
- {
- label: "缁╂晥宸ヨ祫",
- prop: "performancePay",
- width: 120
- },
- {
- label: "搴斿彂鍚堣",
- prop: "payableWages",
- width:150
- },
- {
- label: "绀句繚涓汉",
- prop: "socialSecurityIndividuals",
- },
- {
- label: "绀句繚鍏徃",
- prop: "socialSecurityCompanies",
- width: 120
- },
- {
- label: "绀句繚鍚堣",
- prop: "socialSecurityTotal",
- width: 120
- },
- {
- label: "鍏Н閲戜釜浜�",
- prop: "providentFundIndividuals",
- width: 120
- },
- {
- label: "鍏Н閲戝叕鍙�",
- prop: "providentFundCompany",
- width: 120
- },
- {
- label: "鍏Н閲戝悎璁�",
- prop: "providentFundTotal",
- width: 120
- },
- {
- label: "搴旂◣宸ヨ祫",
- prop: "taxableWaget",
- },
- {
- label: "涓汉鎵�寰楃◣",
- prop: "personalIncomeTax",
- width: 120
- },
- {
- label: "瀹炲彂宸ヨ祫",
- prop: "actualWages",
- width: 120
- },
- {
- dataType: "action",
- label: "鎿嶄綔",
- align: "center",
- fixed: 'right',
- operation: [
- {
- name: "缂栬緫",
- type: "text",
- clickFun: (row) => {
- openForm("edit", row);
- },
- },
- ],
- },
-]);
-const tableData = ref([]);
-const selectedRows = ref([]);
-const tableLoading = ref(false);
-const page = reactive({
- current: 1,
- size: 100,
- total: 0,
-});
-const formDia = ref()
-const { proxy } = getCurrentInstance()
-
-const handleDateChange = (value,type) => {
- searchForm.value.entryDateEnd = null
- searchForm.value.entryDateStart = null
- if(type === 1){
- if (value) {
- searchForm.value.entryDateStart = dayjs(value).format("YYYY-MM-DD");
- }
- }else{
- if (value) {
- searchForm.value.entryDateEnd = dayjs(value).format("YYYY-MM-DD");
- }
- }
- getList();
-};
-// 鏌ヨ鍒楄〃
-/** 鎼滅储鎸夐挳鎿嶄綔 */
-const handleQuery = () => {
- page.current = 1;
- getList();
-};
-const pagination = (obj) => {
- page.current = obj.page;
- page.size = obj.limit;
- getList();
-};
-const getList = () => {
- tableLoading.value = true;
- compensationListPage({...page, ...searchForm.value, staffState: 1}).then(res => {
- tableLoading.value = false;
- tableData.value = res.data.records
- page.total = res.data.total;
- }).catch(err => {
- tableLoading.value = false;
- })
-};
-// 琛ㄦ牸閫夋嫨鏁版嵁
-const handleSelectionChange = (selection) => {
- selectedRows.value = selection;
-};
-
-// 鎵撳紑寮规
-const openForm = (type, row) => {
- nextTick(() => {
- formDia.value?.openDialog(type, row)
- })
-};
-
-// 鍒犻櫎
-const handleDelete = () => {
- let ids = [];
- if (selectedRows.value.length > 0) {
- ids = selectedRows.value.map((item) => item.id);
- } else {
- proxy.$modal.msgWarning("璇烽�夋嫨鏁版嵁");
- return;
- }
- ElMessageBox.confirm("閫変腑鐨勫唴瀹瑰皢琚垹闄わ紝鏄惁纭鍒犻櫎锛�", "瀵煎嚭", {
- confirmButtonText: "纭",
- cancelButtonText: "鍙栨秷",
- type: "warning",
- })
- .then(() => {
- compensationDelete(ids).then((res) => {
- proxy.$modal.msgSuccess("鍒犻櫎鎴愬姛");
- getList();
- });
- })
- .catch(() => {
- proxy.$modal.msg("宸插彇娑�");
- });
-};
-// 瀵煎嚭
-const handleOut = () => {
- ElMessageBox.confirm("閫変腑鐨勫唴瀹瑰皢琚鍑猴紝鏄惁纭瀵煎嚭锛�", "瀵煎嚭", {
- confirmButtonText: "纭",
- cancelButtonText: "鍙栨秷",
- type: "warning",
- })
- .then(() => {
- proxy.download("/staff/staffJoinLeaveRecord/export", {staffState: 1}, "浜哄憳鍏ヨ亴.xlsx");
- })
- .catch(() => {
- proxy.$modal.msg("宸插彇娑�");
- });
-};
-onMounted(() => {
- getList();
-});
-</script>
-
-<style scoped></style>
diff --git a/src/views/procurementManagement/invoiceEntry/components/ExpandTable.vue b/src/views/procurementManagement/invoiceEntry/components/ExpandTable.vue
deleted file mode 100644
index 24a368a..0000000
--- a/src/views/procurementManagement/invoiceEntry/components/ExpandTable.vue
+++ /dev/null
@@ -1,140 +0,0 @@
-<template>
- <PIMTable
- rowKey="id"
- :column="columns"
- :tableData="dataList"
- :tableLoading="loading"
- :summaryMethod="summarizeChildrenTable"
- :isShowSummary="true"
- height="auto"
- >
- </PIMTable>
-</template>
-
-<script setup>
-import { usePaginationApi } from "@/hooks/usePaginationApi";
-import { productList } from "@/api/procurementManagement/procurementLedger.js";
-import { nextTick } from "vue";
-const { proxy } = getCurrentInstance();
-
-defineOptions({
- name: "鏉ョエ鐧昏鎶樺彔琛�",
-});
-
-const {
- loading,
- filters,
- columns,
- dataList,
- pagination,
- getTableData,
- resetFilters,
-} = usePaginationApi(
- productList,
- {
- salesLedgerId: undefined,
- type: 2,
- },
- [
- {
- label: "浜у搧澶х被",
- prop: "productCategory",
- },
- {
- label: "瑙勬牸鍨嬪彿",
- prop: "specificationModel",
- },
- {
- label: "鍗曚綅",
- prop: "unit",
- },
- {
- label: "鏁伴噺",
- prop: "quantity",
- },
- {
- label: "绋庣巼(%)",
- prop: "taxRate",
- },
- {
- label: "鍚◣鍗曚环(鍏�)",
- prop: "taxInclusiveUnitPrice",
- width:200,
- formatData: (val) => {
- return val ? parseFloat(val).toFixed(2) : "-";
- },
- },
- {
- label: "鍚◣鎬讳环(鍏�)",
- prop: "taxInclusiveTotalPrice",
- width:200,
- formatData: (val) => {
- return val ? parseFloat(val).toFixed(2) : "-";
- },
- },
- {
- label: "涓嶅惈绋庢�讳环(鍏�)",
- prop: "taxExclusiveTotalPrice",
- width:200,
- formatData: (val) => {
- return val ? parseFloat(val).toFixed(2) : "-";
- },
- },
- {
- label: "鏈鏉ョエ閲戦(鍏�)",
- prop: "ticketsAmount",
- width:200,
- formatData: (val) => {
- return val ? parseFloat(val).toFixed(2) : "-";
- },
- },
- {
- label: "鏈潵绁ㄦ暟",
- prop: "futureTickets",
- },
- {
- label: "鏈潵绁ㄩ噾棰�(鍏�)",
- prop: "futureTicketsAmount",
- width:200,
- formatData: (val) => {
- return val ? parseFloat(val).toFixed(2) : "-";
- },
- },
- ],
- {},
- {},
- (data) => {
- dataList.value = data;
- }
-);
-
-const getList = async (id) => {
- await nextTick();
- filters.salesLedgerId = id;
- getTableData();
-};
-// 瀛愯〃鍚堣鏂规硶
-const summarizeChildrenTable = (param) => {
- return proxy.summarizeTable(
- param,
- [
- "taxInclusiveUnitPrice",
- "taxInclusiveTotalPrice",
- "taxExclusiveTotalPrice",
- "ticketsNum",
- "ticketsAmount",
- "futureTickets",
- "futureTicketsAmount",
- ],
- {
- ticketsNum: { noDecimal: true }, // 涓嶄繚鐣欏皬鏁�
- futureTickets: { noDecimal: true }, // 涓嶄繚鐣欏皬鏁�
- }
- );
-};
-defineExpose({
- getList,
-});
-</script>
-
-<style lang="scss" scoped></style>
diff --git a/src/views/procurementManagement/invoiceEntry/components/Modal.vue b/src/views/procurementManagement/invoiceEntry/components/Modal.vue
deleted file mode 100644
index f29b78a..0000000
--- a/src/views/procurementManagement/invoiceEntry/components/Modal.vue
+++ /dev/null
@@ -1,456 +0,0 @@
-<template>
- <el-dialog :title="modalOptions.title" v-model="visible" width="70%">
- <el-form
- ref="formRef"
- :model="form"
- :rules="rules"
- label-width="120px"
- label-position="top"
- >
- <el-row :gutter="30">
- <el-col :span="12">
- <el-form-item label="閲囪喘鍚堝悓鍙凤細" prop="purchaseLedgerNo">
- <el-input v-model="form.purchaseLedgerNo" disabled />
- </el-form-item>
- </el-col>
- <el-col :span="12">
- <el-form-item label="閿�鍞悎鍚屽彿锛�" prop="salesContractNo">
- <el-input
- v-model="form.salesContractNo"
- placeholder="鑷姩濉厖"
- clearable
- disabled
- />
- </el-form-item>
- </el-col>
- <el-col :span="12">
- <el-form-item label="渚涘簲鍟嗗悕绉帮細" prop="supplierName">
- <el-input
- v-model="form.supplierName"
- placeholder="鑷姩濉厖"
- clearable
- disabled
- />
- </el-form-item>
- </el-col>
- <el-col :span="12">
- <el-form-item label="椤圭洰鍚嶇О锛�" prop="projectName">
- <el-input
- v-model="form.projectName"
- placeholder="鑷姩濉厖"
- clearable
- disabled
- />
- </el-form-item>
- </el-col>
- <el-col :span="12">
- <el-form-item label="鍙戠エ鍙凤細" prop="invoiceNumber">
- <el-input
- v-model="form.invoiceNumber"
- placeholder="璇疯緭鍏�"
- clearable
- />
- </el-form-item>
- </el-col>
- <el-col :span="12">
- <el-form-item label="鍙戠エ閲戦(鍏�)锛�" prop="invoiceAmount">
- <el-input-number :step="0.01" :min="0" style="width: 100%"
- v-model="form.invoiceAmount"
- placeholder="鑷姩濉厖"
- clearable
- :disabled="true"
- />
- </el-form-item>
- </el-col>
- <el-col :span="12">
- <el-form-item label="褰曞叆浜猴細" prop="issUer">
- <el-input
- v-model="form.issUer"
- placeholder="璇疯緭鍏�"
- clearable
- disabled
- />
- </el-form-item>
- </el-col>
- <el-col :span="12">
- <el-form-item label="寮�绁ㄦ棩鏈燂細" prop="entryDate">
- <el-date-picker
- style="width: 100%"
- v-model="form.entryDate"
- type="date"
- value-format="YYYY-MM-DD"
- format="YYYY-MM-DD"
- clearable
- />
- </el-form-item>
- </el-col>
- <el-col :span="12">
- <el-form-item label="涓婁紶闄勪欢">
- <FileUpload
- :showTip="false"
- accept="*"
- :autoUpload="true"
- :action="action"
- :headers="{
- Authorization: 'Bearer ' + getToken(),
- }"
- :limit="10"
- @success="uploadSuccess"
- @remove="removeFile"
- />
- </el-form-item>
- </el-col>
- <el-col :span="12">
- <el-form-item label="褰曞叆鏃ユ湡锛�" prop="enterDate">
- <el-date-picker
- style="width: 100%"
- v-model="form.enterDate"
- type="date"
- value-format="YYYY-MM-DD"
- format="YYYY-MM-DD"
- clearable
- />
- </el-form-item>
- </el-col>
- </el-row>
- <el-form-item label="浜у搧淇℃伅锛�"> </el-form-item>
- <PIMTable
- rowKey="id"
- :column="columns"
- :tableData="form.productData"
- :summaryMethod="summarizeChildrenTable"
- :isShowSummary="true"
- height="auto"
- >
- <template #ticketsNumRef="{ row }">
- <el-input-number
- v-model="row.ticketsNum"
- placeholder="璇疯緭鍏�"
- :min="0"
- :step="0.1"
- :precision="2"
- clearable
- style="width: 100%"
- @change="invoiceNumBlur(row)"
- />
- </template>
- <template #ticketsAmountRef="{ row }">
- <el-input-number
- v-model="row.ticketsAmount"
- placeholder="璇疯緭鍏�"
- :min="0"
- :precision="2"
- :step="0.1"
- clearable
- style="width: 100%"
- @change="invoiceAmountBlur(row)"
- />
- </template>
- </PIMTable>
- </el-form>
- <template #footer>
- <el-button type="primary" :loading="modalLoading" @click="submitForm">
- {{ modalOptions.confirmText }}
- </el-button>
- <el-button @click="closeModal">{{ modalOptions.cancelText }}</el-button>
- </template>
- </el-dialog>
-</template>
-
-<script setup>
-import { ref, getCurrentInstance } from "vue";
-import { defineEmits } from 'vue';
-import { useModal } from "@/hooks/useModal";
-import useFormData from "@/hooks/useFormData";
-import FileUpload from "@/components/Upload/FileUpload.vue";
-import {
- getPurchaseNoById,
- getInfo,
- addOrUpdateRegistration,
-} from "@/api/procurementManagement/invoiceEntry.js";
-import { getPurchaseById } from "@/api/procurementManagement/procurementLedger.js";
-import { getToken } from "@/utils/auth";
-import useUserStore from "@/store/modules/user";
-import dayjs from "dayjs";
-
-defineOptions({
- name: "鏉ョエ鐧昏妯℃�佹",
-});
-
-const userStore = useUserStore();
-const action = import.meta.env.VITE_APP_BASE_API + "/file/upload";
-const formRef = ref();
-const { proxy } = getCurrentInstance();
-const { form } = useFormData({
- purchaseLedgerNo: undefined, // 閲囪喘鍚堝悓鍙�
- salesContractNo: undefined, // 閿�鍞悎鍚屽彿
- supplierName: undefined, // 渚涘簲鍟嗗悕绉�
- projectName: undefined, // 椤圭洰鍚嶇О
- invoiceNumber: undefined, // 鍙戠エ鍙�
- invoiceAmount: undefined, // 鍙戠エ閲戦(鍏�)
- issUerId: userStore.id, // 褰曞叆浜�
- issUer: userStore.nickName, // 褰曞叆浜�
- entryDate: undefined, // 寮�绁ㄦ棩鏈�
- salesContractNoId: undefined, // 寮�绁ㄦ棩鏈�
- enterDate: dayjs().format("YYYY-MM-DD"),
- productData: [], // 琛ㄦ牸
- tempFileIds: [], // 鏂囦欢
-});
-
-const rules = ref({
- invoiceNumber: [
- { required: true, message: "璇疯緭鍏ュ彂绁ㄥ彿", trigger: "blur" },
- { type: "string" },
- ],
- invoiceAmount: [
- { required: true, message: "璇疯緭鍏ュ彂绁ㄩ噾棰�", trigger: "blur" },
- ],
- entryDate: [{ required: true, message: "璇烽�夋嫨寮�绁ㄦ棩鏈�", trigger: "change" }],
- enterDate: [{ required: true, message: "璇烽�夋嫨褰曞叆鏃ユ湡", trigger: "change" }],
-});
-
-const {
- id,
- visible,
- loading: modalLoading,
- openModal,
- modalOptions,
- handleConfirm,
- closeModal,
-} = useModal({
- title: "鏉ョエ鐧昏",
-});
-
-const emit = defineEmits(['refreshList']);
-
-const columns = [
- {
- label: "浜у搧澶х被",
- prop: "productCategory",
- width: 120,
- },
- {
- label: "瑙勬牸鍨嬪彿",
- prop: "specificationModel",
- width: 120,
- },
- {
- label: "鍗曚綅",
- prop: "unit",
- width: 80,
- },
- {
- label: "鏁伴噺",
- prop: "quantity",
- width: 80,
- },
- {
- label: "绋庣巼(%)",
- prop: "taxRate",
- width: 80,
- },
- {
- label: "褰曞叆鏃ユ湡",
- prop: "registerDate",
- width: 120,
- },
- {
- label: "鍚◣鍗曚环(鍏�)",
- prop: "taxInclusiveUnitPrice",
- width: 150,
- formatData: (val) => {
- return val ? parseFloat(val).toFixed(2) : 0;
- },
- },
- {
- label: "鍚◣鎬讳环(鍏�)",
- prop: "taxInclusiveTotalPrice",
- width: 150,
- formatData: (val) => {
- return parseFloat(val).toFixed(2) ?? 0;
- },
- },
- {
- label: "涓嶅惈绋庢�讳环(鍏�)",
- prop: "taxExclusiveTotalPrice",
- width: 150,
- formatData: (val) => {
- return parseFloat(val).toFixed(2) ?? 0;
- },
- },
- {
- label: "鏈鏉ョエ鏁�",
- prop: "ticketsNum",
- dataType: "slot",
- slot: "ticketsNumRef",
- width: 180,
- align: "center",
- },
- {
- label: "鏈鏉ョエ閲戦(鍏�)",
- prop: "ticketsAmount",
- dataType: "slot",
- slot: "ticketsAmountRef",
- width: 180,
- align: "center",
- },
- {
- label: "鏈潵绁ㄦ暟",
- prop: "futureTickets",
- width: 100,
- },
- {
- label: "鏈潵绁ㄩ噾棰�(鍏�)",
- prop: "futureTicketsAmount",
- width: 200,
- },
-];
-
-const getTableData = async (type, id) => {
- if (type == "add") {
- const { data } = await getPurchaseNoById({ id });
- form.purchaseLedgerNo = data.purchaseContractNumber;
- form.invoiceAmount = data.invoiceAmount;
- form.invoiceNumber = data.invoiceNumber;
- form.entryDate = data.entryDate;
- form.salesContractNoId = data.salesContractNoId;
-
- const { data: infoData } = await getInfo({ id });
- form.salesContractNo = infoData.salesContractNo;
- form.projectName = infoData.projectName;
- form.supplierName = infoData.supplierName;
- form.productData = infoData.productData;
- } else if (type == "edit") {
- const data = await getPurchaseById({ id, type: 2 });
- form.purchaseLedgerNo = data.purchaseContractNumber;
- form.invoiceAmount = data.invoiceAmount;
- form.invoiceNumber = data.invoiceNumber;
- form.salesContractNo = data.salesContractNo;
- form.projectName = data.projectName;
- form.supplierName = data.supplierName;
- form.entryDate = data.entryDate;
- form.productData = data.productData;
- }
-};
-// 瀛愯〃鍚堣鏂规硶
-const summarizeChildrenTable = (param) => {
- return proxy.summarizeTable(param, [
- "taxInclusiveUnitPrice",
- "taxInclusiveTotalPrice",
- "taxExclusiveTotalPrice",
- "ticketsNum",
- "ticketsAmount",
- "ticketsAmountRef",
- "futureTickets",
- "futureTicketsAmount",
- ]);
-};
-//鏈鏉ョエ鏁板け鐒︽搷浣�
-const invoiceNumBlur = (row) => {
- if (!row.ticketsNum || row.ticketsNum === "") {
- row.ticketsNum = 0;
- }
- if (Number(row.ticketsNum) > Number(row.tempFutureTickets)) {
- proxy.$modal.msgWarning("鏈寮�绁ㄦ暟涓嶅緱澶т簬鏈紑绁ㄦ暟");
- row.ticketsNum = 0;
- return;
- }
- // 璁$畻鏈鏉ョエ閲戦
- row.ticketsAmount = (row.ticketsNum * row.taxInclusiveUnitPrice).toFixed(2)
- // 璁$畻鏈潵绁ㄦ暟
- row.futureTickets = (row.tempFutureTickets - row.ticketsNum).toFixed(2)
- // 璁$畻鏈潵绁ㄩ噾棰�
- row.futureTicketsAmount = (row.tempFutureTicketsAmount - row.ticketsAmount).toFixed(2)
- calculateinvoiceAmount();
-};
-
-// 鏈鏉ョエ閲戦澶辩劍鎿嶄綔
-const invoiceAmountBlur = (row) => {
- if (!row.ticketsAmount) {
- row.ticketsAmount = 0;
- }
- // 璁$畻鏄惁瓒呰繃鏉ョエ鎬婚噾棰�
- if (row.ticketsAmount > row.tempFutureTicketsAmount) {
- proxy.$modal.msgWarning("鏈鏉ョエ閲戦涓嶅緱澶т簬鏈潵绁ㄩ噾棰�");
- row.ticketsAmount = 0;
- }
- // 璁$畻鏈鏉ョエ鏁�
- row.ticketsNum = Number(
- (row.ticketsAmount / row.taxInclusiveUnitPrice).toFixed(2)
- );
- // 璁$畻鏈潵绁ㄦ暟
- row.futureTickets = (row.tempFutureTickets - row.ticketsNum).toFixed(2)
- // 璁$畻鏈潵绁ㄩ噾棰�
- row.futureTicketsAmount = (row.tempFutureTicketsAmount - row.ticketsAmount).toFixed(2)
- calculateinvoiceAmount();
-};
-
-const calculateinvoiceAmount = () => {
- let invoiceAmountTotal = 0;
- form.productData.forEach((item) => {
- if (item.ticketsAmount) {
- invoiceAmountTotal += Number(item.ticketsAmount);
- }
- });
- form.invoiceAmount = invoiceAmountTotal.toFixed(2);
-};
-
-const open = (type, eid) => {
- openModal();
- getTableData(type, eid);
- id.value = eid;
-};
-
-const uploadSuccess = (response) => {
- form.tempFileIds.push(response.data.tempId);
- console.log(form);
-};
-
-const removeFile = (file) => {
- const { tempId } = file.response.data;
- form.tempFileIds = form.tempFileIds.filter((item) => item !== tempId);
-};
-
-const closeAndRefresh = () => {
- closeModal();
- emit('refreshList');
-};
-
-const submitForm = () => {
- formRef.value.validate(async (valid, fields) => {
- if (valid) {
- // modalLoading.value = true;
- const { code } = await addOrUpdateRegistration({
- purchaseLedgerId: id.value,
- purchaseContractNumber: form.purchaseLedgerNo,
- invoiceNumber: form.invoiceNumber,
- invoiceAmount: form.invoiceAmount,
- salesContractNo: form.salesContractNo,
- projectName: form.projectName,
- productData: form.productData,
- issueDate: form.entryDate,
- issUerId: form.issUerId, // 褰曞叆浜篿d
- issUer: form.issUer, // 褰曞叆浜�
- salesContractNoId: form.salesContractNoId,
- supplierName: form.supplierName,
- tempFileIds: form.tempFileIds,
- enterDate: form.enterDate,
- type: 4,
- });
- modalLoading.value = false;
- if (code == 200) {
- closeAndRefresh();
- }
- } else {
- modalLoading.value = false;
- }
- });
-};
-
-defineExpose({
- open,
- closeAndRefresh,
-});
-</script>
-
-<style lang="scss" scoped></style>
diff --git a/src/views/procurementManagement/invoiceEntry/index.vue b/src/views/procurementManagement/invoiceEntry/index.vue
deleted file mode 100644
index 4b25c38..0000000
--- a/src/views/procurementManagement/invoiceEntry/index.vue
+++ /dev/null
@@ -1,294 +0,0 @@
-<template>
- <div class="app-container">
- <div class="search_form">
- <el-form :model="filters" :inline="true">
- <el-form-item label="渚涘簲鍟嗗悕绉�">
- <el-input
- v-model="filters.supplierName"
- placeholder="璇疯緭鍏ュ悕绉版悳绱�"
- clearable
- prefix-icon="Search"
- @change="getTableData"
- />
- </el-form-item>
- <el-form-item label="閲囪喘璁㈠崟鍙凤細">
- <el-input
- v-model="filters.purchaseContractNumber"
- placeholder="璇疯緭鍏�"
- clearable
- prefix-icon="Search"
- @change="getTableData"
- />
- </el-form-item>
-
- <el-form-item label="閿�鍞悎鍚屽彿">
- <el-input
- v-model="filters.salesContractNo"
- placeholder="璇疯緭鍏ラ攢鍞悎鍚屽彿"
- clearable
- />
- </el-form-item>
- <el-form-item label="椤圭洰鍚嶇О">
- <el-input
- v-model="filters.projectName"
- placeholder="璇疯緭鍏ラ」鐩悕绉�"
- clearable
- />
- </el-form-item>
- <el-form-item>
- <el-button type="primary" @click="getTableData"> 鎼滅储 </el-button>
- <el-button @click="resetFilters"> 閲嶇疆 </el-button>
- </el-form-item>
- </el-form>
- </div>
- <div class="table_list">
- <div class="actions">
- <div></div>
- <div>
- <el-button type="primary" @click="handleAdd('add')">
- 鏂板鐧昏
- </el-button>
-<!-- <el-button @click="handleOut">瀵煎嚭</el-button>-->
-<!-- <el-button type="danger" plain @click="handleDelete">鍒犻櫎</el-button>-->
- </div>
- </div>
- <PIMTable
- rowKey="id"
- :column="columns"
- :tableData="dataList"
- :tableLoading="loading"
- :isSelection="true"
- :page="{
- current: pagination.currentPage,
- size: pagination.pageSize,
- total: pagination.total,
- }"
- :expand-row-keys="expandRowKeys"
- :summaryMethod="summarizeMainTable"
- :isShowSummary="true"
- @expand-change="expandChange"
- @selection-change="handleSelectionChange"
- @pagination="changePage"
- >
- <template #expand="{ row }">
- <ExpandTable ref="expandTableRef" />
- </template>
- <template #operation="{ row }">
- <el-button
- text
- type="primary"
- size="small"
- @click="handleEdit('edit', row.id)"
- >
- 缂栬緫
- </el-button>
- </template>
- </PIMTable>
- </div>
- <Modal ref="modalRef" @refreshList="getTableData"></Modal>
- </div>
-</template>
-
-<script setup>
-import { usePaginationApi } from "@/hooks/usePaginationApi";
-import {delRegistration, gePurchaseListPage} from "@/api/procurementManagement/invoiceEntry.js";
-import { nextTick, onMounted, getCurrentInstance } from "vue";
-import ExpandTable from "./components/ExpandTable.vue";
-import Modal from "./components/Modal.vue";
-import {ElMessageBox} from "element-plus";
-
-defineOptions({
- name: "鏉ョエ鐧昏",
-});
-
-const { proxy } = getCurrentInstance();
-const expandRowKeys = ref([]);
-const expandTableRef = ref();
-const modalRef = ref();
-const selectedRows = ref([]);
-
-const {
- loading,
- filters,
- columns,
- dataList,
- pagination,
- getTableData,
- resetFilters,
- onCurrentChange,
-} = usePaginationApi(
- gePurchaseListPage,
- {
- purchaseContractNumber: undefined,
- },
- [
- {
- type: "expand",
- dataType: "slot",
- slot: "expand",
- },
- {
- label: "閲囪喘璁㈠崟鍙�",
- prop: "purchaseContractNumber",
- width:150
- },
- {
- label: "閿�鍞悎鍚屽彿",
- prop: "salesContractNo",
- width:150
- },
- {
- label: "渚涘簲鍟嗗悕绉�",
- prop: "supplierName",
- width:300
- },
- {
- label: "椤圭洰鍚嶇О",
- prop: "projectName",
- width:400
- },
- {
- label: "褰曞叆浜�",
- prop: "recorderName",
- },
- {
- label: "褰曞叆鏃ユ湡",
- prop: "entryDate",
- width:110
- },
- {
- label: "鍚堝悓閲戦(鍏�)",
- prop: "contractAmount",
- width:200,
- formatData: (val) => {
- return val ? parseFloat(val).toFixed(2) : 0;
- },
- },
- {
- label: "宸叉潵绁ㄩ噾棰�(鍏�)",
- prop: "receiptPaymentAmount",
- width:200,
- formatData: (val) => {
- return val ? parseFloat(val).toFixed(2) : 0;
- },
- },
- {
- label: "寰呮潵绁ㄩ噾棰�(鍏�)",
- prop: "unReceiptPaymentAmount",
- width:200,
- formatData: (val) => {
- return val ? parseFloat(val).toFixed(2) : 0;
- },
- },
- // {
- // fixed: "right",
- // label: "鎿嶄綔",
- // dataType: "slot",
- // slot: "operation",
- // align: "center",
- // width: "200px",
- // },
- ]
-);
-
-const handleSelectionChange = (selection) => {
- selectedRows.value = selection.filter(
- (item) => item.purchaseContractNumber !== undefined
- );
-};
-
-const handleAdd = (type) => {
- if (selectedRows.value.length !== 1) {
- proxy.$modal.msgWarning("璇峰厛閫変腑涓�鏉℃暟鎹�");
- return;
- }
- modalRef.value.open(type, selectedRows.value[0].id);
-};
-
-const handleEdit = (type, id) => {
- modalRef.value.open(type, id);
-};
-
-// 瀵煎嚭
-const handleOut = () => {
- ElMessageBox.confirm("閫変腑鐨勫唴瀹瑰皢琚鍑猴紝鏄惁纭瀵煎嚭锛�", "瀵煎嚭", {
- confirmButtonText: "纭",
- cancelButtonText: "鍙栨秷",
- type: "warning",
- })
- .then(() => {
- proxy.download("/purchase/registration/export", {}, "鏉ョエ鐧昏.xlsx");
- })
- .catch(() => {
- proxy.$modal.msg("宸插彇娑�");
- });
-};
-// 鍒犻櫎
-const handleDelete = () => {
- let ids = [];
- if (selectedRows.value.length > 0) {
- // 鏂板鍒ゆ柇锛氬鏋滄湁閫変腑鐨勬暟鎹病鏈塼icketRegistrationId锛屾彁绀哄苟缁堟
- const noTicket = selectedRows.value.some(item => !item.ticketRegistrationId);
- if (noTicket) {
- proxy.$modal.msgWarning("閲囪喘鍙拌处杩樻湭杩涜鏉ョエ鐧昏,鏃犳硶杩涜鍒犻櫎鎿嶄綔");
- return;
- }
- ids = selectedRows.value.map((item) => item.ticketRegistrationId);
- } else {
- proxy.$modal.msgWarning("璇烽�夋嫨鏁版嵁");
- return;
- }
- ElMessageBox.confirm("閫変腑鐨勫唴瀹瑰皢琚垹闄わ紝鏄惁纭鍒犻櫎锛�", "瀵煎嚭", {
- confirmButtonText: "纭",
- cancelButtonText: "鍙栨秷",
- type: "warning",
- })
- .then(() => {
- delRegistration(ids).then((res) => {
- proxy.$modal.msgSuccess("鍒犻櫎鎴愬姛");
- getList();
- });
- })
- .catch(() => {
- proxy.$modal.msg("宸插彇娑�");
- });
-};
-
-const expandChange = async (row, expandedRows) => {
- if (expandedRows.length > 0) {
- await nextTick();
- expandTableRef.value.getList(row.id);
- }
-};
-
-const changePage = ({ page, limit }) => {
- pagination.currentPage = page;
- pagination.pageSize = limit;
- onCurrentChange(page);
-};
-// 涓昏〃鍚堣鏂规硶
-const summarizeMainTable = (param) => {
- return proxy.summarizeTable(
- param,
- ["contractAmount", "receiptPaymentAmount", "unReceiptPaymentAmount"],
- {
- ticketsNum: { noDecimal: true }, // 涓嶄繚鐣欏皬鏁�
- futureTickets: { noDecimal: true }, // 涓嶄繚鐣欏皬鏁�
- }
- );
-};
-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/indexOld.vue b/src/views/procurementManagement/invoiceEntry/indexOld.vue
deleted file mode 100644
index 52fe222..0000000
--- a/src/views/procurementManagement/invoiceEntry/indexOld.vue
+++ /dev/null
@@ -1,730 +0,0 @@
-<template>
- <div class="app-container">
- <div class="search_form">
- <div>
- <span class="search_title">閲囪喘鍚堝悓鍙凤細</span>
- <el-input
- v-model="searchForm.purchaseContractNumber"
- style="width: 240px"
- placeholder="璇疯緭鍏�"
- @change="handleQuery"
- clearable
- prefix-icon="Search"
- />
- <el-button
- type="primary"
- @click="handleQuery"
- style="margin-left: 10px"
- >
- 鎼滅储
- </el-button>
- </div>
- <div>
- <el-button type="primary" @click="handleAdd">鏂板鐧昏</el-button>
- <el-button @click="handleOut">瀵煎嚭</el-button>
- <el-button type="danger" plain @click="handleDelete">鍒犻櫎</el-button>
- </div>
- </div>
- <div class="table_list">
- <el-table
- :data="tableData"
- border
- v-loading="tableLoading"
- @selection-change="handleSelectionChange"
- :expand-row-keys="expandedRowKeys"
- :row-key="(row) => row.id"
- show-summary
- :summary-method="summarizeMainTable"
- @expand-change="expandChange"
- height="calc(100vh - 18.5em)"
- stripe
- >
- <el-table-column align="center" type="selection" width="55" />
- <el-table-column type="expand">
- <template #default="props">
- <el-table
- :data="props.row.children"
- border
- show-summary
- :summary-method="summarizeChildrenTable"
- stripe
- >
- <el-table-column
- align="center"
- label="搴忓彿"
- type="index"
- width="60"
- />
- <el-table-column label="浜у搧澶х被" prop="productCategory" />
- <el-table-column label="瑙勬牸鍨嬪彿" prop="specificationModel" />
- <el-table-column label="鍗曚綅" prop="unit" />
- <el-table-column label="鏁伴噺" prop="quantity" />
- <el-table-column label="绋庣巼(%)" prop="taxRate" />
- <el-table-column
- label="鍚◣鍗曚环(鍏�)"
- prop="taxInclusiveUnitPrice"
- :formatter="formattedNumber"
- />
- <el-table-column
- label="鍚◣鎬讳环(鍏�)"
- prop="taxInclusiveTotalPrice"
- :formatter="formattedNumber"
- />
- <el-table-column
- label="涓嶅惈绋庢�讳环(鍏�)"
- prop="taxExclusiveTotalPrice"
- :formatter="formattedNumber"
- />
- <el-table-column label="鏈鏉ョエ鏁�" prop="ticketsNum" />
- <el-table-column
- label="鏈鏉ョエ閲戦(鍏�)"
- prop="ticketsAmount"
- :formatter="formattedNumber"
- />
- <el-table-column label="鏈潵绁ㄦ暟" prop="futureTickets" />
- <el-table-column
- label="鏈潵绁ㄩ噾棰�(鍏�)"
- prop="futureTicketsAmount"
- :formatter="formattedNumber"
- />
- </el-table>
- </template>
- </el-table-column>
- <el-table-column align="center" label="搴忓彿" type="index" width="60" />
- <el-table-column
- label="閲囪喘鍚堝悓鍙�"
- prop="purchaseContractNumber"
- show-overflow-tooltip
- />
- <el-table-column
- label="閿�鍞悎鍚屽彿"
- prop="salesContractNo"
- show-overflow-tooltip
- />
- <el-table-column
- label="渚涘簲鍟嗗悕绉�"
- prop="supplierName"
- show-overflow-tooltip
- />
- <el-table-column
- label="椤圭洰鍚嶇О"
- prop="projectName"
- show-overflow-tooltip
- />
- <el-table-column
- label="鍚堝悓閲戦(鍏�)"
- prop="contractAmount"
- show-overflow-tooltip
- :formatter="formattedNumber"
- />
- <el-table-column
- label="宸插紑绁ㄩ噾棰�(鍏�)"
- prop="receiptPaymentAmount"
- show-overflow-tooltip
- :formatter="formattedNumber"
- />
- <el-table-column
- label="寰呭紑绁ㄩ噾棰�(鍏�)"
- prop="unReceiptPaymentAmount"
- show-overflow-tooltip
- :formatter="formattedNumber"
- />
- <el-table-column
- fixed="right"
- label="鎿嶄綔"
- min-width="60"
- align="center"
- >
- <template #default="scope">
- <el-button
- text
- type="primary"
- size="small"
- @click="openForm('edit', scope.row)"
- >
- 缂栬緫
- </el-button>
- </template>
- </el-table-column>
- </el-table>
- <pagination
- v-show="total > 0"
- :total="total"
- layout="total, sizes, prev, pager, next, jumper"
- :page="page.current"
- :limit="page.size"
- @pagination="paginationChange"
- />
- </div>
- <el-dialog
- v-model="dialogFormVisible"
- :title="operationType === 'add' ? '鏂板鏉ョエ鐧昏' : '缂栬緫鏉ョエ鐧昏'"
- width="80%"
- @close="closeDia"
- >
- <el-form
- :model="form"
- label-width="140px"
- label-position="top"
- :rules="rules"
- ref="formRef"
- >
- <el-row :gutter="30">
- <el-col :span="12">
- <el-form-item label="閲囪喘鍚堝悓鍙凤細" prop="purchaseLedgerNo">
- <el-input v-model="form.purchaseLedgerNo" disabled />
- </el-form-item>
- </el-col>
- <el-col :span="12">
- <el-form-item label="閿�鍞悎鍚屽彿锛�" prop="salesContractNo">
- <el-input
- v-model="form.salesContractNo"
- placeholder="鑷姩濉厖"
- clearable
- disabled
- />
- </el-form-item>
- </el-col>
- </el-row>
- <el-row :gutter="30">
- <el-col :span="12">
- <el-form-item label="渚涘簲鍟嗗悕绉帮細" prop="supplierName">
- <el-input
- v-model="form.supplierName"
- placeholder="鑷姩濉厖"
- clearable
- disabled
- />
- </el-form-item>
- </el-col>
- <el-col :span="12">
- <el-form-item label="椤圭洰鍚嶇О锛�" prop="projectName">
- <el-input
- v-model="form.projectName"
- placeholder="鑷姩濉厖"
- clearable
- disabled
- />
- </el-form-item>
- </el-col>
- </el-row>
- <el-row :gutter="30">
- <el-col :span="12">
- <el-form-item label="鍙戠エ鍙凤細" prop="invoiceNumber">
- <el-input
- v-model="form.invoiceNumber"
- placeholder="璇疯緭鍏�"
- clearable
- />
- </el-form-item>
- </el-col>
- <el-col :span="12">
- <el-form-item label="鍙戠エ閲戦(鍏�)锛�" prop="invoiceAmount">
- <el-input
- type="number"
- :step="0.01"
- v-model="form.invoiceAmount"
- placeholder="鑷姩濉厖"
- clearable
- :disabled="true"
- />
- </el-form-item>
- </el-col>
- </el-row>
- <el-row :gutter="30">
- <el-col :span="12">
- <el-form-item label="褰曞叆浜猴細" prop="issUer">
- <el-input
- v-model="form.issUer"
- placeholder="璇疯緭鍏�"
- clearable
- disabled
- />
- </el-form-item>
- </el-col>
- <el-col :span="12">
- <el-form-item label="寮�绁ㄦ棩鏈燂細" prop="issueDate">
- <el-date-picker
- style="width: 100%"
- v-model="form.issueDate"
- type="date"
- clearable
- />
- </el-form-item>
- </el-col>
- </el-row>
- <el-row :gutter="30">
- <el-col :span="12">
- <el-form-item label="涓婁紶闄勪欢">
- <FileUpload :showTip="false" accept="*" :autoUpload="true" />
- </el-form-item>
- </el-col>
- </el-row>
- <!-- <el-row :gutter="30">
- <el-col :span="12">
- <el-form-item label="褰曞叆鏃ユ湡锛�" prop="createTime">
- <el-date-picker
- style="width: 100%"
- v-model="form.createTime"
- type="date"
- placeholder="璇烽�夋嫨"
- clearable
- />
- </el-form-item>
- </el-col>
- </el-row> -->
- <el-row>
- <el-form-item label="浜у搧淇℃伅锛�" prop="entryDate"> </el-form-item>
- </el-row>
- <el-table
- :data="productData"
- border
- @selection-change="productSelected"
- stripe
- show-summary
- style="width: 100%"
- :summary-method="summarizeChildrenTable"
- >
- <el-table-column
- align="center"
- label="搴忓彿"
- type="index"
- width="60"
- />
- <el-table-column label="浜у搧澶х被" prop="productCategory" />
- <el-table-column label="瑙勬牸鍨嬪彿" prop="specificationModel" />
- <el-table-column label="鍗曚綅" prop="unit" width="70" />
- <el-table-column label="鏁伴噺" prop="quantity" width="70" />
- <el-table-column label="绋庣巼(%)" prop="taxRate" width="80" />
- <el-table-column label="褰曞叆鏃ユ湡" prop="createTime" width="120" />
- <el-table-column
- label="鍚◣鍗曚环(鍏�)"
- width="200"
- prop="taxInclusiveUnitPrice"
- :formatter="formattedNumber"
- />
- <el-table-column
- label="鍚◣鎬讳环(鍏�)"
- width="200"
- prop="taxInclusiveTotalPrice"
- :formatter="formattedNumber"
- />
- <el-table-column
- label="涓嶅惈绋庢�讳环(鍏�)"
- width="200"
- prop="taxExclusiveTotalPrice"
- :formatter="formattedNumber"
- />
- <el-table-column label="鏈鏉ョエ鏁�" prop="ticketsNum" width="170">
- <template #default="scope">
- <el-input-number
- v-model="scope.row.ticketsNum"
- placeholder="璇烽�夋嫨"
- :min="0"
- :precision="2"
- :step="0.1"
- clearable
- style="width: 100%"
- @change="invoiceNumBlur(scope.row)"
- />
- </template>
- </el-table-column>
- <el-table-column
- label="鏈鏉ョエ閲戦(鍏�)"
- prop="ticketsAmount"
- :min="0"
- :step="0.1"
- :formatter="formattedNumber"
- width="200"
- >
- <template #default="scope">
- <el-input-number
- v-model="scope.row.ticketsAmount"
- placeholder="璇烽�夋嫨"
- :min="0"
- :precision="2"
- :step="0.1"
- clearable
- style="width: 100%"
- @change="invoiceAmountBlur(scope.row)"
- />
- </template>
- </el-table-column>
- <el-table-column
- label="鏈潵绁ㄦ暟"
- prop="futureTickets"
- :formatter="
- (row) =>
- row.futureTickets == null || row.futureTickets === ''
- ? row.quantity
- : row.futureTickets
- "
- >
- </el-table-column>
- <el-table-column
- label="鏈潵绁ㄩ噾棰�(鍏�)"
- prop="futureTicketsAmount"
- :formatter="
- (row) =>
- row.futureTicketsAmount !== undefined &&
- row.futureTicketsAmount !== null &&
- row.futureTicketsAmount !== ''
- ? row.futureTicketsAmount
- : row.taxExclusiveTotalPrice
- "
- >
- </el-table-column>
- </el-table>
- </el-form>
- <template #footer>
- <div class="dialog-footer">
- <el-button type="primary" @click="submitForm">纭</el-button>
- <el-button @click="closeDia">鍙栨秷</el-button>
- </div>
- </template>
- </el-dialog>
- </div>
-</template>
-
-<script setup>
-import pagination from "@/components/PIMTable/Pagination.vue";
-import { onMounted, ref } from "vue";
-import { ElMessageBox } from "element-plus";
-import { userListNoPage } from "@/api/system/user.js";
-import { productList } from "@/api/procurementManagement/procurementLedger.js";
-import useUserStore from "@/store/modules/user";
-import FileUpload from "@/components/Upload/FileUpload.vue";
-
-const userStore = useUserStore();
-const { proxy } = getCurrentInstance();
-const tableData = ref([]);
-const productData = ref([]);
-const selectedRows = ref([]);
-const productSelectedRows = ref([]);
-const userList = ref([]);
-const purchaseLedgerList = ref([]);
-const tableLoading = ref(false);
-const page = reactive({
- current: 1,
- size: 100,
-});
-const total = ref(0);
-const fileList = ref([]);
-import {
- addOrUpdateRegistration,
- delRegistration,
- gePurchaseListPage,
- getInfo,
- getProduct,
- getPurchaseNoById,
- getRegistrationById,
-} from "@/api/procurementManagement/invoiceEntry.js";
-
-// 鐢ㄦ埛淇℃伅琛ㄥ崟寮规鏁版嵁
-const operationType = ref("");
-const dialogFormVisible = ref(false);
-const data = reactive({
- searchForm: {
- purchaseContractNumber: "",
- },
- form: {
- issueDate: "", // 寮�绁ㄦ棩鏈�
- purchaseLedgerId: "",
- purchaseLedgerNo: "",
- issUerId: "", // 寮�绁ㄤ汉id
- issUer: "", // 寮�绁ㄤ汉濮撳悕
- invoiceNumber: "", // 鍙戠エ鍙�
- invoiceAmount: "", // 鍙戠エ閲戦
- createTime: "", // 褰曞叆鏃ユ湡
- },
- rules: {
- invoiceNumber: [
- { required: true, message: "璇疯緭鍏ュ彂绁ㄥ彿", trigger: "blur" },
- { type: "string" },
- ],
- invoiceAmount: [
- { required: true, message: "璇疯緭鍏ュ彂绁ㄩ噾棰�", trigger: "blur" },
- ],
- },
-});
-const { searchForm, form, rules } = toRefs(data);
-// 浜у搧琛ㄥ崟寮规鏁版嵁
-const productFormVisible = ref(false);
-const productOperationType = ref("");
-const currentId = ref("");
-
-// 鏌ヨ鍒楄〃
-/** 鎼滅储鎸夐挳鎿嶄綔 */
-const handleQuery = () => {
- page.current = 1;
- getList();
-};
-const paginationChange = (obj) => {
- page.current = obj.page;
- page.size = obj.limit;
- getList();
-};
-const getList = () => {
- tableLoading.value = true;
- gePurchaseListPage({ ...searchForm.value, ...page })
- .then((res) => {
- tableLoading.value = false;
- tableData.value = res.records;
- tableData.value.map((item) => {
- item.children = [];
- });
- total.value = res.total;
- expandedRowKeys.value = [];
- })
- .catch(() => {
- tableLoading.value = false;
- });
-};
-const formattedNumber = (row, column, cellValue) => {
- return parseFloat(cellValue).toFixed(2) ?? 0;
-};
-// 琛ㄦ牸閫夋嫨鏁版嵁
-const handleSelectionChange = (selection) => {
- selectedRows.value = selection.filter(
- (item) => item.purchaseContractNumber !== undefined
- );
-};
-const productSelected = (selectedRows) => {
- productSelectedRows.value = selectedRows;
-};
-const expandedRowKeys = ref([]);
-// 灞曞紑琛�
-const expandChange = (row, expandedRows) => {
- if (expandedRows.length > 0) {
- expandedRowKeys.value = [];
- try {
- productList({ salesLedgerId: row.id, type: 2 }).then((res) => {
- const index = tableData.value.findIndex((item) => item.id === row.id);
- if (index > -1) {
- tableData.value[index].children = res;
- }
- expandedRowKeys.value.push(row.id);
- });
- } catch (error) {
- console.log(error);
- }
- } else {
- expandedRowKeys.value = [];
- }
-};
-// 涓昏〃鍚堣鏂规硶
-const summarizeMainTable = (param) => {
- return proxy.summarizeTable(
- param,
- ["contractAmount", "receiptPaymentAmount", "unReceiptPaymentAmount"],
- {
- ticketsNum: { noDecimal: true }, // 涓嶄繚鐣欏皬鏁�
- futureTickets: { noDecimal: true }, // 涓嶄繚鐣欏皬鏁�
- }
- );
-};
-// 瀛愯〃鍚堣鏂规硶
-const summarizeChildrenTable = (param) => {
- return proxy.summarizeTable(
- param,
- [
- "taxInclusiveUnitPrice",
- "taxInclusiveTotalPrice",
- "taxExclusiveTotalPrice",
- "ticketsNum",
- "ticketsAmount",
- "futureTickets",
- "futureTicketsAmount",
- ],
- {
- ticketsNum: { noDecimal: true }, // 涓嶄繚鐣欏皬鏁�
- futureTickets: { noDecimal: true }, // 涓嶄繚鐣欏皬鏁�
- }
- );
-};
-
-const handleAdd = () => {
- if (selectedRows.value.length !== 1) {
- proxy.$modal.msgWarning("璇峰厛閫変腑涓�鏉℃暟鎹�");
- return;
- }
- openForm("add", selectedRows.value[0]);
-};
-
-// 鎵撳紑寮规
-const openForm = (type, row) => {
- invoiceNumBlur(row);
- operationType.value = type;
- form.value = {};
- productData.value = [];
- fileList.value = [];
- form.value.issUerId = userStore.id;
- form.value.issUer = userStore.name;
- form.value.issueDate = getNowFormatDate();
- userListNoPage().then((res) => {
- userList.value = res.data;
- });
- // 鏂板鏃朵紶鍏ュ綋鍓嶈id骞舵煡璇㈤噰璐悎鍚屽彿
- if (type === "add" && row && row.id) {
- form.value.purchaseLedgerId = row.id;
- getPurchaseNoById({ id: row.id }).then((res) => {
- let result = res.data;
- purchaseLedgerList.value = result;
- form.value.purchaseLedgerNo = result.purchaseContractNumber;
- form.value.invoiceAmount = result.invoiceAmount;
- form.value.invoiceNumber = result.invoiceNumber;
- setInfo(result.id);
- });
- } else {
- getProduct().then((res) => {
- purchaseLedgerList.value = res;
- });
- }
- if (type === "edit") {
- currentId.value = row.id;
- getRegistrationById({ id: row.id }).then((res) => {
- const { code, data } = res;
- if (code == 200) {
- form.value.invoiceAmount = data.invoiceAmount;
- productData.value = data.productData;
- if (data.salesLedgerFiles) {
- fileList.value = data.salesLedgerFiles;
- } else {
- fileList.value = [];
- }
- }
- });
- }
- dialogFormVisible.value = true;
-};
-// 閫夋嫨閲囪喘鍚堝悓鍙疯祴鍊�
-const setInfo = (value) => {
- getInfo({ id: value }).then((res) => {
- let result = res.data;
- form.value.salesContractNo = result.salesContractNo;
- form.value.projectName = result.projectName;
- productData.value = result.productData;
- form.value.supplierName = result.supplierName;
- });
-};
-// 鎻愪氦琛ㄥ崟
-const submitForm = () => {
- proxy.$refs["formRef"].validate((valid) => {
- if (valid) {
- form.value.productData = proxy.HaveJson(productData.value);
- addOrUpdateRegistration(form.value).then((res) => {
- proxy.$modal.msgSuccess("鎻愪氦鎴愬姛");
- closeDia();
- getList();
- });
- }
- });
-};
-// 鍏抽棴寮规
-const closeDia = () => {
- proxy.resetForm("formRef");
- dialogFormVisible.value = false;
-};
-// 瀵煎嚭
-const handleOut = () => {
- ElMessageBox.confirm("閫変腑鐨勫唴瀹瑰皢琚鍑猴紝鏄惁纭瀵煎嚭锛�", "瀵煎嚭", {
- confirmButtonText: "纭",
- cancelButtonText: "鍙栨秷",
- type: "warning",
- })
- .then(() => {
- proxy.download("/purchase/registration/export", {}, "鏉ョエ鐧昏.xlsx");
- })
- .catch(() => {
- proxy.$modal.msg("宸插彇娑�");
- });
-};
-// 鍒犻櫎
-const handleDelete = () => {
- let ids = [];
- if (selectedRows.value.length > 0) {
- ids = selectedRows.value.map((item) => item.id);
- } else {
- proxy.$modal.msgWarning("璇烽�夋嫨鏁版嵁");
- return;
- }
- ElMessageBox.confirm("閫変腑鐨勫唴瀹瑰皢琚垹闄わ紝鏄惁纭鍒犻櫎锛�", "瀵煎嚭", {
- confirmButtonText: "纭",
- cancelButtonText: "鍙栨秷",
- type: "warning",
- })
- .then(() => {
- delRegistration(ids).then((res) => {
- proxy.$modal.msgSuccess("鍒犻櫎鎴愬姛");
- getList();
- });
- })
- .catch(() => {
- proxy.$modal.msg("宸插彇娑�");
- });
-};
-//鏈鏉ョエ鏁板け鐒︽搷浣�
-const invoiceNumBlur = (row) => {
- if (!row.ticketsNum || row.ticketsNum === "") {
- row.ticketsNum = 0;
- }
- if (Number(row.ticketsNum) > Number(row.tempFutureTickets)) {
- proxy.$modal.msgWarning("鏈寮�绁ㄦ暟涓嶅緱澶т簬鏈紑绁ㄦ暟");
- row.ticketsNum = 0;
- return;
- }
- // 璁$畻鏈鏉ョエ閲戦
- row.ticketsAmount = row.ticketsNum * row.taxInclusiveUnitPrice;
- // 璁$畻鏈潵绁ㄦ暟
- row.futureTickets = row.tempFutureTickets - row.ticketsNum;
- // 璁$畻鏈潵绁ㄩ噾棰�
- row.futureTicketsAmount = row.tempFutureTicketsAmount - row.ticketsAmount;
- calculateinvoiceAmount();
-};
-// 鏈鏉ョエ閲戦澶辩劍鎿嶄綔
-const invoiceAmountBlur = (row) => {
- if (!row.ticketsAmount) {
- row.ticketsAmount = 0;
- }
- // 璁$畻鏄惁瓒呰繃鏉ョエ鎬婚噾棰�
- if (row.ticketsAmount > row.tempFutureTicketsAmount) {
- proxy.$modal.msgWarning("鏈鏉ョエ閲戦涓嶅緱澶т簬鏈潵绁ㄩ噾棰�");
- row.ticketsAmount = 0;
- }
- // 璁$畻鏈鏉ョエ鏁�
- row.ticketsNum = (row.ticketsAmount / row.taxInclusiveUnitPrice).toFixed(2);
- // 璁$畻鏈潵绁ㄦ暟
- row.futureTickets = row.tempFutureTickets - row.ticketsNum;
- // 璁$畻鏈潵绁ㄩ噾棰�
- row.futureTicketsAmount = row.tempFutureTicketsAmount - row.ticketsAmount;
- calculateinvoiceAmount();
-};
-
-// 鑾峰彇褰撳墠鏃ユ湡鍑芥暟
-function getNowFormatDate() {
- let date = new Date(),
- year = date.getFullYear(), //鑾峰彇瀹屾暣鐨勫勾浠�(4浣�)
- month = date.getMonth() + 1, //鑾峰彇褰撳墠鏈堜唤(0-11,0浠h〃1鏈�)
- strDate = date.getDate(); // 鑾峰彇褰撳墠鏃�(1-31)
- if (month < 10) month = `0${month}`; // 濡傛灉鏈堜唤鏄釜浣嶆暟锛屽湪鍓嶉潰琛�0
- if (strDate < 10) strDate = `0${strDate}`; // 濡傛灉鏃ユ槸涓綅鏁帮紝鍦ㄥ墠闈㈣ˉ0
- return `${year}-${month}-${strDate}`;
-}
-
-function calculateinvoiceAmount() {
- console.log("productData", productData.value);
- var invoiceAmountTotal = 0;
- productData.value.forEach((item) => {
- if (item.ticketsAmount) {
- invoiceAmountTotal += item.ticketsAmount;
- }
- });
- form.value.invoiceAmount = invoiceAmountTotal.toFixed(2);
-}
-
-onMounted(() => {
- getList();
-});
-</script>
-
-<style scoped lang="scss"></style>
diff --git a/src/views/procurementManagement/paymentEntry/index.vue b/src/views/procurementManagement/paymentEntry/index.vue
deleted file mode 100644
index 3ce2a8d..0000000
--- a/src/views/procurementManagement/paymentEntry/index.vue
+++ /dev/null
@@ -1,581 +0,0 @@
-<template>
- <div class="app-container">
- <div class="search_form">
- <el-form :inline="true" :model="searchForm" style="width: 100%">
- <el-row justify="space-between">
- <el-col :span="20">
- <el-form-item label="渚涘簲鍟嗗悕绉�/鍚堝悓鍙�">
- <el-input
- v-model="searchForm.supplierNameOrContractNo"
- style="width: 240px"
- placeholder="杈撳叆渚涘簲鍟嗗悕绉�/鍚堝悓鍙锋悳绱�"
- clearable
- prefix-icon="Search"
- @change="handleQuery"
- />
- </el-form-item>
- <el-form-item>
- <el-checkbox
- v-model="searchForm.status"
- label="涓嶆樉绀哄緟浠樻涓�0"
- @change="handleQuery"
- />
- </el-form-item>
- <el-form-item>
- <el-button type="primary" @click="handleQuery"> 鎼滅储 </el-button>
- </el-form-item>
- </el-col>
- <el-col :span="4">
- <el-form-item style="float: right; margin-right: unset">
- <el-button type="primary" @click="openForm('add')">
- 鏂板浠樻
- </el-button>
-<!-- <el-button type="danger" plain @click="handleDelete">-->
-<!-- 鍒犻櫎-->
-<!-- </el-button>-->
- </el-form-item>
- </el-col>
- </el-row>
- </el-form>
- </div>
- <div class="table_list">
- <PIMTable
- rowKey="id"
- :column="tableColumn"
- :tableData="tableData"
- :page="page"
- :expandRowKeys="expandedRowKeys"
- :isSelection="true"
- :isShowSummary="isShowSummarySon"
- :summaryMethod="summarizeMainTable1"
- @selection-change="handleSelectionChange"
- @expand-change="expandChange"
- :tableLoading="tableLoading"
- @pagination="pagination"
- :total="page.total"
- >
- <template #expand="{ row }">
- <el-table
- :data="expandData"
- border
- show-summary
- v-loading="childrenLoading"
- :summary-method="summarizeMainTable2"
- stripe
- >
- <el-table-column
- align="center"
- label="搴忓彿"
- type="index"
- width="60"
- />
- <el-table-column label="浠樻鏃ユ湡" prop="paymentDate" />
- <el-table-column label="浠樻閲戦" prop="currentPaymentAmount">
- <template #default="scope">
- <el-input-number :step="0.01" :min="0" style="width: 100%"
- v-model="scope.row.currentPaymentAmount"
- :disabled="!scope.row.editType"
- :precision="2"
- placeholder="璇疯緭鍏�"
- clearable
- />
- </template>
- </el-table-column>
- <el-table-column label="浠樻鏂瑰紡" prop="paymentMethod">
- <template #default="scope">
- <el-select
- :disabled="!scope.row.editType"
- v-model="scope.row.paymentMethod"
- placeholder="璇烽�夋嫨"
- clearable
- >
- <el-option label="鐢垫眹" value="鐢垫眹" />
- <el-option label="鎵垮厬" value="鎵垮厬" />
- </el-select>
- </template>
- </el-table-column>
- <el-table-column label="鐧昏浜�" prop="registrant" />
- <el-table-column label="鐧昏鏃ユ湡" prop="registrationtDate" />
- <el-table-column label="鎿嶄綔" width="150">
- <template #default="scope">
- <el-button
- link
- type="primary"
- size="small"
- @click="changeEditType(scope.row)"
- v-if="!scope.row.editType"
- :disabled="scope.row.registrant !== userStore.nickName"
- >缂栬緫</el-button
- >
- <el-button
- link
- type="primary"
- size="small"
- @click="saveReceiptPayment(scope.row)"
- v-if="scope.row.editType"
- :disabled="scope.row.registrant !== userStore.nickName"
- >淇濆瓨</el-button
- >
- <el-button
- link
- type="primary"
- size="small"
- @click="handleDelete(scope.row)"
- :disabled="scope.row.registrant !== userStore.nickName"
- >鍒犻櫎</el-button
- >
- </template>
- </el-table-column>
- </el-table>
- </template>
- </PIMTable>
- </div>
- <el-dialog
- v-model="dialogFormVisible"
- :title="operationType === 'add' ? '鏂板浠樻鐧昏' : '缂栬緫浠樻鐧昏'"
- width="60%"
- @close="closeDia"
- >
- <el-form
- :model="form"
- label-width="140px"
- label-position="top"
- :rules="rules"
- ref="formRef"
- >
- <el-row :gutter="30">
- <el-col :span="12">
- <el-form-item label="閲囪喘鍚堝悓鍙凤細" prop="purchaseContractNumber">
- <el-input
- v-model="form.purchaseContractNumber"
- placeholder="鑷姩濉厖"
- clearable
- disabled
- />
- </el-form-item>
- </el-col>
- <el-col :span="12">
- <el-form-item label="閿�鍞悎鍚屽彿锛�" prop="salesContractNo">
- <el-input
- v-model="form.salesContractNo"
- placeholder="鑷姩濉厖"
- clearable
- disabled
- />
- </el-form-item>
- </el-col>
- </el-row>
- <el-row :gutter="30">
- <el-col :span="12">
- <el-form-item label="渚涘簲鍟嗗悕绉帮細" prop="supplierName">
- <el-input
- v-model="form.supplierName"
- placeholder="鑷姩濉厖"
- clearable
- disabled
- />
- </el-form-item>
- </el-col>
- <el-col :span="12">
- <el-form-item label="鍙戠エ鍙凤細" prop="invoiceNumber">
- <el-input
- v-model="form.invoiceNumber"
- placeholder="鑷姩濉厖"
- clearable
- disabled
- />
- </el-form-item>
- </el-col>
- </el-row>
- <el-row :gutter="30">
- <el-col :span="12">
- <el-form-item label="鍙戠エ閲戦(鍏�)锛�" prop="invoiceAmount">
- <el-input
- v-model="form.invoiceAmount"
- placeholder="鑷姩濉厖"
- clearable
- disabled
- />
- </el-form-item>
- </el-col>
- <el-col :span="12">
- <el-form-item label="鏈浠樻閲戦锛�" prop="currentPaymentAmount">
- <el-input-number :step="0.01" :min="0" style="width: 100%"
- :precision="2"
- v-model="form.currentPaymentAmount"
- placeholder="璇疯緭鍏�"
- clearable
- />
- </el-form-item>
- </el-col>
- </el-row>
- <el-row :gutter="30">
- <el-col :span="12">
- <el-form-item label="浠樻鏂瑰紡锛�" prop="paymentMethod">
- <el-select
- v-model="form.paymentMethod"
- placeholder="璇烽�夋嫨"
- clearable
- >
- <el-option label="鐢垫眹" value="鐢垫眹" />
- <el-option label="鎵垮厬" value="鎵垮厬" />
- </el-select>
- </el-form-item>
- </el-col>
- <el-col :span="12">
- <el-form-item label="浠樻鏃ユ湡锛�" prop="paymentDate">
- <el-date-picker
- style="width: 100%"
- v-model="form.paymentDate"
- value-format="YYYY-MM-DD"
- format="YYYY-MM-DD"
- type="date"
- placeholder="璇烽�夋嫨"
- clearable
- />
- </el-form-item>
- </el-col>
- </el-row>
- <el-row :gutter="30">
- <el-col :span="12">
- <el-form-item label="鐧昏浜猴細" prop="registrant">
- <el-input
- v-model="form.registrant"
- placeholder="璇疯緭鍏�"
- clearable
- disabled
- />
- </el-form-item>
- </el-col>
- <el-col :span="12">
- <el-form-item label="鐧昏鏃ユ湡锛�" prop="registrationtDate">
- <el-input
- v-model="form.registrationtDate"
- placeholder="璇疯緭鍏�"
- clearable
- disabled
- />
- </el-form-item>
- </el-col>
- </el-row>
- </el-form>
- <template #footer>
- <div class="dialog-footer">
- <el-button type="primary" @click="submitForm">纭</el-button>
- <el-button @click="closeDia">鍙栨秷</el-button>
- </div>
- </template>
- </el-dialog>
- </div>
-</template>
-
-<script setup>
-import { ref } from "vue";
-import { Search } from "@element-plus/icons-vue";
-import { ElMessageBox } from "element-plus";
-import useUserStore from "@/store/modules/user.js";
-import {
- byPurchaseId,
- paymentRegistrationAdd,
- paymentRegistrationDel,
- paymentRegistrationEdit,
- getTicketNo,
-} from "@/api/procurementManagement/paymentEntry.js";
-import {
- delPaymentRegistration,
- invoiceListPage,
- registrationListPageGetById,
- updatePaymentRegistration
-} from "@/api/procurementManagement/procurementInvoiceLedger.js";
-import useFormData from "@/hooks/useFormData";
-
-const { proxy } = getCurrentInstance();
-const tableColumn = ref([
- {
- type: "expand",
- dataType: "slot",
- slot: "expand",
- },
- {
- label: "閲囪喘鍚堝悓鍙�",
- prop: "purchaseContractNumber",
- },
- {
- label: "閿�鍞悎鍚屽彿",
- prop: "salesContractNo",
- },
- {
- label: "渚涘簲鍟嗗悕绉�",
- prop: "supplierName",
- width:240
- },
- {
- label: "鍙戠エ鍙�",
- prop: "invoiceNumber",
- width:200
- },
- {
- label: "鍙戠エ閲戦(鍏�)",
- prop: "invoiceAmount",
- formatData: (params) => {
- return params ? parseFloat(params).toFixed(2) : 0;
- },
- },
- {
- label: "宸蹭粯娆鹃噾棰�(鍏�)",
- prop: "paymentAmountTotal",
- formatData: (params) => {
- return params ? parseFloat(params).toFixed(2) : 0;
- },
- },
- {
- label: "寰呬粯娆鹃噾棰�(鍏�)",
- prop: "unPaymentAmountTotal",
- formatData: (params) => {
- return params ? parseFloat(params).toFixed(2) : 0;
- },
- },
- {
- label: "褰曞叆浜�",
- prop: "issUer",
- },
-]);
-const tableData = ref([]);
-const expandData = ref([]);
-const selectedRows = ref([]);
-const tableLoading = ref(false);
-const childrenLoading = ref(false);
-const userStore = useUserStore();
-const page = reactive({
- current: 1,
- size: 100,
- total: 0,
-});
-
-// 鐢ㄦ埛淇℃伅琛ㄥ崟寮规鏁版嵁
-const operationType = ref("");
-const dialogFormVisible = ref(false);
-const data = reactive({
- searchForm: {
- supplierNameOrContractNo: "",
- status: false,
- },
- form: {
- purchaseContractNumber: "",
- purchaseLedgerId: "",
- salesContractNo: "",
- supplierName: "",
- invoiceNumber: "",
- invoiceAmount: "",
- taxRate: "",
- currentPaymentAmount: "",
- paymentMethod: "",
- registrant: "",
- registrantId: "",
- paymentDate: "",
- registrationtDate: "",
- },
- rules: {
- purchaseLedgerId: [
- { required: true, message: "璇烽�夋嫨", trigger: "change" },
- ],
- currentPaymentAmount: [
- { required: true, message: "璇疯緭鍏�", trigger: "blur" },
- ],
- paymentMethod: [{ required: true, message: "璇烽�夋嫨", trigger: "change" }],
- invoiceNumber: [
- { required: true, message: "璇烽�夋嫨閲囪喘鍚堝悓鍙�", trigger: "change" },
- ],
- },
-});
-const { form, rules } = toRefs(data);
-const { form: searchForm, resetForm } = useFormData(data.searchForm);
-const isShowSummarySon = ref(true);
-const expandedRowKeys = ref([]);
-
-
-// 瀛愯〃鍚堣鏂规硶
-const summarizeMainTable1 = (param) => {
- return proxy.summarizeTable(
- param,
- ["invoiceAmount", "paymentAmountTotal", "unPaymentAmountTotal"],
- {
- ticketsNum: { noDecimal: true }, // 涓嶄繚鐣欏皬鏁�
- futureTickets: { noDecimal: true }, // 涓嶄繚鐣欏皬鏁�
- }
- );
-};
-// 瀛愯〃鍚堣鏂规硶
-const summarizeMainTable2 = (param) => {
- return proxy.summarizeTable(param, ["currentPaymentAmount"], {
- ticketsNum: { noDecimal: true }, // 涓嶄繚鐣欏皬鏁�
- futureTickets: { noDecimal: true }, // 涓嶄繚鐣欏皬鏁�
- });
-};
-// 鏌ヨ鍒楄〃
-/** 鎼滅储鎸夐挳鎿嶄綔 */
-const handleQuery = () => {
- page.current = 1;
- getList();
-};
-const pagination = (obj) => {
- page.current = obj.page;
- page.size = obj.limit;
- getList();
-};
-const getList = () => {
- tableLoading.value = true;
- invoiceListPage({ ...searchForm, ...page }).then((res) => {
- tableLoading.value = false;
- tableData.value = res.records;
- page.total = res.total;
- if (expandedRowKeys.value.length > 0) {
- const arr = []
- const index = tableData.value.findIndex(item => item.id === expandedRowKeys.value[0]);
- if (index > -1) {
- arr.push(tableData.value[index]);
- expandChange(tableData.value[index], arr)
- }
- }
- });
-};
-// 灞曞紑琛�
-const expandChange = (row, expandedRows) => {
- if (expandedRows.length > 0) {
- nextTick(() => {
- expandedRowKeys.value = [];
- try {
- childrenLoading.value = true;
- registrationListPageGetById({ id: row.id }).then((res) => {
- childrenLoading.value = false;
- const index = tableData.value.findIndex((item) => item.id === row.id);
- if (index > -1) {
- expandData.value = res;
- }
- expandedRowKeys.value.push(row.id);
- });
- } catch (error) {
- childrenLoading.value = false;
- console.log(error);
- }
- })
- } else {
- expandedRowKeys.value = [];
- }
-};
-// 缂栬緫淇敼鐘舵��
-const changeEditType = (row) => {
- row.editType = !row.editType;
-};
-// 淇濆瓨鍥炴璁板綍
-const saveReceiptPayment = (row) => {
- let updateData = {
- id: row.id,
- currentPaymentAmount: row.currentPaymentAmount,
- paymentMethod: row.paymentMethod,
- };
- updatePaymentRegistration(updateData).then((res) => {
- row.editType = !row.editType;
- getList();
- proxy.$modal.msgSuccess("鎻愪氦鎴愬姛");
- });
-};
-// 琛ㄦ牸閫夋嫨鏁版嵁
-const handleSelectionChange = (selection) => {
- selectedRows.value = selection;
-};
-// 鎵撳紑寮规
-const openForm = (type, row) => {
- if (selectedRows.value.length !== 1) {
- proxy.$message.error("璇烽�夋嫨涓�鏉″彂绁ㄦ暟鎹�");
- return;
- }
- if (selectedRows.value[0].unPaymentAmountTotal == 0) {
- proxy.$message.warning("鏃犻渶鍐嶄粯娆�");
- return;
- }
- operationType.value = type;
- form.value = {};
- form.value = { ...selectedRows.value[0] };
- form.value.ticketRegistrationId = selectedRows.value[0].id;
- form.value.id = null;
- // 鏌ヨ閲囪喘鍚堝悓鍙�
- form.value.registrationtDate = getCurrentDate();
- form.value.paymentDate = getCurrentDate();
- form.value.registrant = userStore.name;
- dialogFormVisible.value = true;
-};
-// 鎻愪氦琛ㄥ崟
-const submitForm = () => {
- proxy.$refs["formRef"].validate((valid) => {
- if (valid) {
- if (operationType.value === "edit") {
- submitEdit();
- } else {
- submitAdd();
- }
- }
- });
-};
-// 鎻愪氦鏂板
-const submitAdd = () => {
- paymentRegistrationAdd(form.value).then((res) => {
- proxy.$modal.msgSuccess("鎻愪氦鎴愬姛");
- closeDia();
- getList();
- });
-};
-// 鎻愪氦淇敼
-const submitEdit = () => {
- paymentRegistrationEdit(form.value).then((res) => {
- proxy.$modal.msgSuccess("鎻愪氦鎴愬姛");
- closeDia();
- getList();
- });
-};
-// 鍏抽棴寮规
-const closeDia = () => {
- proxy.resetForm("formRef");
- dialogFormVisible.value = false;
-};
-// 鍒犻櫎
-const handleDelete = (row) => {
- ElMessageBox.confirm("閫変腑鐨勫唴瀹瑰皢琚垹闄わ紝鏄惁纭鍒犻櫎锛�", "鍒犻櫎鎻愮ず", {
- confirmButtonText: "纭",
- cancelButtonText: "鍙栨秷",
- type: "warning",
- })
- .then(() => {
- tableLoading.value = true;
- delPaymentRegistration(row.id)
- .then((res) => {
- proxy.$modal.msgSuccess("鍒犻櫎鎴愬姛");
- getList();
- })
- .finally(() => {
- tableLoading.value = false;
- });
- })
- .catch(() => {
- proxy.$modal.msg("宸插彇娑�");
- });
-};
-// 鑾峰彇褰撳墠鏃ユ湡骞舵牸寮忓寲涓� YYYY-MM-DD
-function getCurrentDate() {
- const today = new Date();
- const year = today.getFullYear();
- const month = String(today.getMonth() + 1).padStart(2, "0"); // 鏈堜唤浠�0寮�濮�
- const day = String(today.getDate()).padStart(2, "0");
- return `${year}-${month}-${day}`;
-}
-getList();
-</script>
-
-<style scoped lang="scss">
-.table_list {
- margin-top: unset;
-}
-::v-deep(.el-checkbox__label) {
- font-weight: bold;
-}
-</style>
diff --git a/src/views/procurementManagement/paymentHistory/index.vue b/src/views/procurementManagement/paymentHistory/index.vue
deleted file mode 100644
index 7c71979..0000000
--- a/src/views/procurementManagement/paymentHistory/index.vue
+++ /dev/null
@@ -1,173 +0,0 @@
-<template>
- <div class="app-container">
- <el-form :model="searchForm" :inline="true">
- <el-form-item label="渚涘簲鍟嗗悕绉�">
- <el-input
- v-model="searchForm.searchText"
- style="width: 240px"
- placeholder="杈撳叆渚涘簲鍟嗗悕绉版悳绱�"
- @change="handleQuery"
- clearable
- :prefix-icon="Search"
- />
- </el-form-item>
- <el-form-item label="浠樻鏃ユ湡">
- <el-date-picker
- v-model="searchForm.paymentDate"
- value-format="YYYY-MM-DD"
- format="YYYY-MM-DD"
- type="daterange"
- start-placeholder="寮�濮嬫椂闂�"
- end-placeholder="缁撴潫鏃堕棿"
- clearable
- @change="changeDateRange"
- @clear="clearRange"
- />
- </el-form-item>
- <el-form-item>
- <el-button
- type="primary"
- @click="handleQuery"
- style="margin-left: 10px"
- >
- 鎼滅储
- </el-button>
- </el-form-item>
- </el-form>
- <div class="table_list">
- <PIMTable
- rowKey="id"
- :column="tableColumn"
- :tableData="tableData"
- :page="page"
- :isSelection="true"
- :isShowSummary="isShowSummarySon"
- :summaryMethod="summarizeMainTable1"
- @selection-change="handleSelectionChange"
- :tableLoading="tableLoading"
- @pagination="pagination"
- :total="page.total"
- ></PIMTable>
- </div>
- </div>
-</template>
-
-<script setup>
-import { ref } from "vue";
-import { Search } from "@element-plus/icons-vue";
-import { paymentHistoryListPage } from "@/api/procurementManagement/paymentEntry.js";
-import useFormData from "@/hooks/useFormData";
-import dayjs from "dayjs";
-
-const { proxy } = getCurrentInstance();
-const isShowSummarySon = ref(true);
-const tableColumn = ref([
- {
- label: "閲囪喘鍚堝悓鍙�",
- prop: "purchaseContractNumber",
- },
- {
- label: "浠樻鏃ユ湡",
- prop: "paymentDate",
- },
- {
- label: "渚涘簲鍟嗗悕绉�",
- prop: "supplierName",
- width:240
- },
- {
- label: "浠樻閲戦",
- prop: "currentPaymentAmount",
- formatData: (params) => {
- return params ? parseFloat(params).toFixed(2) : 0;
- },
- },
- {
- label: "浠樻鏂瑰紡",
- prop: "paymentMethod",
- },
- {
- label: "鐧昏浜�",
- prop: "registrant",
- },
- {
- label: "鐧昏鏃ユ湡",
- prop: "registrationtDate",
- },
-]);
-const tableData = ref([]);
-const selectedRows = ref([]);
-const tableLoading = ref(false);
-const page = reactive({
- current: 1,
- size: 100,
- total: 0,
-});
-const total = ref(0);
-const { form: searchForm } = useFormData({
- searchText: undefined,
- paymentDate: [
- dayjs().startOf("month").format("YYYY-MM-DD"),
- dayjs().endOf("month").format("YYYY-MM-DD"),
- ],
- paymentDateStart: dayjs().startOf("month").format("YYYY-MM-DD"),
- paymentDateEnd: dayjs().endOf("month").format("YYYY-MM-DD"),
-});
-
-// 鏌ヨ鍒楄〃
-/** 鎼滅储鎸夐挳鎿嶄綔 */
-const handleQuery = () => {
- page.current = 1;
- getList();
-};
-const pagination = (obj) => {
- page.current = obj.page;
- page.size = obj.limit;
- getList();
-};
-const getList = () => {
- tableLoading.value = true;
- const { paymentDate, ...rest } = searchForm;
- paymentHistoryListPage({ ...rest, ...page }).then((res) => {
- tableLoading.value = false;
- tableData.value = res.records;
- page.total = res.total;
- });
-};
-// 瀛愯〃鍚堣鏂规硶
-const summarizeMainTable1 = (param) => {
- return proxy.summarizeTable(param, ["currentPaymentAmount"], {
- ticketsNum: { noDecimal: true }, // 涓嶄繚鐣欏皬鏁�
- futureTickets: { noDecimal: true }, // 涓嶄繚鐣欏皬鏁�
- });
-};
-// 琛ㄦ牸閫夋嫨鏁版嵁
-const handleSelectionChange = (selection) => {
- selectedRows.value = selection;
-};
-
-const changeDateRange = (date) => {
- if (date) {
- searchForm.paymentDateStart = date[0];
- searchForm.paymentDateEnd = date[1];
- getList();
- }
-};
-
-const clearRange = () => {
- searchForm.paymentDate = [];
- searchForm.paymentDateStart = undefined;
- searchForm.paymentDateEnd = undefined;
- getList();
-};
-
-onMounted(() => {
- getList();
-});
-</script>
-
-<style scoped lang="scss">
-.table_list {
- margin-top: unset;
-}
-</style>
diff --git a/src/views/procurementManagement/paymentLedger/index.vue b/src/views/procurementManagement/paymentLedger/index.vue
deleted file mode 100644
index 2f001a5..0000000
--- a/src/views/procurementManagement/paymentLedger/index.vue
+++ /dev/null
@@ -1,316 +0,0 @@
-<template>
- <div class="app-container">
- <div class="search_form">
- <div>
- <span class="search_title">渚涘簲鍟嗗悕绉�:</span>
- <el-input
- v-model="searchForm.supplierName"
- style="width: 240px"
- placeholder="杈撳叆渚涘簲鍟嗗悕绉�"
- @change="handleQuery"
- clearable
- :prefix-icon="Search"
- />
- <el-button type="primary" @click="handleQuery" style="margin-left: 10px"
- >鎼滅储</el-button
- >
- </div>
- <div></div>
- </div>
- <el-row :gutter="20">
- <el-col :span="14">
- <div class="table_list">
- <el-table
- ref="multipleTable"
- border
- v-loading="tableLoading"
- :data="tableData"
- :header-cell-style="{ background: '#F0F1F5', color: '#333333' }"
- height="calc(100vh - 18.5em)"
- :highlight-current-row="true"
- style="width: 100%"
- stripe
- tooltip-effect="dark"
- @row-click="rowClick"
- :show-summary="isShowSummary"
- :summary-method="summarizeMainTable"
- class="lims-table"
- >
- <el-table-column
- align="center"
- label="搴忓彿"
- type="index"
- width="60"
- />
- <el-table-column label="渚涘簲鍟嗗悕绉�" prop="supplierName" />
- <el-table-column
- label="鍙戠エ閲戦(鍏�)"
- prop="invoiceAmount"
- show-overflow-tooltip
- :formatter="formattedNumber"
- />
- <el-table-column
- label="浠樻閲戦(鍏�)"
- prop="paymentAmount"
- 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>
- <pagination
- v-show="total > 0"
- @pagination="paginationSearch"
- :total="total"
- :layout="page.layout"
- :page="page.current"
- :limit="page.size"
- />
- </div>
- </el-col>
- <el-col :span="10">
- <div class="table_list">
- <PIMTable
- rowKey="id"
- :column="tableColumnSon"
- :tableData="originalTableDataSon"
- :isSelection="false"
- :tableLoading="tableLoadingSon"
- :isShowSummary="isShowSummarySon"
- :summaryMethod="summarizeMainTable1"
- height="calc(100vh - 18.5em)"
- >
- <template #payableAmountSlot="{ row }">
- <el-text type="danger">
- {{ parseFloat(row.payableAmount).toFixed(2) }}
- </el-text>
- </template>
- </PIMTable>
- <pagination
- v-show="sonTotal > 0"
- :total="sonTotal"
- @pagination="sonPaginationSearch"
- :layout="page.layout"
- :page="sonPage.current"
- :limit="sonPage.size"
- />
- </div>
- </el-col>
- </el-row>
- </div>
-</template>
-
-<script setup>
-import { ref, toRefs } from "vue";
-import { Search } from "@element-plus/icons-vue";
-import {
- paymentLedgerList,
- paymentRecordList,
-} from "@/api/procurementManagement/paymentLedger.js";
-import Pagination from "../../../components/PIMTable/Pagination.vue";
-
-const tableColumn = ref([
- {
- label: "渚涘簲鍟嗗悕绉�",
- prop: "supplierName",
- width:240
- },
- {
- label: "鍙戠エ閲戦(鍏�)",
- prop: "invoiceAmount",
- },
- {
- label: "浠樻閲戦(鍏�)",
- prop: "paymentAmount",
- },
- {
- label: "搴斾粯閲戦(鍏�)",
- prop: "payableAmount",
- },
-]);
-const tableData = ref([]);
-const tableLoading = ref(false);
-const data = reactive({
- searchForm: {
- supplierNameOrContractNo: "",
- },
-});
-const page = reactive({
- current: 1,
- size: 100,
-});
-const sonPage = reactive({
- current: 1,
- size: 100,
-});
-const total = ref(0);
-const sonTotal = ref(0);
-const isShowSummary = ref(true);
-const { searchForm } = toRefs(data);
-const currentSupplierId = ref("");
-const rowClick = (row) => {
- currentSupplierId.value = row.supplierId;
- getPaymenRecordtList(row.supplierId);
-};
-// 瀛愭ā鍧�
-const tableColumnSon = ref([
- {
- label: "鍙戠敓鏃ユ湡",
- prop: "happenTime",
- width: 110,
- },
- {
- label: "鍙戠エ閲戦(鍏�)",
- prop: "invoiceAmount",
- width: 200,
- formatData: (params) => {
- return params ? parseFloat(params).toFixed(2) : 0;
- },
- },
- {
- label: "浠樻閲戦(鍏�)",
- prop: "currentPaymentAmount",
- width: 200,
- formatData: (params) => {
- return params ? parseFloat(params).toFixed(2) : 0;
- },
- },
- {
- label: "搴斾粯閲戦(鍏�)",
- dataType: "slot",
- width: 200,
- prop: "payableAmount",
- slot: "payableAmountSlot",
- },
-]);
-const tableDataSon = ref([]);
-const originalTableDataSon = ref([]);
-const tableLoadingSon = ref(false);
-const isShowSummarySon = ref(true);
-const detailPageNum = ref(1);
-const detailPageSize = ref(10);
-const { proxy } = getCurrentInstance();
-
-// 涓昏〃鍚堣鏂规硶
-const summarizeMainTable = (param) => {
- return proxy.summarizeTable(
- param,
- ["invoiceAmount", "paymentAmount", "payableAmount"],
- {
- ticketsNum: { noDecimal: true }, // 涓嶄繚鐣欏皬鏁�
- futureTickets: { noDecimal: true }, // 涓嶄繚鐣欏皬鏁�
- }
- );
-};
-// 瀛愯〃鍚堣鏂规硶
-const summarizeMainTable1 = (param) => {
- let summarizeTable = proxy.summarizeTable(
- param,
- ["invoiceAmount", "currentPaymentAmount"],
- {
- ticketsNum: { noDecimal: true }, // 涓嶄繚鐣欏皬鏁�
- futureTickets: { noDecimal: true }, // 涓嶄繚鐣欏皬鏁�
- }
- );
- if (originalTableDataSon.value.length > 0) {
- summarizeTable[summarizeTable.length - 1] =
- originalTableDataSon.value[
- originalTableDataSon.value.length - 1
- ].payableAmount.toFixed(2);
- } else {
- summarizeTable[summarizeTable.length - 1] = 0.0;
- }
- return summarizeTable;
-};
-/** 鎼滅储鎸夐挳鎿嶄綔 */
-const handleQuery = () => {
- page.current = 1;
- getList();
-};
-const paginationSearch = (obj) => {
- page.current = obj.page;
- page.size = obj.limit;
- getList();
-};
-const getList = () => {
- tableLoading.value = true;
- paymentLedgerList({
- ...searchForm.value,
- ...page,
- detailPageNum: detailPageNum.value, // 鏂板
- detailPageSize: detailPageSize.value, // 鏂板
- }).then((res) => {
- let result = res.data;
- tableLoading.value = false;
- tableData.value = result.records || [];
- total.value = result.total || 0;
- if (tableData.value.length > 0) {
- getPaymenRecordtList(tableData.value[0].supplierId);
- currentSupplierId.value = tableData.value[0].supplierId;
- }
- });
-};
-
-const getPaymenRecordtList = (supplierId) => {
- tableLoadingSon.value = true;
- paymentRecordList(supplierId)
- .then((res) => {
- tableLoadingSon.value = false;
- tableDataSon.value = res.data;
- handlePagination({ page: 1, limit: sonPage.size });
- sonTotal.value = res.data.length;
- })
- .catch((e) => {
- tableLoadingSon.value = false;
- });
-};
-const handlePagination = ({ page, limit }) => {
- sonPage.current = page;
- sonPage.size = limit;
-
- const start = (page - 1) * limit;
- const end = start + limit;
-
- originalTableDataSon.value = tableDataSon.value.slice(start, end);
-};
-
-const sonPaginationSearch = (pagination) => {
- // 鎺ユ敹鍒嗛〉鍣ㄥ弬鏁� { page, limit }
- handlePagination(pagination);
-};
-const formattedNumber = (row, column, cellValue) => {
- if (column.property !== "supplierName") {
- return parseFloat(cellValue).toFixed(2);
- } else {
- return cellValue;
- }
-};
-getList();
-</script>
-
-<style scoped lang="scss">
-.el-pagination {
- width: 100%;
- height: 55px;
- display: flex;
- justify-content: flex-end;
- float: right;
- flex-direction: row;
- align-items: center;
- background: #fff;
- margin: -20px 0 0 0;
- padding: 0 20px;
-}
-.pagination-container {
- margin-top: 0;
-}
-</style>
diff --git a/src/views/procurementManagement/procurementInvoiceLedger/Form/EditForm.vue b/src/views/procurementManagement/procurementInvoiceLedger/Form/EditForm.vue
deleted file mode 100644
index f939be4..0000000
--- a/src/views/procurementManagement/procurementInvoiceLedger/Form/EditForm.vue
+++ /dev/null
@@ -1,128 +0,0 @@
-<template>
- <el-form :model="form">
- <el-row :gutter="20">
- <el-col :span="12">
- <el-form-item label="閲囪喘鍚堝悓鍙凤細">
- <el-tag size="large">{{ form.purchaseContractNumber }}</el-tag>
- </el-form-item>
- </el-col>
- <el-col :span="12">
- <el-form-item label="閿�鍞悎鍚屽彿锛�">
- <el-text>{{ form.salesContractNo }}</el-text>
- </el-form-item>
- </el-col>
- <el-col :span="12">
- <el-form-item label="鍚◣鍗曚环(鍏�)锛�">
- <el-text type="primary">{{ form.taxInclusiveUnitPrice }}</el-text>
- </el-form-item>
- </el-col>
- <el-col :span="12">
- <el-form-item label="鍒涘缓鏃堕棿锛�">
- <el-text>{{ form.createdAt }}</el-text>
- </el-form-item>
- </el-col>
- <el-col :span="12">
- <el-form-item label="鍙戠エ鍙凤細">
- <el-input disabled v-model="form.invoiceNumber" />
- </el-form-item>
- </el-col>
- <el-col :span="12">
- <el-form-item label="鏉ョエ鏁帮細">
- <el-input-number :step="0.1" :min="0" style="width: 100%" v-model="form.ticketsNum" @change="inputTicketsNum" :precision="2"/>
- </el-form-item>
- </el-col>
- <el-col :span="12">
- <el-form-item label="鏈鏉ョエ閲戦(鍏�)锛�">
- <el-input-number :step="0.1" :min="0" style="width: 100%" v-model="form.ticketsAmount" @change="inputTicketsAmount" :precision="2"/>
- </el-form-item>
- </el-col>
- <el-col :span="12">
- <el-form-item label="鏈潵绁ㄦ暟锛�">
- <el-text type="success">{{ form.futureTickets }}</el-text>
- </el-form-item>
- </el-col>
- </el-row>
- </el-form>
-</template>
-
-<script setup>
-import useFormData from "@/hooks/useFormData";
-import { getProductRecordById } from "@/api/procurementManagement/procurementInvoiceLedger";
-const { proxy } = getCurrentInstance()
-
-defineOptions({
- name: "鏉ョエ鍙拌处琛ㄥ崟",
-});
-const temFutureTickets = ref(0)
-const { form, resetForm } = useFormData({
- id: undefined,
- purchaseContractNumber: undefined, // 閲囪喘鍚堝悓鍙�
- salesContractNo: undefined, // 閿�鍞悎鍚屽彿
- createdAt: undefined, // 鍒涘缓鏃堕棿
- invoiceNumber: undefined, // 鍙戠エ鍙�
- ticketsNum: undefined, // 鏉ョエ鏁�
- ticketsAmount: undefined, // 鏉ョエ閲戦
- taxInclusiveUnitPrice: undefined, // 鍚◣鍗曚环
-});
-
-const load = async (id) => {
- const { code, data } = await getProductRecordById({ id });
- if (code === 200) {
- form.id = data.id;
- form.purchaseContractNumber = data.purchaseContractNumber;
- form.salesContractNo = data.salesContractNo;
- form.createdAt = data.createdAt;
- form.invoiceNumber = data.invoiceNumber;
- form.ticketsNum = data.ticketsNum;
- form.ticketsAmount = data.ticketsAmount.toFixed(2);
- form.taxInclusiveUnitPrice = data.taxInclusiveUnitPrice;
- form.futureTickets = data.futureTickets;
- temFutureTickets.value = data.futureTickets;
- }
-};
-
-const inputTicketsNum = (val) => {
- // 纭繚鍚◣鍗曚环瀛樺湪涓斾笉涓洪浂
- if (!form.taxInclusiveUnitPrice || Number(form.taxInclusiveUnitPrice) === 0) {
- proxy.$modal.msgWarning("鍚◣鍗曚环涓嶈兘涓洪浂鎴栨湭瀹氫箟");
- return;
- }
- if (Number(form.ticketsNum) > Number(temFutureTickets.value)) {
- proxy.$modal.msgWarning("寮�绁ㄦ暟涓嶅緱澶т簬鏈紑绁ㄦ暟");
- form.ticketsNum = temFutureTickets.value
- }
-
- // 纭繚鎵�鏈夋暟鍊奸兘杞崲涓烘暟瀛楃被鍨嬭繘琛岃绠�
- const ticketsAmount = Number(form.ticketsNum) * Number(form.taxInclusiveUnitPrice);
- const futureTickets = Number(temFutureTickets.value) - Number(form.ticketsNum);
- form.futureTickets = Number(futureTickets.toFixed(2));
- form.ticketsAmount = Number(ticketsAmount.toFixed(2));
-};
-const inputTicketsAmount = (val) => {
- // 纭繚鍚◣鍗曚环瀛樺湪涓斾笉涓洪浂
- if (!form.taxInclusiveUnitPrice || Number(form.taxInclusiveUnitPrice) === 0) {
- proxy.$modal.msgWarning("鍚◣鍗曚环涓嶈兘涓洪浂鎴栨湭瀹氫箟");
- return;
- }
-
- if (Number(val) > Number(form.futureTickets*form.taxInclusiveUnitPrice)) {
- proxy.$modal.msgWarning("鏈鏉ョエ閲戦涓嶅緱澶т簬鎬婚噾棰�");
- form.ticketsAmount = (form.futureTickets*form.taxInclusiveUnitPrice).toFixed(2)
- const ticketsNum = Number(form.ticketsAmount) / Number(form.taxInclusiveUnitPrice);
- form.ticketsNum = Number(ticketsNum.toFixed(2))
- return;
- }
-
- // 纭繚鎵�鏈夋暟鍊奸兘杞崲涓烘暟瀛楃被鍨嬭繘琛岃绠�
- const ticketsNum = Number(val) / Number(form.taxInclusiveUnitPrice);
- form.ticketsNum = Number(ticketsNum.toFixed(2));
-};
-
-defineExpose({
- load,
- form,
- resetForm,
-});
-</script>
-
-<style lang="scss" scoped></style>
diff --git a/src/views/procurementManagement/procurementInvoiceLedger/Modal/EditModal.vue b/src/views/procurementManagement/procurementInvoiceLedger/Modal/EditModal.vue
deleted file mode 100644
index 82b4164..0000000
--- a/src/views/procurementManagement/procurementInvoiceLedger/Modal/EditModal.vue
+++ /dev/null
@@ -1,62 +0,0 @@
-<template>
- <el-dialog :title="modalOptions.title" v-model="visible" @close="close">
- <EditForm ref="editFormRef" />
- <template #footer>
- <el-button type="primary" :loading="loading" @click="sendForm">
- {{ modalOptions.confirmText }}
- </el-button>
- <el-button @click="closeModal">{{ modalOptions.cancelText }}</el-button>
- </template>
- </el-dialog>
-</template>
-
-<script setup>
-import { useModal } from "@/hooks/useModal";
-import EditForm from "../Form/EditForm.vue";
-import { updateRegistration } from "@/api/procurementManagement/procurementInvoiceLedger";
-import { ElMessage } from "element-plus";
-
-defineOptions({
- name: "鏉ョエ鍙拌处缂栬緫",
-});
-const emits = defineEmits(["success"]);
-
-const saleLedgerProjectId = ref('')
-const editFormRef = ref();
-const {
- id,
- visible,
- loading,
- openModal,
- modalOptions,
- handleConfirm,
- closeModal,
-} = useModal({ title: "鏉ョエ鍙拌处" });
-
-const open = async (row) => {
- openModal(row.id);
- saleLedgerProjectId.value = row.saleLedgerProjectId;
- await nextTick();
- editFormRef.value.load(row.id);
-};
-
-const close = () => {
- editFormRef.value.resetForm();
- closeModal();
-};
-
-const sendForm = async () => {
- const form = editFormRef.value.form;
- form.saleLedgerProjectId = saleLedgerProjectId.value;
- const { code } = await updateRegistration(form);
- if (code === 200) {
- emits("success");
- ElMessage({ message: "鎿嶄綔鎴愬姛", type: "success" });
- close();
- }
-};
-
-defineExpose({
- open,
-});
-</script>
diff --git a/src/views/procurementManagement/procurementInvoiceLedger/Modal/UploadModal.vue b/src/views/procurementManagement/procurementInvoiceLedger/Modal/UploadModal.vue
deleted file mode 100644
index b82bd10..0000000
--- a/src/views/procurementManagement/procurementInvoiceLedger/Modal/UploadModal.vue
+++ /dev/null
@@ -1,87 +0,0 @@
-<template>
- <el-dialog v-model="upload.open" :title="upload.title" :width="500">
- <FileUpload
- ref="fileUploadRef"
- accept=".xlsx, .xls, .pdf"
- :headers="upload.headers"
- :autoUpload="true"
- :action="upload.url"
- :disabled="upload.isUploading"
- :showTip="false"
- :limit="10"
- @success="handleFileSuccess"
- @remove="removeFile"
- />
- <template #footer>
- <div class="dialog-footer">
- <el-button type="primary" @click="submitFileForm">纭� 瀹�</el-button>
- <el-button @click="upload.open = false">鍙� 娑�</el-button>
- </div>
- </template>
- </el-dialog>
-</template>
-
-<script setup>
-import { reactive } from "vue";
-import { getToken } from "@/utils/auth.js";
-import { FileUpload } from "@/components/Upload";
-import { ElMessage } from "element-plus";
-import { ref } from "vue";
-import useFormData from "@/hooks/useFormData";
-
-defineOptions({
- name: "鏉ョエ鍙拌处闄勪欢琛ュ厖",
-});
-
-const { form, resetForm } = useFormData({
- id: undefined,
- tempFileIds: [],
-});
-const emits = defineEmits(["uploadSuccess"]);
-const fileUploadRef = ref();
-const upload = reactive({
- // 鏄惁鏄剧ず寮瑰嚭灞傦紙渚涘簲鍟嗗鍏ワ級
- open: false,
- // 寮瑰嚭灞傛爣棰橈紙渚涘簲鍟嗗鍏ワ級
- title: "",
- // 鏄惁绂佺敤涓婁紶
- isUploading: false,
- // 璁剧疆涓婁紶鐨勮姹傚ご閮�
- headers: { Authorization: "Bearer " + getToken() },
- // 涓婁紶鐨勫湴鍧�
- url: import.meta.env.VITE_APP_BASE_API + "/file/upload",
-});
-// 鐐瑰嚮瀵煎叆
-const handleImport = (id) => {
- form.id = id;
- upload.open = true;
- upload.title = "鏉ョエ鍙拌处闄勪欢琛ュ厖";
-};
-
-const submitFileForm = () => {
- emits("uploadSuccess", form);
- resetForm();
- upload.open = false;
- // 娓呯┖鏂囦欢鍒楄〃
- fileUploadRef.value.fileList = [];
-};
-
-const handleFileSuccess = (response) => {
- if (response.code == 200) {
- form.tempFileIds.push(response.data.tempId);
- console.log('form',form);
- ElMessage({ message: "瀵煎叆鎴愬姛", type: "success" });
- } else {
- ElMessage({ message: response.msg, type: "error" });
- }
-};
-
-const removeFile = (file) => {
- const { tempId } = file.response.data;
- form.tempFileIds = form.tempFileIds.filter((item) => item !== tempId);
-};
-
-defineExpose({
- handleImport,
-});
-</script>
diff --git a/src/views/procurementManagement/procurementInvoiceLedger/index.vue b/src/views/procurementManagement/procurementInvoiceLedger/index.vue
deleted file mode 100644
index 8ad8799..0000000
--- a/src/views/procurementManagement/procurementInvoiceLedger/index.vue
+++ /dev/null
@@ -1,372 +0,0 @@
-<template>
- <div class="app-container">
- <el-form :model="filters" :inline="true">
- <el-form-item label="閲囪喘鍚堝悓鍙�">
- <el-input
- v-model="filters.purchaseContractNumber"
- style="width: 240px"
- placeholder="璇疯緭鍏�"
- clearable
- :prefix-icon="Search"
- @change="getTableData"
- />
- </el-form-item>
- <el-form-item label="渚涘簲鍟�">
- <el-input
- v-model="filters.supplierName"
- style="width: 240px"
- placeholder="璇疯緭鍏�"
- clearable
- :prefix-icon="Search"
- @change="getTableData"
- />
- </el-form-item>
- <el-form-item label="鏉ョエ鏃ユ湡">
- <el-date-picker
- style="width: 240px"
- v-model="filters.createdAt"
- value-format="YYYY-MM-DD"
- format="YYYY-MM-DD"
- type="daterange"
- start-placeholder="寮�濮嬫椂闂�"
- end-placeholder="缁撴潫鏃堕棿"
- clearable
- @change="getTableData"
- />
- </el-form-item>
- <el-form-item>
- <el-button type="primary" @click="getTableData">鎼滅储</el-button>
- <el-button @click="resetFilters"> 閲嶇疆 </el-button>
- <el-button @click="handleOut">瀵煎嚭</el-button>
- </el-form-item>
- </el-form>
- <div class="table_list">
- <PIMTable
- rowKey="id"
- :column="columns"
- :tableLoading="loading"
- :tableData="dataList"
- :isSelection="true"
- height="calc(100vh - 19.5em)"
- :isShowSummary="true"
- :summaryMethod="summarizeMainTable"
- :page="{
- current: pagination.currentPage,
- size: pagination.pageSize,
- total: pagination.total,
- }"
- @selection-change="handleSelectionChange"
- @pagination="changePage"
- >
- <template #commonFilesRef="{ row }">
- <el-dropdown @command="(command) => handleCommand(command, row)">
- <el-button link :icon="Files" type="danger"> 闄勪欢 </el-button>
- <template #dropdown>
- <el-dropdown-menu>
- <el-dropdown-item
- v-if="row.commonFiles.length !== 0"
- :icon="Download"
- command="download"
- >
- 涓嬭浇
- </el-dropdown-item>
- <el-dropdown-item :icon="Upload" command="upload">
- 涓婁紶
- </el-dropdown-item>
- </el-dropdown-menu>
- </template>
- </el-dropdown>
- </template>
- <template #operation="{ row }">
- <el-button
- type="primary"
- text
- @click="openEdit(row)"
- :disabled="row.issUerId !== userStore.id"
- >
- 缂栬緫
- </el-button>
- <el-button
- type="primary"
- text
- :disabled="row.issUerId !== userStore.id"
- @click="handleDelete(row)"
- >
- 鍒犻櫎
- </el-button>
- </template>
- </PIMTable>
- </div>
- <UploadModal ref="modalRef" @uploadSuccess="uploadSuccess"></UploadModal>
- <EditModal ref="editmodalRef" @success="getTableData"></EditModal>
- </div>
-</template>
-
-<script setup>
-import { ref, getCurrentInstance } from "vue";
-import { usePaginationApi } from "@/hooks/usePaginationApi";
-import {
- Files,
- Download,
- Search,
- Upload,
- EditPen,
-} from "@element-plus/icons-vue";
-import {
- delRegistration,
- productRecordPage,
- productUploadFile,
-} from "@/api/procurementManagement/procurementInvoiceLedger.js";
-import { onMounted } from "vue";
-import { ElMessageBox } from "element-plus";
-import UploadModal from "./Modal/UploadModal.vue";
-import EditModal from "./Modal/EditModal.vue";
-import useUserStore from "@/store/modules/user.js";
-import {delInvoiceLedgerByRegProductId} from "@/api/salesManagement/invoiceLedger.js";
-const userStore = useUserStore();
-
-defineOptions({
- name: "鏉ョエ鍙拌处",
-});
-
-const modalRef = ref();
-const editmodalRef = ref();
-
-const { proxy } = getCurrentInstance();
-const multipleVal = ref([]);
-const {
- loading,
- filters,
- columns,
- dataList,
- pagination,
- getTableData,
- resetFilters,
- onCurrentChange,
-} = usePaginationApi(
- productRecordPage,
- {
- purchaseContractNumber: undefined, // 閲囪喘鍚堝悓鍙�
- supplierName: undefined, // 渚涘簲鍟�
- createdAt: [], // 鏉ョエ鏃ユ湡
- },
- [
- {
- label: "閲囪喘鍚堝悓鍙�",
- prop: "purchaseContractNumber",
- width: 150,
- },
- {
- label: "閿�鍞悎鍚屽彿",
- prop: "salesContractNo",
- width: 150,
- },
- {
- label: "椤圭洰鍚嶇О",
- prop: "projectName",
- width: 240,
- },
- {
- label: "渚涘簲鍟嗗悕绉�",
- prop: "supplierName",
- width: 240,
- },
- {
- label: "浜у搧澶х被",
- prop: "productCategory",
- width: 150,
- },
- {
- label: "瑙勬牸鍨嬪彿",
- prop: "specificationModel",
- width: 150,
- },
- {
- label: "鍙戠エ鍙�",
- prop: "invoiceNumber",
- width: 200,
- },
- {
- label: "鍚堝悓閲戦(鍏�)",
- prop: "taxInclusiveTotalPrice",
- width: 200,
- formatData: (cell) => {
- return cell ? parseFloat(cell).toFixed(2) : 0;
- },
- },
- {
- label: "鏈鏉ョエ鏁�",
- prop: "ticketsNum",
- width: 110,
- },
- {
- label: "鏉ョエ鏃ユ湡",
- prop: "createdAt",
- width: 110,
- },
- {
- label: "鏉ョエ閲戦(鍏�)",
- prop: "ticketsAmount",
- width: 200,
- formatData: (cell) => {
- return cell ? parseFloat(cell).toFixed(2) : 0;
- },
- },
- {
- label: "涓嶅惈绋庨噾棰�",
- prop: "unTicketsPrice",
- width: 200,
- formatData: (cell) => {
- return cell ? parseFloat(cell).toFixed(2) : 0;
- },
- },
- {
- label: "澧炲�肩◣",
- prop: "invoiceAmount",
- width: 200,
- },
- {
- label: "褰曞叆浜�",
- prop: "issUer",
- width: 200,
- },
- {
- label: "闄勪欢",
- align: "center",
- prop: "commonFiles",
- dataType: "slot",
- fixed: "right",
- slot: "commonFilesRef",
- width: 120,
- },
- {
- fixed: "right",
- width: 150,
- label: "鎿嶄綔",
- dataType: "slot",
- slot: "operation",
- align: "center",
- },
- ],
- {},
- {
- createdAt: (aim) => ({
- createdAtStart: aim ? aim[0] : undefined,
- createdAtEnd: aim ? aim[1] : undefined,
- }),
- }
-);
-
-// 涓昏〃鍚堣鏂规硶
-const summarizeMainTable = (param) => {
- return proxy.summarizeTable(
- param,
- [
- "taxInclusiveTotalPrice",
- "ticketsAmount",
- "unTicketsPrice",
- "invoiceAmount",
- ],
- {
- ticketsNum: { noDecimal: true }, // 涓嶄繚鐣欏皬鏁�
- futureTickets: { noDecimal: true }, // 涓嶄繚鐣欏皬鏁�
- }
- );
-};
-
-const handleSelectionChange = (val) => {
- multipleVal.value = val;
-};
-
-// 瀵煎嚭
-const handleOut = () => {
- ElMessageBox.confirm("閫変腑鐨勫唴瀹瑰皢琚鍑猴紝鏄惁纭瀵煎嚭锛�", "瀵煎嚭", {
- confirmButtonText: "纭",
- cancelButtonText: "鍙栨秷",
- type: "warning",
- })
- .then(() => {
- proxy.download("/purchase/registration/export", {}, "鏉ョエ鐧昏.xlsx");
- })
- .catch(() => {
- proxy.$modal.msg("宸插彇娑�");
- });
-};
-
-const handleFiles = (fileList) => {
- fileList.forEach((e) => {
- proxy.$download.name(e.url);
- });
-};
-
-const changePage = ({ page, limit }) => {
- pagination.currentPage = page;
- pagination.pageSize = limit;
- onCurrentChange(page);
-};
-
-const handleCommand = (command, row) => {
- switch (command) {
- case "download":
- handleFiles(row.commonFiles);
- break;
- case "upload":
- console.log(row.commonFiles);
- openUoload(row.ticketRegistrationId);
- break;
- }
-};
-
-const openUoload = (id) => {
- modalRef.value.handleImport(id);
-};
-
-const openEdit = (row) => {
- editmodalRef.value.open(row);
-};
-
-// 涓婁紶鎴愬姛鍚庡仛浠�涔�
-const uploadSuccess = async (data) => {
- const { code } = await productUploadFile({
- ticketRegistrationId: data.id,
- tempFileIds: data.tempFileIds,
- });
- if (code === 200) {
- proxy.$modal.msgSuccess("鎻愪氦鎴愬姛");
- getTableData();
- }
-};
-// 鍒犻櫎
-const handleDelete = (row) => {
- let ids = [];
- ids.push(row.id);
- ElMessageBox.confirm("璇ュ紑绁ㄥ彴璐﹀皢琚垹闄�,鏄惁纭鍒犻櫎", {
- confirmButtonText: "纭",
- cancelButtonText: "鍙栨秷",
- type: "warning",
- })
- .then(() => {
- loading.value = true;
- delRegistration(ids).then((res) => {
- getTableData();
- });
- loading.value = false;
- })
- .catch(() => {
- proxy.$modal.msg("宸插彇娑�");
- });
-};
-
-onMounted(() => {
- getTableData();
-});
-</script>
-
-<style lang="scss" scoped>
-.table_list {
- margin-top: unset;
-}
-.tagBox {
- margin-top: 4px;
-}
-</style>
diff --git a/src/views/procurementManagement/procurementInvoiceLedger/indexOld.vue b/src/views/procurementManagement/procurementInvoiceLedger/indexOld.vue
deleted file mode 100644
index af38ab1..0000000
--- a/src/views/procurementManagement/procurementInvoiceLedger/indexOld.vue
+++ /dev/null
@@ -1,313 +0,0 @@
-<template>
- <div class="app-container">
- <div class="search_form">
- <div>
- <span class="search_title">閲囪喘鍚堝悓鍙凤細</span>
- <el-input
- v-model="searchForm.purchaseContractNumber"
- style="width: 240px"
- placeholder="璇疯緭鍏�"
- @change="handleQuery"
- clearable
- :prefix-icon="Search"
- />
- <span class="search_title" style="margin-left: 10px">渚涘簲鍟嗭細</span>
- <el-input
- v-model="searchForm.supplierName"
- style="width: 240px"
- placeholder="璇疯緭鍏�"
- @change="handleQuery"
- clearable
- :prefix-icon="Search"
- />
- <span class="search_title" style="margin-left: 10px">鏉ョエ鏃ユ湡锛�</span>
- <el-date-picker
- style="width: 240px"
- v-model="searchForm.issueDate"
- value-format="YYYY-MM-DD"
- format="YYYY-MM-DD"
- type="daterange"
- start-placeholder="寮�濮嬫椂闂�"
- end-placeholder="缁撴潫鏃堕棿"
- clearable
- @change="changeDateRange"
- @clear="clearRange"
- />
- <el-button type="primary" @click="handleQuery" style="margin-left: 10px"
- >鎼滅储</el-button
- >
- </div>
- <div>
- <el-button @click="handleOut">瀵煎嚭</el-button>
- </div>
- </div>
- <div class="table_list">
- <el-table
- :data="tableData"
- border
- v-loading="tableLoading"
- :expand-row-keys="expandedRowKeys"
- :row-key="(row) => row.id"
- show-summary
- :summary-method="summarizeMainTable"
- @expand-change="expandChange"
- height="calc(100vh - 18.5em)"
- stripe
- >
- <el-table-column align="center" label="搴忓彿" type="index" width="55" />
- <el-table-column type="expand">
- <template #default="props">
- <el-table
- :data="props.row.children"
- border
- show-summary
- :summary-method="summarizeChildrenTable"
- stripe
- >
- <el-table-column
- align="center"
- label="搴忓彿"
- type="index"
- width="60"
- />
- <el-table-column label="浜у搧澶х被" prop="productCategory" />
- <el-table-column label="瑙勬牸鍨嬪彿" prop="specificationModel" />
- <el-table-column label="鍗曚綅" prop="unit" />
- <el-table-column label="鏁伴噺" prop="quantity" />
- <el-table-column label="绋庣巼(%)" prop="taxRate" />
- <el-table-column
- label="鍚◣鍗曚环(鍏�)"
- prop="taxInclusiveUnitPrice"
- :formatter="formattedNumber"
- />
- <el-table-column
- label="鍚◣鎬讳环(鍏�)"
- prop="taxInclusiveTotalPrice"
- :formatter="formattedNumber"
- />
- <el-table-column
- label="涓嶅惈绋庢�讳环(鍏�)"
- prop="taxExclusiveTotalPrice"
- :formatter="formattedNumber"
- />
- <el-table-column label="鏈鏉ョエ鏁�" prop="ticketsNum" />
- <el-table-column
- label="鏈鏉ョエ閲戦(鍏�)"
- prop="ticketsAmount"
- :formatter="formattedNumber"
- />
- <el-table-column label="鏈潵绁ㄦ暟" prop="futureTickets" />
- <el-table-column
- label="鏈潵绁ㄩ噾棰�(鍏�)"
- prop="futureTicketsAmount"
- :formatter="formattedNumber"
- />
- </el-table>
- </template>
- </el-table-column>
- <el-table-column
- label="閲囪喘鍚堝悓鍙�"
- prop="purchaseContractNumber"
- show-overflow-tooltip
- />
- <el-table-column
- label="閿�鍞悎鍚屽彿"
- prop="salesContractNo"
- show-overflow-tooltip
- />
- <el-table-column
- label="渚涘簲鍟嗗悕绉�"
- prop="supplierName"
- show-overflow-tooltip
- />
- <el-table-column
- label="鍙戠エ鍙�"
- prop="invoiceNumber"
- show-overflow-tooltip
- />
- <el-table-column
- label="鍚堝悓閲戦(鍏�)"
- prop="invoiceAmount"
- show-overflow-tooltip
- :formatter="formattedNumber"
- />
- <el-table-column label="寮�绁ㄤ汉" prop="issUer" show-overflow-tooltip />
- <el-table-column
- label="寮�绁ㄦ棩鏈�"
- prop="issueDate"
- show-overflow-tooltip
- />
- </el-table>
- <pagination
- v-show="total > 0"
- :total="total"
- layout="total, sizes, prev, pager, next, jumper"
- :page="page.current"
- :limit="page.size"
- @pagination="paginationChange"
- />
- </div>
- </div>
-</template>
-
-<script setup>
-import pagination from "@/components/PIMTable/Pagination.vue";
-import { ref } from "vue";
-import { Search } from "@element-plus/icons-vue";
-import { ElMessageBox } from "element-plus";
-import {
- invoiceListPage,
- productRecordList,
-} from "@/api/procurementManagement/procurementInvoiceLedger.js";
-import dayjs from "dayjs";
-
-const { proxy } = getCurrentInstance();
-const tableData = ref([]);
-const tableLoading = ref(false);
-const page = reactive({
- current: 1,
- size: 100,
-});
-const total = ref(0);
-// 鐢ㄦ埛淇℃伅琛ㄥ崟寮规鏁版嵁
-const data = reactive({
- searchForm: {
- purchaseContractNumber: "",
- supplierName: "",
- issueDate: [
- dayjs().startOf("month").format("YYYY-MM-DD"),
- dayjs().endOf("month").format("YYYY-MM-DD"),
- ],
- issueDateStart: dayjs().startOf("month").format("YYYY-MM-DD"),
- issueDateEnd: dayjs().endOf("month").format("YYYY-MM-DD"),
- },
- form: {
- issueDate: "", // 寮�绁ㄦ棩鏈�
- purchaseLedgerId: "",
- purchaseLedgerNo: "",
- issUerId: "", // 寮�绁ㄤ汉id
- issUer: "", // 寮�绁ㄤ汉濮撳悕
- },
- rules: {
- purchaseLedgerId: [
- { required: true, message: "璇烽�夋嫨", trigger: "change" },
- ],
- },
-});
-const { searchForm } = toRefs(data);
-
-// 鏌ヨ鍒楄〃
-/** 鎼滅储鎸夐挳鎿嶄綔 */
-const handleQuery = () => {
- page.current = 1;
- getList();
-};
-const paginationChange = (obj) => {
- page.current = obj.page;
- page.size = obj.limit;
- getList();
-};
-const getList = () => {
- tableLoading.value = true;
- const { issueDate, ...rest } = searchForm.value;
- invoiceListPage({ ...rest, ...page })
- .then((res) => {
- tableLoading.value = false;
- tableData.value = res.records;
- tableData.value.map((item) => {
- item.children = [];
- });
- total.value = res.total;
- expandedRowKeys.value = [];
- })
- .catch(() => {
- tableLoading.value = false;
- });
-};
-const formattedNumber = (row, column, cellValue) => {
- return parseFloat(cellValue).toFixed(2);
-};
-// 琛ㄦ牸閫夋嫨鏁版嵁
-const expandedRowKeys = ref([]);
-// 灞曞紑琛�
-const expandChange = (row, expandedRows) => {
- if (expandedRows.length > 0) {
- expandedRowKeys.value = [];
- try {
- productRecordList({ id: row.id }).then((res) => {
- const index = tableData.value.findIndex((item) => item.id === row.id);
- if (index > -1) {
- tableData.value[index].children = res;
- }
- expandedRowKeys.value.push(row.id);
- });
- } catch (error) {
- console.log(error);
- }
- } else {
- expandedRowKeys.value = [];
- }
-};
-// 涓昏〃鍚堣鏂规硶
-const summarizeMainTable = (param) => {
- return proxy.summarizeTable(param, ["invoiceAmount"], {
- ticketsNum: { noDecimal: true }, // 涓嶄繚鐣欏皬鏁�
- futureTickets: { noDecimal: true }, // 涓嶄繚鐣欏皬鏁�
- });
-};
-// 瀛愯〃鍚堣鏂规硶
-const summarizeChildrenTable = (param) => {
- return proxy.summarizeTable(
- param,
- [
- "taxInclusiveUnitPrice",
- "taxInclusiveTotalPrice",
- "taxExclusiveTotalPrice",
- "ticketsNum",
- "ticketsAmount",
- "futureTickets",
- "futureTicketsAmount",
- ],
- {
- ticketsNum: { noDecimal: true }, // 涓嶄繚鐣欏皬鏁�
- futureTickets: { noDecimal: true }, // 涓嶄繚鐣欏皬鏁�
- }
- );
-};
-
-// 瀵煎嚭
-const handleOut = () => {
- ElMessageBox.confirm("閫変腑鐨勫唴瀹瑰皢琚鍑猴紝鏄惁纭瀵煎嚭锛�", "瀵煎嚭", {
- confirmButtonText: "纭",
- cancelButtonText: "鍙栨秷",
- type: "warning",
- })
- .then(() => {
- proxy.download("/purchase/registration/export", {}, "鏉ョエ鐧昏.xlsx");
- })
- .catch(() => {
- proxy.$modal.msg("宸插彇娑�");
- });
-};
-
-const changeDateRange = (date) => {
- if (date) {
- searchForm.value.receiptPaymentDateStart = date[0];
- searchForm.value.receiptPaymentDateEnd = date[1];
- getList();
- }
-};
-
-const clearRange = () => {
- searchForm.value.issueDate = [];
- searchForm.value.issueDateStart = undefined;
- searchForm.value.issueDateEnd = undefined;
- getList();
-};
-
-onMounted(() => {
- getList();
-});
-</script>
-
-<style scoped lang="scss"></style>
diff --git a/src/views/procurementManagement/procurementLedger/index.vue b/src/views/procurementManagement/procurementLedger/index.vue
deleted file mode 100644
index 4fbf775..0000000
--- a/src/views/procurementManagement/procurementLedger/index.vue
+++ /dev/null
@@ -1,1580 +0,0 @@
-<template>
- <div class="app-container">
- <div class="search_form">
- <div>
- <el-form :model="searchForm" :inline="true">
- <el-form-item label="渚涘簲鍟嗗悕绉帮細">
- <el-input v-model="searchForm.supplierName" placeholder="璇疯緭鍏�" clearable prefix-icon="Search"
- @change="handleQuery" />
- </el-form-item>
- <el-form-item label="閲囪喘鍚堝悓鍙凤細">
- <el-input
- v-model="searchForm.purchaseContractNumber"
- style="width: 240px"
- placeholder="璇疯緭鍏�"
- @change="handleQuery"
- clearable
- :prefix-icon="Search"
- />
- </el-form-item>
- <el-form-item label="閿�鍞悎鍚屽彿锛�">
- <el-input v-model="searchForm.salesContractNo" placeholder="璇疯緭鍏�" clearable prefix-icon="Search"
- @change="handleQuery" />
- </el-form-item>
- <el-form-item label="椤圭洰鍚嶇О锛�">
- <el-input v-model="searchForm.projectName" placeholder="璇疯緭鍏�" clearable prefix-icon="Search"
- @change="handleQuery" />
- </el-form-item>
- <el-form-item label="褰曞叆鏃ユ湡锛�">
- <el-date-picker v-model="searchForm.entryDate" value-format="YYYY-MM-DD" format="YYYY-MM-DD" type="daterange"
- placeholder="璇烽�夋嫨" clearable @change="changeDaterange" />
- </el-form-item>
- <el-form-item>
- <el-button type="primary" @click="handleQuery"> 鎼滅储 </el-button>
- </el-form-item>
- </el-form>
- </div>
-
- </div>
- <div class="table_list">
- <div style="display: flex;justify-content: flex-end;margin-bottom: 20px;">
- <el-button type="primary" @click="openForm('add')">鏂板鍙拌处</el-button>
- <el-button type="success" @click="openScanAddDialog">鎵爜鏂板</el-button>
- <el-button @click="handleOut">瀵煎嚭</el-button>
- <el-button type="danger" plain @click="handleDelete">鍒犻櫎</el-button>
- </div>
- <el-table
- :data="tableData"
- border
- v-loading="tableLoading"
- @selection-change="handleSelectionChange"
- :expand-row-keys="expandedRowKeys"
- :row-key="(row) => row.id"
- show-summary
- :summary-method="summarizeMainTable"
- @expand-change="expandChange"
- height="calc(100vh - 18.5em)"
- stripe
- >
- <el-table-column align="center" type="selection" width="55" />
- <el-table-column type="expand">
- <template #default="props">
- <el-table
- :data="props.row.children"
- border
- show-summary
- :summary-method="summarizeChildrenTable"
- stripe
- >
- <el-table-column
- align="center"
- label="搴忓彿"
- type="index"
- width="60"
- />
- <el-table-column label="浜у搧澶х被" prop="productCategory" />
- <el-table-column label="瑙勬牸鍨嬪彿" prop="specificationModel" />
- <el-table-column label="鍗曚綅" prop="unit" />
- <el-table-column label="鏁伴噺" prop="quantity" />
- <el-table-column label="绋庣巼(%)" prop="taxRate" />
- <el-table-column
- label="鍚◣鍗曚环(鍏�)"
- prop="taxInclusiveUnitPrice"
- :formatter="formattedNumber"
- />
- <el-table-column
- label="鍚◣鎬讳环(鍏�)"
- prop="taxInclusiveTotalPrice"
- :formatter="formattedNumber"
- />
- <el-table-column
- label="涓嶅惈绋庢�讳环(鍏�)"
- prop="taxExclusiveTotalPrice"
- :formatter="formattedNumber"
- />
- </el-table>
- </template>
- </el-table-column>
- <el-table-column align="center" label="搴忓彿" type="index" width="60" />
- <el-table-column
- label="閲囪喘鍚堝悓鍙�"
- prop="purchaseContractNumber"
- width="200"
- show-overflow-tooltip
- />
- <el-table-column
- label="閿�鍞悎鍚屽彿"
- prop="salesContractNo"
- width="200"
- show-overflow-tooltip
- />
- <el-table-column
- label="渚涘簲鍟嗗悕绉�"
- width="240"
- prop="supplierName"
- show-overflow-tooltip
- />
- <el-table-column
- label="椤圭洰鍚嶇О"
- prop="projectName"
- width="420"
- show-overflow-tooltip
- />
- <el-table-column
- label="浠樻鏂瑰紡"
- width="100"
- prop="paymentMethod"
- show-overflow-tooltip
- />
- <el-table-column
- label="鍚堝悓閲戦(鍏�)"
- prop="contractAmount"
- width="200"
- show-overflow-tooltip
- :formatter="formattedNumber"
- />
- <el-table-column
- label="褰曞叆浜�"
- prop="recorderName"
- width="100"
- show-overflow-tooltip
- />
- <el-table-column
- label="褰曞叆鏃ユ湡"
- prop="entryDate"
- width="100"
- show-overflow-tooltip
- />
- <el-table-column
- fixed="right"
- label="鎿嶄綔"
- min-width="150"
- align="center"
- >
- <template #default="scope">
- <el-button
- link
- type="primary"
- size="small"
- @click="openForm('edit', scope.row)"
- :disabled="scope.row.receiptPaymentAmount>0 || scope.row.recorderName !== userStore.nickName"
- >缂栬緫</el-button
- >
- <el-button
- link
- type="success"
- size="small"
- @click="showQRCode(scope.row)"
- >鐢熸垚浜岀淮鐮�</el-button
- >
-
- </template>
- </el-table-column>
- </el-table>
- <pagination
- v-show="total > 0"
- :total="total"
- layout="total, sizes, prev, pager, next, jumper"
- :page="page.current"
- :limit="page.size"
- @pagination="paginationChange"
- />
- </div>
- <el-dialog
- v-model="dialogFormVisible"
- :title="operationType === 'add' ? '鏂板閲囪喘鍙拌处椤甸潰' : '缂栬緫閲囪喘鍙拌处椤甸潰'"
- width="70%"
- @close="closeDia"
- >
- <el-form
- :model="form"
- label-width="140px"
- label-position="top"
- :rules="rules"
- ref="formRef"
- >
- <el-row :gutter="30">
- <el-col :span="12">
- <el-form-item label="閲囪喘鍚堝悓鍙凤細" prop="purchaseContractNumber">
- <el-input
- v-model="form.purchaseContractNumber"
- placeholder="璇疯緭鍏�"
- clearable
- />
- </el-form-item>
- </el-col>
- <el-col :span="12">
- <el-form-item label="閿�鍞悎鍚屽彿锛�" prop="salesLedgerId">
- <el-select
- v-model="form.salesLedgerId"
- placeholder="璇烽�夋嫨"
- clearable
- @change="salesLedgerChange"
- >
- <el-option
- v-for="item in salesContractList"
- :key="item.id"
- :label="item.salesContractNo"
- :value="item.id"
- />
- </el-select>
- </el-form-item>
- </el-col>
- </el-row>
- <el-row :gutter="30">
- <el-col :span="12">
- <el-form-item label="渚涘簲鍟嗗悕绉帮細" prop="supplierId">
- <el-select
- v-model="form.supplierId"
- placeholder="璇烽�夋嫨"
- clearable
- >
- <el-option
- v-for="item in supplierList"
- :key="item.id"
- :label="item.supplierName"
- :value="item.id"
- />
- </el-select>
- </el-form-item>
- </el-col>
- <el-col :span="12">
- <el-form-item label="椤圭洰鍚嶇О锛�" prop="projectName">
- <el-input
- v-model="form.projectName"
- placeholder="璇疯緭鍏�"
- clearable
- />
- </el-form-item>
- </el-col>
- </el-row>
- <el-row :gutter="30">
- <el-col :span="12">
- <el-form-item label="褰曞叆浜猴細" prop="recorderId">
- <el-select
- v-model="form.recorderId"
- placeholder="璇烽�夋嫨"
- clearable
- disabled
- >
- <el-option
- v-for="item in userList"
- :key="item.userId"
- :label="item.nickName"
- :value="item.userId"
- />
- </el-select>
- </el-form-item>
- </el-col>
- <el-col :span="12">
- <el-form-item label="褰曞叆鏃ユ湡锛�" prop="entryDate">
- <el-date-picker
- disabled
- style="width: 100%"
- v-model="form.entryDate"
- value-format="YYYY-MM-DD"
- format="YYYY-MM-DD"
- type="date"
- placeholder="璇烽�夋嫨"
- clearable
- />
- </el-form-item>
- </el-col>
- </el-row>
- <el-row :gutter="30">
- <el-col :span="12">
- <el-form-item label="浠樻鏂瑰紡">
- <el-input
- v-model="form.paymentMethod"
- placeholder="璇疯緭鍏�"
- clearable
- />
- </el-form-item>
- </el-col>
- </el-row>
- <el-row>
- <el-form-item label="浜у搧淇℃伅锛�" prop="entryDate">
- <el-button type="primary" @click="openProductForm('add')"
- >娣诲姞</el-button
- >
- <el-button plain type="danger" @click="deleteProduct"
- >鍒犻櫎</el-button
- >
- </el-form-item>
- </el-row>
- <el-table
- :data="productData"
- border
- @selection-change="productSelected"
- show-summary
- stripe
- :summary-method="summarizeProTable"
- >
- <el-table-column align="center" type="selection" width="55" />
- <el-table-column
- align="center"
- label="搴忓彿"
- type="index"
- width="60"
- />
- <el-table-column label="浜у搧澶х被" prop="productCategory" />
- <el-table-column label="瑙勬牸鍨嬪彿" prop="specificationModel" />
- <el-table-column label="鍗曚綅" prop="unit" width="70" />
- <el-table-column label="鏁伴噺" prop="quantity" width="70" />
- <el-table-column label="绋庣巼(%)" prop="taxRate" width="80" />
- <el-table-column
- label="鍚◣鍗曚环(鍏�)"
- prop="taxInclusiveUnitPrice"
- :formatter="formattedNumber"
- width="150"
- />
- <el-table-column
- label="鍚◣鎬讳环(鍏�)"
- prop="taxInclusiveTotalPrice"
- :formatter="formattedNumber"
- width="150"
- />
- <el-table-column
- label="涓嶅惈绋庢�讳环(鍏�)"
- prop="taxExclusiveTotalPrice"
- :formatter="formattedNumber"
- width="150"
- />
- <el-table-column
- fixed="right"
- label="鎿嶄綔"
- min-width="60"
- align="center"
- >
- <template #default="scope">
- <el-button
- link
- type="primary"
- size="small"
- @click="openProductForm('edit', scope.row, scope.$index)"
- >缂栬緫</el-button
- >
- </template>
- </el-table-column>
- </el-table>
- <el-row :gutter="30">
- <el-col :span="24">
- <el-form-item label="澶囨敞路锛�" prop="remark">
- <el-input
- v-model="form.remark"
- placeholder="璇疯緭鍏�"
- clearable
- type="textarea"
- :rows="2"
- />
- </el-form-item>
- </el-col>
- </el-row>
- <el-row :gutter="30">
- <el-col :span="24">
- <el-form-item label="闄勪欢鏉愭枡锛�" prop="remark">
- <el-upload
- v-model:file-list="fileList"
- :action="upload.url"
- multiple
- ref="fileUpload"
- auto-upload
- :headers="upload.headers"
- :before-upload="handleBeforeUpload"
- :on-error="handleUploadError"
- :on-success="handleUploadSuccess"
- :on-remove="handleRemove"
- >
- <el-button type="primary">涓婁紶</el-button>
- <template #tip>
- <div class="el-upload__tip">
- 鏂囦欢鏍煎紡鏀寔
- doc锛宒ocx锛寈ls锛寈lsx锛宲pt锛宲ptx锛宲df锛宼xt锛寈ml锛宩pg锛宩peg锛宲ng锛実if锛宐mp锛宺ar锛寊ip锛�7z
- </div>
- </template>
- </el-upload>
- </el-form-item>
- </el-col>
- </el-row>
- </el-form>
- <template #footer>
- <div class="dialog-footer">
- <el-button type="primary" @click="submitForm">纭</el-button>
- <el-button @click="closeDia">鍙栨秷</el-button>
- </div>
- </template>
- </el-dialog>
- <el-dialog
- v-model="productFormVisible"
- :title="productOperationType === 'add' ? '鏂板浜у搧' : '缂栬緫浜у搧'"
- width="40%"
- @close="closeProductDia"
- >
- <el-form
- :model="productForm"
- label-width="140px"
- label-position="top"
- :rules="productRules"
- ref="productFormRef"
- >
- <el-row :gutter="30">
- <el-col :span="24">
- <el-form-item label="浜у搧澶х被锛�" prop="productId">
- <el-tree-select
- v-model="productForm.productId"
- placeholder="璇烽�夋嫨"
- clearable
- check-strictly
- @change="getModels"
- :data="productOptions"
- :render-after-expand="false"
- style="width: 100%"
- />
- </el-form-item>
- </el-col>
- </el-row>
- <el-row :gutter="30">
- <el-col :span="24">
- <el-form-item label="瑙勬牸鍨嬪彿锛�" prop="productModelId">
- <el-select
- v-model="productForm.productModelId"
- placeholder="璇烽�夋嫨"
- clearable
- @change="getProductModel"
- >
- <el-option
- v-for="item in modelOptions"
- :key="item.id"
- :label="item.model"
- :value="item.id"
- />
- </el-select>
- </el-form-item>
- </el-col>
- </el-row>
- <el-row :gutter="30">
- <el-col :span="12">
- <el-form-item label="鍗曚綅锛�" prop="unit">
- <el-input
- v-model="productForm.unit"
- placeholder="璇疯緭鍏�"
- clearable
- />
- </el-form-item>
- </el-col>
- <el-col :span="12">
- <el-form-item label="绋庣巼(%)锛�" prop="taxRate">
- <el-select
- v-model="productForm.taxRate"
- placeholder="璇烽�夋嫨"
- clearable
- @change="mathNum"
- >
- <el-option label="1" value="1" />
- <el-option label="6" value="6" />
- <el-option label="13" value="13" />
- </el-select>
- </el-form-item>
- </el-col>
- </el-row>
- <el-row :gutter="30">
- <el-col :span="12">
- <el-form-item label="鍚◣鍗曚环(鍏�)锛�" prop="taxInclusiveUnitPrice">
- <el-input-number
- v-model="productForm.taxInclusiveUnitPrice"
- :precision="2"
- :step="0.1"
- clearable
- style="width: 100%"
- @change="mathNum"
- />
- </el-form-item>
- </el-col>
- <el-col :span="12">
- <el-form-item label="鏁伴噺锛�" prop="quantity">
- <el-input-number
- :step="0.1"
- clearable
- :precision="2"
- style="width: 100%"
- v-model="productForm.quantity"
- placeholder="璇疯緭鍏�"
- @change="mathNum"
- />
- </el-form-item>
- </el-col>
- </el-row>
- <el-row :gutter="30">
- <el-col :span="12">
- <el-form-item label="鍚◣鎬讳环(鍏�)锛�" prop="taxInclusiveTotalPrice">
- <el-input-number
- v-model="productForm.taxInclusiveTotalPrice"
- :precision="2"
- :step="0.1"
- clearable
- style="width: 100%"
- @change="reverseMathNum('taxInclusiveTotalPrice')"
- />
- </el-form-item>
- </el-col>
- <el-col :span="12">
- <el-form-item
- label="涓嶅惈绋庢�讳环(鍏�)锛�"
- prop="taxExclusiveTotalPrice"
- >
- <el-input
- v-model="productForm.taxExclusiveTotalPrice"
- @change="reverseMathNum('taxExclusiveTotalPrice')"
- />
- </el-form-item>
- </el-col>
- </el-row>
- <el-row :gutter="30">
- <el-col :span="12">
- <el-form-item label="鍙戠エ绫诲瀷锛�" prop="invoiceType">
- <el-select
- v-model="productForm.invoiceType"
- placeholder="璇烽�夋嫨"
- clearable
- >
- <el-option label="澧炴櫘绁�" value="澧炴櫘绁�" />
- <el-option label="澧炰笓绁�" value="澧炰笓绁�" />
- </el-select>
- </el-form-item>
- </el-col>
- </el-row>
- </el-form>
- <template #footer>
- <div class="dialog-footer">
- <el-button type="primary" @click="submitProduct">纭</el-button>
- <el-button @click="closeProductDia">鍙栨秷</el-button>
- </div>
- </template>
- </el-dialog>
-
- <!-- 浜岀淮鐮佹樉绀哄璇濇 -->
- <el-dialog
- v-model="qrCodeDialogVisible"
- title="閲囪喘鍚堝悓鍙蜂簩缁寸爜"
- width="400px"
- center
- >
- <div style="text-align: center;">
- <img :src="qrCodeUrl" alt="浜岀淮鐮�" style="width:200px;height:200px;" />
- <div style="margin: 20px;">
- <el-button type="primary" @click="downloadQRCode">涓嬭浇浜岀淮鐮佸浘鐗�</el-button>
- </div>
- </div>
- </el-dialog>
-
- <!-- 鎵爜鏂板瀵硅瘽妗� -->
- <el-dialog
- v-model="scanAddDialogVisible"
- title="鎵爜鏂板閲囪喘鍙拌处"
- width="70%"
- @close="closeScanAddDialog"
- >
- <el-form
- :model="scanAddForm"
- label-width="140px"
- label-position="top"
- :rules="scanAddRules"
- ref="scanAddFormRef"
- >
- <el-row :gutter="20">
- <el-col :span="24">
- <el-form-item label="鎵爜鍐呭锛�">
- <el-input
- v-model="scanAddForm.scanContent"
- type="textarea"
- :rows="3"
- placeholder="璇锋壂鎻忎簩缁寸爜鎴栨墜鍔ㄨ緭鍏ラ噰璐悎鍚屼俊鎭�"
- @input="parseScanContent"
- />
- </el-form-item>
- </el-col>
- </el-row>
- <el-row :gutter="20">
- <el-col :span="12">
- <el-form-item label="閲囪喘鍚堝悓鍙凤細" prop="purchaseContractNumber">
- <el-input
- v-model="scanAddForm.purchaseContractNumber"
- placeholder="璇疯緭鍏�"
- clearable
- />
- </el-form-item>
- </el-col>
- <el-col :span="12">
- <el-form-item label="渚涘簲鍟嗗悕绉帮細" prop="supplierName">
- <el-input
- v-model="scanAddForm.supplierName"
- placeholder="璇疯緭鍏�"
- clearable
- />
- </el-form-item>
- </el-col>
- </el-row>
- <el-row :gutter="20">
- <el-col :span="12">
- <el-form-item label="椤圭洰鍚嶇О锛�" prop="projectName">
- <el-input
- v-model="scanAddForm.projectName"
- placeholder="璇疯緭鍏�"
- clearable
- />
- </el-form-item>
- </el-col>
- <el-col :span="12">
- <el-form-item label="鍚堝悓閲戦(鍏�)锛�" prop="contractAmount">
- <el-input-number
- v-model="scanAddForm.contractAmount"
- :precision="2"
- :step="0.1"
- clearable
- style="width: 100%"
- placeholder="璇疯緭鍏�"
- />
- </el-form-item>
- </el-col>
- </el-row>
- <el-row :gutter="20">
- <el-col :span="12">
- <el-form-item label="浠樻鏂瑰紡锛�">
- <el-input
- v-model="scanAddForm.paymentMethod"
- placeholder="璇疯緭鍏�"
- clearable
- />
- </el-form-item>
- </el-col>
- <el-col :span="12">
- <el-form-item label="褰曞叆浜猴細">
- <el-input v-model="scanAddForm.recorderName" disabled />
- </el-form-item>
- </el-col>
- </el-row>
- <el-row :gutter="20">
- <el-col :span="24">
- <el-form-item label="澶囨敞锛�">
- <el-input
- v-model="scanAddForm.remark"
- type="textarea"
- :rows="2"
- placeholder="璇疯緭鍏ュ娉ㄤ俊鎭�"
- clearable
- />
- </el-form-item>
- </el-col>
- </el-row>
- </el-form>
- <template #footer>
- <div class="dialog-footer">
- <el-button type="primary" @click="submitScanAdd">纭鏂板</el-button>
- <el-button @click="closeScanAddDialog">鍙栨秷</el-button>
- </div>
- </template>
- </el-dialog>
-
- <!-- 鎵爜鐧昏瀵硅瘽妗� -->
- <el-dialog
- v-model="scanDialogVisible"
- title="鎵爜鐧昏"
- width="60%"
- @close="closeScanDialog"
- >
- <el-form
- :model="scanForm"
- label-width="120px"
- label-position="left"
- :rules="scanRules"
- ref="scanFormRef"
- >
- <el-row :gutter="20">
- <el-col :span="12">
- <el-form-item label="閲囪喘鍚堝悓鍙凤細">
- <el-input v-model="scanForm.purchaseContractNumber" disabled />
- </el-form-item>
- </el-col>
- <el-col :span="12">
- <el-form-item label="渚涘簲鍟嗗悕绉帮細">
- <el-input v-model="scanForm.supplierName" disabled />
- </el-form-item>
- </el-col>
- </el-row>
- <el-row :gutter="20">
- <el-col :span="12">
- <el-form-item label="椤圭洰鍚嶇О锛�">
- <el-input v-model="scanForm.projectName" disabled />
- </el-form-item>
- </el-col>
- <el-col :span="12">
- <el-form-item label="鎵爜鏃堕棿锛�">
- <el-input v-model="scanForm.scanTime" disabled />
- </el-form-item>
- </el-col>
- </el-row>
- <el-row :gutter="20">
- <el-col :span="12">
- <el-form-item label="鎵爜浜猴細">
- <el-input v-model="scanForm.scannerName" disabled />
- </el-form-item>
- </el-col>
- <el-col :span="12">
- <el-form-item label="鎵爜鐘舵�侊細">
- <el-tag :type="scanForm.scanStatus === '宸叉壂鐮�' ? 'success' : 'warning'">
- {{ scanForm.scanStatus }}
- </el-tag>
- </el-form-item>
- </el-col>
- </el-row>
- <el-row :gutter="20">
- <el-col :span="24">
- <el-form-item label="鎵爜澶囨敞锛�">
- <el-input
- v-model="scanForm.scanRemark"
- type="textarea"
- :rows="3"
- placeholder="璇疯緭鍏ユ壂鐮佸娉ㄤ俊鎭�"
- />
- </el-form-item>
- </el-col>
- </el-row>
- <el-row :gutter="20">
- <el-col :span="24">
- <el-form-item label="鎵爜璁板綍锛�">
- <el-table :data="scanRecords" border style="width: 100%" stripe>
- <el-table-column label="搴忓彿" type="index" width="60" align="center" />
- <el-table-column label="鎵爜鏃堕棿" prop="scanTime" width="180" />
- <el-table-column label="鎵爜浜�" prop="scannerName" width="120" />
- <el-table-column label="鎵爜鐘舵��" prop="scanStatus" width="100">
- <template #default="scope">
- <el-tag :type="scope.row.scanStatus === '宸叉壂鐮�' ? 'success' : 'warning'">
- {{ scope.row.scanStatus }}
- </el-tag>
- </template>
- </el-table-column>
- <el-table-column label="澶囨敞" prop="scanRemark" />
- </el-table>
- </el-form-item>
- </el-col>
- </el-row>
- </el-form>
- <template #footer>
- <div class="dialog-footer">
- <el-button type="primary" @click="submitScan">纭鎵爜</el-button>
- <el-button @click="closeScanDialog">鍙栨秷</el-button>
- </div>
- </template>
- </el-dialog>
- </div>
-</template>
-
-<script setup>
-import { getToken } from "@/utils/auth";
-import pagination from "@/components/PIMTable/Pagination.vue";
-import { ref, onMounted, reactive, toRefs, getCurrentInstance, nextTick } from "vue";
-import { Search } from "@element-plus/icons-vue";
-import { ElMessageBox } from "element-plus";
-import { userListNoPage } from "@/api/system/user.js";
-import {
- getSalesLedgerWithProducts,
- addOrUpdateSalesLedgerProduct,
- delProduct,
- delLedgerFile,
- getProductInfoByContractNo,
-} from "@/api/salesManagement/salesLedger.js";
-import {
- addOrEditPurchase,
- delPurchase,
- getSalesNo,
- purchaseListPage,
- productList,
- getPurchaseById,
- getOptions,
- createPurchaseNo,
-} from "@/api/procurementManagement/procurementLedger.js";
-import useFormData from "@/hooks/useFormData.js";
-import QRCode from "qrcode";
-const { proxy } = getCurrentInstance();
-const tableData = ref([]);
-const productData = ref([]);
-const selectedRows = ref([]);
-const productSelectedRows = ref([]);
-const modelOptions = ref([]);
-const userList = ref([]);
-const productOptions = ref([]);
-const salesContractList = ref([]);
-const supplierList = ref([]);
-const tableLoading = ref(false);
-const page = reactive({
- current: 1,
- size: 100,
-});
-const total = ref(0);
-const fileList = ref([]);
-import useUserStore from "@/store/modules/user";
-import { modelList, productTreeList } from "@/api/basicData/product.js";
-import dayjs from "dayjs";
-
-const userStore = useUserStore();
-
-// 浜岀淮鐮佺浉鍏冲彉閲�
-const qrCodeDialogVisible = ref(false);
-const qrCodeUrl = ref("");
-
-// 鐢ㄦ埛淇℃伅琛ㄥ崟寮规鏁版嵁
-const operationType = ref("");
-const dialogFormVisible = ref(false);
-const data = reactive({
- searchForm: {
- supplierName: "", // 渚涘簲鍟嗗悕绉�
- purchaseContractNumber: "", // 閲囪喘鍚堝悓缂栧彿
- salesContractNo: "", // 閿�鍞悎鍚岀紪鍙�
- projectName: "", // 椤圭洰鍚嶇О
- entryDate: [
- dayjs().format("YYYY-MM-DD"),
- dayjs().add(1, "day").format("YYYY-MM-DD"),
- ], // 褰曞叆鏃ユ湡
- entryDateStart: dayjs().format("YYYY-MM-DD"),
- entryDateEnd: dayjs().add(1, "day").format("YYYY-MM-DD"),
- },
- form: {
- purchaseContractNumber: "",
- salesLedgerId: "",
- projectName: "",
- recorderId: "",
- entryDate: "",
- productData: [],
- supplierName: "",
- supplierId: "",
- paymentMethod: "",
- },
- rules: {
- purchaseContractNumber: [
- { required: true, message: "璇疯緭鍏�", trigger: "blur" },
- ],
- projectName: [{ required: true, message: "璇疯緭鍏�", trigger: "blur" }],
- supplierId: [{ required: true, message: "璇疯緭鍏�", trigger: "blur" }],
- },
-});
-const { form, rules } = toRefs(data);
-const { form: searchForm } = useFormData(data.searchForm);
-
-// 浜у搧琛ㄥ崟寮规鏁版嵁
-const productFormVisible = ref(false);
-const productOperationType = ref("");
-const productOperationIndex = ref("");
-const currentId = ref("");
-const productFormData = reactive({
- productForm: {
- productId: "",
- productCategory: "",
- productModelId: "",
- specificationModel: "",
- unit: "",
- quantity: "",
- taxInclusiveUnitPrice: "",
- taxRate: "",
- taxInclusiveTotalPrice: "",
- taxExclusiveTotalPrice: "",
- invoiceType: "",
- },
- productRules: {
- productId: [{ required: true, message: "璇烽�夋嫨", trigger: "change" }],
- productModelId: [{ required: true, message: "璇烽�夋嫨", trigger: "change" }],
- unit: [{ required: true, message: "璇疯緭鍏�", trigger: "blur" }],
- quantity: [{ required: true, message: "璇疯緭鍏�", trigger: "blur" }],
- taxInclusiveUnitPrice: [
- { required: true, message: "璇疯緭鍏�", trigger: "blur" },
- ],
- taxRate: [{ required: true, message: "璇烽�夋嫨", trigger: "change" }],
- taxInclusiveTotalPrice: [
- { required: true, message: "璇疯緭鍏�", trigger: "blur" },
- ],
- taxExclusiveTotalPrice: [
- { required: true, message: "璇疯緭鍏�", trigger: "blur" },
- ],
- invoiceType: [{ required: true, message: "璇烽�夋嫨", trigger: "change" }],
- },
-});
-const { productForm, productRules } = toRefs(productFormData);
-const upload = reactive({
- // 涓婁紶鐨勫湴鍧�
- url: import.meta.env.VITE_APP_BASE_API + "/file/upload",
- // 璁剧疆涓婁紶鐨勮姹傚ご閮�
- headers: { Authorization: "Bearer " + getToken() },
-});
-
-const changeDaterange = (value) => {
- if (value) {
- searchForm.entryDateStart = dayjs(value[0]).format("YYYY-MM-DD");
- searchForm.entryDateEnd = dayjs(value[1]).format("YYYY-MM-DD");
- } else {
- searchForm.entryDateStart = undefined;
- searchForm.entryDateEnd = undefined;
- }
- handleQuery();
-};
-
-const formattedNumber = (row, column, cellValue) => {
- return parseFloat(cellValue).toFixed(2);
-};
-// 鏌ヨ鍒楄〃
-/** 鎼滅储鎸夐挳鎿嶄綔 */
-const handleQuery = () => {
- page.current = 1;
- getList();
-};
-// 瀛愯〃鍚堣鏂规硶
-const summarizeChildrenTable = (param) => {
- return proxy.summarizeTable(
- param,
- [
- "taxInclusiveUnitPrice",
- "taxInclusiveTotalPrice",
- "taxExclusiveTotalPrice",
- "ticketsNum",
- "ticketsAmount",
- "futureTickets",
- "futureTicketsAmount",
- ],
- {
- ticketsNum: { noDecimal: true }, // 涓嶄繚鐣欏皬鏁�
- futureTickets: { noDecimal: true }, // 涓嶄繚鐣欏皬鏁�
- }
- );
-};
-const paginationChange = (obj) => {
- page.current = obj.page;
- page.size = obj.limit;
- getList();
-};
-const getList = () => {
- tableLoading.value = true;
- const { entryDate, ...rest } = searchForm;
- purchaseListPage({ ...rest, ...page })
- .then((res) => {
- tableLoading.value = false;
- tableData.value = res.data.records;
- tableData.value.map((item) => {
- item.children = [];
- });
- total.value = res.data.total;
- expandedRowKeys.value = [];
- })
- .catch(() => {
- tableLoading.value = false;
- });
-};
-// 琛ㄦ牸閫夋嫨鏁版嵁
-const handleSelectionChange = (selection) => {
- selectedRows.value = selection;
-};
-const productSelected = (selectedRows) => {
- productSelectedRows.value = selectedRows;
-};
-const expandedRowKeys = ref([]);
-// 灞曞紑琛�
-const expandChange = (row, expandedRows) => {
- if (expandedRows.length > 0) {
- expandedRowKeys.value = [];
- try {
- productList({ salesLedgerId: row.id, type: 2 }).then((res) => {
- const index = tableData.value.findIndex((item) => item.id === row.id);
- if (index > -1) {
- tableData.value[index].children = res.data;
- }
- expandedRowKeys.value.push(row.id);
- });
- } catch (error) {
- console.log(error);
- }
- } else {
- expandedRowKeys.value = [];
- }
-};
-// 涓昏〃鍚堣鏂规硶
-const summarizeMainTable = (param) => {
- return proxy.summarizeTable(param, ["contractAmount"]);
-};
-// 瀛愯〃鍚堣鏂规硶
-const summarizeProTable = (param) => {
- return proxy.summarizeTable(param, [
- "taxInclusiveUnitPrice",
- "taxInclusiveTotalPrice",
- "taxExclusiveTotalPrice",
- ]);
-};
-// 鎵撳紑寮规
-const openForm = (type, row) => {
- operationType.value = type;
- form.value = {};
- productData.value = [];
- fileList.value = [];
- if (operationType.value == "add") {
- createPurchaseNo().then((res) => {
- form.value.purchaseContractNumber = res.data;
- });
- }
- userListNoPage().then((res) => {
- userList.value = res.data;
- });
- getSalesNo().then((res) => {
- salesContractList.value = res;
- });
- getOptions().then((res) => {
- supplierList.value = res.data;
- });
- form.value.recorderId = userStore.id;
- form.value.entryDate = getCurrentDate();
- if (type === "edit") {
- currentId.value = row.id;
- getPurchaseById({ id: row.id, type: 2 }).then((res) => {
- form.value = { ...res };
- productData.value = form.value.productData;
- if (form.value.salesLedgerFiles) {
- fileList.value = form.value.salesLedgerFiles;
- } else {
- fileList.value = [];
- }
- });
- }
- dialogFormVisible.value = true;
-};
-// 涓婁紶鍓嶆牎妫�
-function handleBeforeUpload(file) {
- // 鏍℃鏂囦欢澶у皬
- if (file.size > 1024 * 1024 * 50) {
- proxy.$modal.msgError("涓婁紶鏂囦欢澶у皬涓嶈兘瓒呰繃50MB!");
- return false;
- }
- proxy.$modal.loading("姝e湪涓婁紶鏂囦欢锛岃绋嶅��...");
- return true;
-}
-// 涓婁紶澶辫触
-function handleUploadError(err) {
- proxy.$modal.msgError("涓婁紶鏂囦欢澶辫触");
- proxy.$modal.closeLoading();
-}
-// 涓婁紶鎴愬姛鍥炶皟
-function handleUploadSuccess(res, file, uploadFiles) {
- proxy.$modal.closeLoading();
- if (res.code === 200) {
- file.tempId = res.data.tempId;
- proxy.$modal.msgSuccess("涓婁紶鎴愬姛");
- } else {
- proxy.$modal.msgError(res.msg);
- proxy.$refs.fileUpload.handleRemove(file);
- }
-}
-// 绉婚櫎鏂囦欢
-function handleRemove(file) {
- console.log("handleRemove", file.id);
- if (file.size > 1024 * 1024 * 10) {
- // 浠呭墠绔竻鐞嗭紝涓嶈皟鐢ㄥ垹闄ゆ帴鍙e拰鎻愮ず
- return;
- }
- if (operationType.value === "edit") {
- let ids = [];
- ids.push(file.id);
- delLedgerFile(ids).then((res) => {
- proxy.$modal.msgSuccess("鍒犻櫎鎴愬姛");
- });
- }
-}
-// 鎻愪氦琛ㄥ崟
-const submitForm = () => {
- proxy.$refs["formRef"].validate((valid) => {
- if (valid) {
- if (productData.value.length > 0) {
- form.value.productData = proxy.HaveJson(productData.value);
- } else {
- proxy.$modal.msgWarning("璇锋坊鍔犱骇鍝佷俊鎭�");
- return;
- }
- let tempFileIds = [];
- if (fileList.value.length > 0) {
- tempFileIds = fileList.value.map((item) => item.tempId);
- }
- form.value.tempFileIds = tempFileIds;
- form.value.type = 2;
- addOrEditPurchase(form.value).then((res) => {
- proxy.$modal.msgSuccess("鎻愪氦鎴愬姛");
- closeDia();
- getList();
- });
- }
- });
-};
-// 鍏抽棴寮规
-const closeDia = () => {
- proxy.resetForm("formRef");
- dialogFormVisible.value = false;
-};
-// 鎵撳紑浜у搧寮规
-const openProductForm = (type, row, index) => {
- productOperationType.value = type;
- productOperationIndex.value = index;
- productForm.value = {};
- proxy.resetForm("productFormRef");
- if (type === "edit") {
- productForm.value = { ...row };
- }
- productFormVisible.value = true;
- getProductOptions();
-};
-const getProductOptions = () => {
- productTreeList().then((res) => {
- productOptions.value = convertIdToValue(res);
- });
-};
-const getModels = (value) => {
- productForm.value.productCategory = findNodeById(productOptions.value, value);
- modelList({ id: value }).then((res) => {
- modelOptions.value = res;
- });
-};
-const getProductModel = (value) => {
- const index = modelOptions.value.findIndex((item) => item.id === value);
- if (index !== -1) {
- productForm.value.specificationModel = modelOptions.value[index].model;
- productForm.value.unit = modelOptions.value[index].unit;
- } else {
- productForm.value.specificationModel = null;
- productForm.value.unit = null;
- }
-};
-const findNodeById = (nodes, productId) => {
- for (let i = 0; i < nodes.length; i++) {
- if (nodes[i].value === productId) {
- return nodes[i].label; // 鎵惧埌鑺傜偣锛岃繑鍥炶鑺傜偣
- }
- if (nodes[i].children && nodes[i].children.length > 0) {
- const foundNode = findNodeById(nodes[i].children, productId);
- if (foundNode) {
- return foundNode.label; // 鍦ㄥ瓙鑺傜偣涓壘鍒帮紝杩斿洖璇ヨ妭鐐�
- }
- }
- }
- return null; // 娌℃湁鎵惧埌鑺傜偣锛岃繑鍥瀗ull
-};
-function convertIdToValue(data) {
- return data.map((item) => {
- const { id, children, ...rest } = item;
- const newItem = {
- ...rest,
- value: id, // 灏� id 鏀逛负 value
- };
- if (children && children.length > 0) {
- newItem.children = convertIdToValue(children);
- }
-
- return newItem;
- });
-}
-// 鎻愪氦浜у搧琛ㄥ崟
-const submitProduct = () => {
- proxy.$refs["productFormRef"].validate((valid) => {
- if (valid) {
- if (operationType.value === "edit") {
- submitProductEdit();
- } else {
- if (productOperationType.value === "add") {
- productData.value.push({ ...productForm.value });
- console.log("productData.value---", productData.value);
- } else {
- productData.value[productOperationIndex.value] = {
- ...productForm.value,
- };
- }
- closeProductDia();
- }
- }
- });
-};
-const submitProductEdit = () => {
- productForm.value.salesLedgerId = currentId.value;
- productForm.value.type = 2;
- addOrUpdateSalesLedgerProduct(productForm.value).then((res) => {
- proxy.$modal.msgSuccess("鎻愪氦鎴愬姛");
- closeProductDia();
- getPurchaseById({ id: currentId.value, type: 2 }).then((res) => {
- productData.value = res.productData;
- });
- });
-};
-// 鍒犻櫎浜у搧
-const deleteProduct = () => {
- if (productSelectedRows.value.length === 0) {
- proxy.$modal.msgWarning("璇烽�夋嫨鏁版嵁");
- return;
- }
- if (operationType.value === "add") {
- productSelectedRows.value.forEach((selectedRow) => {
- const index = productData.value.findIndex(
- (product) => product.id === selectedRow.id
- );
- if (index !== -1) {
- productData.value.splice(index, 1);
- }
- });
- } else {
- let ids = [];
- if (productSelectedRows.value.length > 0) {
- ids = productSelectedRows.value.map((item) => item.id);
- }
- ElMessageBox.confirm("閫変腑鐨勫唴瀹瑰皢琚垹闄わ紝鏄惁纭鍒犻櫎锛�", "瀵煎嚭", {
- confirmButtonText: "纭",
- cancelButtonText: "鍙栨秷",
- type: "warning",
- })
- .then(() => {
- delProduct(ids).then((res) => {
- proxy.$modal.msgSuccess("鍒犻櫎鎴愬姛");
- closeProductDia();
- getSalesLedgerWithProducts({ id: currentId.value, type: 2 }).then(
- (res) => {
- productData.value = res.productData;
- }
- );
- });
- })
- .catch(() => {
- proxy.$modal.msg("宸插彇娑�");
- });
- }
-};
-// 鍏抽棴浜у搧寮规
-const closeProductDia = () => {
- proxy.resetForm("productFormRef");
- productFormVisible.value = false;
-};
-// 瀵煎嚭
-const handleOut = () => {
- ElMessageBox.confirm("閫変腑鐨勫唴瀹瑰皢琚鍑猴紝鏄惁纭瀵煎嚭锛�", "瀵煎嚭", {
- confirmButtonText: "纭",
- cancelButtonText: "鍙栨秷",
- type: "warning",
- })
- .then(() => {
- proxy.download("/purchase/ledger/export", {}, "閲囪喘鍙拌处.xlsx");
- })
- .catch(() => {
- proxy.$modal.msg("宸插彇娑�");
- });
-};
-// 鍒犻櫎
-const handleDelete = () => {
- let ids = [];
- if (selectedRows.value.length > 0) {
- // 妫�鏌ユ槸鍚︽湁浠栦汉缁存姢鐨勬暟鎹�
- const unauthorizedData = selectedRows.value.filter(item => item.recorderName !== userStore.nickName);
- if (unauthorizedData.length > 0) {
- proxy.$modal.msgWarning("涓嶅彲鍒犻櫎浠栦汉缁存姢鐨勬暟鎹�");
- return;
- }
- ids = selectedRows.value.map((item) => item.id);
- } else {
- proxy.$modal.msgWarning("璇烽�夋嫨鏁版嵁");
- return;
- }
- ElMessageBox.confirm("閫変腑鐨勫唴瀹瑰皢琚垹闄わ紝鏄惁纭鍒犻櫎锛�", "瀵煎嚭", {
- confirmButtonText: "纭",
- cancelButtonText: "鍙栨秷",
- type: "warning",
- })
- .then(() => {
- delPurchase(ids).then((res) => {
- proxy.$modal.msgSuccess("鍒犻櫎鎴愬姛");
- getList();
- });
- })
- .catch(() => {
- proxy.$modal.msg("宸插彇娑�");
- });
-};
-// 鑾峰彇褰撳墠鏃ユ湡骞舵牸寮忓寲涓� YYYY-MM-DD
-function getCurrentDate() {
- const today = new Date();
- const year = today.getFullYear();
- const month = String(today.getMonth() + 1).padStart(2, "0"); // 鏈堜唤浠�0寮�濮�
- const day = String(today.getDate()).padStart(2, "0");
- return `${year}-${month}-${day}`;
-}
-const mathNum = () => {
- if (!productForm.value.taxRate) {
- proxy.$modal.msgWarning("璇峰厛閫夋嫨绋庣巼");
- return;
- }
- if (!productForm.value.taxInclusiveUnitPrice) {
- return;
- }
- if (!productForm.value.quantity) {
- return;
- }
- // 鍚◣鎬讳环璁$畻
- productForm.value.taxInclusiveTotalPrice =
- proxy.calculateTaxIncludeTotalPrice(
- productForm.value.taxInclusiveUnitPrice,
- productForm.value.quantity
- );
- if (productForm.value.taxRate) {
- // 涓嶅惈绋庢�讳环璁$畻
- productForm.value.taxExclusiveTotalPrice =
- proxy.calculateTaxExclusiveTotalPrice(
- productForm.value.taxInclusiveTotalPrice,
- productForm.value.taxRate
- );
- }
-};
-const reverseMathNum = (field) => {
- if (!productForm.value.taxRate) {
- proxy.$modal.msgWarning("璇峰厛閫夋嫨绋庣巼");
- return;
- }
- const taxRate = Number(productForm.value.taxRate);
- if (!taxRate) return;
- if (field === 'taxInclusiveTotalPrice') {
- // 宸茬煡鍚◣鎬讳环鍜屾暟閲忥紝鍙嶇畻鍚◣鍗曚环
- if (productForm.value.quantity) {
- productForm.value.taxInclusiveUnitPrice =
- (Number(productForm.value.taxInclusiveTotalPrice) / Number(productForm.value.quantity)).toFixed(2);
- }
- // 宸茬煡鍚◣鎬讳环鍜屽惈绋庡崟浠凤紝鍙嶇畻鏁伴噺
- else if (productForm.value.taxInclusiveUnitPrice) {
- productForm.value.quantity =
- (Number(productForm.value.taxInclusiveTotalPrice) / Number(productForm.value.taxInclusiveUnitPrice)).toFixed(2);
- }
- // 鍙嶇畻涓嶅惈绋庢�讳环
- productForm.value.taxExclusiveTotalPrice =
- (Number(productForm.value.taxInclusiveTotalPrice) / (1 + taxRate / 100)).toFixed(2);
- } else if (field === 'taxExclusiveTotalPrice') {
- // 鍙嶇畻鍚◣鎬讳环
- productForm.value.taxInclusiveTotalPrice =
- (Number(productForm.value.taxExclusiveTotalPrice) * (1 + taxRate / 100)).toFixed(2);
- // 宸茬煡鏁伴噺锛屽弽绠楀惈绋庡崟浠�
- if (productForm.value.quantity) {
- productForm.value.taxInclusiveUnitPrice =
- (Number(productForm.value.taxInclusiveTotalPrice) / Number(productForm.value.quantity)).toFixed(2);
- }
- // 宸茬煡鍚◣鍗曚环锛屽弽绠楁暟閲�
- else if (productForm.value.taxInclusiveUnitPrice) {
- productForm.value.quantity =
- (Number(productForm.value.taxInclusiveTotalPrice) / Number(productForm.value.taxInclusiveUnitPrice)).toFixed(2);
- }
- }
-};
-// 閿�鍞悎鍚岄�夋嫨鏀瑰彉鏂规硶
-const salesLedgerChange = async (row) => {
- console.log("row", row);
- var index = salesContractList.value.findIndex((item) => item.id == row);
- console.log("index", index);
- if (index > -1) {
- form.value.projectName = salesContractList.value[index].projectName;
- await querygProductInfoByContractNo();
- }
-};
-
-const querygProductInfoByContractNo = async () => {
- const { code, data } = await getProductInfoByContractNo({
- contractNo: form.value.salesLedgerId,
- });
- if (code == 200) {
- productData.value = data;
- }
-};
-
-// 鏄剧ず浜岀淮鐮�
-const showQRCode = async (row) => {
- try {
- // 鏋勫缓浜岀淮鐮佸唴瀹癸紝鍙寘鍚噰璐悎鍚屽彿锛堢函鏂囨湰锛�
- const qrContent = row.purchaseContractNumber || '';
- // 妫�鏌ュ唴瀹规槸鍚︿负绌�
- if (!qrContent || qrContent.trim() === '') {
- proxy.$modal.msgWarning("璇ヨ娌℃湁閲囪喘鍚堝悓鍙凤紝鏃犳硶鐢熸垚浜岀淮鐮�");
- return;
- }
- qrCodeUrl.value = await QRCode.toDataURL(qrContent, {
- width: 200,
- margin: 2,
- color: {
- dark: '#000000',
- light: '#FFFFFF'
- }
- });
- qrCodeDialogVisible.value = true;
- } catch (error) {
- console.error('鐢熸垚浜岀淮鐮佸け璐�:', error);
- proxy.$modal.msgError("鐢熸垚浜岀淮鐮佸け璐ワ細" + error.message);
- }
-};
-
-// 涓嬭浇浜岀淮鐮�
-const downloadQRCode = () => {
- if (!qrCodeUrl.value) {
- proxy.$modal.msgWarning("浜岀淮鐮佹湭鐢熸垚");
- return;
- }
-
- const a = document.createElement('a');
- a.href = qrCodeUrl.value;
- a.download = `閲囪喘鍚堝悓鍙蜂簩缁寸爜_${new Date().getTime()}.png`;
- document.body.appendChild(a);
- a.click();
- document.body.removeChild(a);
- proxy.$modal.msgSuccess("涓嬭浇鎴愬姛");
-};
-
-// 鎵爜鏂板瀵硅瘽妗嗙浉鍏冲彉閲�
-const scanAddDialogVisible = ref(false);
-const scanAddForm = reactive({
- scanContent: "",
- purchaseContractNumber: "",
- supplierName: "",
- projectName: "",
- contractAmount: "",
- paymentMethod: "",
- recorderName: "",
- scanRemark: "",
-});
-const scanAddRules = {
- purchaseContractNumber: [{ required: true, message: "璇疯緭鍏ラ噰璐悎鍚屽彿", trigger: "blur" }],
- supplierName: [{ required: true, message: "璇疯緭鍏ヤ緵搴斿晢鍚嶇О", trigger: "blur" }],
- projectName: [{ required: true, message: "璇疯緭鍏ラ」鐩悕绉�", trigger: "blur" }],
-};
-
-// 鎵爜鐧昏瀵硅瘽妗嗙浉鍏冲彉閲�
-const scanDialogVisible = ref(false);
-const scanForm = reactive({
- purchaseContractNumber: "",
- supplierName: "",
- projectName: "",
- scanTime: "",
- scannerName: "",
- scanStatus: "鏈壂鐮�",
- scanRemark: "",
-});
-const scanRules = {
- scanRemark: [{ required: true, message: "璇疯緭鍏ユ壂鐮佸娉�", trigger: "blur" }],
-};
-const scanRecords = ref([]);
-
-// 鎵撳紑鎵爜鏂板瀵硅瘽妗�
-const openScanAddDialog = () => {
- scanAddForm.scanContent = "";
- scanAddForm.purchaseContractNumber = "";
- scanAddForm.supplierName = "";
- scanAddForm.projectName = "";
- scanAddForm.contractAmount = "";
- scanAddForm.paymentMethod = "";
- scanAddForm.recorderName = userStore.nickName;
- scanAddForm.scanRemark = "";
- scanAddDialogVisible.value = true;
-};
-
-// 瑙f瀽鎵爜鍐呭锛堟ā鎷熻В鏋愪簩缁寸爜鏁版嵁锛�
-const parseScanContent = (content) => {
- if (!content) return;
-
- // 妯℃嫙瑙f瀽浜岀淮鐮佸唴瀹癸紝杩欓噷鍙互鏍规嵁瀹為檯闇�姹傝皟鏁磋В鏋愰�昏緫
- // 鍋囪鎵爜鍐呭鏍煎紡涓猴細鍚堝悓鍙穦渚涘簲鍟唡椤圭洰|閲戦|浠樻鏂瑰紡
- const parts = content.split('|');
- if (parts.length >= 3) {
- scanAddForm.purchaseContractNumber = parts[0] || "";
- scanAddForm.supplierName = parts[1] || "";
- scanAddForm.projectName = parts[2] || "";
- scanAddForm.contractAmount = parts[3] || "";
- scanAddForm.paymentMethod = parts[4] || "";
- }
-};
-
-// 鍏抽棴鎵爜鏂板瀵硅瘽妗�
-const closeScanAddDialog = () => {
- scanAddDialogVisible.value = false;
- proxy.resetForm("scanAddFormRef");
-};
-
-// 鎻愪氦鎵爜鏂板
-const submitScanAdd = () => {
- proxy.$refs["scanAddFormRef"].validate((valid) => {
- if (valid) {
- // 鏋勫缓鏂板鏁版嵁
- const newData = {
- purchaseContractNumber: scanAddForm.purchaseContractNumber,
- supplierName: scanAddForm.supplierName,
- projectName: scanAddForm.projectName,
- contractAmount: scanAddForm.contractAmount,
- paymentMethod: scanAddForm.paymentMethod,
- recorderName: scanAddForm.recorderName,
- entryDate: getCurrentDate(),
- remark: scanAddForm.scanRemark,
- type: 2
- };
-
- // 妯℃嫙鏂板鎴愬姛
- proxy.$modal.msgSuccess("鎵爜鏂板鎴愬姛锛�");
- closeScanAddDialog();
-
- // 鍙互閫夋嫨鏄惁鍒锋柊鍒楄〃
- // getList();
- }
- });
-};
-
-// 鎵撳紑鎵爜鐧昏瀵硅瘽妗�
-const openScanDialog = (row) => {
- scanForm.purchaseContractNumber = row.purchaseContractNumber;
- scanForm.supplierName = row.supplierName;
- scanForm.projectName = row.projectName;
- scanForm.scanTime = getCurrentDateTime();
- scanForm.scannerName = userStore.nickName;
- scanForm.scanStatus = "鏈壂鐮�";
- scanForm.scanRemark = "";
- scanRecords.value = [];
- scanDialogVisible.value = true;
-};
-
-// 鍏抽棴鎵爜鐧昏瀵硅瘽妗�
-const closeScanDialog = () => {
- scanDialogVisible.value = false;
- proxy.resetForm("scanFormRef");
-};
-
-// 鎻愪氦鎵爜鐧昏
-const submitScan = () => {
- proxy.$refs["scanFormRef"].validate((valid) => {
- if (valid) {
- // 娣诲姞鎵爜璁板綍
- scanRecords.value.push({
- ...scanForm,
- id: Date.now(), // 妯℃嫙ID
- scanTime: getCurrentDateTime(),
- });
- scanForm.scanStatus = "宸叉壂鐮�";
- scanForm.scanRemark = scanForm.scanRemark || "鏃�";
- proxy.$modal.msgSuccess("鎵爜鐧昏鎴愬姛锛�");
- closeScanDialog();
- }
- });
-};
-
-// 鑾峰彇褰撳墠鏃ユ湡鏃堕棿
-function getCurrentDateTime() {
- const now = new Date();
- const year = now.getFullYear();
- const month = String(now.getMonth() + 1).padStart(2, "0");
- const day = String(now.getDate()).padStart(2, "0");
- const hours = String(now.getHours()).padStart(2, "0");
- const minutes = String(now.getMinutes()).padStart(2, "0");
- const seconds = String(now.getSeconds()).padStart(2, "0");
- return `${year}-${month}-${day} ${hours}:${minutes}:${seconds}`;
-}
-
-
-
-onMounted(() => {
- getList();
-});
-</script>
-
-<style scoped lang="scss"></style>
diff --git a/src/views/procurementManagement/thePaymentLedger/index.vue b/src/views/procurementManagement/thePaymentLedger/index.vue
deleted file mode 100644
index 5fa9e6f..0000000
--- a/src/views/procurementManagement/thePaymentLedger/index.vue
+++ /dev/null
@@ -1,101 +0,0 @@
-<template>
- <div class="app-container">
- <div class="search_form">
- <div>
- <span class="search_title">渚涘簲鍟嗗悕绉�/鍚堝悓鍙凤細</span>
- <el-input
- v-model="searchForm.supplierNameOrContractNo"
- style="width: 240px"
- placeholder="杈撳叆渚涘簲鍟嗗悕绉�/鍚堝悓鍙锋悳绱�"
- @change="handleQuery"
- clearable
- :prefix-icon="Search"
- />
- <el-button type="primary" @click="handleQuery" style="margin-left: 10px"
- >鎼滅储</el-button
- >
- </div>
- </div>
- <div class="table_list">
- <PIMTable
- rowKey="id"
- :column="tableColumn"
- :tableData="tableData"
- :page="page"
- :tableLoading="tableLoading"
- @pagination="pagination"
- :total="total"
- ></PIMTable>
- </div>
- </div>
-</template>
-
-<script setup>
-import { ref } from "vue";
-import { Search } from "@element-plus/icons-vue";
-import { registrationList } from "@/api/procurementManagement/paymentEntry.js";
-const tableColumn = ref([
- {
- label: "浠樻鏃ユ湡",
- prop: "paymentDate",
- },
- {
- label: "渚涘簲鍟嗗悕绉�",
- prop: "supplierName",
- },
- {
- label: "浠樻閲戦",
- prop: "currentPaymentAmount",
- },
- {
- label: "鐧昏浜�",
- prop: "registrant",
- },
- {
- label: "鐧昏鏃ユ湡",
- prop: "registrationtDate",
- },
-]);
-const tableData = ref([]);
-const tableLoading = ref(false);
-const purchaseLedgerList = ref([]);
-const invoiceNumberList = ref([]);
-const page = reactive({
- current: 1,
- size: 10,
-});
-const total = ref(0);
-
-// 鐢ㄦ埛淇℃伅琛ㄥ崟寮规鏁版嵁
-const operationType = ref("");
-const dialogFormVisible = ref(false);
-const data = reactive({
- searchForm: {
- supplierNameOrContractNo: "",
- },
-});
-const { searchForm, form, rules } = toRefs(data);
-
-// 鏌ヨ鍒楄〃
-/** 鎼滅储鎸夐挳鎿嶄綔 */
-const handleQuery = () => {
- page.current = 1;
- getList();
-};
-const pagination = ({ current, limit }) => {
- page.current = current;
- page.size = limit;
- getList();
-};
-const getList = () => {
- tableLoading.value = true;
- registrationList({ ...searchForm.value, ...page }).then((res) => {
- tableLoading.value = false;
- tableData.value = res.rows;
- total.value = res.total;
- });
-};
-getList();
-</script>
-
-<style scoped lang="scss"></style>
diff --git a/src/views/productionManagement/operationScheduling/components/formDia.vue b/src/views/productionManagement/operationScheduling/components/formDia.vue
deleted file mode 100644
index b8d1428..0000000
--- a/src/views/productionManagement/operationScheduling/components/formDia.vue
+++ /dev/null
@@ -1,185 +0,0 @@
-<template>
- <div>
- <el-dialog
- v-model="dialogFormVisible"
- title="宸ュ簭鎺掍骇"
- width="70%"
- @close="closeDia"
- >
- <el-button type="primary" @click="addRow" style="margin-bottom: 10px;">鏂板</el-button>
- <span style="font-size: 18px;margin-left: 10px">寰呮帓浜ф暟閲忥細{{pendingNum}}</span>
- <el-table :data="tableData" border style="width: 100%" :summary-method="summarizeMainTable" show-summary :row-key="row => row.id" stripe>
- <el-table-column label="搴忓彿" width="60">
- <template #default="scope">
- {{ scope.$index + 1 }}
- </template>
- </el-table-column>
- <el-table-column label="宸ュ簭" prop="process">
- <template #default="scope">
- <el-select v-model="scope.row.process" placeholder="璇烽�夋嫨" clearable style="width: 100%">
- <el-option
- v-for="dict in work_step"
- :key="dict.value"
- :label="dict.label"
- :value="dict.value"
- />
- </el-select>
- </template>
- </el-table-column>
- <el-table-column label="鍗曚綅" prop="unit">
- <template #default="scope">
- <el-input v-model="scope.row.unit" placeholder="璇疯緭鍏ュ崟浣�" />
- </template>
- </el-table-column>
- <el-table-column label="鎺掍骇鏁伴噺" width="200" prop="schedulingNum">
- <template #default="scope">
- <el-input-number
- v-model="scope.row.schedulingNum"
- placeholder="璇疯緭鍏�"
- :min="0"
- :step="0.1"
- :precision="2"
- clearable
- style="width: 100%"
- />
- </template>
- </el-table-column>
- <el-table-column label="宸ユ椂瀹氶" width="200" prop="workHours">
- <template #default="scope">
- <el-input-number
- v-model="scope.row.workHours"
- placeholder="璇疯緭鍏�"
- :min="0"
- :step="0.1"
- :precision="2"
- clearable
- style="width: 100%"
- />
- </template>
- </el-table-column>
- <el-table-column label="鎺掍骇鏃ユ湡" prop="schedulingDate">
- <template #default="scope">
- <el-date-picker v-model="scope.row.schedulingDate" type="date" placeholder="閫夋嫨鏃ユ湡" style="width: 100%;" value-format="YYYY-MM-DD" format="YYYY-MM-DD"/>
- </template>
- </el-table-column>
- <el-table-column label="鎺掍骇浜�" prop="schedulingUserId">
- <template #default="scope">
- <el-select
- v-model="scope.row.schedulingUserId"
- placeholder="閫夋嫨浜哄憳"
- style="width: 100%;"
- >
- <el-option
- v-for="user in userList"
- :key="user.userId"
- :label="user.nickName"
- :value="user.userId"
- />
- </el-select>
- </template>
- </el-table-column>
- <el-table-column label="鎿嶄綔" width="80">
- <template #default="scope">
- <el-button type="danger" size="small" @click="removeRow(scope.$index)">鍒犻櫎</el-button>
- </template>
- </el-table-column>
- </el-table>
- <template #footer>
- <div class="dialog-footer">
- <el-button type="primary" @click="submitForm">纭</el-button>
- <el-button @click="closeDia">鍙栨秷</el-button>
- </div>
- </template>
- </el-dialog>
- </div>
-</template>
-
-<script setup>
-import {ref} from "vue";
-import {userListNoPageByTenantId} from "@/api/system/user.js";
-import {processScheduling} from "@/api/productionManagement/operationScheduling.js";
-const { proxy } = getCurrentInstance()
-const { work_step } = proxy.useDict("work_step")
-const emit = defineEmits(['close'])
-
-const dialogFormVisible = ref(false);
-const operationType = ref('')
-const tableData = ref([
- { process: '', schedulingDate: '', schedulingNum: '', schedulingUserId: '', workHours: '', unit: '' }
-]);
-const unitFromRow = ref('');
-const idFromRow = ref('');
-const pendingNum = ref('');
-const userList = ref([])
-
-// 鎵撳紑寮规
-const openDialog = (type, row) => {
- operationType.value = type;
- dialogFormVisible.value = true;
- userListNoPageByTenantId().then((res) => {
- userList.value = res.data;
- });
- pendingNum.value = row.pendingNum
- if (row && row.unit !== undefined) {
- unitFromRow.value = row.unit;
- idFromRow.value = row.id;
- tableData.value.forEach(item => {
- item.unit = row.unit;
- item.id = row.id;
- });
- } else {
- unitFromRow.value = '';
- }
-}
-const submitForm = () => {
- // 1. 妫�鏌ユ瘡涓�琛屾槸鍚﹀~鍐欏畬鏁�
- for (let i = 0; i < tableData.value.length; i++) {
- const row = tableData.value[i];
- if (
- !row.process ||
- !row.schedulingDate ||
- row.schedulingNum === '' || row.schedulingNum === null ||
- !row.schedulingUserId ||
- row.workHours === '' || row.workHours === null ||
- !row.unit
- ) {
- proxy.$modal.msgError(`绗�${i + 1}琛屾暟鎹湭濉啓瀹屾暣`);
- return;
- }
- }
- // 2. 鍚堣鎺掍骇鏁伴噺
- const totalSchedulingNum = tableData.value.reduce((sum, row) => {
- return sum + Number(row.schedulingNum || 0);
- }, 0);
- if (totalSchedulingNum > Number(pendingNum.value)) {
- proxy.$modal.msgError('鎺掍骇鏁伴噺鍚堣涓嶈兘瓒呰繃寰呮帓浜ф暟閲�');
- return;
- }
- processScheduling(tableData.value).then((res) => {
- proxy.$modal.msgSuccess("鎻愪氦鎴愬姛");
- closeDia();
- })
-}
-const summarizeMainTable = (param) => {
- return proxy.summarizeTable(param, ['schedulingNum']);
-};
-// 鍏抽棴寮规
-const closeDia = () => {
- dialogFormVisible.value = false;
- emit('close')
-};
-defineExpose({
- openDialog,
-});
-
-const addRow = () => {
- tableData.value.push({ id: idFromRow.value, process: '', unit: unitFromRow.value, schedulingNum: '', workHours: '', schedulingDate: '', schedulingUserId: '' });
-};
-const removeRow = (index) => {
- tableData.value.splice(index, 1);
-};
-</script>
-
-<style scoped>
-
-</style>
\ No newline at end of file
diff --git a/src/views/productionManagement/operationScheduling/index.vue b/src/views/productionManagement/operationScheduling/index.vue
deleted file mode 100644
index 983101f..0000000
--- a/src/views/productionManagement/operationScheduling/index.vue
+++ /dev/null
@@ -1,258 +0,0 @@
-<template>
- <div class="app-container">
- <div class="search_form">
- <el-form :model="searchForm" :inline="true">
- <el-form-item label="瀹㈡埛鍚嶇О:">
- <el-input v-model="searchForm.customerName" placeholder="璇疯緭鍏�" clearable prefix-icon="Search"
- style="width: 200px;"
- @change="handleQuery" />
- </el-form-item>
- <el-form-item label="椤圭洰鍚嶇О:">
- <el-input v-model="searchForm.projectName" placeholder="璇疯緭鍏�" clearable prefix-icon="Search"
- style="width: 200px;"
- @change="handleQuery" />
- </el-form-item>
- <el-form-item label="娲惧伐鏃ユ湡:">
- <el-date-picker v-model="searchForm.entryDate" value-format="YYYY-MM-DD" format="YYYY-MM-DD" type="daterange"
- placeholder="璇烽�夋嫨" clearable @change="changeDaterange" />
- </el-form-item>
- <el-form-item label="鐘舵��:">
- <el-select v-model="searchForm.status" placeholder="璇烽�夋嫨鐘舵��" @change="handleQuery" style="width: 140px" clearable>
- <el-option label="寰呮帓浜�" :value="1"></el-option>
- <el-option label="宸叉帓浜�" :value="3"></el-option>
- <el-option label="鎺掍骇涓�" :value="2"></el-option>
- </el-select>
- </el-form-item>
- <el-form-item>
- <el-button type="primary" @click="handleQuery">鎼滅储</el-button>
- </el-form-item>
- </el-form>
- </div>
- <div class="table_list">
- <div style="text-align: right" class="mb10">
- <el-button type="primary" @click="openForm">宸ュ簭鎺掍骇</el-button>
- <el-button type="danger" @click="handleDelete" plain>鍙栨秷鎺掍骇</el-button>
- </div>
- <PIMTable
- rowKey="id"
- :column="tableColumn"
- :tableData="tableData"
- :page="page"
- :isSelection="true"
- @selection-change="handleSelectionChange"
- :tableLoading="tableLoading"
- @pagination="pagination"
- :total="page.total"
- ></PIMTable>
- </div>
- <form-dia ref="formDia" @close="handleQuery"></form-dia>
- </div>
-</template>
-
-<script setup>
-import {onMounted, ref} from "vue";
-import FormDia from "@/views/productionManagement/operationScheduling/components/formDia.vue";
-import {ElMessageBox} from "element-plus";
-import dayjs from "dayjs";
-import {listPageProcess, productionDispatchDelete} from "@/api/productionManagement/operationScheduling.js";
-
-const data = reactive({
- searchForm: {
- staffName: "",
- status: 1,
- entryDate: [
- dayjs().format("YYYY-MM-DD"),
- dayjs().add(1, "day").format("YYYY-MM-DD"),
- ], // 褰曞叆鏃ユ湡
- entryDateStart: dayjs().format("YYYY-MM-DD"),
- entryDateEnd: dayjs().add(1, "day").format("YYYY-MM-DD"),
- },
-});
-const { searchForm } = toRefs(data);
-const tableColumn = ref([
- {
- label: "鐘舵��",
- prop: "status",
- dataType: "tag",
- formatData: (params) => {
- if (params == 3) {
- return "宸叉帓浜�";
- } else if (params == 1) {
- return "寰呮帓浜�";
- } else {
- return '鎺掍骇涓�';
- }
- },
- formatType: (params) => {
- if (params == 3) {
- return "success";
- } else if (params == 1) {
- return "primary";
- } else {
- return 'warning';
- }
- },
- },
- {
- label: "娲惧伐鏃ユ湡",
- prop: "schedulingDate",
- width: 120,
- },
- {
- label: "娲惧伐浜�",
- prop: "schedulingUserName",
- },
- {
- label: "鍚堝悓鍙�",
- prop: "salesContractNo",
- width: 200,
- },
- {
- label: "瀹㈡埛鍚堝悓鍙�",
- prop: "customerContractNo",
- width: 200,
- },
- {
- label: "瀹㈡埛鍚嶇О",
- prop: "customerName",
- width: 200,
- },
- {
- label: "椤圭洰鍚嶇О",
- prop: "projectName",
- width:300
- },
- {
- label: "浜у搧澶х被",
- prop: "productCategory",
- width: 150,
- },
- {
- label: "瑙勬牸鍨嬪彿",
- prop: "specificationModel",
- width: 150,
- },
- {
- label: "鍗曚綅",
- prop: "unit",
- },
- {
- label: "鎺掍骇鎬绘暟",
- prop: "schedulingNum",
- },
- {
- label: "宸叉帓浜ф暟閲�",
- prop: "successNum",
- width: 100,
- },
- {
- label: "寰呮帓浜ф暟閲�",
- prop: "pendingNum",
- width: 100,
- },
-]);
-const tableData = ref([]);
-const selectedRows = ref([]);
-const tableLoading = ref(false);
-const page = reactive({
- current: 1,
- size: 100,
- total: 0,
-});
-const formDia = ref()
-const { proxy } = getCurrentInstance()
-
-// 鏌ヨ鍒楄〃
-/** 鎼滅储鎸夐挳鎿嶄綔 */
-const handleQuery = () => {
- page.current = 1;
- getList();
-};
-const changeDaterange = (value) => {
- if (value) {
- searchForm.value.entryDateStart = dayjs(value[0]).format("YYYY-MM-DD");
- searchForm.value.entryDateEnd = dayjs(value[1]).format("YYYY-MM-DD");
- } else {
- searchForm.value.entryDateStart = undefined;
- searchForm.value.entryDateEnd = undefined;
- }
- handleQuery();
-};
-const pagination = (obj) => {
- page.current = obj.page;
- page.size = obj.limit;
- getList();
-};
-const getList = () => {
- tableLoading.value = true;
- const params = { ...searchForm.value, ...page };
- params.entryDate = undefined
- listPageProcess(params).then(res => {
- tableLoading.value = false;
- tableData.value = res.data.records.map(item => ({
- ...item,
- pendingNum: (Number(item.schedulingNum) || 0) - (Number(item.successNum) || 0)
- }));
- page.total = res.data.total;
- }).catch(err => {
- tableLoading.value = false;
- })
-};
-// 琛ㄦ牸閫夋嫨鏁版嵁
-const handleSelectionChange = (selection) => {
- selectedRows.value = selection;
-};
-
-// 鎵撳紑寮规
-const openForm = (type, row) => {
- if (selectedRows.value.length !== 1) {
- proxy.$message.error("璇烽�夋嫨涓�鏉℃暟鎹�");
- return;
- }
- if (selectedRows.value[0].pendingNum == 0) {
- proxy.$message.warning("鏃犻渶鍐嶆帓浜�");
- return;
- }
- nextTick(() => {
- formDia.value?.openDialog(type, selectedRows.value[0])
- })
-};
-
-// 鍒犻櫎
-const handleDelete = () => {
- let ids = [];
- if (selectedRows.value.length > 0) {
- // 鏂板锛氬垽鏂槸鍚︽湁宸叉帓浜х殑鏁版嵁
- const hasScheduled = selectedRows.value.some(item => item.status == 3);
- if (hasScheduled) {
- proxy.$modal.msgWarning("宸叉帓浜ф暟鎹笉鑳藉彇娑堟帓浜�");
- return;
- }
- ids = selectedRows.value.map((item) => item.id);
- } else {
- proxy.$modal.msgWarning("璇烽�夋嫨鏁版嵁");
- return;
- }
- ElMessageBox.confirm("鏄惁纭鍙栨秷鎺掍骇锛�", "鍒犻櫎鎻愮ず", {
- confirmButtonText: "纭",
- cancelButtonText: "鍙栨秷",
- type: "warning",
- })
- .then(() => {
- tableLoading.value = true;
- productionDispatchDelete(ids)
- .then((res) => {
- proxy.$modal.msgSuccess("鍙栨秷鎺掍骇鎴愬姛");
- getList();
- })
- })
- .catch(() => {
- proxy.$modal.msg("宸插彇娑�");
- });
-};
-onMounted(() => {
- getList();
-});
-</script>
-
-<style scoped></style>
diff --git a/src/views/productionManagement/productionCosting/index.vue b/src/views/productionManagement/productionCosting/index.vue
deleted file mode 100644
index 76e7414..0000000
--- a/src/views/productionManagement/productionCosting/index.vue
+++ /dev/null
@@ -1,186 +0,0 @@
-<template>
- <div class="app-container">
- <div class="search_form">
- <div>
- <span class="search_title">鐢熶骇鏃ユ湡锛�</span>
- <el-date-picker v-model="searchForm.entryDate" value-format="YYYY-MM-DD" format="YYYY-MM-DD" type="daterange"
- placeholder="璇烽�夋嫨" clearable @change="changeDaterange" />
- <span class="search_title ml10">鐢熶骇浜猴細</span>
- <el-input
- v-model="searchForm.schedulingUserName"
- style="width: 240px"
- placeholder="璇疯緭鍏�"
- @change="handleQuery"
- clearable
- prefix-icon="Search"
- />
- <el-button type="primary" @click="handleQuery" style="margin-left: 10px"
- >鎼滅储</el-button
- >
- </div>
- <div>
- <el-button @click="handleOut">瀵煎嚭</el-button>
- </div>
- </div>
- <div class="table_list">
- <PIMTable
- rowKey="id"
- :column="tableColumn"
- :tableData="tableData"
- :page="page"
- :tableLoading="tableLoading"
- @pagination="pagination"
- ></PIMTable>
- </div>
- </div>
-</template>
-
-<script setup>
-import {onMounted, ref} from "vue";
-import {
- listCustomer,
-} from "@/api/basicData/customerFile.js";
-import { ElMessageBox } from "element-plus";
-import dayjs from "dayjs";
-import {productionAccountingListPage} from "@/api/productionManagement/productionCosting.js";
-const { proxy } = getCurrentInstance();
-
-const tableColumn = ref([
- {
- label: "鐢熶骇鏃ユ湡",
- prop: "schedulingDate",
- width: 120,
- },
- {
- label: "鐢熶骇浜�",
- prop: "schedulingUserName",
- width: 90,
- },
- {
- label: "鍚堝悓鍙�",
- prop: "salesContractNo",
- width: 220,
- },
- {
- label: "瀹㈡埛鍚堝悓鍙�",
- prop: "customerContractNo",
- width: 250,
- },
- {
- label: "瀹㈡埛鍚嶇О",
- prop: "customerName",
- width: 250,
- },
- {
- label: "椤圭洰鍚嶇О",
- prop: "projectName",
- width:300
- },
- {
- label: "浜у搧澶х被",
- prop: "productCategory",
- width: 160,
- },
- {
- label: "瑙勬牸鍨嬪彿",
- prop: "specificationModel",
- width: 160,
- },
- {
- label: "鍗曚綅",
- prop: "unit",
- },
- {
- label: "宸ュ簭",
- prop: "process",
- },
- {
- label: "鐢熶骇鏁伴噺",
- prop: "finishedNum",
- width: 100,
- },
- {
- label: "宸ユ椂瀹氶",
- prop: "workHours",
- width: 100,
- },
- {
- label: "宸ヨ祫",
- prop: "wages",
- width: 100,
- },
-]);
-const tableData = ref([]);
-const tableLoading = ref(false);
-const page = reactive({
- current: 1,
- size: 100,
- total: 0,
-});
-
-const data = reactive({
- searchForm: {
- schedulingUserName: "",
- entryDate: [
- dayjs().format("YYYY-MM-DD"),
- dayjs().add(1, "day").format("YYYY-MM-DD"),
- ], // 褰曞叆鏃ユ湡
- entryDateStart: dayjs().format("YYYY-MM-DD"),
- entryDateEnd: dayjs().add(1, "day").format("YYYY-MM-DD"),
- },
-});
-const { searchForm } = toRefs(data);
-
-// 鏌ヨ鍒楄〃
-/** 鎼滅储鎸夐挳鎿嶄綔 */
-const handleQuery = () => {
- page.current = 1;
- getList();
-};
-const pagination = (obj) => {
- page.current = obj.page;
- page.size = obj.limit;
- getList();
-};
-const changeDaterange = (value) => {
- if (value) {
- searchForm.value.entryDateStart = dayjs(value[0]).format("YYYY-MM-DD");
- searchForm.value.entryDateEnd = dayjs(value[1]).format("YYYY-MM-DD");
- } else {
- searchForm.value.entryDateStart = undefined;
- searchForm.value.entryDateEnd = undefined;
- }
- handleQuery();
-};
-const getList = () => {
- tableLoading.value = true;
- const params = { ...searchForm.value, ...page };
- params.entryDate = undefined
- productionAccountingListPage(params).then((res) => {
- tableLoading.value = false;
- tableData.value = res.data.records;
- page.total = res.data.total;
- });
-};
-
-// 瀵煎嚭
-const handleOut = () => {
- ElMessageBox.confirm("閫変腑鐨勫唴瀹瑰皢琚鍑猴紝鏄惁纭瀵煎嚭锛�", "瀵煎嚭", {
- confirmButtonText: "纭",
- cancelButtonText: "鍙栨秷",
- type: "warning",
- })
- .then(() => {
- proxy.download("/basic/customer/export", {}, "鐢熶骇鏍哥畻.xlsx");
- })
- .catch(() => {
- proxy.$modal.msg("宸插彇娑�");
- });
-};
-
-onMounted(() => {
- getList();
-});
-</script>
-
-<style scoped lang="scss"></style>
diff --git a/src/views/productionManagement/productionDispatching/components/formDia.vue b/src/views/productionManagement/productionDispatching/components/formDia.vue
deleted file mode 100644
index a60f751..0000000
--- a/src/views/productionManagement/productionDispatching/components/formDia.vue
+++ /dev/null
@@ -1,169 +0,0 @@
-<template>
- <div>
- <el-dialog
- v-model="dialogFormVisible"
- title="鐢熶骇娲惧伐"
- width="50%"
- @close="closeDia"
- >
- <el-form :model="form" label-width="140px" label-position="top" :rules="rules" ref="formRef">
- <el-row :gutter="30">
- <el-col :span="12">
- <el-form-item label="椤圭洰鍚嶇О锛�" prop="projectName">
- <el-input v-model="form.projectName" placeholder="璇疯緭鍏�" clearable disabled/>
- </el-form-item>
- </el-col>
- <el-col :span="12">
- <el-form-item label="浜у搧澶х被锛�" prop="productCategory">
- <el-input v-model="form.productCategory" placeholder="璇疯緭鍏�" clearable disabled/>
- </el-form-item>
- </el-col>
- </el-row>
- <el-row :gutter="30">
- <el-col :span="12">
- <el-form-item label="鎬绘暟閲忥細" prop="quantity">
- <el-input v-model="form.quantity" placeholder="璇疯緭鍏�" clearable disabled/>
- </el-form-item>
- </el-col>
- <el-col :span="12">
- <el-form-item label="寰呮帓浜ф暟閲忥細" prop="pendingQuantity">
- <el-input v-model="form.pendingQuantity" placeholder="璇疯緭鍏�" clearable disabled/>
- </el-form-item>
- </el-col>
- </el-row>
- <el-row :gutter="30">
- <el-col :span="12">
- <el-form-item label="鏈鎺掍骇鏁伴噺锛�" prop="schedulingNum">
- <el-input-number
- v-model="form.schedulingNum"
- placeholder="璇疯緭鍏�"
- :min="0"
- :step="0.1"
- :precision="2"
- clearable
- @change="changeNum"
- style="width: 100%"
- />
- </el-form-item>
- </el-col>
- </el-row>
- <el-row :gutter="30">
- <el-col :span="12">
- <el-form-item label="娲惧伐浜猴細" prop="schedulingUserId">
- <el-select
- v-model="form.schedulingUserId"
- placeholder="閫夋嫨浜哄憳"
- style="width: 100%;"
- >
- <el-option
- v-for="user in userList"
- :key="user.userId"
- :label="user.nickName"
- :value="user.userId"
- />
- </el-select>
- </el-form-item>
- </el-col>
- <el-col :span="12">
- <el-form-item label="娲惧伐鏃ユ湡锛�" prop="schedulingDate">
- <el-date-picker
- v-model="form.schedulingDate"
- type="date"
- placeholder="璇烽�夋嫨鏃ユ湡"
- value-format="YYYY-MM-DD"
- format="YYYY-MM-DD"
- clearable
- style="width: 100%"
- />
- </el-form-item>
- </el-col>
- </el-row>
- </el-form>
- <template #footer>
- <div class="dialog-footer">
- <el-button type="primary" @click="submitForm">纭</el-button>
- <el-button @click="closeDia">鍙栨秷</el-button>
- </div>
- </template>
- </el-dialog>
- </div>
-</template>
-
-<script setup>
-import {ref} from "vue";
-import {getStaffJoinInfo, staffJoinAdd, staffJoinUpdate} from "@/api/personnelManagement/onboarding.js";
-import {userListNoPageByTenantId} from "@/api/system/user.js";
-import {productionDispatch} from "@/api/productionManagement/productionOrder.js";
-import useUserStore from "@/store/modules/user.js";
-import dayjs from "dayjs";
-const { proxy } = getCurrentInstance()
-const emit = defineEmits(['close'])
-
-const dialogFormVisible = ref(false);
-const operationType = ref('')
-const data = reactive({
- form: {
- projectName: "",
- productCategory: "",
- quantity: "",
- schedulingNum: "",
- schedulingUserId: "",
- schedulingDate: "",
- pendingQuantity: "",
- },
- rules: {
- schedulingNum: [{ required: true, message: "璇疯緭鍏�", trigger: "blur" },],
- schedulingUserId: [{ required: true, message: "璇烽�夋嫨", trigger: "change" },],
- schedulingDate: [{ required: true, message: "璇烽�夋嫨", trigger: "change" },],
- },
-});
-const { form, rules } = toRefs(data);
-const userList = ref([])
-const userStore = useUserStore()
-
-// 鎵撳紑寮规
-const openDialog = (type, row) => {
- operationType.value = type;
- dialogFormVisible.value = true;
- userListNoPageByTenantId().then((res) => {
- userList.value = res.data;
- });
- form.value = {...row}
- form.value.schedulingNum = 0
- form.value.schedulingUserId = userStore.id
- form.value.schedulingDate = dayjs().format("YYYY-MM-DD");
-}
-
-//
-const changeNum = (value) => {
- if (value > form.value.pendingQuantity) {
- form.value.schedulingNum = form.value.pendingQuantity;
- proxy.$modal.msgWarning('鎺掍骇鏁伴噺涓嶅彲澶т簬寰呮帓浜ф暟閲�')
- }
-}
-// 鎻愪氦浜у搧琛ㄥ崟
-const submitForm = () => {
- proxy.$refs.formRef.validate(valid => {
- if (valid) {
- productionDispatch(form.value).then(res => {
- proxy.$modal.msgSuccess("鎻愪氦鎴愬姛");
- closeDia();
- })
- }
- })
-}
-
-// 鍏抽棴寮规
-const closeDia = () => {
- proxy.resetForm("formRef");
- dialogFormVisible.value = false;
- emit('close')
-};
-defineExpose({
- openDialog,
-});
-</script>
-
-<style scoped>
-
-</style>
\ No newline at end of file
diff --git a/src/views/productionManagement/productionDispatching/index.vue b/src/views/productionManagement/productionDispatching/index.vue
deleted file mode 100644
index 5aebfc3..0000000
--- a/src/views/productionManagement/productionDispatching/index.vue
+++ /dev/null
@@ -1,204 +0,0 @@
-<template>
- <div class="app-container">
- <div class="search_form">
- <div>
- <span class="search_title">瀹㈡埛鍚嶇О锛�</span>
- <el-input
- v-model="searchForm.customerName"
- style="width: 240px"
- placeholder="璇疯緭鍏�"
- @change="handleQuery"
- clearable
- prefix-icon="Search"
- />
- <span class="search_title ml10">椤圭洰鍚嶇О锛�</span>
- <el-input
- v-model="searchForm.projectName"
- style="width: 240px"
- placeholder="璇疯緭鍏�"
- @change="handleQuery"
- clearable
- prefix-icon="Search"
- />
- <span class="search_title ml10">褰曞叆鏃ユ湡锛�</span>
- <el-date-picker v-model="searchForm.entryDate" value-format="YYYY-MM-DD" format="YYYY-MM-DD" type="daterange"
- placeholder="璇烽�夋嫨" clearable @change="changeDaterange" />
- <el-button type="primary" @click="handleQuery" style="margin-left: 10px">鎼滅储</el-button>
- </div>
- <div>
- <el-button type="primary" @click="openForm('add')">鐢熶骇娲惧伐</el-button>
- </div>
- </div>
- <div class="table_list">
- <PIMTable
- rowKey="id"
- :column="tableColumn"
- :tableData="tableData"
- :page="page"
- :isSelection="true"
- @selection-change="handleSelectionChange"
- :tableLoading="tableLoading"
- @pagination="pagination"
- :total="page.total"
- ></PIMTable>
- </div>
- <form-dia ref="formDia" @close="handleQuery"></form-dia>
- </div>
-</template>
-
-<script setup>
-import {onMounted, ref} from "vue";
-import FormDia from "@/views/productionManagement/productionDispatching/components/formDia.vue";
-import dayjs from "dayjs";
-import {schedulingListPage} from "@/api/productionManagement/productionOrder.js";
-
-const data = reactive({
- searchForm: {
- customerName: "",
- projectName: "",
- entryDate: [
- dayjs().format("YYYY-MM-DD"),
- dayjs().add(1, "day").format("YYYY-MM-DD"),
- ], // 褰曞叆鏃ユ湡
- entryDateStart: dayjs().format("YYYY-MM-DD"),
- entryDateEnd: dayjs().add(1, "day").format("YYYY-MM-DD"),
- },
-});
-const { searchForm } = toRefs(data);
-const tableColumn = ref([
- {
- label: "褰曞叆鏃ユ湡",
- prop: "entryDate",
- width: 120,
- },
- {
- label: "鍚堝悓鍙�",
- prop: "salesContractNo",
- width: 220,
- },
- {
- label: "瀹㈡埛鍚堝悓鍙�",
- prop: "customerContractNo",
- width: 250,
- },
- {
- label: "瀹㈡埛鍚嶇О",
- prop: "customerName",
- width: 250,
- },
- {
- label: "椤圭洰鍚嶇О",
- prop: "projectName",
- width:300
- },
- {
- label: "浜у搧澶х被",
- prop: "productCategory",
- width: 160,
- },
- {
- label: "瑙勬牸鍨嬪彿",
- prop: "specificationModel",
- width: 220,
- },
- {
- label: "鍗曚綅",
- prop: "unit",
- width:90
- },
- {
- label: "鏁伴噺",
- prop: "quantity",
- },
- {
- label: "鎺掍骇鏁伴噺",
- prop: "schedulingNum",
- width: 100,
- },
- {
- label: "寰呮帓鏁伴噺",
- prop: "pendingQuantity",
- width: 100,
- },
-]);
-const tableData = ref([]);
-const selectedRows = ref([]);
-const tableLoading = ref(false);
-const page = reactive({
- current: 1,
- size: 100,
- total: 0,
-});
-const formDia = ref()
-const { proxy } = getCurrentInstance()
-
-// 鏌ヨ鍒楄〃
-/** 鎼滅储鎸夐挳鎿嶄綔 */
-const handleQuery = () => {
- page.current = 1;
- getList();
-};
-const changeDaterange = (value) => {
- if (value) {
- searchForm.value.entryDateStart = value[0];
- searchForm.value.entryDateEnd = value[1];
- } else {
- searchForm.value.entryDateStart = undefined;
- searchForm.value.entryDateEnd = undefined;
- }
- handleQuery();
-};
-const pagination = (obj) => {
- page.current = obj.page;
- page.size = obj.limit;
- getList();
-};
-const getList = () => {
- tableLoading.value = true;
- // 鏋勯�犱竴涓柊鐨勫璞★紝涓嶅寘鍚玡ntryDate瀛楁
- const params = { ...searchForm.value, ...page };
- params.entryDate = undefined
- schedulingListPage(params).then((res) => {
- tableLoading.value = false;
- // 澶勭悊姣忔潯鏁版嵁锛屽鍔爌endingQuantity瀛楁
- tableData.value = res.data.records.map(item => ({
- ...item,
- pendingQuantity: (Number(item.quantity) || 0) - (Number(item.schedulingNum) || 0)
- }));
- page.total = res.data.total;
- }).catch(() => {
- tableLoading.value = false;
- })
-};
-// 琛ㄦ牸閫夋嫨鏁版嵁
-const handleSelectionChange = (selection) => {
- selectedRows.value = selection;
-};
-
-// 鎵撳紑寮规
-const openForm = (type) => {
- if (selectedRows.value.length !== 1) {
- proxy.$message.error("璇烽�夋嫨涓�鏉℃暟鎹�");
- return;
- }
- if (selectedRows.value[0].pendingQuantity == 0) {
- proxy.$message.warning("鏃犻渶鍐嶆淳宸�");
- return;
- }
- nextTick(() => {
- formDia.value?.openDialog(type, selectedRows.value[0])
- })
-};
-
-onMounted(() => {
- searchForm.value.entryDate = [
- dayjs().format("YYYY-MM-DD"),
- dayjs().add(1, "day").format("YYYY-MM-DD"),
- ]
- searchForm.value.entryDateStart = dayjs().format("YYYY-MM-DD")
- searchForm.value.entryDateEnd = dayjs().add(1, "day").format("YYYY-MM-DD")
- getList();
-});
-</script>
-
-<style scoped></style>
diff --git a/src/views/productionManagement/productionOrder/index.vue b/src/views/productionManagement/productionOrder/index.vue
deleted file mode 100644
index e65fd3b..0000000
--- a/src/views/productionManagement/productionOrder/index.vue
+++ /dev/null
@@ -1,190 +0,0 @@
-<template>
- <div class="app-container">
- <div class="search_form">
- <div>
- <span class="search_title">瀹㈡埛鍚嶇О锛�</span>
- <el-input
- v-model="searchForm.customerName"
- style="width: 240px"
- placeholder="璇疯緭鍏�"
- @change="handleQuery"
- clearable
- prefix-icon="Search"
- />
- <span class="search_title ml10">椤圭洰鍚嶇О锛�</span>
- <el-input
- v-model="searchForm.projectName"
- style="width: 240px"
- placeholder="璇疯緭鍏�"
- @change="handleQuery"
- clearable
- prefix-icon="Search"
- />
- <span class="search_title ml10">褰曞叆鏃ユ湡锛�</span>
- <el-date-picker v-model="searchForm.entryDate" value-format="YYYY-MM-DD" format="YYYY-MM-DD" type="daterange"
- placeholder="璇烽�夋嫨" clearable @change="changeDaterange" />
- <el-button type="primary" @click="handleQuery" style="margin-left: 10px"
- >鎼滅储</el-button
- >
- </div>
- <div>
- <el-button @click="handleOut">瀵煎嚭</el-button>
- </div>
- </div>
- <div class="table_list">
- <PIMTable
- rowKey="id"
- :column="tableColumn"
- :tableData="tableData"
- :page="page"
- :tableLoading="tableLoading"
- @pagination="pagination"
- ></PIMTable>
- </div>
- </div>
-</template>
-
-<script setup>
-import {onMounted, ref} from "vue";
-import { ElMessageBox } from "element-plus";
-import dayjs from "dayjs";
-import {schedulingListPage} from "@/api/productionManagement/productionOrder.js";
-const { proxy } = getCurrentInstance();
-
-const tableColumn = ref([
- {
- label: "褰曞叆鏃ユ湡",
- prop: "entryDate",
- width: 120,
- },
- {
- label: "鍚堝悓鍙�",
- prop: "salesContractNo",
- width: 220,
- },
- {
- label: "瀹㈡埛鍚堝悓鍙�",
- prop: "customerContractNo",
- width: 250,
- },
- {
- label: "瀹㈡埛鍚嶇О",
- prop: "customerName",
- width: 250,
- },
- {
- label: "椤圭洰鍚嶇О",
- prop: "projectName",
- width:300
- },
- {
- label: "浜у搧澶х被",
- prop: "productCategory",
- width: 160,
- },
- {
- label: "瑙勬牸鍨嬪彿",
- prop: "specificationModel",
- width: 220,
- },
- {
- label: "鍗曚綅",
- prop: "unit",
- width:90
- },
- {
- label: "鏁伴噺",
- prop: "quantity",
- },
- {
- label: "鎺掍骇鏁伴噺",
- prop: "schedulingNum",
- width: 100,
- },
- {
- label: "瀹屽伐鏁伴噺",
- prop: "successNum",
- width: 100,
- },
-]);
-const tableData = ref([]);
-const tableLoading = ref(false);
-const page = reactive({
- current: 1,
- size: 100,
- total: 0,
-});
-
-const data = reactive({
- searchForm: {
- customerName: "",
- projectName: "",
- entryDate: [], // 褰曞叆鏃ユ湡
- entryDateStart: '',
- entryDateEnd: '',
- },
-});
-const { searchForm } = toRefs(data);
-
-// 鏌ヨ鍒楄〃
-/** 鎼滅储鎸夐挳鎿嶄綔 */
-const handleQuery = () => {
- page.current = 1;
- getList();
-};
-const pagination = (obj) => {
- page.current = obj.page;
- page.size = obj.limit;
- getList();
-};
-const changeDaterange = (value) => {
- if (value) {
- searchForm.value.entryDateStart = value[0];
- searchForm.value.entryDateEnd = value[1];
- } else {
- searchForm.value.entryDateStart = undefined;
- searchForm.value.entryDateEnd = undefined;
- }
- handleQuery();
-};
-const getList = () => {
- tableLoading.value = true;
- // 鏋勯�犱竴涓柊鐨勫璞★紝涓嶅寘鍚玡ntryDate瀛楁
- const params = { ...searchForm.value, ...page };
- params.entryDate = undefined
- schedulingListPage(params).then((res) => {
- tableLoading.value = false;
- tableData.value = res.data.records;
- page.total = res.data.total;
- }).catch(() => {
- tableLoading.value = false;
- })
-};
-
-// 瀵煎嚭
-const handleOut = () => {
- ElMessageBox.confirm("閫変腑鐨勫唴瀹瑰皢琚鍑猴紝鏄惁纭瀵煎嚭锛�", "瀵煎嚭", {
- confirmButtonText: "纭",
- cancelButtonText: "鍙栨秷",
- type: "warning",
- })
- .then(() => {
- proxy.download("/salesLedger/scheduling/export", {}, "鐢熶骇璁㈠崟.xlsx");
- })
- .catch(() => {
- proxy.$modal.msg("宸插彇娑�");
- });
-};
-
-onMounted(() => {
- searchForm.value.entryDate = [
- dayjs().format("YYYY-MM-DD"),
- dayjs().add(1, "day").format("YYYY-MM-DD"),
- ]
- searchForm.value.entryDateStart = dayjs().format("YYYY-MM-DD")
- searchForm.value.entryDateEnd = dayjs().add(1, "day").format("YYYY-MM-DD")
- getList();
-});
-</script>
-
-<style scoped lang="scss"></style>
diff --git a/src/views/productionManagement/productionReporting/components/formDia.vue b/src/views/productionManagement/productionReporting/components/formDia.vue
deleted file mode 100644
index 89f6c76..0000000
--- a/src/views/productionManagement/productionReporting/components/formDia.vue
+++ /dev/null
@@ -1,155 +0,0 @@
-<template>
- <div>
- <el-dialog
- v-model="dialogFormVisible"
- title="鐢熶骇鎶ュ伐"
- width="70%"
- @close="closeDia"
- >
- <el-form :model="form" label-width="140px" label-position="top" :rules="rules" ref="formRef">
- <el-row :gutter="30">
- <el-col :span="12">
- <el-form-item label="鎺掍骇鏁伴噺锛�" prop="schedulingNum">
- <el-input v-model="form.schedulingNum" placeholder="璇疯緭鍏�" clearable disabled/>
- </el-form-item>
- </el-col>
- <el-col :span="12">
- <el-form-item label="鏈鐢熶骇鏁伴噺锛�" prop="finishedNum">
- <el-input-number
- v-model="form.finishedNum"
- placeholder="璇疯緭鍏�"
- :min="0"
- :step="0.1"
- :precision="2"
- clearable
- style="width: 100%"
- @change="changeNum"
- />
- </el-form-item>
- </el-col>
- </el-row>
- <el-row :gutter="30">
- <el-col :span="12">
- <el-form-item label="寰呯敓浜ф暟閲忥細" prop="pendingNum">
- <el-input v-model="form.pendingNum" placeholder="璇疯緭鍏�" clearable disabled/>
- </el-form-item>
- </el-col>
- </el-row>
- <el-row :gutter="30">
- <el-col :span="12">
- <el-form-item label="鐢熶骇浜猴細" prop="schedulingUserId">
- <el-select
- v-model="form.schedulingUserId"
- placeholder="閫夋嫨浜哄憳"
- style="width: 100%;"
- >
- <el-option
- v-for="user in userList"
- :key="user.userId"
- :label="user.nickName"
- :value="user.userId"
- />
- </el-select>
- </el-form-item>
- </el-col>
- <el-col :span="12">
- <el-form-item label="鐢熶骇鏃ユ湡锛�" prop="schedulingDate">
- <el-date-picker
- v-model="form.schedulingDate"
- type="date"
- placeholder="璇烽�夋嫨鏃ユ湡"
- value-format="YYYY-MM-DD"
- format="YYYY-MM-DD"
- clearable
- style="width: 100%"
- />
- </el-form-item>
- </el-col>
- </el-row>
- </el-form>
- <template #footer>
- <div class="dialog-footer">
- <el-button type="primary" @click="submitForm">纭</el-button>
- <el-button @click="closeDia">鍙栨秷</el-button>
- </div>
- </template>
- </el-dialog>
- </div>
-</template>
-
-<script setup>
-import {ref} from "vue";
-import {getStaffJoinInfo, staffJoinAdd, staffJoinUpdate} from "@/api/personnelManagement/onboarding.js";
-import {userListNoPageByTenantId} from "@/api/system/user.js";
-import {productionReport, productionReportUpdate} from "@/api/productionManagement/productionReporting.js";
-const { proxy } = getCurrentInstance()
-const emit = defineEmits(['close'])
-
-const userList = ref([])
-const dialogFormVisible = ref(false);
-const operationType = ref('')
-const data = reactive({
- form: {
- successNum: "",
- schedulingNum: "",
- finishedNum: "",
- schedulingUserId: "",
- schedulingDate: "",
- },
- rules: {
- schedulingNum: [{ required: true, message: "璇疯緭鍏�", trigger: "blur" },],
- },
-});
-const { form, rules } = toRefs(data);
-
-// 鎵撳紑寮规
-const openDialog = (type, row) => {
- operationType.value = type;
- dialogFormVisible.value = true;
- userListNoPageByTenantId().then((res) => {
- userList.value = res.data;
- });
- form.value = {...row}
-}
-
-const changeNum = (value) => {
- if (value > form.value.schedulingNum) {
- form.value.finishedNum = form.value.schedulingNum;
- proxy.$modal.msgWarning('鏈鐢熶骇鏁伴噺涓嶅彲澶т簬鎺掍骇鏁伴噺')
- }
- form.value.pendingNum = form.value.schedulingNum - form.value.finishedNum;
-}
-// 鎻愪氦浜у搧琛ㄥ崟
-const submitForm = () => {
- proxy.$refs.formRef.validate(valid => {
- if (valid) {
- form.value.staffState = 1
- if (operationType.value === "add") {
- productionReport(form.value).then(res => {
- proxy.$modal.msgSuccess("鎻愪氦鎴愬姛");
- closeDia();
- })
- } else {
- productionReportUpdate(form.value).then(res => {
- proxy.$modal.msgSuccess("鎻愪氦鎴愬姛");
- closeDia();
- })
- }
- }
- })
-}
-
-// 鍏抽棴寮规
-const closeDia = () => {
- proxy.resetForm("formRef");
- dialogFormVisible.value = false;
- emit('close')
-};
-defineExpose({
- openDialog,
-});
-</script>
-
-<style scoped>
-
-</style>
\ No newline at end of file
diff --git a/src/views/productionManagement/productionReporting/index.vue b/src/views/productionManagement/productionReporting/index.vue
deleted file mode 100644
index bcb2d5d..0000000
--- a/src/views/productionManagement/productionReporting/index.vue
+++ /dev/null
@@ -1,431 +0,0 @@
-<template>
- <div class="app-container">
- <div class="search_form">
- <el-form :model="searchForm" :inline="true">
- <el-form-item label="瀹㈡埛鍚嶇О:">
- <el-input v-model="searchForm.customerName" placeholder="璇疯緭鍏�" clearable prefix-icon="Search"
- style="width: 200px;"
- @change="handleQuery" />
- </el-form-item>
- <el-form-item label="椤圭洰鍚嶇О:">
- <el-input v-model="searchForm.projectName" placeholder="璇疯緭鍏�" clearable prefix-icon="Search"
- style="width: 200px;"
- @change="handleQuery" />
- </el-form-item>
- <el-form-item label="鎺掍骇鏃ユ湡:">
- <el-date-picker v-model="searchForm.entryDate" value-format="YYYY-MM-DD" format="YYYY-MM-DD" type="daterange"
- placeholder="璇烽�夋嫨" clearable @change="changeDaterange" />
- </el-form-item>
- <el-form-item label="鐘舵��:">
- <el-select v-model="searchForm.status" placeholder="璇烽�夋嫨鐘舵��" style="width: 140px" clearable>
- <el-option label="寰呯敓浜�" :value="1"></el-option>
- <el-option label="宸叉姤宸�" :value="3"></el-option>
- <el-option label="鐢熶骇涓�" :value="2"></el-option>
- </el-select>
- </el-form-item>
- <el-form-item>
- <el-button type="primary" @click="handleQuery">鎼滅储</el-button>
- </el-form-item>
- </el-form>
- </div>
- <div class="table_list">
- <div style="text-align: right" class="mb10">
- <el-button type="primary" @click="openForm('add')">鐢熶骇鎶ュ伐</el-button>
- </div>
- <PIMTable
- rowKey="id"
- :column="tableColumn"
- :tableData="tableData"
- :page="page"
- :isSelection="true"
- :expandRowKeys="expandedRowKeys"
- @expand-change="expandChange"
- @selection-change="handleSelectionChange"
- :tableLoading="tableLoading"
- @pagination="pagination"
- :total="page.total"
- >
- <template #expand="{ row }">
- <el-table
- :data="expandData"
- border
- show-summary
- stripe
- :summary-method="summarizeMainTable"
- v-loading="childrenLoading"
- >
- <el-table-column
- align="center"
- label="搴忓彿"
- type="index"
- width="60"
- />
- <el-table-column label="鏈鐢熶骇鏁伴噺" prop="finishedNum" align="center" width="400">
- <template #default="scope">
- <el-input-number :step="0.01" :min="0" style="width: 100%"
- v-model="scope.row.finishedNum"
- :disabled="!scope.row.editType"
- :precision="2"
- placeholder="璇疯緭鍏�"
- clearable
- @change="changeNum(scope.row)"
- />
- </template>
- </el-table-column>
-<!-- <el-table-column label="寰呯敓浜ф暟閲�" prop="pendingNum" width="240" align="center"></el-table-column>-->
- <el-table-column label="鐢熶骇浜�" prop="schedulingUserId" width="400">
- <template #default="scope">
- <el-select
- v-model="scope.row.schedulingUserId"
- placeholder="閫夋嫨浜哄憳"
- :disabled="!scope.row.editType"
- style="width: 100%;"
- >
- <el-option
- v-for="user in userList"
- :key="user.userId"
- :label="user.nickName"
- :value="user.userId"
- />
- </el-select>
- </template>
- </el-table-column>
- <el-table-column label="鐢熶骇鏃ユ湡" prop="schedulingDate" width="400">
- <template #default="scope">
- <el-date-picker
- v-model="scope.row.schedulingDate"
- type="date"
- :disabled="!scope.row.editType"
- placeholder="璇烽�夋嫨鏃ユ湡"
- value-format="YYYY-MM-DD"
- format="YYYY-MM-DD"
- clearable
- style="width: 100%"
- />
- </template>
- </el-table-column>
- <el-table-column label="鎿嶄綔" width="60">
- <template #default="scope">
- <el-button
- link
- type="primary"
- size="small"
- @click="changeEditType(scope.row)"
- v-if="!scope.row.editType"
- :disabled="scope.row.parentStatus === 3"
- >缂栬緫</el-button
- >
- <el-button
- link
- type="primary"
- size="small"
- @click="saveReceiptPayment(scope.row)"
- v-if="scope.row.editType"
- >淇濆瓨</el-button
- >
- </template>
- </el-table-column>
- </el-table>
- </template>
- </PIMTable>
- </div>
- <form-dia ref="formDia" @close="handleQuery"></form-dia>
- </div>
-</template>
-
-<script setup>
-import {onMounted, ref} from "vue";
-import FormDia from "@/views/productionManagement/productionReporting/components/formDia.vue";
-import {staffJoinDel, staffJoinListPage} from "@/api/personnelManagement/onboarding.js";
-import {ElMessageBox} from "element-plus";
-import dayjs from "dayjs";
-import {
- productionReportUpdate,
- workListPage,
- workListPageById
-} from "@/api/productionManagement/productionReporting.js";
-import {userListNoPageByTenantId} from "@/api/system/user.js";
-
-const data = reactive({
- searchForm: {
- staffName: "",
- entryDate: [
- dayjs().format("YYYY-MM-DD"),
- dayjs().add(1, "day").format("YYYY-MM-DD"),
- ], // 褰曞叆鏃ユ湡
- entryDateStart: dayjs().format("YYYY-MM-DD"),
- entryDateEnd: dayjs().add(1, "day").format("YYYY-MM-DD"),
- },
-});
-const { searchForm } = toRefs(data);
-const expandedRowKeys = ref([]);
-const expandData = ref([]);
-const userList = ref([])
-const tableColumn = ref([
- {
- type: "expand",
- dataType: "slot",
- slot: "expand",
- },
- {
- label: "鐘舵��",
- prop: "status",
- dataType: "tag",
- formatData: (params) => {
- if (params == 3) {
- return "宸叉姤宸�";
- } else if (params == 1) {
- return "寰呯敓浜�";
- } else {
- return '鐢熶骇涓�';
- }
- },
- formatType: (params) => {
- if (params == 3) {
- return "success";
- } else if (params == 1) {
- return "primary";
- } else {
- return 'warning';
- }
- },
- },
- {
- label: "鎺掍骇鏃ユ湡",
- prop: "schedulingDate",
- width: 120,
- },
- {
- label: "鎺掍骇浜�",
- prop: "schedulingUserName",
- },
- {
- label: "鍚堝悓鍙�",
- prop: "salesContractNo",
- width: 200,
- },
- {
- label: "瀹㈡埛鍚堝悓鍙�",
- prop: "customerContractNo",
- width: 200,
- },
- {
- label: "瀹㈡埛鍚嶇О",
- prop: "customerName",
- width: 200,
- },
- {
- label: "椤圭洰鍚嶇О",
- prop: "projectName",
- width:300
- },
- {
- label: "浜у搧澶х被",
- prop: "productCategory",
- width: 150,
- },
- {
- label: "瑙勬牸鍨嬪彿",
- prop: "specificationModel",
- width: 150,
- },
- {
- label: "鍗曚綅",
- prop: "unit",
- },
- {
- label: "宸ュ簭",
- prop: "process",
- },
- {
- label: "鎺掍骇鏁伴噺",
- prop: "schedulingNum",
- width: 100,
- },
- {
- label: "鐢熶骇鏁伴噺",
- prop: "finishedNum",
- width: 100,
- },
- {
- label: "寰呯敓浜ф暟閲�",
- prop: "pendingFinishNum",
- width: 100,
- },
-]);
-const tableData = ref([]);
-const selectedRows = ref([]);
-const tableLoading = ref(false);
-const childrenLoading = ref(false);
-const page = reactive({
- current: 1,
- size: 100,
- total: 0,
-});
-const formDia = ref()
-const { proxy } = getCurrentInstance()
-
-// 鏌ヨ鍒楄〃
-/** 鎼滅储鎸夐挳鎿嶄綔 */
-const handleQuery = () => {
- page.current = 1;
- getList();
-};
-const changeDaterange = (value) => {
- if (value) {
- searchForm.value.entryDateStart = value[0];
- searchForm.value.entryDateEnd = value[1];
- } else {
- searchForm.value.entryDateStart = undefined;
- searchForm.value.entryDateEnd = undefined;
- }
- handleQuery();
-};
-const pagination = (obj) => {
- page.current = obj.page;
- page.size = obj.limit;
- getList();
-};
-const getList = () => {
- tableLoading.value = true;
- const params = { ...searchForm.value, ...page };
- params.entryDate = undefined
- expandedRowKeys.value = []
- workListPage(params).then(res => {
- tableLoading.value = false;
- tableData.value = res.data.records.map(item => ({
- ...item,
- pendingFinishNum: (Number(item.schedulingNum) || 0) - (Number(item.finishedNum) || 0)
- }));
- page.total = res.data.total;
- }).catch(err => {
- tableLoading.value = false;
- })
-};
-// 灞曞紑琛�
-const expandChange = (row, expandedRows) => {
- userListNoPageByTenantId().then((res) => {
- userList.value = res.data;
- });
- if (expandedRows.length > 0) {
- nextTick(() => {
- expandedRowKeys.value = [];
- try {
- childrenLoading.value = true;
- workListPageById({ id: row.id }).then((res) => {
- childrenLoading.value = false;
- const index = tableData.value.findIndex((item) => item.id === row.id);
- if (index > -1) {
- expandData.value = res.data.map(item => ({
- ...item,
- pendingNum: (Number(item.schedulingNum) || 0) - (Number(item.finishedNum) || 0),
- parentStatus: row.status // 鏂板鐖惰〃鐘舵��
- }));
- }
- expandedRowKeys.value.push(row.id);
- });
- } catch (error) {
- childrenLoading.value = false;
- console.log(error);
- }
- })
- } else {
- expandedRowKeys.value = [];
- }
-};
-const changeNum = (row) => {
- // 鎵惧埌鐖惰〃鏍兼暟鎹�
- const parentRow = tableData.value.find(item => item.id === expandedRowKeys.value[0]);
- // 璁$畻鎵�鏈夊瓙琛ㄦ牸 finishedNum 鐨勬�诲拰
- const totalFinishedNum = expandData.value.reduce((sum, item) => sum + (Number(item.finishedNum) || 0), 0);
- // 鐖惰〃鏍肩殑鎺掍骇鏁伴噺
- const schedulingNum = parentRow ? Number(parentRow.schedulingNum) : 0;
-
- if (totalFinishedNum > schedulingNum) {
- // 鍥為��鏈杈撳叆
- row.finishedNum = schedulingNum - (totalFinishedNum - Number(row.finishedNum));
- proxy.$modal.msgWarning('鎵�鏈夋湰娆$敓浜ф暟閲忎箣鍜屼笉鍙ぇ浜庢帓浜ф暟閲�');
- }
- row.pendingNum = row.schedulingNum - row.finishedNum;
-}
-// 缂栬緫淇敼鐘舵��
-const changeEditType = (row) => {
- row.editType = !row.editType;
-};
-// 淇濆瓨璁板綍
-const saveReceiptPayment = (row) => {
- productionReportUpdate(row).then((res) => {
- row.editType = !row.editType;
- getList();
- proxy.$modal.msgSuccess("鎻愪氦鎴愬姛");
- });
-};
-// 琛ㄦ牸閫夋嫨鏁版嵁
-const handleSelectionChange = (selection) => {
- selectedRows.value = selection;
-};
-const summarizeMainTable = (param) => {
- return proxy.summarizeTable(param, [
- "finishedNum"
- ]);
-};
-// 鎵撳紑寮规
-const openForm = (type, row) => {
- if (selectedRows.value.length !== 1) {
- proxy.$message.error("璇烽�夋嫨涓�鏉℃暟鎹�");
- return;
- }
- if (selectedRows.value[0].pendingFinishNum == 0) {
- proxy.$message.warning("鏃犻渶鍐嶆姤宸�");
- return;
- }
- nextTick(() => {
- const rowInfo = type === 'add' ? selectedRows.value[0] : row
- formDia.value?.openDialog(type, rowInfo)
- })
-};
-
-// 鍒犻櫎
-const handleDelete = () => {
- let ids = [];
- if (selectedRows.value.length > 0) {
- ids = selectedRows.value.map((item) => item.id);
- } else {
- proxy.$modal.msgWarning("璇烽�夋嫨鏁版嵁");
- return;
- }
- ElMessageBox.confirm("閫変腑鐨勫唴瀹瑰皢琚垹闄わ紝鏄惁纭鍒犻櫎锛�", "瀵煎嚭", {
- confirmButtonText: "纭",
- cancelButtonText: "鍙栨秷",
- type: "warning",
- })
- .then(() => {
- staffJoinDel(ids).then((res) => {
- proxy.$modal.msgSuccess("鍒犻櫎鎴愬姛");
- getList();
- });
- })
- .catch(() => {
- proxy.$modal.msg("宸插彇娑�");
- });
-};
-// 瀵煎嚭
-const handleOut = () => {
- ElMessageBox.confirm("閫変腑鐨勫唴瀹瑰皢琚鍑猴紝鏄惁纭瀵煎嚭锛�", "瀵煎嚭", {
- confirmButtonText: "纭",
- cancelButtonText: "鍙栨秷",
- type: "warning",
- })
- .then(() => {
- proxy.download("/staff/staffJoinLeaveRecord/export", {staffState: 1}, "浜哄憳鍏ヨ亴.xlsx");
- })
- .catch(() => {
- proxy.$modal.msg("宸插彇娑�");
- });
-};
-onMounted(() => {
- getList();
-});
-</script>
-
-<style scoped></style>
diff --git a/src/views/productionManagement/safetyMonitoring/index.vue b/src/views/productionManagement/safetyMonitoring/index.vue
deleted file mode 100644
index 56f65e7..0000000
--- a/src/views/productionManagement/safetyMonitoring/index.vue
+++ /dev/null
@@ -1,873 +0,0 @@
-<template>
- <div class="safety-monitoring">
- <el-row :gutter="20">
- <!-- 宸︿晶锛氬疄鏃剁洃鎺у尯鍩� -->
- <el-col :span="16">
- <el-card class="monitoring-card">
- <div slot="header" class="card-header">
- <span>瀹炴椂姘斾綋娴撳害鐩戞帶</span>
- <el-tag :type="systemStatus === 'normal' ? 'success' : 'danger'">
- {{ systemStatus === 'normal' ? '绯荤粺姝e父' : '绯荤粺鍛婅' }}
- </el-tag>
- </div>
-
- <!-- 鍌ㄧ綈鍖虹洃鎺� -->
- <div class="monitoring-section">
- <h3>鍌ㄧ綈鍖虹洃鎺�</h3>
- <div class="sensor-grid">
- <div class="sensor-item" v-for="sensor in tankSensors" :key="sensor.id">
- <div class="sensor-header">
- <span>{{ sensor.name }}</span>
- <el-tag :type="sensor.status === 'normal' ? 'success' : 'danger'" size="small">
- {{ sensor.status === 'normal' ? '姝e父' : '瓒呮爣' }}
- </el-tag>
- </div>
- <div class="sensor-data">
- <div class="data-item">
- <span>鐢茬兎: {{ sensor.methane.toFixed(2) }}%</span>
- <el-progress
- :percentage="Math.min(Math.round(sensor.methane * 40 * 100) / 100, 100)"
- :color="getProgressColor(Math.min(Math.round(sensor.methane * 40 * 100) / 100, 100), 80)"
- :format="formatProgress"
- :stroke-width="8"
- />
- </div>
- <div class="data-item">
- <span>纭寲姘�: {{ sensor.h2s.toFixed(2) }}ppm</span>
- <el-progress
- :percentage="Math.min(Math.round((sensor.h2s / 20) * 100 * 100) / 100, 100)"
- :color="getProgressColor(Math.min(Math.round((sensor.h2s / 20) * 100 * 100) / 100, 100), 80)"
- :format="formatProgress"
- :stroke-width="8"
- />
- </div>
- </div>
- </div>
- </div>
- </div>
-
- <!-- 浜曞彛鍘嬬缉鏈虹洃鎺� -->
- <div class="monitoring-section">
- <h3>浜曞彛鍘嬬缉鏈虹洃鎺�</h3>
- <div class="sensor-grid">
- <div class="sensor-item" v-for="sensor in compressorSensors" :key="sensor.id">
- <div class="sensor-header">
- <span>{{ sensor.name }}</span>
- <el-tag :type="sensor.status === 'normal' ? 'success' : 'danger'" size="small">
- {{ sensor.status === 'normal' ? '姝e父' : '瓒呮爣' }}
- </el-tag>
- </div>
- <div class="sensor-data">
- <div class="data-item">
- <span>鐢茬兎: {{ sensor.methane.toFixed(2) }}%</span>
- <el-progress
- :percentage="Math.min(Math.round(sensor.methane * 40 * 100) / 100, 100)"
- :color="getProgressColor(sensor.methane, 2.5)"
- :format="formatProgress"
- :stroke-width="8"
- />
- </div>
- <div class="data-item">
- <span>纭寲姘�: {{ sensor.h2s.toFixed(2) }}ppm</span>
- <el-progress
- :percentage="Math.min(Math.round((sensor.h2s / 20) * 100 * 100) / 100, 100)"
- :color="getProgressColor(sensor.h2s, 10)"
- :format="formatProgress"
- :stroke-width="8"
- />
- </div>
- </div>
- </div>
- </div>
- </div>
-
- <!-- 瀹炴椂鏇茬嚎鍥� -->
- <div class="chart-section">
- <h3>瀹炴椂娴撳害鏇茬嚎</h3>
- <div class="chart-container">
- <div ref="chart" class="chart"></div>
- </div>
- </div>
- </el-card>
- </el-col>
-
- <!-- 鍙充晶锛氭帶鍒堕潰鏉� -->
- <el-col :span="8">
- <el-card class="control-card">
- <div slot="header" class="card-header">
- <span>搴旀�ユ帶鍒堕潰鏉�</span>
- </div>
-
- <!-- 鍠锋穻鐘舵�� -->
- <div class="control-section">
- <h4>鍠锋穻绯荤粺鐘舵��</h4>
- <div class="status-grid">
- <div class="status-item" v-for="sprinkler in sprinklerSystems" :key="sprinkler.id">
- <div class="status-indicator" :class="sprinkler.status">
- <i class="el-icon-circle-check" v-if="sprinkler.status === 'active'"></i>
- <i class="el-icon-circle-close" v-else></i>
- </div>
- <span>{{ sprinkler.name }}</span>
- <el-tag :type="sprinkler.status === 'active' ? 'success' : 'info'" size="small">
- {{ sprinkler.status === 'active' ? '杩愯涓�' : '寰呮満' }}
- </el-tag>
- </div>
- </div>
- </div>
-
- <!-- 搴旀�ヨ褰曟寜閽� -->
- <h4>搴旀�ョ鐞�</h4>
-
- <div class="control-section1">
- <el-button type="primary" @click="showEmergencyRecords" style="margin-bottom: 10px;">
- 搴旀�ヨ褰�
- </el-button>
- <el-button type="warning" @click="triggerEmergency" :disabled="!hasEmergency">
- 瑙﹀彂搴旀�ュ搷搴�
- </el-button>
- </div>
-
- <!-- 绯荤粺鏃ュ織 -->
- <div class="control-section">
- <h4>绯荤粺鏃ュ織</h4>
- <div class="log-container">
- <div class="log-item" v-for="log in systemLogs" :key="log.id">
- <span class="log-time">{{ log.time }}</span>
- <span class="log-content">{{ log.content }}</span>
- </div>
- </div>
- </div>
- </el-card>
- </el-col>
- </el-row>
-
- <!-- 娉勬紡棰勮寮圭獥 -->
- <el-dialog
- title="鈿狅笍 娉勬紡棰勮"
- :visible.sync="leakWarningVisible"
- width="500px"
- :close-on-click-modal="false"
- :close-on-press-escape="false"
- class="leak-warning-dialog"
- >
- <div class="warning-content">
- <div class="warning-icon">
- <i class="el-icon-warning"></i>
- </div>
- <div class="warning-text">
- <h3>妫�娴嬪埌姘斾綋娴撳害瓒呮爣锛�</h3>
- <p>浣嶇疆锛歿{ currentWarning.location }}</p>
- <p>瓒呮爣姘斾綋锛歿{ currentWarning.gas }}</p>
- <p>褰撳墠娴撳害锛歿{ currentWarning.value }}</p>
- </div>
- </div>
- <div slot="footer" class="dialog-footer">
- <el-button type="danger" @click="acknowledgeWarning">纭鍛婅</el-button>
- <el-button type="primary" @click="viewDetails">鏌ョ湅璇︽儏</el-button>
- </div>
- </el-dialog>
-
- <!-- 搴旀�ヨ褰曞脊绐� -->
- <el-dialog
- title="搴旀�ヨ褰�"
- :visible.sync="emergencyRecordsVisible"
- width="800px"
- >
- <el-table :data="emergencyRecords" style="width: 100%" stripe>
- <el-table-column prop="time" label="鏃堕棿" width="180"></el-table-column>
- <el-table-column prop="location" label="浣嶇疆" width="150"></el-table-column>
- <el-table-column prop="type" label="绫诲瀷" width="120"></el-table-column>
- <el-table-column prop="status" label="鐘舵��" width="100">
- <template slot-scope="scope">
- <el-tag :type="scope.row.status === 'resolved' ? 'success' : 'warning'">
- {{ scope.row.status === 'resolved' ? '宸茶В鍐�' : '澶勭悊涓�' }}
- </el-tag>
- </template>
- </el-table-column>
- <el-table-column prop="description" label="鎻忚堪"></el-table-column>
- <el-table-column label="鎿嶄綔" width="120">
- <template slot-scope="scope">
- <el-button type="text" @click="viewBlockchainDetails(scope.row)">
- 鍖哄潡閾捐鎯�
- </el-button>
- </template>
- </el-table-column>
- </el-table>
- </el-dialog>
-
- <!-- 鍖哄潡閾惧瓨璇佽鎯呭脊绐� -->
- <el-dialog
- title="鍖哄潡閾惧瓨璇佽鎯�"
- :visible.sync="blockchainDetailsVisible"
- width="900px"
- >
- <div class="blockchain-details">
- <el-descriptions :column="2" border>
- <el-descriptions-item label="浜嬩欢ID">{{ currentEvent.id }}</el-descriptions-item>
- <el-descriptions-item label="鏃堕棿鎴�">{{ currentEvent.timestamp }}</el-descriptions-item>
- <el-descriptions-item label="浣嶇疆">{{ currentEvent.location }}</el-descriptions-item>
- <el-descriptions-item label="浜嬩欢绫诲瀷">{{ currentEvent.type }}</el-descriptions-item>
- </el-descriptions>
-
- <div class="sensor-data-section">
- <h4>浼犳劅鍣ㄦ暟鎹�</h4>
- <el-table :data="currentEvent.sensorData" style="width: 100%" stripe>
- <el-table-column prop="sensor" label="浼犳劅鍣�"></el-table-column>
- <el-table-column prop="methane" label="鐢茬兎娴撳害"></el-table-column>
- <el-table-column prop="h2s" label="纭寲姘㈡祿搴�"></el-table-column>
- <el-table-column prop="timestamp" label="璁板綍鏃堕棿"></el-table-column>
- </el-table>
- </div>
-
- <div class="action-log-section">
- <h4>澶勭疆鍔ㄤ綔璁板綍</h4>
- <el-timeline>
- <el-timeline-item
- v-for="action in currentEvent.actions"
- :key="action.id"
- :timestamp="action.timestamp"
- :type="action.type === 'emergency' ? 'danger' : 'primary'"
- >
- {{ action.description }}
- </el-timeline-item>
- </el-timeline>
- </div>
-
- <div class="blockchain-info">
- <h4>鍖哄潡閾句俊鎭�</h4>
- <el-descriptions :column="1" border>
- <el-descriptions-item label="鍖哄潡鍝堝笇">{{ currentEvent.blockHash }}</el-descriptions-item>
- <el-descriptions-item label="浜ゆ槗鍝堝笇">{{ currentEvent.txHash }}</el-descriptions-item>
- <el-descriptions-item label="纭鏁�">{{ currentEvent.confirmations }}</el-descriptions-item>
- </el-descriptions>
- </div>
- </div>
- </el-dialog>
- </div>
-</template>
-
-<script>
-import * as echarts from 'echarts'
-
-export default {
- name: 'SafetyMonitoring',
- data() {
- return {
- systemStatus: 'normal',
- leakWarningVisible: false,
- emergencyRecordsVisible: false,
- blockchainDetailsVisible: false,
- currentWarning: {},
- currentEvent: {},
- hasEmergency: false,
-
- // 鍌ㄧ綈鍖轰紶鎰熷櫒鏁版嵁
- tankSensors: [
- { id: 1, name: '鍌ㄧ綈T-001', methane: 1.20, h2s: 2.10, status: 'normal' },
- { id: 2, name: '鍌ㄧ綈T-002', methane: 0.80, h2s: 1.50, status: 'normal' },
- { id: 3, name: '鍌ㄧ綈T-003', methane: 3.20, h2s: 8.50, status: 'warning' },
- { id: 4, name: '鍌ㄧ綈T-004', methane: 0.60, h2s: 0.80, status: 'normal' }
- ],
-
- // 浜曞彛鍘嬬缉鏈轰紶鎰熷櫒鏁版嵁
- compressorSensors: [
- { id: 5, name: '鍘嬬缉鏈篊-001', methane: 2.10, h2s: 3.20, status: 'normal' },
- { id: 6, name: '鍘嬬缉鏈篊-002', methane: 4.80, h2s: 12.50, status: 'warning' },
- { id: 7, name: '鍘嬬缉鏈篊-003', methane: 1.80, h2s: 2.80, status: 'normal' }
- ],
-
- // 鍠锋穻绯荤粺鐘舵��
- sprinklerSystems: [
- { id: 1, name: '鍌ㄧ綈鍖哄柗娣�', status: 'active' },
- { id: 2, name: '鍘嬬缉鏈哄尯鍠锋穻', status: 'standby' },
- { id: 3, name: '绱ф�ュ柗娣�', status: 'standby' }
- ],
-
- // 绯荤粺鏃ュ織
- systemLogs: [
- { id: 1, time: '14:30:25', content: '绯荤粺鍚姩瀹屾垚锛屾墍鏈変紶鎰熷櫒姝e父' },
- { id: 2, time: '14:35:12', content: '鍌ㄧ綈T-003鐢茬兎娴撳害瓒呮爣锛岃Е鍙戦璀�' },
- { id: 3, time: '14:35:15', content: '鍚姩鍌ㄧ綈鍖哄柗娣嬬郴缁�' },
- { id: 4, time: '14:35:20', content: '鍙戦�佺揣鎬ョ枏鏁e箍鎾�' }
- ],
-
- // 搴旀�ヨ褰�
- emergencyRecords: [
- {
- id: 'EM001',
- time: '2024-01-15 14:35:12',
- location: '鍌ㄧ綈T-003',
- type: '鐢茬兎瓒呮爣',
- status: 'resolved',
- description: '鍌ㄧ綈T-003鐢茬兎娴撳害杈惧埌3.2%锛岃秴杩囧畨鍏ㄩ槇鍊�2.5%'
- },
- {
- id: 'EM002',
- time: '2024-01-15 14:35:15',
- location: '鍘嬬缉鏈篊-002',
- type: '纭寲姘㈣秴鏍�',
- status: 'processing',
- description: '鍘嬬缉鏈篊-002纭寲姘㈡祿搴﹁揪鍒�12.5ppm锛岃秴杩囧畨鍏ㄩ槇鍊�10ppm'
- }
- ],
-
- // 鍥捐〃瀹炰緥
- chart: null,
-
- // 瀹氭椂鍣�
- timer: null
- }
- },
-
- mounted() {
- this.initChart()
- this.startDataRefresh()
- this.checkEmergencyStatus()
- },
-
- beforeDestroy() {
- if (this.timer) {
- clearInterval(this.timer)
- }
- if (this.chart) {
- this.chart.dispose()
- }
- },
-
- methods: {
- // 缁熶竴杩涘害鏉℃牸寮忓寲涓轰袱浣嶅皬鏁帮紝閬垮厤娴偣璇樊鏄剧ず
- formatProgress(percentage) {
- if (percentage == null || isNaN(percentage)) return '0.00%'
- const val = Math.round(Number(percentage) * 100) / 100
- return `${val.toFixed(2)}%`
- },
- // 鍒濆鍖栧浘琛�
- initChart() {
- this.chart = echarts.init(this.$refs.chart)
- this.updateChart()
- },
-
- // 鏇存柊鍥捐〃鏁版嵁
- updateChart() {
- const option = {
- title: {
- text: '瀹炴椂姘斾綋娴撳害鐩戞帶',
- left: 'center'
- },
- tooltip: {
- trigger: 'axis',
- axisPointer: {
- type: 'cross'
- }
- },
- legend: {
- data: ['鍌ㄧ綈鍖虹敳鐑�', '鍌ㄧ綈鍖虹~鍖栨阿', '鍘嬬缉鏈虹敳鐑�', '鍘嬬缉鏈虹~鍖栨阿'],
- top: 30
- },
- grid: {
- left: '3%',
- right: '4%',
- bottom: '3%',
- top: '15%',
- containLabel: true
- },
- xAxis: {
- type: 'category',
- data: this.generateTimeData()
- },
- yAxis: [
- {
- type: 'value',
- name: '鐢茬兎娴撳害(%)',
- position: 'left'
- },
- {
- type: 'value',
- name: '纭寲姘㈡祿搴�(ppm)',
- position: 'right'
- }
- ],
- series: [
- {
- name: '鍌ㄧ綈鍖虹敳鐑�',
- type: 'line',
- data: this.generateRandomData(20, 0.5, 3.5),
- smooth: true,
- yAxisIndex: 0
- },
- {
- name: '鍌ㄧ綈鍖虹~鍖栨阿',
- type: 'line',
- data: this.generateRandomData(20, 0.5, 12),
- smooth: true,
- yAxisIndex: 1
- },
- {
- name: '鍘嬬缉鏈虹敳鐑�',
- type: 'line',
- data: this.generateRandomData(20, 1.0, 5.0),
- smooth: true,
- yAxisIndex: 0
- },
- {
- name: '鍘嬬缉鏈虹~鍖栨阿',
- type: 'line',
- data: this.generateRandomData(20, 1.0, 15),
- smooth: true,
- yAxisIndex: 1
- }
- ]
- }
-
- this.chart.setOption(option)
- },
-
- // 鐢熸垚鏃堕棿鏁版嵁
- generateTimeData() {
- const times = []
- const now = new Date()
- for (let i = 19; i >= 0; i--) {
- const time = new Date(now.getTime() - i * 5 * 60 * 1000)
- times.push(time.toLocaleTimeString('zh-CN', { hour12: false }))
- }
- return times
- },
-
- // 鐢熸垚闅忔満鏁版嵁
- generateRandomData(count, min, max) {
- const data = []
- for (let i = 0; i < count; i++) {
- data.push(+(Math.random() * (max - min) + min).toFixed(2))
- }
- return data
- },
-
- // 寮�濮嬫暟鎹埛鏂�
- startDataRefresh() {
- this.timer = setInterval(() => {
- this.refreshSensorData()
- this.updateChart()
- this.checkEmergencyStatus()
- }, 5000) // 姣�5绉掑埛鏂颁竴娆�
- },
-
- // 鍒锋柊浼犳劅鍣ㄦ暟鎹�
- refreshSensorData() {
- // 鏇存柊鍌ㄧ綈鍖轰紶鎰熷櫒鏁版嵁
- this.tankSensors.forEach(sensor => {
- sensor.methane = +(Math.random() * 4).toFixed(2)
- sensor.h2s = +(Math.random() * 15).toFixed(2)
- sensor.status = this.getSensorStatus(sensor.methane, sensor.h2s)
- })
-
- // 鏇存柊鍘嬬缉鏈轰紶鎰熷櫒鏁版嵁
- this.compressorSensors.forEach(sensor => {
- sensor.methane = +(Math.random() * 6).toFixed(2)
- sensor.h2s = +(Math.random() * 20).toFixed(2)
- sensor.status = this.getSensorStatus(sensor.methane, sensor.h2s)
- })
-
- // 妫�鏌ユ槸鍚﹂渶瑕佽Е鍙戦璀�
- this.checkLeakWarning()
- },
-
- // 鑾峰彇浼犳劅鍣ㄧ姸鎬�
- getSensorStatus(methane, h2s) {
- const methanePct = Math.min(Math.round(methane * 40 * 100) / 100, 100)
- const h2sPct = Math.min(Math.round((h2s / 20) * 100 * 100) / 100, 100)
- if (methanePct >= 80 || h2sPct >= 80) {
- return 'warning'
- }
- return 'normal'
- },
-
- // 妫�鏌ユ硠婕忛璀�
- checkLeakWarning() {
- const allSensors = [...this.tankSensors, ...this.compressorSensors]
- const warningSensor = allSensors.find(sensor => this.getSensorStatus(sensor.methane, sensor.h2s) === 'warning')
-
- if (warningSensor && !this.leakWarningVisible) {
- this.triggerLeakWarning(warningSensor)
- }
- },
-
- // 瑙﹀彂娉勬紡棰勮
- triggerLeakWarning(sensor) {
- const methanePct = Math.min(Math.round(sensor.methane * 40 * 100) / 100, 100)
- const h2sPct = Math.min(Math.round((sensor.h2s / 20) * 100 * 100) / 100, 100)
- const isMethaneMajor = methanePct >= h2sPct
- const overGas = isMethaneMajor ? '鐢茬兎' : '纭寲姘�'
- const percent = (isMethaneMajor ? methanePct : h2sPct).toFixed(2)
- this.currentWarning = {
- location: sensor.name,
- gas: overGas,
- value: `${percent}%`
- }
-
- this.leakWarningVisible = true
- this.hasEmergency = true
-
- // 鑷姩瑙﹀彂搴旀�ュ搷搴�
- this.autoEmergencyResponse(sensor)
-
- // 娣诲姞绯荤粺鏃ュ織
- this.addSystemLog(`妫�娴嬪埌${sensor.name}姘斾綋娴撳害瓒呮爣锛岃Е鍙戞硠婕忛璀)
- },
-
- // 鑷姩搴旀�ュ搷搴�
- autoEmergencyResponse(sensor) {
- // 鍚姩鍠锋穻绯荤粺
- if (sensor.name.includes('鍌ㄧ綈')) {
- this.sprinklerSystems[0].status = 'active'
- } else if (sensor.name.includes('鍘嬬缉鏈�')) {
- this.sprinklerSystems[1].status = 'active'
- }
-
- // 娣诲姞绯荤粺鏃ュ織
- this.addSystemLog(`鍚姩${sensor.name}鍖哄煙鍠锋穻绯荤粺`)
- this.addSystemLog(`鍙戦�佺揣鎬ョ枏鏁e箍鎾璥)
-
- // 鍒涘缓搴旀�ヨ褰�
- this.createEmergencyRecord(sensor)
- },
-
- // 娣诲姞绯荤粺鏃ュ織
- addSystemLog(content) {
- const now = new Date()
- const time = now.toLocaleTimeString('zh-CN', { hour12: false })
-
- this.systemLogs.unshift({
- id: Date.now(),
- time: time,
- content: content
- })
-
- // 淇濇寔鏈�澶�20鏉℃棩蹇�
- if (this.systemLogs.length > 20) {
- this.systemLogs = this.systemLogs.slice(0, 20)
- }
- },
-
- // 鍒涘缓搴旀�ヨ褰�
- createEmergencyRecord(sensor) {
- const now = new Date()
- const record = {
- id: `EM${Date.now()}`,
- time: now.toLocaleString('zh-CN'),
- location: sensor.name,
- type: sensor.methane > 2.5 ? '鐢茬兎瓒呮爣' : '纭寲姘㈣秴鏍�',
- status: 'processing',
- description: `${sensor.name}妫�娴嬪埌${sensor.methane > 2.5 ? '鐢茬兎' : '纭寲姘�'}娴撳害瓒呮爣`
- }
-
- this.emergencyRecords.unshift(record)
- },
-
- // 鑾峰彇杩涘害鏉¢鑹�
- getProgressColor(value, threshold) {
- if (value > threshold) {
- return '#F56C6C'
- } else if (value > threshold * 0.8) {
- return '#E6A23C'
- }
- return '#67C23A'
- },
-
- // 妫�鏌ュ簲鎬ョ姸鎬�
- checkEmergencyStatus() {
- const allSensors = [...this.tankSensors, ...this.compressorSensors]
- const has = allSensors.some(sensor => this.getSensorStatus(sensor.methane, sensor.h2s) === 'warning')
- this.hasEmergency = has
- this.systemStatus = has ? 'warning' : 'normal'
- },
-
- // 纭鍛婅
- acknowledgeWarning() {
- this.leakWarningVisible = false
- this.addSystemLog('娉勬紡棰勮宸茬‘璁�')
- },
-
- // 鏌ョ湅璇︽儏
- viewDetails() {
- this.leakWarningVisible = false
- // 杩欓噷鍙互璺宠浆鍒拌缁嗛〉闈㈡垨鏄剧ず鏇村淇℃伅
- },
-
- // 鏄剧ず搴旀�ヨ褰�
- showEmergencyRecords() {
- this.emergencyRecordsVisible = true
- },
-
- // 鏌ョ湅鍖哄潡閾捐鎯�
- viewBlockchainDetails(record) {
- this.currentEvent = {
- id: record.id,
- timestamp: record.time,
- location: record.location,
- type: record.type,
- sensorData: [
- {
- sensor: '鐢茬兎浼犳劅鍣�',
- methane: '3.2%',
- h2s: '8.5ppm',
- timestamp: record.time
- },
- {
- sensor: '纭寲姘紶鎰熷櫒',
- methane: '2.8%',
- h2s: '12.5ppm',
- timestamp: record.time
- }
- ],
- actions: [
- {
- id: 1,
- timestamp: record.time,
- type: 'emergency',
- description: '妫�娴嬪埌姘斾綋娴撳害瓒呮爣锛岃Е鍙戦璀�'
- },
- {
- id: 2,
- timestamp: new Date(new Date(record.time).getTime() + 3000).toLocaleString('zh-CN'),
- type: 'action',
- description: '鍚姩鍠锋穻绯荤粺闄嶆俯'
- },
- {
- id: 3,
- timestamp: new Date(new Date(record.time).getTime() + 5000).toLocaleString('zh-CN'),
- type: 'action',
- description: '鍙戦�佺揣鎬ョ枏鏁e箍鎾�'
- }
- ],
- blockHash: '0x1234567890abcdef...',
- txHash: '0xabcdef1234567890...',
- confirmations: 12
- }
-
- this.emergencyRecordsVisible = false
- this.blockchainDetailsVisible = true
- },
-
- // 瑙﹀彂搴旀�ュ搷搴�
- triggerEmergency() {
- this.$message.success('搴旀�ュ搷搴斿凡瑙﹀彂')
- this.addSystemLog('鎵嬪姩瑙﹀彂搴旀�ュ搷搴�')
- }
- }
-}
-</script>
-
-<style scoped>
-.safety-monitoring {
- padding: 20px;
- background-color: #f5f7fa;
- min-height: calc(100vh - 84px);
-}
-
-.monitoring-card, .control-card {
- margin-bottom: 20px;
-}
-
-.card-header {
- display: flex;
- justify-content: space-between;
- align-items: center;
-}
-
-.monitoring-section {
- margin-bottom: 30px;
-}
-
-.monitoring-section h3 {
- color: #303133;
- margin-bottom: 15px;
- padding-bottom: 8px;
- border-bottom: 2px solid #409EFF;
-}
-
-.sensor-grid {
- display: grid;
- grid-template-columns: repeat(auto-fit, minmax(250px, 1fr));
- gap: 15px;
-}
-
-.sensor-item {
- background: #fff;
- border: 1px solid #e4e7ed;
- border-radius: 8px;
- padding: 15px;
- box-shadow: 0 2px 4px rgba(0,0,0,0.1);
-}
-
-.sensor-header {
- display: flex;
- justify-content: space-between;
- align-items: center;
- margin-bottom: 15px;
- font-weight: bold;
-}
-
-.sensor-data .data-item {
- margin-bottom: 12px;
-}
-
-.sensor-data .data-item span {
- display: block;
- margin-bottom: 5px;
- font-size: 14px;
- color: #606266;
-}
-
-.chart-section {
- margin-top: 30px;
-}
-
-.chart-section h3 {
- color: #303133;
- margin-bottom: 15px;
- padding-bottom: 8px;
- border-bottom: 2px solid #409EFF;
-}
-
-.chart-container {
- background: #fff;
- border-radius: 8px;
- padding: 20px;
-}
-
-.chart {
- width: 100%;
- height: 400px;
-}
-
-.control-section {
- margin-bottom: 25px;
-}
-.control-section1 {
- display: flex;
-}
-
-.control-section h4 {
- color: #303133;
- margin-bottom: 15px;
- font-size: 16px;
-}
-
-.status-grid {
- display: grid;
- gap: 10px;
-}
-
-.status-item {
- display: flex;
- align-items: center;
- gap: 10px;
- padding: 10px;
- background: #f8f9fa;
- border-radius: 6px;
-}
-
-.status-indicator {
- width: 20px;
- height: 20px;
- border-radius: 50%;
- display: flex;
- align-items: center;
- justify-content: center;
-}
-
-.status-indicator.active {
- color: #67C23A;
-}
-
-.status-indicator.standby {
- color: #909399;
-}
-
-.log-container {
- max-height: 200px;
- overflow-y: auto;
- background: #f8f9fa;
- border-radius: 6px;
- padding: 10px;
-}
-
-.log-item {
- display: flex;
- gap: 10px;
- margin-bottom: 8px;
- font-size: 12px;
-}
-
-.log-time {
- color: #909399;
- min-width: 60px;
-}
-
-.log-content {
- color: #606266;
-}
-
-/* 娉勬紡棰勮寮圭獥鏍峰紡 */
-.leak-warning-dialog {
- background: #fff5f5;
-}
-
-.warning-content {
- text-align: center;
- padding: 20px 0;
-}
-
-.warning-icon {
- font-size: 60px;
- color: #F56C6C;
- margin-bottom: 20px;
-}
-
-.warning-text h3 {
- color: #F56C6C;
- margin-bottom: 15px;
-}
-
-.warning-text p {
- margin: 8px 0;
- color: #606266;
-}
-
-/* 鍖哄潡閾捐鎯呮牱寮� */
-.blockchain-details {
- padding: 20px 0;
-}
-
-.sensor-data-section, .action-log-section, .blockchain-info {
- margin-top: 25px;
-}
-
-.sensor-data-section h4, .action-log-section h4, .blockchain-info h4 {
- color: #303133;
- margin-bottom: 15px;
- padding-bottom: 8px;
- border-bottom: 1px solid #e4e7ed;
-}
-
-/* 鍝嶅簲寮忚璁� */
-@media (max-width: 1200px) {
- .sensor-grid {
- grid-template-columns: repeat(auto-fit, minmax(200px, 1fr));
- }
-}
-
-@media (max-width: 768px) {
- .safety-monitoring {
- padding: 10px;
- }
-
- .sensor-grid {
- grid-template-columns: 1fr;
- }
-
- .chart {
- height: 300px;
- }
-}
-</style>
diff --git a/src/views/qualityManagement/finalInspection/components/filesDia.vue b/src/views/qualityManagement/finalInspection/components/filesDia.vue
deleted file mode 100644
index 66392f3..0000000
--- a/src/views/qualityManagement/finalInspection/components/filesDia.vue
+++ /dev/null
@@ -1,190 +0,0 @@
-<template>
- <div>
- <el-dialog
- v-model="dialogFormVisible"
- title="涓婁紶闄勪欢"
- width="50%"
- @close="closeDia"
- >
- <div style="margin-bottom: 10px;text-align: right">
- <el-upload
- v-model:file-list="fileList"
- class="upload-demo"
- :action="uploadUrl"
- :on-success="handleUploadSuccess"
- :on-error="handleUploadError"
- name="file"
- :show-file-list="false"
- :headers="headers"
- style="display: inline;margin-right: 10px"
- >
- <el-button type="primary">涓婁紶闄勪欢</el-button>
- </el-upload>
- <el-button type="danger" plain @click="handleDelete">鍒犻櫎</el-button>
- </div>
- <PIMTable
- rowKey="id"
- :column="tableColumn"
- :tableData="tableData"
- :tableLoading="tableLoading"
- :isSelection="true"
- @selection-change="handleSelectionChange"
- height="500"
- >
- </PIMTable>
- <pagination
- style="margin: 10px 0"
- v-show="total > 0"
- @pagination="paginationSearch"
- :total="total"
- :page="page.current"
- :limit="page.size"
- />
- <template #footer>
- <div class="dialog-footer">
- <el-button @click="closeDia">鍙栨秷</el-button>
- </div>
- </template>
- </el-dialog>
- </div>
-</template>
-
-<script setup>
-import {ref} from "vue";
-import {getStaffJoinInfo, staffJoinAdd, staffJoinUpdate} from "@/api/personnelManagement/onboarding.js";
-import {Search} from "@element-plus/icons-vue";
-import {
- qualityInspectParamDel,
- qualityInspectParamInfo,
- qualityInspectParamUpdate
-} from "@/api/qualityManagement/qualityInspectParam.js";
-import {ElMessageBox} from "element-plus";
-import {getToken} from "@/utils/auth.js";
-import {
- qualityInspectFileAdd,
- qualityInspectFileDel,
- qualityInspectFileListPage
-} from "@/api/qualityManagement/qualityInspectFile.js";
-import Pagination from "@/components/PIMTable/Pagination.vue";
-const { proxy } = getCurrentInstance()
-const emit = defineEmits(['close'])
-
-const dialogFormVisible = ref(false);
-const currentId = ref('')
-const selectedRows = ref([]);
-const tableColumn = ref([
- {
- label: "鏂囦欢鍚嶇О",
- prop: "name",
- },
- {
- dataType: "action",
- label: "鎿嶄綔",
- align: "center",
- operation: [
- {
- name: "涓嬭浇",
- type: "text",
- clickFun: (row) => {
- downLoadFile(row);
- },
- }
- ],
- },
-]);
-const page = reactive({
- current: 1,
- size: 100,
-});
-const total = ref(0);
-const tableData = ref([]);
-const fileList = ref([]);
-const tableLoading = ref(false);
-const headers = ref({
- Authorization: "Bearer " + getToken(),
-});
-const uploadUrl = ref(import.meta.env.VITE_APP_BASE_API + "/file/upload"); // 涓婁紶鐨勫浘鐗囨湇鍔″櫒鍦板潃
-
-// 鎵撳紑寮规
-const openDialog = (row) => {
- dialogFormVisible.value = true;
- currentId.value = row.id;
- getList()
-}
-const paginationSearch = (obj) => {
- page.current = obj.page;
- page.size = obj.limit;
- getList();
-};
-const getList = () => {
- qualityInspectFileListPage({inspectId: currentId.value}).then(res => {
- tableData.value = res.data.records;
- total.value = res.data.total;
- })
-}
-// 琛ㄦ牸閫夋嫨鏁版嵁
-const handleSelectionChange = (selection) => {
- selectedRows.value = selection;
-};
-// 涓嬭浇闄勪欢
-const downLoadFile = (row) => {
- proxy.$download.name(row.url);
-}
-// 鍏抽棴寮规
-const closeDia = () => {
- dialogFormVisible.value = false;
- emit('close')
-};
-// 涓婁紶鎴愬姛澶勭悊
-function handleUploadSuccess(res, file) {
- // 濡傛灉涓婁紶鎴愬姛
- if (res.code == 200) {
- const fileRow = {}
- fileRow.name = res.data.originalName
- fileRow.url = res.data.tempPath
- uploadFile(fileRow)
- } else {
- proxy.$modal.msgError("鏂囦欢涓婁紶澶辫触");
- }
-}
-function uploadFile(file) {
- file.inspectId = currentId.value;
- qualityInspectFileAdd(file).then(res => {
- proxy.$modal.msgSuccess("鏂囦欢涓婁紶鎴愬姛");
- getList()
- })
-}
-// 涓婁紶澶辫触澶勭悊
-function handleUploadError() {
- proxy.$modal.msgError("鏂囦欢涓婁紶澶辫触");
-}
-// 鍒犻櫎
-const handleDelete = () => {
- let ids = [];
- if (selectedRows.value.length > 0) {
- ids = selectedRows.value.map((item) => item.id);
- } else {
- proxy.$modal.msgWarning("璇烽�夋嫨鏁版嵁");
- return;
- }
- ElMessageBox.confirm("閫変腑鐨勫唴瀹瑰皢琚垹闄わ紝鏄惁纭鍒犻櫎锛�", "瀵煎嚭", {
- confirmButtonText: "纭",
- cancelButtonText: "鍙栨秷",
- type: "warning",
- }).then(() => {
- qualityInspectFileDel(ids).then((res) => {
- proxy.$modal.msgSuccess("鍒犻櫎鎴愬姛");
- getList();
- });
- }).catch(() => {
- proxy.$modal.msg("宸插彇娑�");
- });
-};
-defineExpose({
- openDialog,
-});
-</script>
-
-<style scoped>
-
-</style>
\ No newline at end of file
diff --git a/src/views/qualityManagement/finalInspection/components/formDia.vue b/src/views/qualityManagement/finalInspection/components/formDia.vue
deleted file mode 100644
index 6547e3f..0000000
--- a/src/views/qualityManagement/finalInspection/components/formDia.vue
+++ /dev/null
@@ -1,278 +0,0 @@
-<template>
- <div>
- <el-dialog
- v-model="dialogFormVisible"
- :title="operationType === 'add' ? '鏂板鍑哄巶妫�楠�' : '缂栬緫鍑哄巶妫�楠�'"
- width="70%"
- @close="closeDia"
- >
- <el-form :model="form" label-width="140px" label-position="top" :rules="rules" ref="formRef">
- <el-row :gutter="30">
- <el-col :span="12">
- <el-form-item label="浜у搧鍚嶇О锛�" prop="productId">
- <el-tree-select
- v-model="form.productId"
- placeholder="璇烽�夋嫨"
- clearable
- check-strictly
- @change="getModels"
- :data="productOptions"
- :render-after-expand="false"
- style="width: 100%"
- />
- </el-form-item>
- </el-col>
- <el-col :span="12">
- <el-form-item label="瑙勬牸鍨嬪彿锛�" prop="model">
- <el-input v-model="form.model" placeholder="璇疯緭鍏�" clearable/>
- </el-form-item>
- </el-col>
- </el-row>
- <el-row :gutter="30">
- <el-col :span="12">
- <el-form-item label="鍗曚綅锛�" prop="unit">
- <el-input v-model="form.unit" placeholder="璇疯緭鍏�" clearable/>
- </el-form-item>
- </el-col>
- <el-col :span="12">
- <el-form-item label="鏁伴噺锛�" prop="quantity">
- <el-input-number :step="0.01" :min="0" style="width: 100%" v-model="form.quantity" placeholder="璇疯緭鍏�" clearable :precision="2"/>
- </el-form-item>
- </el-col>
- </el-row>
- <el-row :gutter="30">
- <el-col :span="12">
- <el-form-item label="妫�娴嬪崟浣嶏細" prop="checkCompany">
- <el-input v-model="form.checkCompany" placeholder="璇疯緭鍏�" clearable/>
- </el-form-item>
- </el-col>
- <el-col :span="12">
- <el-form-item label="妫�娴嬬粨鏋滐細" prop="checkResult">
- <el-select v-model="form.checkResult">
- <el-option label="鍚堟牸" value="鍚堟牸" />
- <el-option label="涓嶅悎鏍�" value="涓嶅悎鏍�" />
- </el-select>
- </el-form-item>
- </el-col>
- </el-row>
- <el-row :gutter="30">
- <el-col :span="12">
- <el-form-item label="妫�楠屽憳锛�" prop="checkName">
- <el-select v-model="form.checkName" placeholder="璇烽�夋嫨" clearable>
- <el-option v-for="item in userList" :key="item.nickName" :label="item.nickName"
- :value="item.nickName"/>
- </el-select>
- </el-form-item>
- </el-col>
- <el-col :span="12">
- <el-form-item label="妫�娴嬫棩鏈燂細" prop="checkTime">
- <el-date-picker
- v-model="form.checkTime"
- type="date"
- placeholder="璇烽�夋嫨鏃ユ湡"
- value-format="YYYY-MM-DD"
- format="YYYY-MM-DD"
- clearable
- style="width: 100%"
- />
- </el-form-item>
- </el-col>
- </el-row>
- </el-form>
- <PIMTable
- rowKey="id"
- :column="tableColumn"
- :tableData="tableData"
- :tableLoading="tableLoading"
- height="400"
- >
- <template #slot="{ row }">
- <el-input v-model="row.testValue" clearable/>
- </template>
- </PIMTable>
- <template #footer>
- <div class="dialog-footer">
- <el-button type="primary" @click="submitForm">纭</el-button>
- <el-button @click="closeDia">鍙栨秷</el-button>
- </div>
- </template>
- </el-dialog>
- </div>
-</template>
-
-<script setup>
-import {ref} from "vue";
-import {getOptions} from "@/api/procurementManagement/procurementLedger.js";
-import {productTreeList} from "@/api/basicData/product.js";
-import {qualityInspectAdd, qualityInspectUpdate} from "@/api/qualityManagement/rawMaterialInspection.js";
-import {userListNoPage} from "@/api/system/user.js";
-import {qualityInspectDetailByProductId} from "@/api/qualityManagement/metricMaintenance.js";
-import {qualityInspectParamInfo} from "@/api/qualityManagement/qualityInspectParam.js";
-const { proxy } = getCurrentInstance()
-const emit = defineEmits(['close'])
-
-const dialogFormVisible = ref(false);
-const operationType = ref('')
-const data = reactive({
- form: {
- checkTime: "",
- process: "",
- checkName: "",
- productName: "",
- productId: "",
- model: "",
- unit: "",
- quantity: "",
- checkCompany: "",
- checkResult: "",
- },
- rules: {
- checkTime: [{ required: false, message: "璇疯緭鍏�", trigger: "blur" },],
- process: [{ required: true, message: "璇疯緭鍏�", trigger: "blur" }],
- checkName: [{ required: false, message: "璇疯緭鍏�", trigger: "blur" }],
- productId: [{ required: true, message: "璇疯緭鍏�", trigger: "blur" }],
- model: [{ required: false, message: "璇疯緭鍏�", trigger: "blur" }],
- unit: [{ required: false, message: "璇疯緭鍏�", trigger: "blur" }],
- quantity: [{ required: true, message: "璇疯緭鍏�", trigger: "blur" }],
- checkCompany: [{ required: false, message: "璇疯緭鍏�", trigger: "blur" }],
- checkResult: [{ required: true, message: "璇疯緭鍏�", trigger: "change" }],
- },
-});
-const { form, rules } = toRefs(data);
-const supplierList = ref([]);
-const productOptions = ref([]);
-const tableColumn = ref([
- {
- label: "鎸囨爣",
- prop: "parameterItem",
- },
- {
- label: "鍗曚綅",
- prop: "unit",
- },
- {
- label: "鏍囧噯鍊�",
- prop: "standardValue",
- },
- {
- label: "鍐呮帶鍊�",
- prop: "controlValue",
- },
- {
- label: "妫�楠屽��",
- prop: "testValue",
- dataType: 'slot',
- slot: 'slot',
- },
-]);
-const tableData = ref([]);
-const tableLoading = ref(false);
-const userList = ref([]);
-const currentProductId = ref(0);
-
-// 鎵撳紑寮规
-const openDialog = async (type, row) => {
- operationType.value = type;
- dialogFormVisible.value = true;
- getOptions().then((res) => {
- supplierList.value = res.data;
- });
- let userLists = await userListNoPage();
- userList.value = userLists.data;
- form.value = {}
- getProductOptions();
- if (operationType.value === 'edit') {
- form.value = {...row}
- currentProductId.value = row.productId || 0
- getQualityInspectParamList(row.id)
- }
-}
-const getProductOptions = () => {
- productTreeList().then((res) => {
- productOptions.value = convertIdToValue(res);
- });
-};
-const getModels = (value) => {
- currentProductId.value = value
- form.value.productName = findNodeById(productOptions.value, value);
- if (currentProductId) {
- getList();
- }
-};
-const findNodeById = (nodes, productId) => {
- for (let i = 0; i < nodes.length; i++) {
- if (nodes[i].value === productId) {
- return nodes[i].label; // 鎵惧埌鑺傜偣锛岃繑鍥炶鑺傜偣
- }
- if (nodes[i].children && nodes[i].children.length > 0) {
- const foundNode = findNodeById(nodes[i].children, productId);
- if (foundNode) {
- return foundNode; // 鍦ㄥ瓙鑺傜偣涓壘鍒帮紝杩斿洖璇ヨ妭鐐�
- }
- }
- }
- return null; // 娌℃湁鎵惧埌鑺傜偣锛岃繑鍥瀗ull
-};
-function convertIdToValue(data) {
- return data.map((item) => {
- const { id, children, ...rest } = item;
- const newItem = {
- ...rest,
- value: id, // 灏� id 鏀逛负 value
- };
- if (children && children.length > 0) {
- newItem.children = convertIdToValue(children);
- }
-
- return newItem;
- });
-}
-// 鎻愪氦浜у搧琛ㄥ崟
-const submitForm = () => {
- proxy.$refs.formRef.validate(valid => {
- if (valid) {
- form.value.inspectType = 2
- if (operationType.value === "add") {
- tableData.value.forEach((item) => {
- delete item.id
- })
- }
- const data = {...form.value, qualityInspectParams: tableData.value}
- if (operationType.value === "add") {
- qualityInspectAdd(data).then(res => {
- proxy.$modal.msgSuccess("鎻愪氦鎴愬姛");
- closeDia();
- })
- } else {
- qualityInspectUpdate(data).then(res => {
- proxy.$modal.msgSuccess("鎻愪氦鎴愬姛");
- closeDia();
- })
- }
- }
- })
-}
-const getList = () => {
- qualityInspectDetailByProductId(currentProductId.value).then(res => {
- tableData.value = res.data;
- })
-}
-const getQualityInspectParamList = (id) => {
- qualityInspectParamInfo(id).then(res => {
- tableData.value = res.data;
- })
-}
-// 鍏抽棴寮规
-const closeDia = () => {
- proxy.resetForm("formRef");
- dialogFormVisible.value = false;
- emit('close')
-};
-defineExpose({
- openDialog,
-});
-</script>
-
-<style scoped>
-
-</style>
\ No newline at end of file
diff --git a/src/views/qualityManagement/finalInspection/components/inspectionFormDia.vue b/src/views/qualityManagement/finalInspection/components/inspectionFormDia.vue
deleted file mode 100644
index 32a36fa..0000000
--- a/src/views/qualityManagement/finalInspection/components/inspectionFormDia.vue
+++ /dev/null
@@ -1,140 +0,0 @@
-<template>
- <div>
- <el-dialog
- v-model="dialogFormVisible"
- title="濉啓妫�楠岃褰�"
- width="70%"
- @close="closeDia"
- >
- <div style="margin-bottom: 10px;text-align: right">
- <el-button type="danger" plain @click="handleDelete">鍒犻櫎</el-button>
- </div>
- <PIMTable
- rowKey="id"
- :column="tableColumn"
- :tableData="tableData"
- :tableLoading="tableLoading"
- :isSelection="true"
- @selection-change="handleSelectionChange"
- height="600"
- >
- <template #slot="{ row }">
- <el-input v-model="row.testValue" clearable/>
- </template>
- </PIMTable>
- <template #footer>
- <div class="dialog-footer">
- <el-button type="primary" @click="submitForm">纭</el-button>
- <el-button @click="closeDia">鍙栨秷</el-button>
- </div>
- </template>
- </el-dialog>
- </div>
-</template>
-
-<script setup>
-import {ref} from "vue";
-import {getStaffJoinInfo, staffJoinAdd, staffJoinUpdate} from "@/api/personnelManagement/onboarding.js";
-import {Search} from "@element-plus/icons-vue";
-import {
- qualityInspectParamDel,
- qualityInspectParamInfo,
- qualityInspectParamUpdate
-} from "@/api/qualityManagement/qualityInspectParam.js";
-import {ElMessageBox} from "element-plus";
-const { proxy } = getCurrentInstance()
-const emit = defineEmits(['close'])
-
-const dialogFormVisible = ref(false);
-const operationType = ref('')
-const currentId = ref('')
-const selectedRows = ref([]);
-const tableColumn = ref([
- {
- label: "鎸囨爣",
- prop: "parameterItem",
- },
- {
- label: "鍗曚綅",
- prop: "unit",
- },
- {
- label: "鏍囧噯鍊�",
- prop: "standardValue",
- },
- {
- label: "鍐呮帶鍊�",
- prop: "controlValue",
- },
- {
- label: "妫�楠屽��",
- prop: "testValue",
- dataType: 'slot',
- slot: 'slot',
- },
-]);
-const tableData = ref([]);
-const tableLoading = ref(false);
-
-// 鎵撳紑寮规
-const openDialog = (type, row) => {
- operationType.value = type;
- dialogFormVisible.value = true;
- if (operationType.value === 'edit') {
- currentId.value = row.id;
- getList()
- }
-}
-const getList = () => {
- qualityInspectParamInfo(currentId.value).then(res => {
- tableData.value = res.data;
- })
-}
-// 琛ㄦ牸閫夋嫨鏁版嵁
-const handleSelectionChange = (selection) => {
- selectedRows.value = selection;
-};
-// 鎻愪氦浜у搧琛ㄥ崟
-const submitForm = () => {
- qualityInspectParamUpdate(tableData.value).then(res => {
- proxy.$modal.msgSuccess("鎻愪氦鎴愬姛");
- closeDia();
- })
-}
-// 鍏抽棴寮规
-const closeDia = () => {
- dialogFormVisible.value = false;
- emit('close')
-};
-// 鍒犻櫎
-const handleDelete = () => {
- let ids = [];
- if (selectedRows.value.length > 0) {
- ids = selectedRows.value.map((item) => item.id);
- } else {
- proxy.$modal.msgWarning("璇烽�夋嫨鏁版嵁");
- return;
- }
- ElMessageBox.confirm("閫変腑鐨勫唴瀹瑰皢琚垹闄わ紝鏄惁纭鍒犻櫎锛�", "瀵煎嚭", {
- confirmButtonText: "纭",
- cancelButtonText: "鍙栨秷",
- type: "warning",
- })
- .then(() => {
- qualityInspectParamDel(ids).then((res) => {
- proxy.$modal.msgSuccess("鍒犻櫎鎴愬姛");
- getList();
- });
- })
- .catch(() => {
- proxy.$modal.msg("宸插彇娑�");
- });
-};
-defineExpose({
- openDialog,
-});
-</script>
-
-<style scoped>
-
-</style>
\ No newline at end of file
diff --git a/src/views/qualityManagement/finalInspection/index.vue b/src/views/qualityManagement/finalInspection/index.vue
deleted file mode 100644
index 3f2595f..0000000
--- a/src/views/qualityManagement/finalInspection/index.vue
+++ /dev/null
@@ -1,381 +0,0 @@
-<template>
- <div class="app-container">
- <div class="search_form">
- <div>
- <span class="search_title">浜у搧鍚嶇О锛�</span>
- <el-input
- v-model="searchForm.productName"
- style="width: 240px"
- placeholder="璇疯緭鍏ヤ骇鍝佸悕绉版悳绱�"
- @change="handleQuery"
- clearable
- :prefix-icon="Search"
- />
- <span style="margin-left: 10px" class="search_title">妫�娴嬫棩鏈燂細</span>
- <el-date-picker v-model="searchForm.entryDate" value-format="YYYY-MM-DD" format="YYYY-MM-DD" type="daterange"
- placeholder="璇烽�夋嫨" clearable @change="changeDaterange" />
- <el-button type="primary" @click="handleQuery" style="margin-left: 10px"
- >鎼滅储</el-button
- >
- </div>
- <div>
- <el-button type="primary" @click="openForm('add')">鏂板</el-button>
- <el-button @click="handleOut">瀵煎嚭</el-button>
- <el-button type="danger" plain @click="handleDelete">鍒犻櫎</el-button>
- </div>
- </div>
- <div class="table_list">
- <PIMTable
- rowKey="id"
- :column="tableColumn"
- :tableData="tableData"
- :page="page"
- :isSelection="true"
- @selection-change="handleSelectionChange"
- :tableLoading="tableLoading"
- @pagination="pagination"
- :total="page.total"
- ></PIMTable>
- </div>
- <InspectionFormDia ref="inspectionFormDia" @close="handleQuery"></InspectionFormDia>
- <FormDia ref="formDia" @close="handleQuery"></FormDia>
- <files-dia ref="filesDia" @close="handleQuery"></files-dia>
- <el-dialog v-model="dialogFormVisible" title="缂栬緫妫�楠屽憳" width="30%"
- @close="closeDia">
- <el-form :model="form" label-width="140px" label-position="top" :rules="rules" ref="formRef">
- <el-form-item label="妫�楠屽憳锛�" prop="checkName">
- <el-select v-model="form.checkName" placeholder="璇烽�夋嫨" clearable>
- <el-option v-for="item in userList" :key="item.nickName" :label="item.nickName"
- :value="item.nickName"/>
- </el-select>
- </el-form-item>
- </el-form>
- <template #footer>
- <div class="dialog-footer">
- <el-button type="primary" @click="submitForm">纭</el-button>
- <el-button @click="closeDia">鍙栨秷</el-button>
- </div>
- </template>
- </el-dialog>
- </div>
-</template>
-
-<script setup>
-import { Search } from "@element-plus/icons-vue";
-import {onMounted, ref} from "vue";
-import InspectionFormDia from "@/views/qualityManagement/finalInspection/components/inspectionFormDia.vue";
-import FormDia from "@/views/qualityManagement/finalInspection/components/formDia.vue";
-import {ElMessageBox} from "element-plus";
-import {
- downloadQualityInspect,
- qualityInspectDel,
- qualityInspectListPage, qualityInspectUpdate,
- submitQualityInspect
-} from "@/api/qualityManagement/rawMaterialInspection.js";
-import FilesDia from "@/views/qualityManagement/finalInspection/components/filesDia.vue";
-import dayjs from "dayjs";
-import {userListNoPage} from "@/api/system/user.js";
-
-const data = reactive({
- searchForm: {
- productName: "",
- entryDate: [
- dayjs().format("YYYY-MM-DD"),
- dayjs().add(1, "day").format("YYYY-MM-DD"),
- ], // 褰曞叆鏃ユ湡
- entryDateStart: dayjs().format("YYYY-MM-DD"),
- entryDateEnd: dayjs().add(1, "day").format("YYYY-MM-DD"),
- },
- rules: {
- checkName: [{required: true, message: "璇烽�夋嫨", trigger: "change"}],
- },
-});
-const { searchForm } = toRefs(data);
-const tableColumn = ref([
- {
- label: "妫�娴嬫棩鏈�",
- prop: "checkTime",
- width: 120
- },
- {
- label: "妫�楠屽憳",
- prop: "checkName",
- },
- {
- label: "浜у搧鍚嶇О",
- prop: "productName",
- },
- {
- label: "瑙勬牸鍨嬪彿",
- prop: "model",
- },
- {
- label: "鍗曚綅",
- prop: "unit",
- },
- {
- label: "鏁伴噺",
- prop: "quantity",
- width: 100
- },
- {
- label: "妫�娴嬪崟浣�",
- prop: "checkCompany",
- width: 120
- },
- {
- label: "妫�娴嬬粨鏋�",
- prop: "checkResult",
- dataType: "tag",
- formatType: (params) => {
- if (params == '涓嶅悎鏍�') {
- return "danger";
- } else if (params == '鍚堟牸') {
- return "success";
- } else {
- return null;
- }
- },
- },
- {
- label: "鎻愪氦鐘舵��",
- prop: "inspectState",
- formatData: (params) => {
- if (params) {
- return "宸叉彁浜�";
- } else {
- return "鏈彁浜�";
- }
- },
- },
- {
- dataType: "action",
- label: "鎿嶄綔",
- align: "center",
- fixed: "right",
- width: 280,
- operation: [
- {
- name: "缂栬緫",
- type: "text",
- clickFun: (row) => {
- openForm("edit", row);
- },
- disabled: (row) => {
- return row.inspectState == 1;
- }
- },
- {
- name: "闄勪欢",
- type: "text",
- clickFun: (row) => {
- openFilesFormDia(row);
- },
- },
- {
- name: "鎻愪氦",
- type: "text",
- clickFun: (row) => {
- submit(row.id);
- },
- disabled: (row) => {
- return row.inspectState == 1;
- }
- },
- {
- name: "鍒嗛厤妫�楠屽憳",
- type: "text",
- clickFun: (row) => {
- if (!row.checkName) {
- open(row)
- } else {
- proxy.$modal.msgError("妫�楠屽憳宸插瓨鍦�");
- }
- },
- disabled: (row) => {
- return row.inspectState == 1 || row.checkName;
- }
- },
- {
- name: "涓嬭浇",
- type: "text",
- clickFun: (row) => {
- downLoadFile(row);
- },
- },
- ],
- },
-]);
-const tableData = ref([]);
-const selectedRows = ref([]);
-const tableLoading = ref(false);
-const currentRow = ref(null)
-const page = reactive({
- current: 1,
- size: 100,
- total: 0
-});
-const formDia = ref()
-const filesDia = ref()
-const inspectionFormDia = ref()
-const { proxy } = getCurrentInstance()
-const userList = ref([]);
-const form = ref({
- checkName: ""
-});
-const dialogFormVisible = ref(false);
-
-const changeDaterange = (value) => {
- searchForm.value.entryDateStart = undefined;
- searchForm.value.entryDateEnd = undefined;
- if (value) {
- searchForm.value.entryDateStart = dayjs(value[0]).format("YYYY-MM-DD");
- searchForm.value.entryDateEnd = dayjs(value[1]).format("YYYY-MM-DD");
- }
- getList();
-};
-// 鏌ヨ鍒楄〃
-/** 鎼滅储鎸夐挳鎿嶄綔 */
-const handleQuery = () => {
- page.current = 1;
- getList();
-};
-const pagination = (obj) => {
- page.current = obj.page;
- page.size = obj.limit;
- getList();
-};
-const getList = () => {
- tableLoading.value = true;
- const params = { ...searchForm.value, ...page };
- params.entryDate = undefined
- qualityInspectListPage({...params, inspectType: 2}).then(res => {
- tableLoading.value = false;
- tableData.value = res.data.records
- page.total = res.data.total;
- }).catch(err => {
- tableLoading.value = false;
- })
-};
-// 琛ㄦ牸閫夋嫨鏁版嵁
-const handleSelectionChange = (selection) => {
- selectedRows.value = selection;
-};
-
-// 鎵撳紑寮规
-const openForm = (type, row) => {
- nextTick(() => {
- formDia.value?.openDialog(type, row)
- })
-};
-// 鎵撳紑鏂板妫�楠屽脊妗�
-const openInspectionForm = (type, row) => {
- nextTick(() => {
- inspectionFormDia.value?.openDialog(type, row)
- })
-};
-// 鎵撳紑闄勪欢寮规
-const openFilesFormDia = (type, row) => {
- nextTick(() => {
- filesDia.value?.openDialog(type, row)
- })
-};
-
-// 鍒犻櫎
-const handleDelete = () => {
- let ids = [];
- if (selectedRows.value.length > 0) {
- ids = selectedRows.value.map((item) => item.id);
- } else {
- proxy.$modal.msgWarning("璇烽�夋嫨鏁版嵁");
- return;
- }
- ElMessageBox.confirm("閫変腑鐨勫唴瀹瑰皢琚垹闄わ紝鏄惁纭鍒犻櫎锛�", "瀵煎嚭", {
- confirmButtonText: "纭",
- cancelButtonText: "鍙栨秷",
- type: "warning",
- })
- .then(() => {
- qualityInspectDel(ids).then((res) => {
- proxy.$modal.msgSuccess("鍒犻櫎鎴愬姛");
- getList();
- });
- })
- .catch(() => {
- proxy.$modal.msg("宸插彇娑�");
- });
-};
-// 瀵煎嚭
-const handleOut = () => {
- ElMessageBox.confirm("閫変腑鐨勫唴瀹瑰皢琚鍑猴紝鏄惁纭瀵煎嚭锛�", "瀵煎嚭", {
- confirmButtonText: "纭",
- cancelButtonText: "鍙栨秷",
- type: "warning",
- })
- .then(() => {
- proxy.download("/quality/qualityInspect/export", {inspectType: 2}, "鍑哄巶妫�楠�.xlsx");
- })
- .catch(() => {
- proxy.$modal.msg("宸插彇娑�");
- });
-};
-
-// 鎻愪环
-const submit = async (id) => {
- const res = await submitQualityInspect({id: id})
- if (res.code === 200) {
- proxy.$modal.msgSuccess("鎻愪氦鎴愬姛");
- getList();
- }
-}
-
-// 鍏抽棴寮规
-const closeDia = () => {
- proxy.resetForm("formRef");
- dialogFormVisible.value = false;
-};
-
-const submitForm = () => {
- if (currentRow.value) {
- const data = {
- ...form.value,
- id: currentRow.value.id
- }
- qualityInspectUpdate(data).then(res => {
- proxy.$modal.msgSuccess("鎻愪氦鎴愬姛");
- closeDia();
- getList();
- })
- }
-};
-
-const open = async (row) => {
- let userLists = await userListNoPage();
- userList.value = userLists.data;
- currentRow.value = row
- dialogFormVisible.value = true
-}
-
-const downLoadFile = (row) => {
- downloadQualityInspect({ id: row.id }).then((blobData) => {
- const blob = new Blob([blobData], {
- type: 'application/vnd.openxmlformats-officedocument.wordprocessingml.document',
- })
- const downloadUrl = window.URL.createObjectURL(blob)
-
- const link = document.createElement('a')
- link.href = downloadUrl
- link.download = '鍘熸潗鏂欐楠屾姤鍛�.docx'
- document.body.appendChild(link)
- link.click()
-
- document.body.removeChild(link)
- window.URL.revokeObjectURL(downloadUrl)
- })
-};
-onMounted(() => {
- getList();
-});
-</script>
-
-<style scoped></style>
diff --git a/src/views/qualityManagement/metricMaintenance/index.vue b/src/views/qualityManagement/metricMaintenance/index.vue
deleted file mode 100644
index 016a4c1..0000000
--- a/src/views/qualityManagement/metricMaintenance/index.vue
+++ /dev/null
@@ -1,415 +0,0 @@
-<template>
- <div class="app-container product-view">
- <div class="left">
- <div>
- <el-input
- v-model="search"
- style="width: 210px"
- placeholder="杈撳叆鍏抽敭瀛楄繘琛屾悳绱�"
- @change="searchFilter"
- @clear="searchFilter"
- clearable
- prefix-icon="Search"
- />
- </div>
- <div ref="containerRef">
- <el-tree
- ref="tree"
- v-loading="treeLoad"
- :data="list"
- @node-click="handleNodeClick"
- :expand-on-click-node="false"
- default-expand-all
- :default-expanded-keys="expandedKeys"
- :draggable="true"
- :filter-node-method="filterNode"
- :props="{ children: 'children', label: 'label' }"
- highlight-current
- node-key="id"
- style="
- height: calc(100vh - 190px);
- overflow-y: scroll;
- scrollbar-width: none;
- "
- >
- <template #default="{ node, data }">
- <div class="custom-tree-node">
- <span class="tree-node-content">
- <el-icon class="orange-icon">
- <component :is="data.children && data.children.length > 0
- ? node.expanded ? 'FolderOpened' : 'Folder' : 'Tickets'" />
- </el-icon>
- {{ data.label }}
- </span>
- </div>
- </template>
- </el-tree>
- </div>
- </div>
- <div class="right">
- <div style="margin-bottom: 10px">
- <el-button type="primary" @click="openModelDia('add')">
- 鏂板妫�娴嬫寚鏍�
- </el-button>
- <el-button @click="handleOut">瀵煎嚭</el-button>
- <el-button
- type="danger"
- @click="handleDelete"
- style="margin-left: 10px"
- plain
- >
- 鍒犻櫎
- </el-button>
- </div>
- <PIMTable
- rowKey="id"
- :column="tableColumn"
- :tableData="tableData"
- :page="page"
- :isSelection="true"
- @selection-change="handleSelectionChange"
- :tableLoading="tableLoading"
- @pagination="pagination"
- :total="page.total"
- ></PIMTable>
- </div>
- <el-dialog
- v-model="modelDia"
- title="妫�娴嬫寚鏍�"
- width="400px"
- @close="closeModelDia"
- >
- <el-form
- :model="modelForm"
- label-width="140px"
- label-position="top"
- :rules="modelRules"
- ref="modelFormRef"
- >
- <el-row>
- <el-col :span="24">
- <el-form-item label="鎸囨爣锛�" prop="parameterItem">
- <el-input
- v-model="modelForm.parameterItem"
- placeholder="璇疯緭鍏ユ寚鏍�"
- clearable
- />
- </el-form-item>
- </el-col>
- </el-row>
- <el-row>
- <el-col :span="24">
- <el-form-item label="鍗曚綅锛�" prop="unit">
- <el-input
- v-model="modelForm.unit"
- placeholder="璇疯緭鍏ュ崟浣�"
- clearable
- />
- </el-form-item>
- </el-col>
- </el-row>
- <el-row>
- <el-col :span="24">
- <el-form-item label="鏍囧噯鍊硷細" prop="standardValue">
- <el-input
- v-model="modelForm.standardValue"
- placeholder="璇疯緭鍏ユ爣鍑嗗��"
- clearable
- />
- </el-form-item>
- </el-col>
- </el-row>
- <el-row>
- <el-col :span="24">
- <el-form-item label="鍐呮帶鍊硷細" prop="controlValue">
- <el-input
- v-model="modelForm.controlValue"
- placeholder="璇疯緭鍏ュ唴鎺у��"
- clearable
- />
- </el-form-item>
- </el-col>
- </el-row>
- </el-form>
- <template #footer>
- <div class="dialog-footer">
- <el-button type="primary" @click="submitModelForm">纭</el-button>
- <el-button @click="closeModelDia">鍙栨秷</el-button>
- </div>
- </template>
- </el-dialog>
- </div>
-</template>
-
-<script setup>
-import {ref} from "vue";
-import {addOrEditProductModel, delProductModel, modelListPage, productTreeList} from "@/api/basicData/product.js";
-import ImportExcel from "@/views/basicData/product/ImportExcel/index.vue";
-import {ElMessageBox} from "element-plus";
-import {
- qualityTestStandardAdd, qualityTestStandardDel,
- qualityTestStandardListPage,
- qualityTestStandardUpdate
-} from "@/api/qualityManagement/metricMaintenance.js";
-const { proxy } = getCurrentInstance();
-// 鏍�
-const search = ref("");
-const treeLoad = ref(false);
-const list = ref([]);
-const expandedKeys = ref([]);
-const currentId = ref("");
-const currentParentId = ref("");
-// 鎸囨爣琛ㄦ牸
-const tableData = ref([]);
-const tableLoading = ref(false);
-const page = reactive({
- current: 1,
- size: 10,
-});
-const tableColumn = ref([
- {
- label: "鎸囨爣",
- prop: "parameterItem",
- },
- {
- label: "鍗曚綅",
- prop: "unit",
- },
- {
- label: "鏍囧噯鍊�",
- prop: "standardValue",
- },
- {
- label: "鍐呮帶鍊�",
- prop: "controlValue",
- },
- {
- dataType: "action",
- label: "鎿嶄綔",
- align: "center",
- operation: [
- {
- name: "缂栬緫",
- type: "text",
- clickFun: (row) => {
- openModelDia("edit", row);
- },
- },
- ],
- },
-]);
-const selectedRows = ref([]);
-// 鎸囨爣寮规
-const modelDia = ref(false);
-const modelOperationType = ref("");
-const data = reactive({
- modelForm: {
- parameterItem: "",
- unit: "",
- standardValue: "",
- controlValue: "",
- },
- modelRules: {
- parameterItem: [{ required: true, message: "璇疯緭鍏�", trigger: "blur" }],
- unit: [{ required: true, message: "璇疯緭鍏�", trigger: "blur" }],
- standardValue: [{ required: true, message: "璇疯緭鍏�", trigger: "blur" }],
- controlValue: [{ required: true, message: "璇疯緭鍏�", trigger: "blur" }],
- },
-});
-const { modelForm, modelRules } = toRefs(data);
-
-// 鏌ヨ浜у搧鏍�
-const getProductTreeList = () => {
- treeLoad.value = true;
- productTreeList().then((res) => {
- list.value = res;
- list.value.forEach((a) => {
- expandedKeys.value.push(a.label);
- });
- treeLoad.value = false;
- }).catch((err) => {
- treeLoad.value = false;
- });
-};
-// 杩囨护浜у搧鏍�
-const searchFilter = () => {
- proxy.$refs.tree.filter(search.value);
-};
-// 閫夋嫨浜у搧
-const handleNodeClick = (val, node, el) => {
- // 鍙湁鍙跺瓙鑺傜偣鎵嶆墽琛屼互涓嬮�昏緫
- currentId.value = val.id;
- currentParentId.value = val.parentId;
- getModelList();
-};
-// 琛ㄦ牸閫夋嫨鏁版嵁
-const handleSelectionChange = (selection) => {
- selectedRows.value = selection;
-};
-// 鏌ヨ鎸囨爣鏁版嵁
-const pagination = (obj) => {
- page.current = obj.page;
- page.size = obj.limit;
- getModelList();
-};
-const getModelList = () => {
- tableLoading.value = true;
- qualityTestStandardListPage({
- productId: currentId.value,
- current: page.current,
- size: page.size,
- }).then((res) => {
- tableData.value = res.data.records;
- page.total = res.data.total;
- tableLoading.value = false;
- });
-};
-// 璋冪敤tree杩囨护鏂规硶 涓枃鑻辫繃婊�
-const filterNode = (value, data, node) => {
- if (!value) {
- //濡傛灉鏁版嵁涓虹┖锛屽垯杩斿洖true,鏄剧ず鎵�鏈夌殑鏁版嵁椤�
- return true;
- }
- // 鏌ヨ鍒楄〃鏄惁鏈夊尮閰嶆暟鎹紝灏嗗�煎皬鍐欙紝鍖归厤鑻辨枃鏁版嵁
- let val = value.toLowerCase();
- return chooseNode(val, data, node); // 璋冪敤杩囨护浜屽眰鏂规硶
-};
-// 杩囨护鐖惰妭鐐� / 瀛愯妭鐐� (濡傛灉杈撳叆鐨勫弬鏁版槸鐖惰妭鐐逛笖鑳藉尮閰嶏紝鍒欒繑鍥炶鑺傜偣浠ュ強鍏朵笅鐨勬墍鏈夊瓙鑺傜偣锛涘鏋滃弬鏁版槸瀛愯妭鐐癸紝鍒欒繑鍥炶鑺傜偣鐨勭埗鑺傜偣銆俷ame鏄腑鏂囧瓧绗︼紝enName鏄嫳鏂囧瓧绗�.
-const chooseNode = (value, data, node) => {
- if (data.label.indexOf(value) !== -1) {
- return true;
- }
- const level = node.level;
- // 濡傛灉浼犲叆鐨勮妭鐐规湰韬氨鏄竴绾ц妭鐐瑰氨涓嶇敤鏍¢獙浜�
- if (level === 1) {
- return false;
- }
- // 鍏堝彇褰撳墠鑺傜偣鐨勭埗鑺傜偣
- let parentData = node.parent;
- // 閬嶅巻褰撳墠鑺傜偣鐨勭埗鑺傜偣
- let index = 0;
- while (index < level - 1) {
- // 濡傛灉鍖归厤鍒扮洿鎺ヨ繑鍥烇紝姝ゅname鍊兼槸涓枃瀛楃锛宔nName鏄嫳鏂囧瓧绗︺�傚垽鏂尮閰嶄腑鑻辨枃杩囨护
- if (parentData.data.label.indexOf(value) !== -1) {
- return true;
- }
- // 鍚﹀垯鐨勮瘽鍐嶅線涓婁竴灞傚仛鍖归厤
- parentData = parentData.parent;
- index++;
- }
- // 娌″尮閰嶅埌杩斿洖false
- return false;
-};
-// 鎵撳紑鎸囨爣寮规
-const openModelDia = (type, data) => {
- modelOperationType.value = type;
- modelDia.value = true;
- modelForm.value.model = "";
- modelForm.value.model = "";
- modelForm.value.id = "";
- if (type === "edit") {
- modelForm.value = { ...data };
- }
-};
-// 瀵煎嚭
-const handleOut = () => {
- ElMessageBox.confirm("閫変腑鐨勫唴瀹瑰皢琚鍑猴紝鏄惁纭瀵煎嚭锛�", "瀵煎嚭", {
- confirmButtonText: "纭",
- cancelButtonText: "鍙栨秷",
- type: "warning",
- }).then(() => {
- proxy.download("/quality/qualityTestStandard/export", {}, "妫�娴嬫寚鏍�.xlsx");
- }).catch(() => {
- proxy.$modal.msg("宸插彇娑�");
- });
-};
-
-// 鍒犻櫎鎸囨爣
-const handleDelete = () => {
- let ids = [];
- if (selectedRows.value.length > 0) {
- ids = selectedRows.value.map((item) => item.id);
- } else {
- proxy.$modal.msgWarning("璇烽�夋嫨鏁版嵁");
- return;
- }
- ElMessageBox.confirm("閫変腑鐨勫唴瀹瑰皢琚垹闄わ紝鏄惁纭鍒犻櫎锛�", "鍒犻櫎鎻愮ず", {
- confirmButtonText: "纭",
- cancelButtonText: "鍙栨秷",
- type: "warning",
- }).then(() => {
- tableLoading.value = true;
- qualityTestStandardDel(ids).then((res) => {
- proxy.$modal.msgSuccess("鍒犻櫎鎴愬姛");
- getModelList();
- }).finally(() => {
- tableLoading.value = false;
- });
- }).catch(() => {
- proxy.$modal.msg("宸插彇娑�");
- });
-};
-
-// 鎻愪氦瑙勬牸鍨嬪彿淇敼
-const submitModelForm = () => {
- proxy.$refs.modelFormRef.validate((valid) => {
- if (valid) {
- modelForm.value.productId = Number(currentId.value);
- if(modelOperationType.value === 'add') {
- qualityTestStandardAdd(modelForm.value).then((res) => {
- proxy.$modal.msgSuccess("鎻愪氦鎴愬姛");
- closeModelDia();
- getModelList();
- });
- } else {
- qualityTestStandardUpdate(modelForm.value).then((res) => {
- proxy.$modal.msgSuccess("鎻愪氦鎴愬姛");
- closeModelDia();
- getModelList();
- });
- }
- }
- });
-};
-// 鍏抽棴鍨嬪彿寮规
-const closeModelDia = () => {
- proxy.$refs.modelFormRef.resetFields();
- modelDia.value = false;
-};
-getProductTreeList();
-</script>
-
-<style scoped>
-.product-view {
- display: flex;
-}
-.left {
- width: 380px;
- padding: 16px;
- background: #ffffff;
-}
-.right {
- width: calc(100% - 380px);
- padding: 16px;
- margin-left: 20px;
- background: #ffffff;
-}
-.custom-tree-node {
- flex: 1;
- display: flex;
- align-items: center;
- justify-content: space-between;
- font-size: 14px;
- padding-right: 8px;
-}
-.tree-node-content {
- display: flex;
- align-items: center; /* 鍨傜洿灞呬腑 */
- height: 100%;
-}
-.orange-icon {
- color: orange;
- font-size: 18px;
- margin-right: 8px; /* 鍥炬爣涓庢枃瀛椾箣闂村姞鐐归棿璺� */
-}
-</style>
\ No newline at end of file
diff --git a/src/views/qualityManagement/nonconformingManagement/components/formDia.vue b/src/views/qualityManagement/nonconformingManagement/components/formDia.vue
deleted file mode 100644
index 13a231d..0000000
--- a/src/views/qualityManagement/nonconformingManagement/components/formDia.vue
+++ /dev/null
@@ -1,249 +0,0 @@
-<template>
- <div>
- <el-dialog
- v-model="dialogFormVisible"
- :title="operationType === 'add' ? '鏂板涓嶅悎鏍肩鐞�' : '缂栬緫涓嶅悎鏍肩鐞�'"
- width="70%"
- @close="closeDia"
- >
- <el-form :model="form" label-width="140px" label-position="top" :rules="rules" ref="formRef">
- <el-row :gutter="30">
- <el-col :span="12">
- <el-form-item label="鐘舵�侊細" prop="inspectState">
- <el-select v-model="form.inspectState">
- <el-option label="寰呭鐞�" :value="0" />
- <el-option label="宸插鐞�" :value="1" />
- </el-select>
- </el-form-item>
- </el-col>
- <el-col :span="12">
- <el-form-item label="绫诲埆锛�" prop="inspectType">
- <el-select v-model="form.inspectType">
- <el-option label="鍘熸潗鏂欐楠�" :value="0" />
- <el-option label="杩囩▼妫�楠�" :value="1" />
- <el-option label="鍑哄巶妫�楠�" :value="2" />
- </el-select>
- </el-form-item>
- </el-col>
- </el-row>
- <el-row :gutter="30">
- <el-col :span="12">
- <el-form-item label="浜у搧鍚嶇О锛�" prop="productId">
- <el-tree-select
- v-model="form.productId"
- placeholder="璇烽�夋嫨"
- clearable
- check-strictly
- @change="getModels"
- :data="productOptions"
- :render-after-expand="false"
- style="width: 100%"
- />
- </el-form-item>
- </el-col>
- <el-col :span="12">
- <el-form-item label="瑙勬牸鍨嬪彿锛�" prop="model">
- <el-input v-model="form.model" placeholder="璇疯緭鍏�" clearable/>
- </el-form-item>
- </el-col>
- </el-row>
- <el-row :gutter="30">
- <el-col :span="12">
- <el-form-item label="鍗曚綅锛�" prop="unit">
- <el-input v-model="form.unit" placeholder="璇疯緭鍏�" clearable/>
- </el-form-item>
- </el-col>
- <el-col :span="12">
- <el-form-item label="鏁伴噺锛�" prop="quantity">
- <el-input-number :step="0.01" :min="0" style="width: 100%" v-model="form.quantity" placeholder="璇疯緭鍏�" clearable :precision="2"/>
- </el-form-item>
- </el-col>
- </el-row>
- <el-row :gutter="30">
- <el-col :span="12">
- <el-form-item label="妫�楠屽憳锛�" prop="checkName">
- <el-input v-model="form.checkName" placeholder="璇疯緭鍏�" clearable/>
- </el-form-item>
- </el-col>
- <el-col :span="12">
- <el-form-item label="妫�娴嬫棩鏈燂細" prop="checkTime">
- <el-date-picker
- v-model="form.checkTime"
- type="date"
- placeholder="璇烽�夋嫨鏃ユ湡"
- value-format="YYYY-MM-DD"
- format="YYYY-MM-DD"
- clearable
- style="width: 100%"
- />
- </el-form-item>
- </el-col>
- </el-row>
- <el-row :gutter="30">
- <el-col :span="12">
- <el-form-item label="涓嶅悎鏍肩幇璞★細" prop="defectivePhenomena">
- <el-input v-model="form.defectivePhenomena" placeholder="璇疯緭鍏�" clearable/>
- </el-form-item>
- </el-col>
- <el-col :span="12">
- <el-form-item label="澶勭悊缁撴灉锛�" prop="dealResult">
- <el-input v-model="form.dealResult" placeholder="璇疯緭鍏�" clearable/>
- </el-form-item>
- </el-col>
- </el-row>
- <el-row :gutter="30">
- <el-col :span="12">
- <el-form-item label="澶勭悊浜猴細" prop="dealName">
- <el-input v-model="form.dealName" placeholder="璇疯緭鍏�" clearable/>
- </el-form-item>
- </el-col>
- <el-col :span="12">
- <el-form-item label="澶勭悊鏃ユ湡锛�" prop="dealTime">
- <el-date-picker
- v-model="form.dealTime"
- type="date"
- placeholder="璇烽�夋嫨鏃ユ湡"
- value-format="YYYY-MM-DD"
- format="YYYY-MM-DD"
- clearable
- style="width: 100%"
- />
- </el-form-item>
- </el-col>
- </el-row>
- </el-form>
- <template #footer>
- <div class="dialog-footer">
- <el-button type="primary" @click="submitForm">纭</el-button>
- <el-button @click="closeDia">鍙栨秷</el-button>
- </div>
- </template>
- </el-dialog>
- </div>
-</template>
-
-<script setup>
-import {ref} from "vue";
-import {productTreeList} from "@/api/basicData/product.js";
-import {
- getQualityUnqualifiedInfo,
- qualityUnqualifiedAdd,
- qualityUnqualifiedUpdate
-} from "@/api/qualityManagement/nonconformingManagement.js";
-const { proxy } = getCurrentInstance()
-const emit = defineEmits(['close'])
-
-const dialogFormVisible = ref(false);
-const operationType = ref('')
-const data = reactive({
- form: {
- checkTime: "",
- process: "",
- checkName: "",
- productName: "",
- productId: "",
- model: "",
- unit: "",
- quantity: "",
- checkCompany: "",
- checkResult: "",
- inspectState: '',
- inspectType: '',
- defectivePhenomena: '',
- dealResult: '',
- },
- rules: {
- checkTime: [{ required: false, message: "璇疯緭鍏�", trigger: "blur" },],
- process: [{ required: true, message: "璇疯緭鍏�", trigger: "blur" }],
- checkName: [{ required: false, message: "璇疯緭鍏�", trigger: "blur" }],
- productId: [{ required: true, message: "璇疯緭鍏�", trigger: "blur" }],
- model: [{ required: false, message: "璇疯緭鍏�", trigger: "blur" }],
- unit: [{ required: false, message: "璇疯緭鍏�", trigger: "blur" }],
- quantity: [{ required: true, message: "璇疯緭鍏�", trigger: "blur" }],
- checkCompany: [{ required: false, message: "璇疯緭鍏�", trigger: "blur" }],
- checkResult: [{ required: false, message: "璇疯緭鍏�", trigger: "blur" }],
- },
-});
-const { form, rules } = toRefs(data);
-const productOptions = ref([]);
-
-// 鎵撳紑寮规
-const openDialog = (type, row) => {
- operationType.value = type;
- dialogFormVisible.value = true;
- form.value = {}
- getProductOptions();
- if (operationType.value === 'edit') {
- getQualityUnqualifiedInfo(row.id).then(res => {
- form.value = {...res.data}
- })
- }
-}
-const getProductOptions = () => {
- productTreeList().then((res) => {
- productOptions.value = convertIdToValue(res);
- });
-};
-const getModels = (value) => {
- form.value.productName = findNodeById(productOptions.value, value);
-};
-const findNodeById = (nodes, productId) => {
- for (let i = 0; i < nodes.length; i++) {
- if (nodes[i].value === productId) {
- return nodes[i].label; // 鎵惧埌鑺傜偣锛岃繑鍥炶鑺傜偣
- }
- if (nodes[i].children && nodes[i].children.length > 0) {
- const foundNode = findNodeById(nodes[i].children, productId);
- if (foundNode) {
- return foundNode; // 鍦ㄥ瓙鑺傜偣涓壘鍒帮紝杩斿洖璇ヨ妭鐐�
- }
- }
- }
- return null; // 娌℃湁鎵惧埌鑺傜偣锛岃繑鍥瀗ull
-};
-function convertIdToValue(data) {
- return data.map((item) => {
- const { id, children, ...rest } = item;
- const newItem = {
- ...rest,
- value: id, // 灏� id 鏀逛负 value
- };
- if (children && children.length > 0) {
- newItem.children = convertIdToValue(children);
- }
-
- return newItem;
- });
-}
-// 鎻愪氦浜у搧琛ㄥ崟
-const submitForm = () => {
- proxy.$refs.formRef.validate(valid => {
- if (valid) {
- if (operationType.value === "add") {
- qualityUnqualifiedAdd(form.value).then(res => {
- proxy.$modal.msgSuccess("鎻愪氦鎴愬姛");
- closeDia();
- })
- } else {
- qualityUnqualifiedUpdate(form.value).then(res => {
- proxy.$modal.msgSuccess("鎻愪氦鎴愬姛");
- closeDia();
- })
- }
- }
- })
-}
-// 鍏抽棴寮规
-const closeDia = () => {
- proxy.resetForm("formRef");
- dialogFormVisible.value = false;
- emit('close')
-};
-defineExpose({
- openDialog,
-});
-</script>
-
-<style scoped>
-
-</style>
\ No newline at end of file
diff --git a/src/views/qualityManagement/nonconformingManagement/components/inspectionFormDia.vue b/src/views/qualityManagement/nonconformingManagement/components/inspectionFormDia.vue
deleted file mode 100644
index 308d960..0000000
--- a/src/views/qualityManagement/nonconformingManagement/components/inspectionFormDia.vue
+++ /dev/null
@@ -1,257 +0,0 @@
-<template>
- <div>
- <el-dialog
- v-model="dialogFormVisible"
- :title="operationType === 'add' ? '鏂板鍘熸潗鏂欐楠�' : '缂栬緫鍘熸潗鏂欐楠�'"
- width="70%"
- @close="closeDia"
- >
- <el-form :model="form" label-width="140px" label-position="top" :rules="rules" ref="formRef">
- <el-row :gutter="30">
- <el-col :span="12">
- <el-form-item label="鐘舵�侊細" prop="inspectState">
- <el-select v-model="form.inspectState">
- <el-option label="寰呭鐞�" :value="0" />
- <el-option label="宸插鐞�" :value="1" />
- </el-select>
- </el-form-item>
- </el-col>
- <el-col :span="12">
- <el-form-item label="绫诲埆锛�" prop="inspectType">
- <el-select v-model="form.inspectType" disabled>
- <el-option label="鍘熸潗鏂欐楠�" :value="0" />
- <el-option label="杩囩▼妫�楠�" :value="1" />
- <el-option label="鍑哄巶妫�楠�" :value="2" />
- </el-select>
- </el-form-item>
- </el-col>
- </el-row>
- <el-row :gutter="30">
- <el-col :span="12">
- <el-form-item label="浜у搧鍚嶇О锛�" prop="productId">
- <el-tree-select
- v-model="form.productId"
- placeholder="璇烽�夋嫨"
- clearable
- disabled
- check-strictly
- @change="getModels"
- :data="productOptions"
- :render-after-expand="false"
- style="width: 100%"
- />
- </el-form-item>
- </el-col>
- <el-col :span="12">
- <el-form-item label="瑙勬牸鍨嬪彿锛�" prop="model">
- <el-input v-model="form.model" placeholder="璇疯緭鍏�" clearable disabled/>
- </el-form-item>
- </el-col>
- </el-row>
- <el-row :gutter="30">
- <el-col :span="12">
- <el-form-item label="鍗曚綅锛�" prop="unit">
- <el-input v-model="form.unit" placeholder="璇疯緭鍏�" clearable disabled/>
- </el-form-item>
- </el-col>
- <el-col :span="12">
- <el-form-item label="鏁伴噺锛�" prop="quantity">
- <el-input v-model="form.quantity" placeholder="璇疯緭鍏�" clearable disabled/>
- </el-form-item>
- </el-col>
- </el-row>
- <el-row :gutter="30">
- <el-col :span="12">
- <el-form-item label="妫�楠屽憳锛�" prop="checkName">
- <el-input v-model="form.checkName" placeholder="璇疯緭鍏�" clearable disabled/>
- </el-form-item>
- </el-col>
- <el-col :span="12">
- <el-form-item label="妫�娴嬫棩鏈燂細" prop="checkTime">
- <el-date-picker
- v-model="form.checkTime"
- type="date"
- disabled
- placeholder="璇烽�夋嫨鏃ユ湡"
- value-format="YYYY-MM-DD"
- format="YYYY-MM-DD"
- clearable
- style="width: 100%"
- />
- </el-form-item>
- </el-col>
- </el-row>
- <el-row :gutter="30">
- <el-col :span="12">
- <el-form-item label="涓嶅悎鏍肩幇璞★細" prop="defectivePhenomena">
- <el-input v-model="form.defectivePhenomena" placeholder="璇疯緭鍏�" clearable/>
- </el-form-item>
- </el-col>
- <el-col :span="12">
- <el-form-item label="澶勭悊缁撴灉锛�" prop="dealResult">
- <el-input v-model="form.dealResult" placeholder="璇疯緭鍏�" clearable/>
- </el-form-item>
- </el-col>
- </el-row>
- <el-row :gutter="30">
- <el-col :span="12">
- <el-form-item label="澶勭悊浜猴細" prop="dealName">
- <el-input v-model="form.dealName" placeholder="璇疯緭鍏�" clearable/>
- </el-form-item>
- </el-col>
- <el-col :span="12">
- <el-form-item label="澶勭悊鏃ユ湡锛�" prop="dealTime">
- <el-date-picker
- v-model="form.dealTime"
- type="date"
- placeholder="璇烽�夋嫨鏃ユ湡"
- value-format="YYYY-MM-DD"
- format="YYYY-MM-DD"
- clearable
- style="width: 100%"
- />
- </el-form-item>
- </el-col>
- </el-row>
- </el-form>
- <template #footer>
- <div class="dialog-footer">
- <el-button type="primary" @click="submitForm">纭</el-button>
- <el-button @click="closeDia">鍙栨秷</el-button>
- </div>
- </template>
- </el-dialog>
- </div>
-</template>
-
-<script setup>
-import {ref} from "vue";
-import {productTreeList} from "@/api/basicData/product.js";
-import {
- getQualityUnqualifiedInfo,
- qualityUnqualifiedAdd,
- qualityUnqualifiedUpdate
-} from "@/api/qualityManagement/nonconformingManagement.js";
-const { proxy } = getCurrentInstance()
-const emit = defineEmits(['close'])
-
-const dialogFormVisible = ref(false);
-const operationType = ref('')
-const data = reactive({
- form: {
- checkTime: "",
- process: "",
- checkName: "",
- productName: "",
- productId: "",
- model: "",
- unit: "",
- quantity: "",
- checkCompany: "",
- checkResult: "",
- inspectState: '',
- inspectType: '',
- defectivePhenomena: '',
- dealResult: '',
- dealName: '',
- dealTime: '',
- },
- rules: {
- checkTime: [{ required: false, message: "璇疯緭鍏�", trigger: "blur" },],
- process: [{ required: false, message: "璇疯緭鍏�", trigger: "blur" }],
- checkName: [{ required: false, message: "璇疯緭鍏�", trigger: "blur" }],
- productId: [{ required: false, message: "璇疯緭鍏�", trigger: "blur" }],
- model: [{ required: false, message: "璇疯緭鍏�", trigger: "blur" }],
- unit: [{ required: false, message: "璇疯緭鍏�", trigger: "blur" }],
- quantity: [{ required: false, message: "璇疯緭鍏�", trigger: "blur" }],
- checkCompany: [{ required: false, message: "璇疯緭鍏�", trigger: "blur" }],
- checkResult: [{ required: false, message: "璇疯緭鍏�", trigger: "blur" }],
- defectivePhenomena: [{ required: true, message: "璇疯緭鍏�", trigger: "blur" }],
- dealResult: [{ required: true, message: "璇疯緭鍏�", trigger: "blur" }],
- dealName: [{ required: true, message: "璇疯緭鍏�", trigger: "blur" }],
- dealTime: [{ required: true, message: "璇疯緭鍏�", trigger: "change" }],
- },
-});
-const { form, rules } = toRefs(data);
-const productOptions = ref([]);
-
-// 鎵撳紑寮规
-const openDialog = (type, row) => {
- operationType.value = type;
- dialogFormVisible.value = true;
- form.value = {}
- getProductOptions();
- if (operationType.value === 'edit') {
- getQualityUnqualifiedInfo(row.id).then(res => {
- form.value = {...res.data}
- })
- }
-}
-const getProductOptions = () => {
- productTreeList().then((res) => {
- productOptions.value = convertIdToValue(res);
- });
-};
-const getModels = (value) => {
- form.value.productName = findNodeById(productOptions.value, value);
-};
-const findNodeById = (nodes, productId) => {
- for (let i = 0; i < nodes.length; i++) {
- if (nodes[i].value === productId) {
- return nodes[i].label; // 鎵惧埌鑺傜偣锛岃繑鍥炶鑺傜偣
- }
- if (nodes[i].children && nodes[i].children.length > 0) {
- const foundNode = findNodeById(nodes[i].children, productId);
- if (foundNode) {
- return foundNode; // 鍦ㄥ瓙鑺傜偣涓壘鍒帮紝杩斿洖璇ヨ妭鐐�
- }
- }
- }
- return null; // 娌℃湁鎵惧埌鑺傜偣锛岃繑鍥瀗ull
-};
-function convertIdToValue(data) {
- return data.map((item) => {
- const { id, children, ...rest } = item;
- const newItem = {
- ...rest,
- value: id, // 灏� id 鏀逛负 value
- };
- if (children && children.length > 0) {
- newItem.children = convertIdToValue(children);
- }
-
- return newItem;
- });
-}
-// 鎻愪氦浜у搧琛ㄥ崟
-const submitForm = () => {
- proxy.$refs.formRef.validate(valid => {
- if (valid) {
- if (operationType.value === "add") {
- qualityUnqualifiedAdd(form.value).then(res => {
- proxy.$modal.msgSuccess("鎻愪氦鎴愬姛");
- closeDia();
- })
- } else {
- qualityUnqualifiedUpdate(form.value).then(res => {
- proxy.$modal.msgSuccess("鎻愪氦鎴愬姛");
- closeDia();
- })
- }
- }
- })
-}
-// 鍏抽棴寮规
-const closeDia = () => {
- proxy.resetForm("formRef");
- dialogFormVisible.value = false;
- emit('close')
-};
-defineExpose({
- openDialog,
-});
-</script>
-
-<style scoped>
-
-</style>
\ No newline at end of file
diff --git a/src/views/qualityManagement/nonconformingManagement/index.vue b/src/views/qualityManagement/nonconformingManagement/index.vue
deleted file mode 100644
index d3ac667..0000000
--- a/src/views/qualityManagement/nonconformingManagement/index.vue
+++ /dev/null
@@ -1,306 +0,0 @@
-<template>
- <div class="app-container">
- <div class="search_form">
- <div style="display: flex;flex-direction: row;align-items: center;">
- <div>
- <span class="search_title">绫诲瀷锛�</span>
- <el-select v-model="searchForm.inspectType" clearable style="width: 240px" @change="handleQuery">
- <el-option label="鍘熸潗鏂欐楠�" :value="0" />
- <el-option label="杩囩▼妫�楠�" :value="1" />
- <el-option label="鍑哄巶妫�楠�" :value="2" />
- </el-select>
- </div>
- <div style="margin-left: 10px">
- <span class="search_title">鐘舵�侊細</span>
- <el-select v-model="searchForm.inspectState" clearable style="width: 240px" @change="handleQuery">
- <el-option label="寰呭鐞�" :value="0" />
- <el-option label="宸插鐞�" :value="1" />
- </el-select>
- </div>
- <div style="margin-left: 10px">
- <span class="search_title">浜у搧鍚嶇О锛�</span>
- <el-input
- v-model="searchForm.productName"
- style="width: 240px"
- placeholder="璇疯緭鍏ヤ骇鍝佸悕绉版悳绱�"
- @change="handleQuery"
- clearable
- :prefix-icon="Search"
- />
- </div>
- <span style="margin-left: 10px" class="search_title">妫�娴嬫棩鏈燂細</span>
- <el-date-picker v-model="searchForm.entryDate" value-format="YYYY-MM-DD" format="YYYY-MM-DD" type="daterange"
- placeholder="璇烽�夋嫨" clearable @change="changeDaterange" />
- <el-button type="primary" @click="handleQuery" style="margin-left: 10px">鎼滅储</el-button>
- </div>
- <div>
- <el-button type="primary" @click="openForm('add')">鏂板</el-button>
- <el-button @click="handleOut">瀵煎嚭</el-button>
- <el-button type="danger" plain @click="handleDelete">鍒犻櫎</el-button>
- </div>
- </div>
- <div class="table_list">
- <PIMTable
- rowKey="id"
- :column="tableColumn"
- :tableData="tableData"
- :page="page"
- :isSelection="true"
- @selection-change="handleSelectionChange"
- :tableLoading="tableLoading"
- @pagination="pagination"
- :total="page.total"
- ></PIMTable>
- </div>
- <FormDia ref="formDia" @close="handleQuery"></FormDia>
- <InspectionFormDia ref="inspectionFormDia" @close="handleQuery"></InspectionFormDia>
- </div>
-</template>
-
-<script setup>
-import { Search } from "@element-plus/icons-vue";
-import {onMounted, ref} from "vue";
-import FormDia from "@/views/qualityManagement/nonconformingManagement/components/formDia.vue";
-import {ElMessageBox} from "element-plus";
-import {qualityUnqualifiedDel, qualityUnqualifiedListPage} from "@/api/qualityManagement/nonconformingManagement.js";
-import InspectionFormDia from "@/views/qualityManagement/nonconformingManagement/components/inspectionFormDia.vue";
-import dayjs from "dayjs";
-
-const data = reactive({
- searchForm: {
- inspectType: "",
- inspectState: "",
- productName: "",
- entryDate: [
- dayjs().format("YYYY-MM-DD"),
- dayjs().add(1, "day").format("YYYY-MM-DD"),
- ], // 褰曞叆鏃ユ湡
- entryDateStart: dayjs().format("YYYY-MM-DD"),
- entryDateEnd: dayjs().add(1, "day").format("YYYY-MM-DD"),
- },
-});
-const { searchForm } = toRefs(data);
-const tableColumn = ref([
- {
- label: "鐘舵��",
- prop: "inspectState",
- dataType: "tag",
- formatData: (params) => {
- if (params == 0) {
- return "寰呭鐞�";
- } else if (params == 1) {
- return "宸插鐞�";
- } else {
- return null;
- }
- },
- formatType: (params) => {
- if (params == '涓嶅悎鏍�') {
- return "danger";
- } else if (params == '鍚堟牸') {
- return "success";
- } else {
- return null;
- }
- },
- },
- {
- label: "妫�娴嬫棩鏈�",
- prop: "checkTime",
- width: 120
- },
- {
- label: "绫诲埆",
- prop: "inspectType",
- dataType: "tag",
- width: 120,
- formatData: (params) => {
- if (params == 0) {
- return "鍘熸潗鏂欐楠�";
- } else if (params == 1) {
- return "杩囩▼妫�楠�";
- } else {
- return '鍑哄巶妫�楠�';
- }
- },
- formatType: (params) => {
- if (params == '涓嶅悎鏍�') {
- return "info";
- } else if (params == '鍚堟牸') {
- return "success";
- } else {
- return 'primary';
- }
- },
- },
- {
- label: "妫�楠屽憳",
- prop: "checkName",
- },
- {
- label: "浜у搧鍚嶇О",
- prop: "productName",
- },
- {
- label: "瑙勬牸鍨嬪彿",
- prop: "model",
- },
- {
- label: "鍗曚綅",
- prop: "unit",
- },
- {
- label: "鏁伴噺",
- prop: "quantity",
- width: 100
- },
- {
- label: "涓嶅悎鏍肩幇璞�",
- prop: "defectivePhenomena",
- width: 120
- },
- {
- label: "澶勭悊缁撴灉",
- prop: "dealResult",
- width: 120
- },
- {
- label: "澶勭悊浜�",
- prop: "dealName",
- width: 120
- },
- {
- label: "澶勭悊鏃ユ湡",
- prop: "dealTime",
- width: 120
- },
- {
- dataType: "action",
- label: "鎿嶄綔",
- align: "center",
- fixed: "right",
- width: 120,
- operation: [
- {
- name: "缂栬緫",
- type: "text",
- clickFun: (row) => {
- openForm("edit", row);
- },
- },
- {
- name: "澶勭悊",
- type: "text",
- clickFun: (row) => {
- openInspectionForm("edit", row);
- },
- },
- ],
- },
-]);
-const tableData = ref([]);
-const selectedRows = ref([]);
-const tableLoading = ref(false);
-const page = reactive({
- current: 1,
- size: 100,
- total: 0
-});
-const formDia = ref()
-const inspectionFormDia = ref()
-const { proxy } = getCurrentInstance()
-
-const changeDaterange = (value) => {
- searchForm.value.entryDateStart = undefined;
- searchForm.value.entryDateEnd = undefined;
- if (value) {
- searchForm.value.entryDateStart = dayjs(value[0]).format("YYYY-MM-DD");
- searchForm.value.entryDateEnd = dayjs(value[1]).format("YYYY-MM-DD");
- }
- getList();
-};
-// 鏌ヨ鍒楄〃
-/** 鎼滅储鎸夐挳鎿嶄綔 */
-const handleQuery = () => {
- page.current = 1;
- getList();
-};
-const pagination = (obj) => {
- page.current = obj.page;
- page.size = obj.limit;
- getList();
-};
-const getList = () => {
- tableLoading.value = true;
- const params = { ...searchForm.value, ...page };
- params.entryDate = undefined
- qualityUnqualifiedListPage(params).then(res => {
- tableLoading.value = false;
- tableData.value = res.data.records
- page.total = res.data.total;
- }).catch(err => {
- tableLoading.value = false;
- })
-};
-// 琛ㄦ牸閫夋嫨鏁版嵁
-const handleSelectionChange = (selection) => {
- selectedRows.value = selection;
-};
-
-// 鎵撳紑寮规
-const openForm = (type, row) => {
- nextTick(() => {
- formDia.value?.openDialog(type, row)
- })
-};
-// 鎵撳紑澶勭悊寮规
-const openInspectionForm = (type, row) => {
- nextTick(() => {
- inspectionFormDia.value?.openDialog(type, row)
- })
-};
-
-// 鍒犻櫎
-const handleDelete = () => {
- let ids = [];
- if (selectedRows.value.length > 0) {
- ids = selectedRows.value.map((item) => item.id);
- } else {
- proxy.$modal.msgWarning("璇烽�夋嫨鏁版嵁");
- return;
- }
- ElMessageBox.confirm("閫変腑鐨勫唴瀹瑰皢琚垹闄わ紝鏄惁纭鍒犻櫎锛�", "瀵煎嚭", {
- confirmButtonText: "纭",
- cancelButtonText: "鍙栨秷",
- type: "warning",
- })
- .then(() => {
- qualityUnqualifiedDel(ids).then((res) => {
- proxy.$modal.msgSuccess("鍒犻櫎鎴愬姛");
- getList();
- });
- })
- .catch(() => {
- proxy.$modal.msg("宸插彇娑�");
- });
-};
-// 瀵煎嚭
-const handleOut = () => {
- ElMessageBox.confirm("閫変腑鐨勫唴瀹瑰皢琚鍑猴紝鏄惁纭瀵煎嚭锛�", "瀵煎嚭", {
- confirmButtonText: "纭",
- cancelButtonText: "鍙栨秷",
- type: "warning",
- })
- .then(() => {
- proxy.download("/quality/qualityUnqualified/export", {}, "涓嶅悎鏍肩鐞�.xlsx");
- })
- .catch(() => {
- proxy.$modal.msg("宸插彇娑�");
- });
-};
-onMounted(() => {
- getList();
-});
-</script>
-
-<style scoped></style>
diff --git a/src/views/qualityManagement/processInspection/components/filesDia.vue b/src/views/qualityManagement/processInspection/components/filesDia.vue
deleted file mode 100644
index fb47850..0000000
--- a/src/views/qualityManagement/processInspection/components/filesDia.vue
+++ /dev/null
@@ -1,197 +0,0 @@
-<template>
- <div>
- <el-dialog
- v-model="dialogFormVisible"
- title="涓婁紶闄勪欢"
- width="50%"
- @close="closeDia"
- >
- <div style="margin-bottom: 10px;text-align: right">
- <el-upload
- v-model:file-list="fileList"
- class="upload-demo"
- :action="uploadUrl"
- :on-success="handleUploadSuccess"
- :on-error="handleUploadError"
- name="file"
- :show-file-list="false"
- :headers="headers"
- style="display: inline;margin-right: 10px"
- >
- <el-button type="primary">涓婁紶闄勪欢</el-button>
- </el-upload>
- <el-button type="danger" plain @click="handleDelete">鍒犻櫎</el-button>
- </div>
- <PIMTable
- rowKey="id"
- :column="tableColumn"
- :tableData="tableData"
- :tableLoading="tableLoading"
- :isSelection="true"
- @selection-change="handleSelectionChange"
- height="500"
- >
- </PIMTable>
- <pagination
- style="margin: 10px 0"
- v-show="total > 0"
- @pagination="paginationSearch"
- :total="total"
- :page="page.current"
- :limit="page.size"
- />
- <template #footer>
- <div class="dialog-footer">
- <el-button @click="closeDia">鍙栨秷</el-button>
- </div>
- </template>
- </el-dialog>
- <filePreview ref="filePreviewRef" />
- </div>
-</template>
-
-<script setup>
-import {ref} from "vue";
-import filePreview from '@/components/filePreview/index.vue'
-import {ElMessageBox} from "element-plus";
-import {getToken} from "@/utils/auth.js";
-import {
- qualityInspectFileAdd,
- qualityInspectFileDel,
- qualityInspectFileListPage
-} from "@/api/qualityManagement/qualityInspectFile.js";
-import Pagination from "@/components/PIMTable/Pagination.vue";
-const { proxy } = getCurrentInstance()
-const emit = defineEmits(['close'])
-
-const dialogFormVisible = ref(false);
-const currentId = ref('')
-const selectedRows = ref([]);
-const filePreviewRef = ref()
-const tableColumn = ref([
- {
- label: "鏂囦欢鍚嶇О",
- prop: "name",
- },
- {
- dataType: "action",
- label: "鎿嶄綔",
- align: "center",
- operation: [
- {
- name: "涓嬭浇",
- type: "text",
- clickFun: (row) => {
- downLoadFile(row);
- },
- },
- {
- name: "棰勮",
- type: "text",
- clickFun: (row) => {
- lookFile(row);
- },
- }
- ],
- },
-]);
-const page = reactive({
- current: 1,
- size: 100,
-});
-const total = ref(0);
-const tableData = ref([]);
-const fileList = ref([]);
-const tableLoading = ref(false);
-const headers = ref({
- Authorization: "Bearer " + getToken(),
-});
-const uploadUrl = ref(import.meta.env.VITE_APP_BASE_API + "/file/upload"); // 涓婁紶鐨勫浘鐗囨湇鍔″櫒鍦板潃
-
-// 鎵撳紑寮规
-const openDialog = (row) => {
- dialogFormVisible.value = true;
- currentId.value = row.id;
- getList()
-}
-const paginationSearch = (obj) => {
- page.current = obj.page;
- page.size = obj.limit;
- getList();
-};
-const getList = () => {
- qualityInspectFileListPage({inspectId: currentId.value}).then(res => {
- tableData.value = res.data.records;
- total.value = res.data.total;
- })
-}
-// 琛ㄦ牸閫夋嫨鏁版嵁
-const handleSelectionChange = (selection) => {
- selectedRows.value = selection;
-};
-// 涓嬭浇闄勪欢
-const downLoadFile = (row) => {
- proxy.$download.name(row.url);
-}
-// 鍏抽棴寮规
-const closeDia = () => {
- dialogFormVisible.value = false;
- emit('close')
-};
-// 涓婁紶鎴愬姛澶勭悊
-function handleUploadSuccess(res, file) {
- // 濡傛灉涓婁紶鎴愬姛
- if (res.code == 200) {
- const fileRow = {}
- fileRow.name = res.data.originalName
- fileRow.url = res.data.tempPath
- uploadFile(fileRow)
- } else {
- proxy.$modal.msgError("鏂囦欢涓婁紶澶辫触");
- }
-}
-function uploadFile(file) {
- file.inspectId = currentId.value;
- qualityInspectFileAdd(file).then(res => {
- proxy.$modal.msgSuccess("鏂囦欢涓婁紶鎴愬姛");
- getList()
- })
-}
-// 涓婁紶澶辫触澶勭悊
-function handleUploadError() {
- proxy.$modal.msgError("鏂囦欢涓婁紶澶辫触");
-}
-// 棰勮闄勪欢
-const lookFile = (row) => {
- filePreviewRef.value.open(row.url)
-}
-// 鍒犻櫎
-const handleDelete = () => {
- let ids = [];
- if (selectedRows.value.length > 0) {
- ids = selectedRows.value.map((item) => item.id);
- } else {
- proxy.$modal.msgWarning("璇烽�夋嫨鏁版嵁");
- return;
- }
- ElMessageBox.confirm("閫変腑鐨勫唴瀹瑰皢琚垹闄わ紝鏄惁纭鍒犻櫎锛�", "瀵煎嚭", {
- confirmButtonText: "纭",
- cancelButtonText: "鍙栨秷",
- type: "warning",
- }).then(() => {
- qualityInspectFileDel(ids).then((res) => {
- proxy.$modal.msgSuccess("鍒犻櫎鎴愬姛");
- getList();
- });
- }).catch(() => {
- proxy.$modal.msg("宸插彇娑�");
- });
-};
-defineExpose({
- openDialog,
-});
-</script>
-
-<style scoped>
-
-</style>
\ No newline at end of file
diff --git a/src/views/qualityManagement/processInspection/components/formDia.vue b/src/views/qualityManagement/processInspection/components/formDia.vue
deleted file mode 100644
index c24d425..0000000
--- a/src/views/qualityManagement/processInspection/components/formDia.vue
+++ /dev/null
@@ -1,285 +0,0 @@
-<template>
- <div>
- <el-dialog
- v-model="dialogFormVisible"
- :title="operationType === 'add' ? '鏂板杩囩▼妫�楠�' : '缂栬緫杩囩▼妫�楠�'"
- width="70%"
- @close="closeDia"
- >
- <el-form :model="form" label-width="140px" label-position="top" :rules="rules" ref="formRef">
- <el-row :gutter="30">
- <el-col :span="12">
- <el-form-item label="宸ュ簭锛�" prop="process">
- <el-input v-model="form.process" placeholder="璇疯緭鍏�" clearable/>
- </el-form-item>
- </el-col>
- <el-col :span="12">
- <el-form-item label="浜у搧鍚嶇О锛�" prop="productId">
- <el-tree-select
- v-model="form.productId"
- placeholder="璇烽�夋嫨"
- clearable
- check-strictly
- @change="getModels"
- :data="productOptions"
- :render-after-expand="false"
- style="width: 100%"
- />
- </el-form-item>
- </el-col>
- </el-row>
- <el-row :gutter="30">
- <el-col :span="12">
- <el-form-item label="瑙勬牸鍨嬪彿锛�" prop="model">
- <el-input v-model="form.model" placeholder="璇疯緭鍏�" clearable/>
- </el-form-item>
- </el-col>
- </el-row>
- <el-row :gutter="30">
- <el-col :span="12">
- <el-form-item label="鍗曚綅锛�" prop="unit">
- <el-input v-model="form.unit" placeholder="璇疯緭鍏�" clearable/>
- </el-form-item>
- </el-col>
- <el-col :span="12">
- <el-form-item label="鏁伴噺锛�" prop="quantity">
- <el-input-number :step="0.01" :min="0" style="width: 100%" v-model="form.quantity" placeholder="璇疯緭鍏�" clearable :precision="2"/>
- </el-form-item>
- </el-col>
- </el-row>
- <el-row :gutter="30">
- <el-col :span="12">
- <el-form-item label="妫�娴嬪崟浣嶏細" prop="checkCompany">
- <el-input v-model="form.checkCompany" placeholder="璇疯緭鍏�" clearable/>
- </el-form-item>
- </el-col>
- <el-col :span="12">
- <el-form-item label="妫�娴嬬粨鏋滐細" prop="checkResult">
- <el-select v-model="form.checkResult">
- <el-option label="鍚堟牸" value="鍚堟牸" />
- <el-option label="涓嶅悎鏍�" value="涓嶅悎鏍�" />
- </el-select>
- </el-form-item>
- </el-col>
- </el-row>
- <el-row :gutter="30">
- <el-col :span="12">
- <el-form-item label="妫�楠屽憳锛�" prop="checkName">
- <el-select v-model="form.checkName" placeholder="璇烽�夋嫨" clearable>
- <el-option v-for="item in userList" :key="item.nickName" :label="item.nickName"
- :value="item.nickName"/>
- </el-select>
- </el-form-item>
- </el-col>
- <el-col :span="12">
- <el-form-item label="妫�娴嬫棩鏈燂細" prop="checkTime">
- <el-date-picker
- v-model="form.checkTime"
- type="date"
- placeholder="璇烽�夋嫨鏃ユ湡"
- value-format="YYYY-MM-DD"
- format="YYYY-MM-DD"
- clearable
- style="width: 100%"
- />
- </el-form-item>
- </el-col>
- </el-row>
- </el-form>
- <PIMTable
- rowKey="id"
- :column="tableColumn"
- :tableData="tableData"
- :tableLoading="tableLoading"
- height="400"
- >
- <template #slot="{ row }">
- <el-input v-model="row.testValue" clearable/>
- </template>
- </PIMTable>
- <template #footer>
- <div class="dialog-footer">
- <el-button type="primary" @click="submitForm">纭</el-button>
- <el-button @click="closeDia">鍙栨秷</el-button>
- </div>
- </template>
- </el-dialog>
- </div>
-</template>
-
-<script setup>
-import {ref} from "vue";
-import {getOptions} from "@/api/procurementManagement/procurementLedger.js";
-import {productTreeList} from "@/api/basicData/product.js";
-import {qualityInspectAdd, qualityInspectUpdate} from "@/api/qualityManagement/rawMaterialInspection.js";
-import {qualityInspectDetailByProductId} from "@/api/qualityManagement/metricMaintenance.js";
-import {userListNoPage} from "@/api/system/user.js";
-import {qualityInspectParamInfo} from "@/api/qualityManagement/qualityInspectParam.js";
-const { proxy } = getCurrentInstance()
-const emit = defineEmits(['close'])
-
-const dialogFormVisible = ref(false);
-const operationType = ref('')
-const data = reactive({
- form: {
- checkTime: "",
- process: "",
- checkName: "",
- productName: "",
- productId: "",
- model: "",
- unit: "",
- quantity: "",
- checkCompany: "",
- checkResult: "",
- },
- rules: {
- checkTime: [{ required: false, message: "璇疯緭鍏�", trigger: "blur" },],
- process: [{ required: true, message: "璇疯緭鍏�", trigger: "blur" }],
- checkName: [{ required: false, message: "璇疯緭鍏�", trigger: "blur" }],
- productId: [{ required: true, message: "璇疯緭鍏�", trigger: "blur" }],
- model: [{ required: false, message: "璇疯緭鍏�", trigger: "blur" }],
- unit: [{ required: false, message: "璇疯緭鍏�", trigger: "blur" }],
- quantity: [{ required: true, message: "璇疯緭鍏�", trigger: "blur" }],
- checkCompany: [{ required: false, message: "璇疯緭鍏�", trigger: "blur" }],
- checkResult: [{ required: true, message: "璇疯緭鍏�", trigger: "change" }],
- },
-});
-const userList = ref([]);
-const { form, rules } = toRefs(data);
-const supplierList = ref([]);
-const productOptions = ref([]);
-const tableColumn = ref([
- {
- label: "鎸囨爣",
- prop: "parameterItem",
- },
- {
- label: "鍗曚綅",
- prop: "unit",
- },
- {
- label: "鏍囧噯鍊�",
- prop: "standardValue",
- },
- {
- label: "鍐呮帶鍊�",
- prop: "controlValue",
- },
- {
- label: "妫�楠屽��",
- prop: "testValue",
- dataType: 'slot',
- slot: 'slot',
- },
-]);
-const tableData = ref([]);
-const tableLoading = ref(false);
-const currentProductId = ref(0);
-
-// 鎵撳紑寮规
-const openDialog = async (type, row) => {
- operationType.value = type;
- dialogFormVisible.value = true;
- getOptions().then((res) => {
- supplierList.value = res.data;
- });
- let userLists = await userListNoPage();
- userList.value = userLists.data;
- form.value = {}
- getProductOptions();
- if (operationType.value === 'edit') {
- form.value = {...row}
- currentProductId.value = row.productId || 0
- getQualityInspectParamList(row.id)
- }
-}
-const getProductOptions = () => {
- productTreeList().then((res) => {
- productOptions.value = convertIdToValue(res);
- });
-};
-const getModels = (value) => {
- currentProductId.value = value
- form.value.productName = findNodeById(productOptions.value, value);
- if (currentProductId) {
- getList();
- }
-};
-const findNodeById = (nodes, productId) => {
- for (let i = 0; i < nodes.length; i++) {
- if (nodes[i].value === productId) {
- return nodes[i].label; // 鎵惧埌鑺傜偣锛岃繑鍥炶鑺傜偣
- }
- if (nodes[i].children && nodes[i].children.length > 0) {
- const foundNode = findNodeById(nodes[i].children, productId);
- if (foundNode) {
- return foundNode; // 鍦ㄥ瓙鑺傜偣涓壘鍒帮紝杩斿洖璇ヨ妭鐐�
- }
- }
- }
- return null; // 娌℃湁鎵惧埌鑺傜偣锛岃繑鍥瀗ull
-};
-function convertIdToValue(data) {
- return data.map((item) => {
- const { id, children, ...rest } = item;
- const newItem = {
- ...rest,
- value: id, // 灏� id 鏀逛负 value
- };
- if (children && children.length > 0) {
- newItem.children = convertIdToValue(children);
- }
-
- return newItem;
- });
-}
-// 鎻愪氦浜у搧琛ㄥ崟
-const submitForm = () => {
- proxy.$refs.formRef.validate(valid => {
- if (valid) {
- form.value.inspectType = 1
- if (operationType.value === "add") {
- tableData.value.forEach((item) => {
- delete item.id
- })
- }
- const data = {...form.value, qualityInspectParams: tableData.value}
- if (operationType.value === "add") {
- qualityInspectAdd(data).then(res => {
- proxy.$modal.msgSuccess("鎻愪氦鎴愬姛");
- closeDia();
- })
- } else {
- qualityInspectUpdate(data).then(res => {
- proxy.$modal.msgSuccess("鎻愪氦鎴愬姛");
- closeDia();
- })
- }
- }
- })
-}
-const getList = () => {
- qualityInspectDetailByProductId(currentProductId.value).then(res => {
- tableData.value = res.data;
- })
-}
-const getQualityInspectParamList = (id) => {
- qualityInspectParamInfo(id).then(res => {
- tableData.value = res.data;
- })
-}
-// 鍏抽棴寮规
-const closeDia = () => {
- proxy.resetForm("formRef");
- dialogFormVisible.value = false;
- emit('close')
-};
-defineExpose({
- openDialog,
-});
-</script>
-
-<style scoped>
-
-</style>
\ No newline at end of file
diff --git a/src/views/qualityManagement/processInspection/components/inspectionFormDia.vue b/src/views/qualityManagement/processInspection/components/inspectionFormDia.vue
deleted file mode 100644
index 32a36fa..0000000
--- a/src/views/qualityManagement/processInspection/components/inspectionFormDia.vue
+++ /dev/null
@@ -1,140 +0,0 @@
-<template>
- <div>
- <el-dialog
- v-model="dialogFormVisible"
- title="濉啓妫�楠岃褰�"
- width="70%"
- @close="closeDia"
- >
- <div style="margin-bottom: 10px;text-align: right">
- <el-button type="danger" plain @click="handleDelete">鍒犻櫎</el-button>
- </div>
- <PIMTable
- rowKey="id"
- :column="tableColumn"
- :tableData="tableData"
- :tableLoading="tableLoading"
- :isSelection="true"
- @selection-change="handleSelectionChange"
- height="600"
- >
- <template #slot="{ row }">
- <el-input v-model="row.testValue" clearable/>
- </template>
- </PIMTable>
- <template #footer>
- <div class="dialog-footer">
- <el-button type="primary" @click="submitForm">纭</el-button>
- <el-button @click="closeDia">鍙栨秷</el-button>
- </div>
- </template>
- </el-dialog>
- </div>
-</template>
-
-<script setup>
-import {ref} from "vue";
-import {getStaffJoinInfo, staffJoinAdd, staffJoinUpdate} from "@/api/personnelManagement/onboarding.js";
-import {Search} from "@element-plus/icons-vue";
-import {
- qualityInspectParamDel,
- qualityInspectParamInfo,
- qualityInspectParamUpdate
-} from "@/api/qualityManagement/qualityInspectParam.js";
-import {ElMessageBox} from "element-plus";
-const { proxy } = getCurrentInstance()
-const emit = defineEmits(['close'])
-
-const dialogFormVisible = ref(false);
-const operationType = ref('')
-const currentId = ref('')
-const selectedRows = ref([]);
-const tableColumn = ref([
- {
- label: "鎸囨爣",
- prop: "parameterItem",
- },
- {
- label: "鍗曚綅",
- prop: "unit",
- },
- {
- label: "鏍囧噯鍊�",
- prop: "standardValue",
- },
- {
- label: "鍐呮帶鍊�",
- prop: "controlValue",
- },
- {
- label: "妫�楠屽��",
- prop: "testValue",
- dataType: 'slot',
- slot: 'slot',
- },
-]);
-const tableData = ref([]);
-const tableLoading = ref(false);
-
-// 鎵撳紑寮规
-const openDialog = (type, row) => {
- operationType.value = type;
- dialogFormVisible.value = true;
- if (operationType.value === 'edit') {
- currentId.value = row.id;
- getList()
- }
-}
-const getList = () => {
- qualityInspectParamInfo(currentId.value).then(res => {
- tableData.value = res.data;
- })
-}
-// 琛ㄦ牸閫夋嫨鏁版嵁
-const handleSelectionChange = (selection) => {
- selectedRows.value = selection;
-};
-// 鎻愪氦浜у搧琛ㄥ崟
-const submitForm = () => {
- qualityInspectParamUpdate(tableData.value).then(res => {
- proxy.$modal.msgSuccess("鎻愪氦鎴愬姛");
- closeDia();
- })
-}
-// 鍏抽棴寮规
-const closeDia = () => {
- dialogFormVisible.value = false;
- emit('close')
-};
-// 鍒犻櫎
-const handleDelete = () => {
- let ids = [];
- if (selectedRows.value.length > 0) {
- ids = selectedRows.value.map((item) => item.id);
- } else {
- proxy.$modal.msgWarning("璇烽�夋嫨鏁版嵁");
- return;
- }
- ElMessageBox.confirm("閫変腑鐨勫唴瀹瑰皢琚垹闄わ紝鏄惁纭鍒犻櫎锛�", "瀵煎嚭", {
- confirmButtonText: "纭",
- cancelButtonText: "鍙栨秷",
- type: "warning",
- })
- .then(() => {
- qualityInspectParamDel(ids).then((res) => {
- proxy.$modal.msgSuccess("鍒犻櫎鎴愬姛");
- getList();
- });
- })
- .catch(() => {
- proxy.$modal.msg("宸插彇娑�");
- });
-};
-defineExpose({
- openDialog,
-});
-</script>
-
-<style scoped>
-
-</style>
\ No newline at end of file
diff --git a/src/views/qualityManagement/processInspection/index.vue b/src/views/qualityManagement/processInspection/index.vue
deleted file mode 100644
index 6f5ddec..0000000
--- a/src/views/qualityManagement/processInspection/index.vue
+++ /dev/null
@@ -1,380 +0,0 @@
-<template>
- <div class="app-container">
- <div class="search_form">
- <div>
- <span class="search_title">宸ュ簭锛�</span>
- <el-input
- v-model="searchForm.process"
- style="width: 240px"
- placeholder="璇疯緭鍏ュ伐搴忔悳绱�"
- @change="handleQuery"
- clearable
- :prefix-icon="Search"
- />
- <span style="margin-left: 10px" class="search_title">妫�娴嬫棩鏈燂細</span>
- <el-date-picker v-model="searchForm.entryDate" value-format="YYYY-MM-DD" format="YYYY-MM-DD" type="daterange"
- placeholder="璇烽�夋嫨" clearable @change="changeDaterange" />
- <el-button type="primary" @click="handleQuery" style="margin-left: 10px"
- >鎼滅储</el-button
- >
- </div>
- <div>
- <el-button type="primary" @click="openForm('add')">鏂板</el-button>
- <el-button @click="handleOut">瀵煎嚭</el-button>
- <el-button type="danger" plain @click="handleDelete">鍒犻櫎</el-button>
- </div>
- </div>
- <div class="table_list">
- <PIMTable
- rowKey="id"
- :column="tableColumn"
- :tableData="tableData"
- :page="page"
- :isSelection="true"
- @selection-change="handleSelectionChange"
- :tableLoading="tableLoading"
- @pagination="pagination"
- :total="page.total"
- ></PIMTable>
- </div>
- <InspectionFormDia ref="inspectionFormDia" @close="handleQuery"></InspectionFormDia>
- <FormDia ref="formDia" @close="handleQuery"></FormDia>
- <files-dia ref="filesDia" @close="handleQuery"></files-dia>
- <el-dialog v-model="dialogFormVisible" title="缂栬緫妫�楠屽憳" width="30%"
- @close="closeDia">
- <el-form :model="form" label-width="140px" label-position="top" :rules="rules" ref="formRef">
- <el-form-item label="妫�楠屽憳锛�" prop="checkName">
- <el-select v-model="form.checkName" placeholder="璇烽�夋嫨" clearable>
- <el-option v-for="item in userList" :key="item.nickName" :label="item.nickName"
- :value="item.nickName"/>
- </el-select>
- </el-form-item>
- </el-form>
- <template #footer>
- <div class="dialog-footer">
- <el-button type="primary" @click="submitForm">纭</el-button>
- <el-button @click="closeDia">鍙栨秷</el-button>
- </div>
- </template>
- </el-dialog>
- </div>
-</template>
-
-<script setup>
-import { Search } from "@element-plus/icons-vue";
-import {onMounted, ref} from "vue";
-import InspectionFormDia from "@/views/qualityManagement/processInspection/components/inspectionFormDia.vue";
-import FormDia from "@/views/qualityManagement/processInspection/components/formDia.vue";
-import {ElMessageBox} from "element-plus";
-import {
- downloadQualityInspect,
- qualityInspectDel,
- qualityInspectListPage, qualityInspectUpdate,
- submitQualityInspect
-} from "@/api/qualityManagement/rawMaterialInspection.js";
-import FilesDia from "@/views/qualityManagement/processInspection/components/filesDia.vue";
-import dayjs from "dayjs";
-import {userListNoPage} from "@/api/system/user.js";
-
-const data = reactive({
- searchForm: {
- process: "",
- entryDate: [
- dayjs().format("YYYY-MM-DD"),
- dayjs().add(1, "day").format("YYYY-MM-DD"),
- ], // 褰曞叆鏃ユ湡
- entryDateStart: dayjs().format("YYYY-MM-DD"),
- entryDateEnd: dayjs().add(1, "day").format("YYYY-MM-DD"),
- },
- rules: {
- checkName: [{required: true, message: "璇烽�夋嫨", trigger: "change"}],
- },
-});
-const { searchForm } = toRefs(data);
-const tableColumn = ref([
- {
- label: "妫�娴嬫棩鏈�",
- prop: "checkTime",
- width: 120
- },
- {
- label: "宸ュ簭",
- prop: "process",
- width: 230
- },
- {
- label: "妫�楠屽憳",
- prop: "checkName",
- },
- {
- label: "浜у搧鍚嶇О",
- prop: "productName",
- },
- {
- label: "瑙勬牸鍨嬪彿",
- prop: "model",
- },
- {
- label: "鍗曚綅",
- prop: "unit",
- },
- {
- label: "鏁伴噺",
- prop: "quantity",
- width: 100
- },
- {
- label: "妫�娴嬪崟浣�",
- prop: "checkCompany",
- width: 120
- },
- {
- label: "妫�娴嬬粨鏋�",
- prop: "checkResult",
- dataType: "tag",
- formatType: (params) => {
- if (params == '涓嶅悎鏍�') {
- return "danger";
- } else if (params == '鍚堟牸') {
- return "success";
- } else {
- return null;
- }
- },
- },
- {
- label: "鎻愪氦鐘舵��",
- prop: "inspectState",
- formatData: (params) => {
- if (params) {
- return "宸叉彁浜�";
- } else {
- return "鏈彁浜�";
- }
- },
- },
- {
- dataType: "action",
- label: "鎿嶄綔",
- align: "center",
- fixed: "right",
- width: 280,
- operation: [
- {
- name: "缂栬緫",
- type: "text",
- clickFun: (row) => {
- openForm("edit", row);
- },
- disabled: (row) => {
- return row.inspectState == 1;
- }
- },
- {
- name: "闄勪欢",
- type: "text",
- clickFun: (row) => {
- openFilesFormDia(row);
- },
- },
- {
- name: "鎻愪氦",
- type: "text",
- clickFun: (row) => {
- submit(row.id);
- },
- disabled: (row) => {
- return row.inspectState == 1;
- }
- },
- {
- name: "鍒嗛厤妫�楠屽憳",
- type: "text",
- clickFun: (row) => {
- if (!row.checkName) {
- open(row)
- } else {
- proxy.$modal.msgError("妫�楠屽憳宸插瓨鍦�");
- }
- },
- disabled: (row) => {
- return row.inspectState == 1 || row.checkName;
- }
- },
- {
- name: "涓嬭浇",
- type: "text",
- clickFun: (row) => {
- downLoadFile(row);
- },
- },
- ],
- },
-]);
-const userList = ref([]);
-const currentRow = ref(null)
-const tableData = ref([]);
-const selectedRows = ref([]);
-const tableLoading = ref(false);
-const dialogFormVisible = ref(false);
-const form = ref({
- checkName: ""
-});
-const page = reactive({
- current: 1,
- size: 100,
- total: 0
-});
-const formDia = ref()
-const filesDia = ref()
-const inspectionFormDia = ref()
-const { proxy } = getCurrentInstance()
-const changeDaterange = (value) => {
- searchForm.value.entryDateStart = undefined;
- searchForm.value.entryDateEnd = undefined;
- if (value) {
- searchForm.value.entryDateStart = dayjs(value[0]).format("YYYY-MM-DD");
- searchForm.value.entryDateEnd = dayjs(value[1]).format("YYYY-MM-DD");
- }
- getList();
-};
-// 鏌ヨ鍒楄〃
-/** 鎼滅储鎸夐挳鎿嶄綔 */
-const handleQuery = () => {
- page.current = 1;
- getList();
-};
-const pagination = (obj) => {
- page.current = obj.page;
- page.size = obj.limit;
- getList();
-};
-const getList = () => {
- tableLoading.value = true;
- const params = { ...searchForm.value, ...page };
- params.entryDate = undefined
- qualityInspectListPage({...params, inspectType: 1}).then(res => {
- tableLoading.value = false;
- tableData.value = res.data.records
- page.total = res.data.total;
- }).catch(err => {
- tableLoading.value = false;
- })
-};
-// 琛ㄦ牸閫夋嫨鏁版嵁
-const handleSelectionChange = (selection) => {
- selectedRows.value = selection;
-};
-
-// 鎵撳紑寮规
-const openForm = (type, row) => {
- nextTick(() => {
- formDia.value?.openDialog(type, row)
- })
-};
-// 鎵撳紑鏂板妫�楠屽脊妗�
-const openInspectionForm = (type, row) => {
- nextTick(() => {
- inspectionFormDia.value?.openDialog(type, row)
- })
-};
-// 鎵撳紑闄勪欢寮规
-const openFilesFormDia = (type, row) => {
- nextTick(() => {
- filesDia.value?.openDialog(type, row)
- })
-};
-// 鎻愪环
-const submit = async (id) => {
- const res = await submitQualityInspect({id: id})
- if (res.code === 200) {
- proxy.$modal.msgSuccess("鎻愪氦鎴愬姛");
- getList();
- }
-}
-const open = async (row) => {
- let userLists = await userListNoPage();
- userList.value = userLists.data;
- currentRow.value = row
- dialogFormVisible.value = true
-}
-// 鍏抽棴寮规
-const closeDia = () => {
- proxy.resetForm("formRef");
- dialogFormVisible.value = false;
-};
-const submitForm = () => {
- if (currentRow.value) {
- const data = {
- ...form.value,
- id: currentRow.value.id
- }
- qualityInspectUpdate(data).then(res => {
- proxy.$modal.msgSuccess("鎻愪氦鎴愬姛");
- closeDia();
- getList();
- })
- }
-};
-
-// 鍒犻櫎
-const handleDelete = () => {
- let ids = [];
- if (selectedRows.value.length > 0) {
- ids = selectedRows.value.map((item) => item.id);
- } else {
- proxy.$modal.msgWarning("璇烽�夋嫨鏁版嵁");
- return;
- }
- ElMessageBox.confirm("閫変腑鐨勫唴瀹瑰皢琚垹闄わ紝鏄惁纭鍒犻櫎锛�", "瀵煎嚭", {
- confirmButtonText: "纭",
- cancelButtonText: "鍙栨秷",
- type: "warning",
- })
- .then(() => {
- qualityInspectDel(ids).then((res) => {
- proxy.$modal.msgSuccess("鍒犻櫎鎴愬姛");
- getList();
- });
- })
- .catch(() => {
- proxy.$modal.msg("宸插彇娑�");
- });
-};
-const downLoadFile = (row) => {
- downloadQualityInspect({ id: row.id }).then((blobData) => {
- const blob = new Blob([blobData], {
- type: 'application/vnd.openxmlformats-officedocument.wordprocessingml.document',
- })
- const downloadUrl = window.URL.createObjectURL(blob)
-
- const link = document.createElement('a')
- link.href = downloadUrl
- link.download = '杩囩▼妫�楠屾姤鍛�.docx'
- document.body.appendChild(link)
- link.click()
-
- document.body.removeChild(link)
- window.URL.revokeObjectURL(downloadUrl)
- })
-};
-// 瀵煎嚭
-const handleOut = () => {
- ElMessageBox.confirm("閫変腑鐨勫唴瀹瑰皢琚鍑猴紝鏄惁纭瀵煎嚭锛�", "瀵煎嚭", {
- confirmButtonText: "纭",
- cancelButtonText: "鍙栨秷",
- type: "warning",
- })
- .then(() => {
- proxy.download("/quality/qualityInspect/export", {inspectType: 1}, "杩囩▼妫�楠�.xlsx");
- })
- .catch(() => {
- proxy.$modal.msg("宸插彇娑�");
- });
-};
-onMounted(() => {
- getList();
-});
-</script>
-
-<style scoped></style>
diff --git a/src/views/qualityManagement/rawMaterialInspection/components/filesDia.vue b/src/views/qualityManagement/rawMaterialInspection/components/filesDia.vue
deleted file mode 100644
index 9907fbe..0000000
--- a/src/views/qualityManagement/rawMaterialInspection/components/filesDia.vue
+++ /dev/null
@@ -1,198 +0,0 @@
-<template>
- <div>
- <el-dialog
- v-model="dialogFormVisible"
- title="涓婁紶闄勪欢"
- width="50%"
- @close="closeDia"
- >
- <div style="margin-bottom: 10px;text-align: right">
- <el-upload
- v-model:file-list="fileList"
- class="upload-demo"
- :action="uploadUrl"
- :on-success="handleUploadSuccess"
- :on-error="handleUploadError"
- name="file"
- :show-file-list="false"
- :headers="headers"
- style="display: inline;margin-right: 10px"
- >
- <el-button type="primary">涓婁紶闄勪欢</el-button>
- </el-upload>
- <el-button type="danger" plain @click="handleDelete">鍒犻櫎</el-button>
- </div>
- <PIMTable
- rowKey="id"
- :column="tableColumn"
- :tableData="tableData"
- :tableLoading="tableLoading"
- :isSelection="true"
- @selection-change="handleSelectionChange"
- height="500"
- >
- </PIMTable>
- <pagination
- style="margin: 10px 0"
- v-show="total > 0"
- @pagination="paginationSearch"
- :total="total"
- :page="page.current"
- :limit="page.size"
- />
- <template #footer>
- <div class="dialog-footer">
- <el-button @click="closeDia">鍙栨秷</el-button>
- </div>
- </template>
- </el-dialog>
- <filePreview ref="filePreviewRef" />
- </div>
-</template>
-
-<script setup>
-import {ref} from "vue";
-import filePreview from '@/components/filePreview/index.vue'
-import {ElMessageBox} from "element-plus";
-import {getToken} from "@/utils/auth.js";
-import {
- qualityInspectFileAdd,
- qualityInspectFileDel,
- qualityInspectFileListPage
-} from "@/api/qualityManagement/qualityInspectFile.js";
-import Pagination from "@/components/PIMTable/Pagination.vue";
-const { proxy } = getCurrentInstance()
-const emit = defineEmits(['close'])
-
-const dialogFormVisible = ref(false);
-const currentId = ref('')
-const selectedRows = ref([]);
-const tableColumn = ref([
- {
- label: "鏂囦欢鍚嶇О",
- prop: "name",
- },
- {
- dataType: "action",
- label: "鎿嶄綔",
- align: "center",
- operation: [
- {
- name: "涓嬭浇",
- type: "text",
- clickFun: (row) => {
- downLoadFile(row);
- },
- },
- {
- name: "棰勮",
- type: "text",
- clickFun: (row) => {
- lookFile(row);
- },
- }
- ],
- },
-]);
-const page = reactive({
- current: 1,
- size: 100,
-});
-const total = ref(0);
-const tableData = ref([]);
-const fileList = ref([]);
-const tableLoading = ref(false);
-const filePreviewRef = ref()
-const headers = ref({
- Authorization: "Bearer " + getToken(),
-});
-const uploadUrl = ref(import.meta.env.VITE_APP_BASE_API + "/file/upload"); // 涓婁紶鐨勫浘鐗囨湇鍔″櫒鍦板潃
-
-// 鎵撳紑寮规
-const openDialog = (row) => {
- dialogFormVisible.value = true;
- currentId.value = row.id;
- getList()
-}
-const paginationSearch = (obj) => {
- page.current = obj.page;
- page.size = obj.limit;
- getList();
-};
-const getList = () => {
- qualityInspectFileListPage({inspectId: currentId.value, ...page}).then(res => {
- tableData.value = res.data.records;
- total.value = res.data.total;
- })
-}
-// 琛ㄦ牸閫夋嫨鏁版嵁
-const handleSelectionChange = (selection) => {
- selectedRows.value = selection;
-};
-
-// 鍏抽棴寮规
-const closeDia = () => {
- dialogFormVisible.value = false;
- emit('close')
-};
-// 涓婁紶鎴愬姛澶勭悊
-function handleUploadSuccess(res, file) {
- // 濡傛灉涓婁紶鎴愬姛
- if (res.code == 200) {
- const fileRow = {}
- fileRow.name = res.data.originalName
- fileRow.url = res.data.tempPath
- uploadFile(fileRow)
- } else {
- proxy.$modal.msgError("鏂囦欢涓婁紶澶辫触");
- }
-}
-function uploadFile(file) {
- file.inspectId = currentId.value;
- qualityInspectFileAdd(file).then(res => {
- proxy.$modal.msgSuccess("鏂囦欢涓婁紶鎴愬姛");
- getList()
- })
-}
-// 涓婁紶澶辫触澶勭悊
-function handleUploadError() {
- proxy.$modal.msgError("鏂囦欢涓婁紶澶辫触");
-}
-// 涓嬭浇闄勪欢
-const downLoadFile = (row) => {
- proxy.$download.name(row.url);
-}
-// 棰勮闄勪欢
-const lookFile = (row) => {
- filePreviewRef.value.open(row.url)
-}
-// 鍒犻櫎
-const handleDelete = () => {
- let ids = [];
- if (selectedRows.value.length > 0) {
- ids = selectedRows.value.map((item) => item.id);
- } else {
- proxy.$modal.msgWarning("璇烽�夋嫨鏁版嵁");
- return;
- }
- ElMessageBox.confirm("閫変腑鐨勫唴瀹瑰皢琚垹闄わ紝鏄惁纭鍒犻櫎锛�", "瀵煎嚭", {
- confirmButtonText: "纭",
- cancelButtonText: "鍙栨秷",
- type: "warning",
- }).then(() => {
- qualityInspectFileDel(ids).then((res) => {
- proxy.$modal.msgSuccess("鍒犻櫎鎴愬姛");
- getList();
- });
- }).catch(() => {
- proxy.$modal.msg("宸插彇娑�");
- });
-};
-defineExpose({
- openDialog,
-});
-</script>
-
-<style scoped>
-
-</style>
\ No newline at end of file
diff --git a/src/views/qualityManagement/rawMaterialInspection/components/formDia.vue b/src/views/qualityManagement/rawMaterialInspection/components/formDia.vue
deleted file mode 100644
index 977b420..0000000
--- a/src/views/qualityManagement/rawMaterialInspection/components/formDia.vue
+++ /dev/null
@@ -1,302 +0,0 @@
-<template>
- <div>
- <el-dialog
- v-model="dialogFormVisible"
- :title="operationType === 'add' ? '鏂板鍘熸潗鏂欐楠�' : '缂栬緫鍘熸潗鏂欐楠�'"
- width="70%"
- @close="closeDia"
- >
- <el-form :model="form" label-width="140px" label-position="top" :rules="rules" ref="formRef">
- <el-row :gutter="30">
- <el-col :span="12">
- <el-form-item label="渚涘簲鍟嗭細" prop="supplier">
- <el-select
- v-model="form.supplier"
- placeholder="璇烽�夋嫨"
- clearable
- >
- <el-option
- v-for="item in supplierList"
- :key="item.id"
- :label="item.supplierName"
- :value="item.supplierName"
- />
- </el-select>
- </el-form-item>
- </el-col>
- <el-col :span="12">
- <el-form-item label="浜у搧鍚嶇О锛�" prop="productId">
- <el-tree-select
- v-model="form.productId"
- placeholder="璇烽�夋嫨"
- clearable
- check-strictly
- @change="getModels"
- :data="productOptions"
- :render-after-expand="false"
- style="width: 100%"
- />
- </el-form-item>
- </el-col>
- </el-row>
- <el-row :gutter="30">
- <el-col :span="12">
- <el-form-item label="瑙勬牸鍨嬪彿锛�" prop="model">
- <el-input v-model="form.model" placeholder="璇疯緭鍏�" clearable/>
- </el-form-item>
- </el-col>
- </el-row>
- <el-row :gutter="30">
- <el-col :span="12">
- <el-form-item label="鍗曚綅锛�" prop="unit">
- <el-input v-model="form.unit" placeholder="璇疯緭鍏�" clearable/>
- </el-form-item>
- </el-col>
- <el-col :span="12">
- <el-form-item label="鏁伴噺锛�" prop="quantity">
- <el-input-number :step="0.01" :min="0" style="width: 100%" v-model="form.quantity" placeholder="璇疯緭鍏�"
- clearable :precision="2"/>
- </el-form-item>
- </el-col>
- </el-row>
- <el-row :gutter="30">
- <el-col :span="12">
- <el-form-item label="妫�娴嬪崟浣嶏細" prop="checkCompany">
- <el-input v-model="form.checkCompany" placeholder="璇疯緭鍏�" clearable/>
- </el-form-item>
- </el-col>
- <el-col :span="12">
- <el-form-item label="妫�娴嬬粨鏋滐細" prop="checkResult">
- <el-select v-model="form.checkResult">
- <el-option label="鍚堟牸" value="鍚堟牸"/>
- <el-option label="涓嶅悎鏍�" value="涓嶅悎鏍�"/>
- </el-select>
- </el-form-item>
- </el-col>
- </el-row>
- <el-row :gutter="30">
- <el-col :span="12">
- <el-form-item label="妫�楠屽憳锛�" prop="checkName">
- <el-input v-model="form.checkName" placeholder="璇疯緭鍏�" clearable/>
-
- </el-form-item>
- </el-col>
- <el-col :span="12">
- <el-form-item label="妫�娴嬫棩鏈燂細" prop="checkTime">
- <el-date-picker
- v-model="form.checkTime"
- type="date"
- placeholder="璇烽�夋嫨鏃ユ湡"
- value-format="YYYY-MM-DD"
- format="YYYY-MM-DD"
- clearable
- style="width: 100%"
- />
- </el-form-item>
- </el-col>
- </el-row>
- </el-form>
-<!-- <div style="margin-bottom: 10px;text-align: right">-->
-<!-- <el-button type="danger" plain @click="handleDelete">鍒犻櫎</el-button>-->
-<!-- </div>-->
- <PIMTable
- rowKey="id"
- :column="tableColumn"
- :tableData="tableData"
- :tableLoading="tableLoading"
- height="400"
- >
- <template #slot="{ row }">
- <el-input v-model="row.testValue" clearable/>
- </template>
- </PIMTable>
- <template #footer>
- <div class="dialog-footer">
- <el-button type="primary" @click="submitForm">纭</el-button>
- <el-button @click="closeDia">鍙栨秷</el-button>
- </div>
- </template>
- </el-dialog>
- </div>
-</template>
-
-<script setup>
-import {ref} from "vue";
-import {getOptions} from "@/api/procurementManagement/procurementLedger.js";
-import {productTreeList} from "@/api/basicData/product.js";
-import {qualityInspectAdd, qualityInspectUpdate} from "@/api/qualityManagement/rawMaterialInspection.js";
-import {ElMessageBox} from "element-plus";
-import {qualityInspectParamDel, qualityInspectParamInfo} from "@/api/qualityManagement/qualityInspectParam.js";
-import {qualityInspectDetailByProductId} from "@/api/qualityManagement/metricMaintenance.js";
-
-const {proxy} = getCurrentInstance()
-const emit = defineEmits(['close'])
-
-const dialogFormVisible = ref(false);
-const operationType = ref('')
-const data = reactive({
- form: {
- checkTime: "",
- supplier: "",
- checkName: "",
- productName: "",
- productId: "",
- model: "",
- unit: "",
- quantity: "",
- checkCompany: "",
- checkResult: "",
- },
- rules: {
- checkTime: [{required: false, message: "璇疯緭鍏�", trigger: "blur"},],
- supplier: [{required: true, message: "璇疯緭鍏�", trigger: "blur"}],
- checkName: [{required: false, message: "璇疯緭鍏�", trigger: "blur"}],
- productId: [{required: true, message: "璇疯緭鍏�", trigger: "blur"}],
- model: [{required: false, message: "璇疯緭鍏�", trigger: "blur"}],
- unit: [{required: false, message: "璇疯緭鍏�", trigger: "blur"}],
- quantity: [{required: true, message: "璇疯緭鍏�", trigger: "blur"}],
- checkCompany: [{required: false, message: "璇疯緭鍏�", trigger: "blur"}],
- checkResult: [{required: true, message: "璇烽�夋嫨妫�娴嬬粨鏋�", trigger: "change"}],
- },
-});
-const tableColumn = ref([
- {
- label: "鎸囨爣",
- prop: "parameterItem",
- },
- {
- label: "鍗曚綅",
- prop: "unit",
- },
- {
- label: "鏍囧噯鍊�",
- prop: "standardValue",
- },
- {
- label: "鍐呮帶鍊�",
- prop: "controlValue",
- },
- {
- label: "妫�楠屽��",
- prop: "testValue",
- dataType: 'slot',
- slot: 'slot',
- },
-]);
-const tableData = ref([]);
-const tableLoading = ref(false);
-
-const {form, rules} = toRefs(data);
-const supplierList = ref([]);
-const productOptions = ref([]);
-const currentProductId = ref(0);
-
-// 鎵撳紑寮规
-const openDialog = (type, row) => {
- operationType.value = type;
- dialogFormVisible.value = true;
- getOptions().then((res) => {
- supplierList.value = res.data;
- });
- form.value = {}
- getProductOptions();
- if (operationType.value === 'edit') {
- form.value = {...row}
- currentProductId.value = row.productId || 0
- getQualityInspectParamList(row.id)
- }
-}
-const getProductOptions = () => {
- productTreeList().then((res) => {
- productOptions.value = convertIdToValue(res);
- });
-};
-const getModels = (value) => {
- currentProductId.value = value
- form.value.productName = findNodeById(productOptions.value, value);
- if (currentProductId) {
- getList();
- }
-};
-const findNodeById = (nodes, productId) => {
- for (let i = 0; i < nodes.length; i++) {
- if (nodes[i].value === productId) {
- return nodes[i].label; // 鎵惧埌鑺傜偣锛岃繑鍥炶鑺傜偣
- }
- if (nodes[i].children && nodes[i].children.length > 0) {
- const foundNode = findNodeById(nodes[i].children, productId);
- if (foundNode) {
- return foundNode; // 鍦ㄥ瓙鑺傜偣涓壘鍒帮紝杩斿洖璇ヨ妭鐐�
- }
- }
- }
- return null; // 娌℃湁鎵惧埌鑺傜偣锛岃繑鍥瀗ull
-};
-
-function convertIdToValue(data) {
- return data.map((item) => {
- const {id, children, ...rest} = item;
- const newItem = {
- ...rest,
- value: id, // 灏� id 鏀逛负 value
- };
- if (children && children.length > 0) {
- newItem.children = convertIdToValue(children);
- }
-
- return newItem;
- });
-}
-
-// 鎻愪氦浜у搧琛ㄥ崟
-const submitForm = () => {
- proxy.$refs.formRef.validate(valid => {
- if (valid) {
- form.value.inspectType = 0
- if (operationType.value === "add") {
- tableData.value.forEach((item) => {
- delete item.id
- })
- }
- const data = {...form.value, qualityInspectParams: tableData.value}
- if (operationType.value === "add") {
- qualityInspectAdd(data).then(res => {
- proxy.$modal.msgSuccess("鎻愪氦鎴愬姛");
- closeDia();
- })
- } else {
- qualityInspectUpdate(data).then(res => {
- proxy.$modal.msgSuccess("鎻愪氦鎴愬姛");
- closeDia();
- })
- }
- }
- })
-}
-
-const getList = () => {
- qualityInspectDetailByProductId(currentProductId.value).then(res => {
- tableData.value = res.data;
- })
-}
-
-const getQualityInspectParamList = (id) => {
- qualityInspectParamInfo(id).then(res => {
- tableData.value = res.data;
- })
-}
-// 鍏抽棴寮规
-const closeDia = () => {
- proxy.resetForm("formRef");
- tableData.value = []
- dialogFormVisible.value = false;
- emit('close')
-};
-defineExpose({
- openDialog,
-});
-</script>
-
-<style scoped>
-
-</style>
\ No newline at end of file
diff --git a/src/views/qualityManagement/rawMaterialInspection/components/inspectionFormDia.vue b/src/views/qualityManagement/rawMaterialInspection/components/inspectionFormDia.vue
deleted file mode 100644
index 32a36fa..0000000
--- a/src/views/qualityManagement/rawMaterialInspection/components/inspectionFormDia.vue
+++ /dev/null
@@ -1,140 +0,0 @@
-<template>
- <div>
- <el-dialog
- v-model="dialogFormVisible"
- title="濉啓妫�楠岃褰�"
- width="70%"
- @close="closeDia"
- >
- <div style="margin-bottom: 10px;text-align: right">
- <el-button type="danger" plain @click="handleDelete">鍒犻櫎</el-button>
- </div>
- <PIMTable
- rowKey="id"
- :column="tableColumn"
- :tableData="tableData"
- :tableLoading="tableLoading"
- :isSelection="true"
- @selection-change="handleSelectionChange"
- height="600"
- >
- <template #slot="{ row }">
- <el-input v-model="row.testValue" clearable/>
- </template>
- </PIMTable>
- <template #footer>
- <div class="dialog-footer">
- <el-button type="primary" @click="submitForm">纭</el-button>
- <el-button @click="closeDia">鍙栨秷</el-button>
- </div>
- </template>
- </el-dialog>
- </div>
-</template>
-
-<script setup>
-import {ref} from "vue";
-import {getStaffJoinInfo, staffJoinAdd, staffJoinUpdate} from "@/api/personnelManagement/onboarding.js";
-import {Search} from "@element-plus/icons-vue";
-import {
- qualityInspectParamDel,
- qualityInspectParamInfo,
- qualityInspectParamUpdate
-} from "@/api/qualityManagement/qualityInspectParam.js";
-import {ElMessageBox} from "element-plus";
-const { proxy } = getCurrentInstance()
-const emit = defineEmits(['close'])
-
-const dialogFormVisible = ref(false);
-const operationType = ref('')
-const currentId = ref('')
-const selectedRows = ref([]);
-const tableColumn = ref([
- {
- label: "鎸囨爣",
- prop: "parameterItem",
- },
- {
- label: "鍗曚綅",
- prop: "unit",
- },
- {
- label: "鏍囧噯鍊�",
- prop: "standardValue",
- },
- {
- label: "鍐呮帶鍊�",
- prop: "controlValue",
- },
- {
- label: "妫�楠屽��",
- prop: "testValue",
- dataType: 'slot',
- slot: 'slot',
- },
-]);
-const tableData = ref([]);
-const tableLoading = ref(false);
-
-// 鎵撳紑寮规
-const openDialog = (type, row) => {
- operationType.value = type;
- dialogFormVisible.value = true;
- if (operationType.value === 'edit') {
- currentId.value = row.id;
- getList()
- }
-}
-const getList = () => {
- qualityInspectParamInfo(currentId.value).then(res => {
- tableData.value = res.data;
- })
-}
-// 琛ㄦ牸閫夋嫨鏁版嵁
-const handleSelectionChange = (selection) => {
- selectedRows.value = selection;
-};
-// 鎻愪氦浜у搧琛ㄥ崟
-const submitForm = () => {
- qualityInspectParamUpdate(tableData.value).then(res => {
- proxy.$modal.msgSuccess("鎻愪氦鎴愬姛");
- closeDia();
- })
-}
-// 鍏抽棴寮规
-const closeDia = () => {
- dialogFormVisible.value = false;
- emit('close')
-};
-// 鍒犻櫎
-const handleDelete = () => {
- let ids = [];
- if (selectedRows.value.length > 0) {
- ids = selectedRows.value.map((item) => item.id);
- } else {
- proxy.$modal.msgWarning("璇烽�夋嫨鏁版嵁");
- return;
- }
- ElMessageBox.confirm("閫変腑鐨勫唴瀹瑰皢琚垹闄わ紝鏄惁纭鍒犻櫎锛�", "瀵煎嚭", {
- confirmButtonText: "纭",
- cancelButtonText: "鍙栨秷",
- type: "warning",
- })
- .then(() => {
- qualityInspectParamDel(ids).then((res) => {
- proxy.$modal.msgSuccess("鍒犻櫎鎴愬姛");
- getList();
- });
- })
- .catch(() => {
- proxy.$modal.msg("宸插彇娑�");
- });
-};
-defineExpose({
- openDialog,
-});
-</script>
-
-<style scoped>
-
-</style>
\ No newline at end of file
diff --git a/src/views/qualityManagement/rawMaterialInspection/index.vue b/src/views/qualityManagement/rawMaterialInspection/index.vue
deleted file mode 100644
index 7536274..0000000
--- a/src/views/qualityManagement/rawMaterialInspection/index.vue
+++ /dev/null
@@ -1,382 +0,0 @@
-<template>
- <div class="app-container">
- <div class="search_form">
- <div>
- <span class="search_title">渚涘簲鍟嗭細</span>
- <el-input
- v-model="searchForm.supplier"
- style="width: 240px"
- placeholder="璇疯緭鍏ヤ緵搴斿晢鎼滅储"
- @change="handleQuery"
- clearable
- :prefix-icon="Search"
- />
- <span style="margin-left: 10px" class="search_title">妫�娴嬫棩鏈燂細</span>
- <el-date-picker v-model="searchForm.entryDate" value-format="YYYY-MM-DD" format="YYYY-MM-DD" type="daterange"
- placeholder="璇烽�夋嫨" clearable @change="changeDaterange"/>
- <el-button type="primary" @click="handleQuery" style="margin-left: 10px"
- >鎼滅储
- </el-button
- >
- </div>
- <div>
- <el-button type="primary" @click="openForm('add')">鏂板</el-button>
- <el-button @click="handleOut">瀵煎嚭</el-button>
- <el-button type="danger" plain @click="handleDelete">鍒犻櫎</el-button>
- </div>
- </div>
- <div class="table_list">
- <PIMTable
- rowKey="id"
- :column="tableColumn"
- :tableData="tableData"
- :page="page"
- :isSelection="true"
- @selection-change="handleSelectionChange"
- :tableLoading="tableLoading"
- @pagination="pagination"
- :total="page.total"
- ></PIMTable>
- </div>
- <InspectionFormDia ref="inspectionFormDia" @close="handleQuery"></InspectionFormDia>
- <FormDia ref="formDia" @close="handleQuery"></FormDia>
- <files-dia ref="filesDia" @close="handleQuery"></files-dia>
- <el-dialog v-model="dialogFormVisible" title="缂栬緫妫�楠屽憳" width="30%"
- @close="closeDia">
- <el-form :model="form" label-width="140px" label-position="top" :rules="rules" ref="formRef">
- <el-form-item label="妫�楠屽憳锛�" prop="checkName">
- <el-select v-model="form.checkName" placeholder="璇烽�夋嫨" clearable>
- <el-option v-for="item in userList" :key="item.nickName" :label="item.nickName"
- :value="item.nickName"/>
- </el-select>
- </el-form-item>
- </el-form>
- <template #footer>
- <div class="dialog-footer">
- <el-button type="primary" @click="submitForm">纭</el-button>
- <el-button @click="closeDia">鍙栨秷</el-button>
- </div>
- </template>
- </el-dialog>
-
- </div>
-</template>
-
-<script setup>
-import {Search} from "@element-plus/icons-vue";
-import {onMounted, ref} from "vue";
-import InspectionFormDia from "@/views/qualityManagement/rawMaterialInspection/components/inspectionFormDia.vue";
-import FormDia from "@/views/qualityManagement/rawMaterialInspection/components/formDia.vue";
-import {ElMessageBox} from "element-plus";
-import {
- downloadQualityInspect,
- qualityInspectDel,
- qualityInspectListPage, qualityInspectUpdate,
- submitQualityInspect
-} from "@/api/qualityManagement/rawMaterialInspection.js";
-import FilesDia from "@/views/qualityManagement/rawMaterialInspection/components/filesDia.vue";
-import dayjs from "dayjs";
-import {userListNoPage} from "@/api/system/user.js";
-
-const data = reactive({
- searchForm: {
- supplier: "",
- entryDate: [
- dayjs().format("YYYY-MM-DD"),
- dayjs().add(1, "day").format("YYYY-MM-DD"),
- ], // 褰曞叆鏃ユ湡
- entryDateStart: dayjs().format("YYYY-MM-DD"),
- entryDateEnd: dayjs().add(1, "day").format("YYYY-MM-DD"),
- },
- rules: {
- checkName: [{required: true, message: "璇烽�夋嫨", trigger: "change"}],
- },
-});
-const {searchForm, rules} = toRefs(data);
-const tableColumn = ref([
- {
- label: "妫�娴嬫棩鏈�",
- prop: "checkTime",
- width: 120
- },
- {
- label: "渚涘簲鍟�",
- prop: "supplier",
- width: 230
- },
- {
- label: "妫�楠屽憳",
- prop: "checkName",
- },
- {
- label: "浜у搧鍚嶇О",
- prop: "productName",
- },
- {
- label: "瑙勬牸鍨嬪彿",
- prop: "model",
- },
- {
- label: "鍗曚綅",
- prop: "unit",
- },
- {
- label: "鏁伴噺",
- prop: "quantity",
- width: 120
- },
- {
- label: "妫�娴嬪崟浣�",
- prop: "checkCompany",
- width: 120
- },
- {
- label: "妫�娴嬬粨鏋�",
- prop: "checkResult",
- dataType: "tag",
- formatType: (params) => {
- if (params === '涓嶅悎鏍�') {
- return "danger";
- } else if (params === '鍚堟牸') {
- return "success";
- } else {
- return null;
- }
- },
- },
- {
- label: "鎻愪氦鐘舵��",
- prop: "inspectState",
- formatData: (params) => {
- if (params) {
- return "宸叉彁浜�";
- } else {
- return "鏈彁浜�";
- }
- },
- },
- {
- dataType: "action",
- label: "鎿嶄綔",
- align: "center",
- fixed: "right",
- width: 280,
- operation: [
- {
- name: "缂栬緫",
- type: "text",
- clickFun: (row) => {
- openForm("edit", row);
- },
- disabled: (row) => {
- return row.inspectState == 1;
- }
- },
- {
- name: "闄勪欢",
- type: "text",
- clickFun: (row) => {
- openFilesFormDia(row);
- },
- },
- {
- name: "鎻愪氦",
- type: "text",
- clickFun: (row) => {
- submit(row.id);
- },
- disabled: (row) => {
- return row.inspectState == 1;
- }
- },
- {
- name: "鍒嗛厤妫�楠屽憳",
- type: "text",
- clickFun: (row) => {
- if (!row.checkName) {
- open(row)
- } else {
- proxy.$modal.msgError("妫�楠屽憳宸插瓨鍦�");
- }
- },
- disabled: (row) => {
- return row.inspectState == 1 || row.checkName;
- }
- },
- {
- name: "涓嬭浇",
- type: "text",
- clickFun: (row) => {
- downLoadFile(row);
- },
- },
- ],
- },
-]);
-const tableData = ref([]);
-const selectedRows = ref([]);
-const tableLoading = ref(false);
-const userList = ref([]);
-const dialogFormVisible = ref(false);
-const form = ref({
- checkName: ""
-});
-const page = reactive({
- current: 1,
- size: 100,
- total: 0
-});
-const currentRow = ref(null)
-const formDia = ref()
-const filesDia = ref()
-const inspectionFormDia = ref()
-const {proxy} = getCurrentInstance()
-const changeDaterange = (value) => {
- searchForm.value.entryDateStart = undefined;
- searchForm.value.entryDateEnd = undefined;
- if (value) {
- searchForm.value.entryDateStart = dayjs(value[0]).format("YYYY-MM-DD");
- searchForm.value.entryDateEnd = dayjs(value[1]).format("YYYY-MM-DD");
- }
- getList();
-};
-// 鏌ヨ鍒楄〃
-/** 鎼滅储鎸夐挳鎿嶄綔 */
-const handleQuery = () => {
- page.current = 1;
- getList();
-};
-const pagination = (obj) => {
- page.current = obj.page;
- page.size = obj.limit;
- getList();
-};
-const getList = () => {
- tableLoading.value = true;
- const params = {...searchForm.value, ...page};
- params.entryDate = undefined
- qualityInspectListPage({...params, inspectType: 0}).then(res => {
- tableLoading.value = false;
- tableData.value = res.data.records
- page.total = res.data.total;
- }).catch(err => {
- tableLoading.value = false;
- })
-};
-// 琛ㄦ牸閫夋嫨鏁版嵁
-const handleSelectionChange = (selection) => {
- selectedRows.value = selection;
-};
-
-// 鎵撳紑寮规
-const openForm = (type, row) => {
- nextTick(() => {
- formDia.value?.openDialog(type, row)
- })
-};
-// 鎵撳紑闄勪欢寮规
-const openFilesFormDia = (type, row) => {
- nextTick(() => {
- filesDia.value?.openDialog(type, row)
- })
-};
-
-// 鍒犻櫎
-const handleDelete = () => {
- let ids = [];
- if (selectedRows.value.length > 0) {
- ids = selectedRows.value.map((item) => item.id);
- } else {
- proxy.$modal.msgWarning("璇烽�夋嫨鏁版嵁");
- return;
- }
- ElMessageBox.confirm("閫変腑鐨勫唴瀹瑰皢琚垹闄わ紝鏄惁纭鍒犻櫎锛�", "瀵煎嚭", {
- confirmButtonText: "纭",
- cancelButtonText: "鍙栨秷",
- type: "warning",
- })
- .then(() => {
- qualityInspectDel(ids).then((res) => {
- proxy.$modal.msgSuccess("鍒犻櫎鎴愬姛");
- getList();
- });
- })
- .catch(() => {
- proxy.$modal.msg("宸插彇娑�");
- });
-};
-// 瀵煎嚭
-const handleOut = () => {
- ElMessageBox.confirm("閫変腑鐨勫唴瀹瑰皢琚鍑猴紝鏄惁纭瀵煎嚭锛�", "瀵煎嚭", {
- confirmButtonText: "纭",
- cancelButtonText: "鍙栨秷",
- type: "warning",
- })
- .then(() => {
- proxy.download("/quality/qualityInspect/export", {inspectType: 0}, "鍘熸潗鏂欐楠�.xlsx");
- })
- .catch(() => {
- proxy.$modal.msg("宸插彇娑�");
- });
-};
-
-// 鎻愪环
-const submit = async (id) => {
- const res = await submitQualityInspect({id: id})
- if (res.code === 200) {
- proxy.$modal.msgSuccess("鎻愪氦鎴愬姛");
- getList();
- }
-}
-
-// 鍏抽棴寮规
-const closeDia = () => {
- proxy.resetForm("formRef");
- dialogFormVisible.value = false;
-};
-
-const submitForm = () => {
- if (currentRow.value) {
- const data = {
- ...form.value,
- id: currentRow.value.id
- }
- qualityInspectUpdate(data).then(res => {
- proxy.$modal.msgSuccess("鎻愪氦鎴愬姛");
- closeDia();
- getList();
- })
- }
-};
-
-const open = async (row) => {
- let userLists = await userListNoPage();
- userList.value = userLists.data;
- currentRow.value = row
- dialogFormVisible.value = true
-}
-
-const downLoadFile = (row) => {
- downloadQualityInspect({ id: row.id }).then((blobData) => {
- const blob = new Blob([blobData], {
- type: 'application/vnd.openxmlformats-officedocument.wordprocessingml.document',
- })
- const downloadUrl = window.URL.createObjectURL(blob)
-
- const link = document.createElement('a')
- link.href = downloadUrl
- link.download = '鍘熸潗鏂欐楠屾姤鍛�.docx'
- document.body.appendChild(link)
- link.click()
-
- document.body.removeChild(link)
- window.URL.revokeObjectURL(downloadUrl)
- })
-};
-
-onMounted(() => {
- getList();
-});
-</script>
-
-<style scoped></style>
diff --git a/src/views/reportAnalysis/projectProfit/index.vue b/src/views/reportAnalysis/projectProfit/index.vue
deleted file mode 100644
index 9584776..0000000
--- a/src/views/reportAnalysis/projectProfit/index.vue
+++ /dev/null
@@ -1,120 +0,0 @@
-<template>
- <div class="app-container">
- <el-form :model="filters" :inline="true" label-width="80px">
- <el-form-item label="瀹㈡埛鍚嶇О">
- <el-input v-model="filters.customerName" placeholder="璇疯緭鍏ュ鎴峰悕绉�" />
- </el-form-item>
- <el-form-item>
- <el-button type="primary" @click="getTableData"> 鎼滅储 </el-button>
- <el-button @click="resetFilters"> 閲嶇疆 </el-button>
- </el-form-item>
- </el-form>
- <div class="table_list">
- <PIMTable
- rowKey="id"
- :column="columns"
- :tableLoading="loading"
- :tableData="dataList"
- :page="{
- current: pagination.currentPage,
- size: pagination.pageSize,
- total: pagination.total,
- }"
- :isShowSummary="true"
- :summaryMethod="summaryMethod"
- @pagination="changePage"
- ></PIMTable>
- </div>
- </div>
-</template>
-
-<script setup>
-import { usePaginationApi } from "@/hooks/usePaginationApi";
-import { getPurchaseList } from "@/api/procurementManagement/projectProfit";
-import { onMounted } from "vue";
-import { summarizeTable } from "@/utils/summarizeTable";
-
-defineOptions({
- name: "椤圭洰鍒╂鼎",
-});
-
-const {
- loading,
- filters,
- columns,
- dataList,
- pagination,
- getTableData,
- resetFilters,
- onCurrentChange,
-} = usePaginationApi(
- getPurchaseList,
- {
- customerName: undefined,
- },
- [
- {
- label: "閿�鍞悎鍚屽彿",
- align: "center",
- prop: "customerContractNo",
- },
- {
- label: "瀹㈡埛鍚嶇О",
- align: "center",
- prop: "customerName",
- },
- {
- label: "椤圭洰鍚嶇О",
- align: "center",
- prop: "projectName",
- },
- {
- label: "鍚堝悓閲戦",
- align: "center",
- prop: "contractAmount",
- },
- {
- label: "閲囪喘閲戦",
- align: "center",
- prop: "purchaseAmount",
- },
- {
- label: "鍒╂鼎",
- align: "center",
- prop: "balance",
- },
- {
- label: "鍒╂鼎鐜�",
- align: "center",
- prop: "balanceRatio",
- },
- {
- label: "澧炲�肩◣",
- align: "center",
- prop: "balanceAmount",
- },
- ]
-);
-
-const changePage = ({ page }) => {
- pagination.currentPage = page;
- onCurrentChange(page);
-};
-
-// 鍚堣鏂规硶
-const summaryMethod = (param) => {
- return summarizeTable(
- param,
- ['contractAmount', 'purchaseAmount', 'balance', 'balanceAmount', 'balanceRatio'],
- );
-};
-
-onMounted(() => {
- getTableData();
-});
-</script>
-<style lang="scss" scoped>
-.table_list {
- margin-top: unset;
-}
-</style>
diff --git a/src/views/reportAnalysis/taxComparison/index.vue b/src/views/reportAnalysis/taxComparison/index.vue
deleted file mode 100644
index a97ca4f..0000000
--- a/src/views/reportAnalysis/taxComparison/index.vue
+++ /dev/null
@@ -1,99 +0,0 @@
-<template>
- <div class="app-container">
- <el-form :model="filters" :inline="true">
- <el-form-item label="鏃ユ湡">
- <el-date-picker
- style="width: 240px"
- v-model="filters.month"
- value-format="YYYY-MM"
- format="YYYY-MM"
- type="month"
- placeholder="閫夋嫨鏈堜唤"
- clearable
- @change="getTableData"
- />
- </el-form-item>
- <el-form-item>
- <el-button type="primary" @click="getTableData"> 鎼滅储 </el-button>
- <el-button @click="resetFilters"> 閲嶇疆 </el-button>
- </el-form-item>
- </el-form>
- <div class="table_list">
- <PIMTable
- rowKey="id"
- :column="columns"
- :tableData="dataList"
- :page="{
- current: pagination.currentPage,
- size: pagination.pageSize,
- total: pagination.total,
- }"
- @pagination="changePage"
- />
- </div>
- </div>
-</template>
-
-<script setup>
-import { usePaginationApi } from "@/hooks/usePaginationApi";
-import { onMounted } from "vue";
-import { getTaxList } from "@/api/procurementManagement/taxComparison";
-
-defineOptions({
- name: "澧炲�肩◣姣斿",
-});
-
-const {
- loading,
- filters,
- columns,
- dataList,
- pagination,
- getTableData,
- resetFilters,
- onCurrentChange,
-} = usePaginationApi(
- getTaxList,
- {
- month: [], // 鏉ョエ鏃ユ湡
- },
- [
- {
- label: "鏈堜唤",
- prop: "month",
- align: "center",
- },
- {
- label: "閿�椤圭◣棰�",
- prop: "jtaxAmount",
- align: "center",
- },
- {
- label: "杩涢」绋庨",
- prop: "xtaxAmount",
- align: "center",
- },
- {
- label: "閿�-杩�",
- prop: "taxAmount",
- align: "center",
- },
- ],
- {}
-);
-
-const changePage = ({ page }) => {
- pagination.currentPage = page;
- onCurrentChange(page);
-};
-
-onMounted(() => {
- getTableData();
-});
-</script>
-
-<style lang="scss" scoped>
-.table_list {
- margin-top: unset;
-}
-</style>
diff --git a/src/views/salesManagement/invoiceLedger/index.vue b/src/views/salesManagement/invoiceLedger/index.vue
deleted file mode 100644
index 4e8c274..0000000
--- a/src/views/salesManagement/invoiceLedger/index.vue
+++ /dev/null
@@ -1,448 +0,0 @@
-<template>
- <div class="app-container">
- <div class="search_form">
- <el-form :inline="true" :model="searchForm">
- <el-form-item label="瀹㈡埛鍚嶇О/鍚堝悓鍙�">
- <el-input v-model="searchForm.searchText" style="width: 240px" placeholder="杈撳叆瀹㈡埛鍚嶇О/閿�鍞悎鍚屽彿鎼滅储"
- @change="handleQuery" clearable :prefix-icon="Search" />
- </el-form-item>
- <el-form-item label="寮�绁ㄦ棩鏈�">
- <el-date-picker style="width: 240px" v-model="searchForm.invoiceDate" value-format="YYYY-MM-DD"
- format="YYYY-MM-DD" type="daterange" start-placeholder="寮�濮嬫椂闂�" end-placeholder="缁撴潫鏃堕棿" clearable
- @change="changeDateRange" @clear="clearRange" />
- </el-form-item>
- <el-form-item label="褰曞叆鏃ユ湡">
- <el-date-picker style="width: 100%" v-model="searchForm.createTimeStart" value-format="YYYY-MM-DD HH:mm:ss"
- format="YYYY-MM-DD" type="date" placeholder="璇烽�夋嫨" clearable @change="handleQuery" />
- </el-form-item>
- <el-form-item label="涓嶆樉绀烘湁鍙戠エ琛�">
- <el-checkbox v-model="searchForm.status" @change="handleQuery" />
- </el-form-item>
- <el-form-item>
- <el-button type="primary" @click="handleQuery"> 鎼滅储 </el-button>
- <el-button @click="resetForm"> 閲嶇疆 </el-button>
- <el-button @click="handleOut" type="primary">瀵煎嚭</el-button>
- </el-form-item>
- </el-form>
- </div>
- <div class="table_list">
- <el-table :data="tableData" border v-loading="tableLoading" @selection-change="handleSelectionChange"
- :row-key="(row) => row.id" show-summary :summary-method="summarizeMainTable" height="calc(100vh - 18.5em)" stripe>
- <el-table-column align="center" type="selection" width="55" />
- <el-table-column align="center" label="搴忓彿" type="index" width="60" />
- <el-table-column label="閿�鍞悎鍚屽彿" prop="salesContractNo" show-overflow-tooltip width="180" />
- <el-table-column label="瀹㈡埛鍚堝悓鍙�" prop="customerContractNo" show-overflow-tooltip width="180" />
- <el-table-column label="瀹㈡埛鍚嶇О" prop="customerName" show-overflow-tooltip width="240" />
- <el-table-column label="椤圭洰" prop="projectName" width="320" />
- <el-table-column label="浜у搧澶х被" prop="productCategory" width="200" />
- <el-table-column label="瑙勬牸鍨嬪彿" prop="specificationModel" width="160" show-overflow-tooltip />
- <el-table-column label="鍙戠エ鍙�" prop="invoiceNo" width="200" show-overflow-tooltip />
- <el-table-column label="鍙戠エ閲戦(鍏�)" prop="invoiceTotal" show-overflow-tooltip :formatter="formattedNumber"
- width="200" />
- <el-table-column label="绋庣巼(%)" prop="taxRate" show-overflow-tooltip />
- <el-table-column label="褰曞叆浜�" prop="invoicePerson" show-overflow-tooltip />
- <el-table-column label="褰曞叆鏃ユ湡" prop="createTime" show-overflow-tooltip :formatter="formatDate" width="180" />
- <el-table-column label="寮�绁ㄦ棩鏈�" prop="invoiceDate" show-overflow-tooltip width="120" />
- <el-table-column label="鍙戠エ" prop="invoiceFileName" width="120" align="center" show-overflow-tooltip fixed="right">
- <template #default="scope">
- <el-button v-if="scope.row.invoiceFileName" text bg type="primary"
- @click="handleFile(scope.row.commonFiles)">
- 鏌ョ湅闄勪欢
- </el-button>
- <el-button v-else link type="primary" @click="handleDownload(scope.row)" :disabled="scope.row.invoicePerson !== userStore.nickName">
- 涓婁紶
- </el-button>
- </template>
- </el-table-column>
- <el-table-column fixed="right" label="鎿嶄綔" width="150" align="center">
- <template #default="scope">
- <el-button link type="primary" size="small" @click="openForm(scope.row)" :disabled="scope.row.invoicePerson !== userStore.nickName">缂栬緫</el-button>
- <el-button link type="primary" size="small" @click="delInvoiceLedger(scope.row)" :disabled="scope.row.invoicePerson !== userStore.nickName">鍒犻櫎</el-button>
- </template>
- </el-table-column>
- </el-table>
- <pagination v-show="total > 0" :total="total" layout="total, sizes, prev, pager, next, jumper"
- :page="page.current" :limit="page.size" @pagination="paginationChange" />
- </div>
- <el-dialog v-model="dialogFormVisible" title="寮�绁ㄥ彴璐﹂〉闈�" width="70%" @close="closeDia">
- <el-form :model="form" label-width="140px" label-position="top" :rules="rules" ref="formRef">
- <el-row :gutter="30">
- <el-col :span="12">
- <el-form-item label="閿�鍞悎鍚屽彿锛�" prop="salesContractNo">
- <el-input v-model="form.salesContractNo" disabled></el-input>
- </el-form-item>
- </el-col>
- <el-col :span="12">
- <el-form-item label="瀹㈡埛鍚嶇О锛�" prop="customerName">
- <el-input v-model="form.customerName" placeholder="鑷姩濉厖" clearable disabled />
- </el-form-item>
- </el-col>
- </el-row>
- <el-row :gutter="30">
- <el-col :span="12">
- <el-form-item label="鍙戠エ鍙凤細" prop="invoiceNo">
- <el-input v-model="form.invoiceNo" placeholder="璇疯緭鍏�" clearable />
- </el-form-item>
- </el-col>
- <el-col :span="12">
- <el-form-item :label="`鍙戠エ閲戦(鍏�)锛� 鍚堝悓鎬婚(${form.taxInclusiveTotalPrice}鍏�)`" prop="invoiceTotal">
- <el-input-number :step="0.01" :min="0" :max="form.taxInclusiveTotalPrice" style="width: 100%" v-model="form.invoiceTotal" placeholder="璇疯緭鍏�" clearable :precision="2"/>
- </el-form-item>
- </el-col>
- </el-row>
- <el-row :gutter="30">
- <el-col :span="12">
- <el-form-item label="寮�绁ㄤ汉锛�" prop="invoicePerson">
- <el-input v-model="form.invoicePerson" placeholder="璇疯緭鍏�" clearable disabled />
- </el-form-item>
- </el-col>
- <el-col :span="12">
- <el-form-item label="寮�绁ㄦ棩鏈燂細" prop="invoiceDate">
- <el-date-picker style="width: 100%" v-model="form.invoiceDate" value-format="YYYY-MM-DD"
- format="YYYY-MM-DD" type="date" placeholder="璇烽�夋嫨" clearable />
- </el-form-item>
- </el-col>
- </el-row>
- <el-row :gutter="30">
- <el-col :span="24">
- <el-form-item label="闄勪欢鏉愭枡锛�" prop="remark">
- <el-upload v-model:file-list="fileList" :action="upload.url" multiple ref="fileUpload" auto-upload
- :headers="upload.headers" accept=".pdf" :limit="10" :before-upload="handleBeforeUpload"
- :on-error="handleUploadError" :on-success="handleUploadSuccess" :on-remove="handleRemove">
- <el-button type="primary">涓婁紶</el-button>
- <template #tip>
- <!-- 鏂囦欢鏍煎紡鏀寔 doc锛宒ocx锛寈ls锛寈lsx锛宲pt锛宲ptx锛宲df锛宼xt锛寈ml锛宩pg锛宩peg锛宲ng锛実if锛宐mp锛宺ar锛寊ip锛�7z-->
- <div class="el-upload__tip">鏂囦欢鏍煎紡鏀寔 pdf</div>
- </template>
- </el-upload>
- </el-form-item>
- </el-col>
- </el-row>
- </el-form>
- <template #footer>
- <div class="dialog-footer">
- <el-button type="primary" @click="submitForm">纭</el-button>
- <el-button @click="closeDia">鍙栨秷</el-button>
- </div>
- </template>
- </el-dialog>
- <el-dialog title="涓婁紶寮圭獥" width="50%" v-model="uploadModal">
- <el-row :gutter="30">
- <el-col :span="24">
- <el-form-item label="闄勪欢鏉愭枡锛�" prop="remark">
- <el-upload v-model:file-list="fileList" :action="upload.url" multiple ref="fileUpload" auto-upload
- :headers="upload.headers" accept=".pdf" :limit="10" style="width: 100%" :on-exceed="handleExceed"
- :before-upload="handleBeforeUpload" :on-error="handleUploadError" :on-success="handleUploadSuccess"
- :on-remove="handleRemove">
- <el-button type="primary">涓婁紶</el-button>
- <template #tip>
- <div class="el-upload__tip">鏂囦欢鏍煎紡浠呮敮鎸� pdf</div>
- </template>
- </el-upload>
- </el-form-item>
- </el-col>
- </el-row>
- <template #footer>
- <div class="dialog-footer">
- <el-button @click="commiInvoicetFile" type="primary">纭</el-button>
- <el-button @click="uploadModal = false">鍙栨秷</el-button>
- </div>
- </template>
- </el-dialog>
- </div>
-</template>
-
-<script setup>
-import pagination from "@/components/PIMTable/Pagination.vue";
-import { ref } from "vue";
-import { Search } from "@element-plus/icons-vue";
-import { ElMessageBox } from "element-plus";
-import { getToken } from "@/utils/auth";
-import {
- invoiceLedgerSaveOrUpdate,
- invoiceLedgerProductInfo,
- commitFile,
- registrationProductPage,
- delInvoiceLedgerByRegProductId,
-} from "../../../api/salesManagement/invoiceLedger.js";
-import useUserStore from "@/store/modules/user.js";
-import useFormData from "@/hooks/useFormData";
-import dayjs from "dayjs";
-
-const { proxy } = getCurrentInstance();
-const tableData = ref([]);
-const productData = ref([]);
-const selectedRows = ref([]);
-const tableLoading = ref(false);
-const page = reactive({
- current: 1,
- size: 100,
-});
-const total = ref(0);
-const fileList = ref([]);
-const dialogFormVisible = ref(false);
-const data = reactive({
- searchForm: {
- searchText: "",
- status: false,
- invoiceDate: [
- dayjs().startOf("month").format("YYYY-MM-DD"),
- dayjs().endOf("month").format("YYYY-MM-DD"),
- ],
- invoiceDateStart: dayjs().startOf("month").format("YYYY-MM-DD"),
- invoiceDateEnd: dayjs().endOf("month").format("YYYY-MM-DD"),
- createTimeStart: "", // 褰曞叆鏃ユ湡
- },
- form: {
- salesLedgerId: "",
- customerId: "",
- invoiceNo: "",
- invoiceTotal: "",
- taxRate: "",
- invoicePerson: "",
- invoiceDate: "",
- customerName: "",
- fileList: [],
- createTime: "", // 褰曞叆鏃ユ湡
- },
- rules: {
- salesLedgerId: [{ required: true, message: "璇烽�夋嫨", trigger: "change" }],
- customerId: [{ required: true, message: "璇疯緭鍏�", trigger: "blur" }],
- invoiceNo: [{ required: true, message: "璇烽�夋嫨", trigger: "change" }],
- invoiceAmount: [{ required: true, message: "璇疯緭鍏�", trigger: "blur" }],
- taxRate: [{ required: true, message: "璇烽�夋嫨", trigger: "change" }],
- invoicePerson: [{ required: true, message: "璇烽�夋嫨", trigger: "change" }],
- invoiceDate: [{ required: true, message: "璇烽�夋嫨", trigger: "change" }],
- customerName: [{ required: true, message: "璇烽�夋嫨", trigger: "change" }],
- },
-});
-const { form, rules } = toRefs(data);
-const { form: searchForm, resetForm } = useFormData(data.searchForm);
-const currentId = ref("");
-const userStore = useUserStore();
-const upload = reactive({
- // 涓婁紶鐨勫湴鍧�
- url: import.meta.env.VITE_APP_BASE_API + "/invoiceLedger/uploadFile",
- // 璁剧疆涓婁紶鐨勮姹傚ご閮�
- headers: { Authorization: "Bearer " + getToken() },
-});
-const matchFileType = ref(["pdf"]);
-const uploadModal = ref(false);
-const formattedNumber = (row, column, cellValue) => {
- return parseFloat(cellValue).toFixed(2);
-};
-const formatDate = (row, column, cellValue) => {
- return dayjs(cellValue).format("YYYY-MM-DD HH:mm:ss");
-};
-// 鏌ヨ鍒楄〃
-/** 鎼滅储鎸夐挳鎿嶄綔 */
-const handleQuery = () => {
- page.current = 1;
- getList();
-};
-const paginationChange = (obj) => {
- page.current = obj.page;
- page.size = obj.limit;
- getList();
-};
-const getList = () => {
- tableLoading.value = true;
- const { invoiceDate, ...rest } = searchForm;
- registrationProductPage({ ...rest, ...page }).then((res) => {
- tableLoading.value = false;
- tableData.value = res.data.records;
- total.value = res.data.total;
- });
-};
-// 琛ㄦ牸閫夋嫨鏁版嵁
-const handleSelectionChange = (selection) => {
- selectedRows.value = selection;
-};
-// 涓昏〃鍚堣鏂规硶
-const summarizeMainTable = (param) => {
- return proxy.summarizeTable(param, ["invoiceTotal"], {
- ticketsNum: { noDecimal: true }, // 涓嶄繚鐣欏皬鏁�
- futureTickets: { noDecimal: true }, // 涓嶄繚鐣欏皬鏁�
- });
-};
-// 鎵撳紑寮规
-const openForm = (row) => {
- form.value = {};
- productData.value = [];
- fileList.value = [];
- currentId.value = row.id;
-
- invoiceLedgerProductInfo({ id: row.id }).then((res) => {
- form.value = { ...res.data };
- fileList.value = res.data.fileList;
- if (!form.value.invoicePerson) {
- form.value.invoicePerson = userStore.nickName;
- form.value.entryDate = getCurrentDate();
- }
- if (!form.value.invoiceDate) {
- form.value.invoiceDate = getCurrentDate();
- }
- });
- dialogFormVisible.value = true;
-};
-// 涓婁紶澶氫釜鏂囦欢灏辫鐩栧師鏉ョ殑
-const handleExceed = (files) => {
- proxy.$refs["fileUpload"].clearFiles();
- const file = files[0];
- file.uid = genFileId();
- proxy.$refs["fileUpload"].handleStart(file);
-};
-// 涓婁紶鍓嶆牎妫�
-function handleBeforeUpload(file) {
- console.log("file", file);
- // 鏍℃鏂囦欢澶у皬
- if (file.size > 1024 * 1024 * 50) {
- proxy.$modal.msgError("涓婁紶鏂囦欢澶у皬涓嶈兘瓒呰繃50MB!");
- return false;
- }
- // 鍒ゆ柇鏂囦欢鏍煎紡鏄惁绗﹀悎
- const fileType = file.name.split(".").pop().toLowerCase();
- if (!matchFileType.value.includes(fileType)) {
- proxy.$modal.msgError("鏂囦欢鏍煎紡涓嶅尮閰�");
- return false;
- }
- proxy.$modal.loading("姝e湪涓婁紶鏂囦欢锛岃绋嶅��...");
- return true;
-}
-// 涓婁紶澶辫触
-function handleUploadError(err) {
- proxy.$modal.msgError("涓婁紶鏂囦欢澶辫触");
- proxy.$modal.closeLoading();
-}
-// 涓婁紶鎴愬姛鍥炶皟
-function handleUploadSuccess(res, file, uploadFiles) {
- proxy.$modal.closeLoading();
- if (res.code === 200) {
- proxy.$refs["fileUpload"].handleRemove(file);
- fileList.value.push(res.data);
- proxy.$modal.msgSuccess("涓婁紶鎴愬姛");
- } else {
- proxy.$modal.msgError(res.msg);
- proxy.$refs.fileUpload.handleRemove(file);
- }
-}
-// 绉婚櫎鏂囦欢
-function handleRemove(file) {
- let index = fileList.value.findIndex((item) => item.url === file.url);
- if (index > -1) {
- fileList.value.splice(index, 1);
- }
-}
-// 鎻愪氦琛ㄥ崟
-const submitForm = () => {
- proxy.$refs["formRef"].validate((valid) => {
- if (valid) {
- form.value.fileList = fileList.value;
- invoiceLedgerSaveOrUpdate(form.value).then((res) => {
- proxy.$modal.msgSuccess("鎻愪氦鎴愬姛");
- closeDia();
- getList();
- });
- }
- });
-};
-// 鍏抽棴寮规
-const closeDia = () => {
- proxy.resetForm("formRef");
- dialogFormVisible.value = false;
-};
-// 瀵煎嚭
-const handleOut = () => {
- ElMessageBox.confirm("閫変腑鐨勫唴瀹瑰皢琚鍑猴紝鏄惁纭瀵煎嚭锛�", "瀵煎嚭", {
- confirmButtonText: "纭",
- cancelButtonText: "鍙栨秷",
- type: "warning",
- })
- .then(() => {
- proxy.download("/invoiceLedger/export", {}, "寮�绁ㄥ彴璐�.xlsx");
- })
- .catch(() => {
- proxy.$modal.msg("宸插彇娑�");
- });
-};
-
-// 鎵撳紑闄勪欢涓婁紶寮圭獥
-const handleDownload = (val) => {
- fileList.value = [];
- uploadModal.value = true;
- currentId.value = val.id;
-};
-
-// 纭鏂囦欢涓婁紶
-const commiInvoicetFile = () => {
- const object = {
- fileList: fileList.value,
- id: currentId.value,
- };
- commitFile(object).then((res) => {
- if (res.code === 200) {
- proxy.$modal.msgSuccess("鎻愪氦鎴愬姛");
- uploadModal.value = false;
- }
- getList();
- currentId.value = "";
- fileList.value = [];
- });
-};
-// 鍒犻櫎寮�绁ㄥ彴璐�
-const delInvoiceLedger = (row) => {
- ElMessageBox.confirm("璇ュ彂绁ㄥ彴璐﹀皢琚垹闄�,鏄惁纭鍒犻櫎", {
- confirmButtonText: "纭",
- cancelButtonText: "鍙栨秷",
- type: "warning",
- })
- .then(() => {
- delInvoiceLedgerByRegProductId(row.id).then((res) => {
- proxy.$modal.msgSuccess("鍒犻櫎鎴愬姛");
- getList();
- });
- })
- .catch(() => {
- proxy.$modal.msg("宸插彇娑�");
- });
-};
-
-// 鑾峰彇褰撳墠鏃ユ湡骞舵牸寮忓寲涓� YYYY-MM-DD
-function getCurrentDate() {
- const today = new Date();
- const year = today.getFullYear();
- const month = String(today.getMonth() + 1).padStart(2, "0"); // 鏈堜唤浠�0寮�濮�
- const day = String(today.getDate()).padStart(2, "0");
- return `${year}-${month}-${day}`;
-}
-const changeDateRange = (date) => {
- if (date) {
- searchForm.invoiceDateStart = date[0];
- searchForm.invoiceDateEnd = date[1];
- getList();
- }
-};
-
-const handleFile = (commonFiles) => {
- commonFiles.forEach((e) => {
- proxy.$download.name(e.url);
- });
-};
-
-const clearRange = () => {
- searchForm.invoiceDate = [];
- searchForm.invoiceDateStart = undefined;
- searchForm.invoiceDateEnd = undefined;
- getList();
-};
-
-onMounted(() => {
- getList();
-});
-</script>
-
-<style scoped lang="scss">
-.table_list {
- margin-top: unset;
-}
-</style>
diff --git a/src/views/salesManagement/invoiceRegistration/index.vue b/src/views/salesManagement/invoiceRegistration/index.vue
deleted file mode 100644
index 9d39684..0000000
--- a/src/views/salesManagement/invoiceRegistration/index.vue
+++ /dev/null
@@ -1,692 +0,0 @@
-<template>
- <div class="app-container">
- <div class="search_form">
- <el-form :inline="true" :model="searchForm">
- <el-form-item label="瀹㈡埛鍚嶇О">
- <el-input
- v-model="searchForm.customerName"
- style="width: 240px"
- placeholder="璇疯緭鍏ュ悕绉版悳绱�"
- clearable
- :prefix-icon="Search"
- @change="handleQuery"
- />
- </el-form-item>
- <el-form-item label="瀹㈡埛鍚堝悓鍙�">
- <el-input
- v-model="searchForm.customerContractNo"
- placeholder="璇疯緭鍏ュ鎴峰悎鍚屽彿"
- clearable
- />
- </el-form-item>
- <el-form-item label="椤圭洰鍚嶇О">
- <el-input
- v-model="searchForm.projectName"
- placeholder="璇疯緭鍏ラ」鐩悕绉�"
- clearable
- />
- </el-form-item>
- <el-form-item>
- <el-checkbox
- v-model="searchForm.status"
- label="涓嶆樉绀烘湭寮�绁ㄩ噾棰濅负0"
- @change="handleQuery"
- />
- </el-form-item>
- <br/>
- <el-form-item label="鍚堝悓褰曞叆鏃ユ湡">
- <el-date-picker style="width: 240px" v-model="searchForm.commonDate" value-format="YYYY-MM-DD"
- format="YYYY-MM-DD" type="daterange" start-placeholder="寮�濮嬫椂闂�" end-placeholder="缁撴潫鏃堕棿" clearable
- @change="changeDateRange" @clear="clearRange" />
- </el-form-item>
- <el-form-item>
- <el-button type="primary" @click="handleQuery"> 鎼滅储 </el-button>
- <el-button @click="resetForm"> 閲嶇疆 </el-button>
- </el-form-item>
- </el-form>
- </div>
- <div class="table_list">
- <div class="flex justify-between">
- <div></div>
- <el-button type="primary" @click="openForm" style="margin-bottom: 8px">
- 鏂板鐧昏
- </el-button>
- </div>
- <el-table
- :data="tableData"
- :border="true"
- height="calc(100vh - 21em)"
- v-loading="tableLoading"
- :expand-row-keys="expandedRowKeys"
- :row-key="(row) => row.id"
- show-summary
- :summary-method="summarizeMainTable"
- @expand-change="expandChange"
- @selection-change="handleSelectionChange"
- stripe
- >
- <el-table-column align="center" type="selection" width="55" />
- <el-table-column type="expand">
- <template #default="props">
- <el-table
- :data="props.row.children"
- border
- show-summary
- :summary-method="summarizeChildrenTable"
- stripe
- >
- <el-table-column
- align="center"
- label="搴忓彿"
- type="index"
- width="60"
- />
- <el-table-column label="浜у搧澶х被" prop="productCategory" />
- <el-table-column
- label="瑙勬牸鍨嬪彿"
- prop="specificationModel"
- width="150"
- />
- <el-table-column label="鍗曚綅" prop="unit" width="70" />
- <el-table-column label="鏁伴噺" prop="quantity" width="70" />
- <el-table-column label="绋庣巼(%)" prop="taxRate" width="80" />
- <el-table-column
- label="鍚◣鍗曚环(鍏�)"
- prop="taxInclusiveUnitPrice"
- :formatter="formattedNumber"
- />
- <el-table-column
- label="鍚◣鎬讳环(鍏�)"
- prop="taxInclusiveTotalPrice"
- :formatter="formattedNumber"
- />
- <el-table-column
- label="涓嶅惈绋庢�讳环(鍏�)"
- prop="taxExclusiveTotalPrice"
- :formatter="formattedNumber"
- />
- <el-table-column
- label="寮�绁ㄦ暟"
- prop="invoiceNum"
- :formatter="formattedNumber"
- />
- <el-table-column
- label="寮�绁ㄩ噾棰�(鍏�)"
- prop="invoiceAmount"
- :formatter="formattedNumber"
- />
- <el-table-column
- label="鏈紑绁ㄦ暟"
- prop="noInvoiceNum"
- :formatter="formattedNumber"
- />
- <el-table-column
- label="鏈紑绁ㄩ噾棰�(鍏�)"
- prop="noInvoiceAmount"
- :formatter="formattedNumber"
- />
- </el-table>
- </template>
- </el-table-column>
- <el-table-column align="center" label="搴忓彿" type="index" width="60" />
- <el-table-column label="鍚堝悓褰曞叆鏃ユ湡" prop="entryDate" width="120" />
- <el-table-column
- label="閿�鍞悎鍚屽彿"
- prop="salesContractNo"
- show-overflow-tooltip
- width="200"
- />
- <el-table-column
- label="瀹㈡埛鍚堝悓鍙�"
- prop="customerContractNo"
- width="200"
- show-overflow-tooltip
- />
- <el-table-column
- label="瀹㈡埛鍚嶇О"
- prop="customerName"
- show-overflow-tooltip
- width="240"
- />
- <el-table-column label="涓氬姟鍛�" prop="salesman" show-overflow-tooltip width="90"/>
- <el-table-column
- label="椤圭洰鍚嶇О"
- prop="projectName"
- show-overflow-tooltip
- width="200"
- />
- <el-table-column
- label="鍚堝悓閲戦(鍏�)"
- prop="contractAmount"
- show-overflow-tooltip
- :formatter="formattedNumber"
- width="220"
-
- />
- <el-table-column
- label="宸插紑绁ㄩ噾棰�(鍏�)"
- prop="invoiceTotal"
- show-overflow-tooltip
- :formatter="formattedNumber"
- width="120"
- />
- <el-table-column
- label="鏈紑绁ㄩ噾棰�(鍏�)"
- prop="noInvoiceAmountTotal"
- show-overflow-tooltip
- width="120"
- >
- <template #default="{ row, column }">
- <el-text type="danger">
- {{ formattedNumber(row, column, row.noInvoiceAmountTotal) }}
- </el-text>
- </template>
- </el-table-column>
- </el-table>
- <pagination
- v-show="total > 0"
- :total="total"
- layout="total, sizes, prev, pager, next, jumper"
- :page="page.current"
- :limit="page.size"
- @pagination="paginationChange"
- />
- </div>
- <el-dialog
- v-model="dialogFormVisible"
- title="鏂板寮�绁ㄧ櫥璁伴〉闈�"
- width="85%"
- @close="closeDia"
- >
- <el-form
- :model="form"
- label-width="140px"
- label-position="top"
- :rules="rules"
- ref="formRef"
- >
- <el-row :gutter="30">
- <el-col :span="12">
- <el-form-item label="閿�鍞悎鍚屽彿锛�" prop="salesContractNo">
- <el-input v-model="form.salesContractNo" disabled></el-input>
- </el-form-item>
- </el-col>
- <el-col :span="12">
- <el-form-item label="瀹㈡埛鍚嶇О锛�" prop="customerName">
- <el-input
- v-model="form.customerName"
- placeholder="鑷姩濉厖"
- disabled
- ></el-input>
- </el-form-item>
- </el-col>
- </el-row>
- <el-row :gutter="30">
- <el-col :span="12">
- <el-form-item label="涓氬姟鍛橈細" prop="salesman">
- <el-input
- v-model="form.salesman"
- placeholder="鑷姩濉厖"
- disabled
- />
- </el-form-item>
- </el-col>
- <el-col :span="12">
- <el-form-item label="椤圭洰鍚嶇О锛�" prop="projectName">
- <el-input
- v-model="form.projectName"
- placeholder="鑷姩濉厖"
- disabled
- />
- </el-form-item>
- </el-col>
- </el-row>
- <el-row :gutter="30">
- <el-col :span="12">
- <el-form-item label="褰曞叆浜�" prop="createUer">
- <el-input v-model="form.createUer" placeholder="璇疯緭鍏ュ綍鍏ヤ汉" />
- </el-form-item>
- </el-col>
- <el-col :span="12">
- <el-form-item label="寮�绁ㄦ棩鏈�" prop="issueDate">
- <el-date-picker
- style="width: 100%"
- v-model="form.issueDate"
- type="date"
- placeholder="璇烽�夋嫨"
- clearable
- format="YYYY-MM-DD"
- value-format="YYYY-MM-DD"
- />
- </el-form-item>
- </el-col>
- </el-row>
- <el-row :gutter="30">
- <el-col :span="12">
- <el-form-item label="褰曞叆鏃ユ湡锛�" prop="createTime">
- <el-date-picker
- style="width: 100%"
- v-model="form.createTime"
- type="date"
- placeholder="璇烽�夋嫨"
- clearable
- />
- </el-form-item>
- </el-col>
- <el-col :span="12">
- <el-form-item label="鍙戠エ鍙风爜锛�" prop="invoiceNo">
- <el-input
- v-model="form.invoiceNo"
- placeholder="璇疯緭鍏�"
- clearable
- />
- </el-form-item>
- </el-col>
- </el-row>
- <el-row>
- <el-form-item label="浜у搧淇℃伅锛�" prop="entryDate"> </el-form-item>
- </el-row>
- <el-table
- :data="productData"
- border
- show-summary
- :summary-method="summarizeChildrenTable"
- >
- <el-table-column
- align="center"
- label="搴忓彿"
- type="index"
- width="60"
- />
- <el-table-column label="浜у搧澶х被" prop="productCategory" />
- <el-table-column
- label="瑙勬牸鍨嬪彿"
- prop="specificationModel"
- width="150"
- />
- <el-table-column label="鍗曚綅" prop="unit" />
- <el-table-column label="鏁伴噺" prop="quantity" width="70" />
- <el-table-column label="绋庣巼(%)" prop="taxRate" width="80" />
- <el-table-column
- label="鍚◣鍗曚环(鍏�)"
- prop="taxInclusiveUnitPrice"
- :formatter="formattedNumber"
- width="200"
- />
- <el-table-column
- label="鍚◣鎬讳环(鍏�)"
- prop="taxInclusiveTotalPrice"
- :formatter="formattedNumber"
- width="200"
- />
- <el-table-column
- label="涓嶅惈绋庢�讳环(鍏�)"
- prop="taxExclusiveTotalPrice"
- :formatter="formattedNumber"
- width="150"
- />
- <el-table-column label="鏈寮�绁ㄦ暟" prop="currentInvoiceNum" width="180">
- <template #default="scope">
- <el-input-number :step="0.1" :min="0" style="width: 100%"
- :precision="2"
- v-model="scope.row.currentInvoiceNum"
- @change="invoiceNumBlur(scope.row)"
- ></el-input-number>
- </template>
- </el-table-column>
- <el-table-column
- label="鏈寮�绁ㄩ噾棰�(鍏�)"
- prop="currentInvoiceAmount"
- width="180"
- >
- <template #default="scope">
- <el-input-number :step="0.01" :min="0" style="width: 100%"
- :precision="2"
- v-model="scope.row.currentInvoiceAmount"
- @change="invoiceAmountBlur(scope.row)"
- ></el-input-number>
- </template>
- </el-table-column>
- <el-table-column label="鏈紑绁ㄦ暟" prop="noInvoiceNum" width="120">
- <template #default="scope">
- <el-input
- type="number"
- min="0"
- disabled
- v-model="scope.row.noInvoiceNum"
- ></el-input>
- </template>
- </el-table-column>
- <el-table-column
- label="鏈紑绁ㄩ噾棰�(鍏�)"
- prop="noInvoiceAmount"
- width="200"
- >
- <template #default="scope">
- <el-input
- type="number"
- min="0"
- disabled
- v-model="scope.row.noInvoiceAmount"
- :formatter="formattedInputNumber"
- :precision="2"
- :step="0.01"
- ></el-input>
- </template>
- </el-table-column>
- <el-table-column label="鐧昏浜�" prop="register" width="100">
- <!-- <template #default="{ row }">
- <el-input
- v-model="row.register"
- placeholder="璇疯緭鍏ョ櫥璁颁汉"
- disabled
- />
- </template> -->
- </el-table-column>
- <el-table-column label="鐧昏鏃ユ湡" prop="registerDate" width="150">
- <!-- <template #default="{ row }">
- <el-date-picker
- style="width: 100%"
- v-model="row.registerDate"
- value-format="YYYY-MM-DD"
- format="YYYY-MM-DD"
- type="date"
- placeholder="璇烽�夋嫨"
- clearable
- disabled
- />
- </template> -->
- </el-table-column>
- </el-table>
- </el-form>
- <template #footer>
- <div class="dialog-footer">
- <el-button type="primary" @click="submitForm">纭</el-button>
- <el-button @click="closeDia">鍙栨秷</el-button>
- </div>
- </template>
- </el-dialog>
- </div>
-</template>
-
-<script setup>
-import pagination from "@/components/PIMTable/Pagination.vue";
-import { onMounted, ref } from "vue";
-import { Search } from "@element-plus/icons-vue";
-import { ElMessageBox } from "element-plus";
-// import {userListNoPage} from "@/api/system/user.js";
-import {
- getSalesLedgerWithProducts,
- ledgerListPage,
- productList,
-} from "@/api/salesManagement/salesLedger.js";
-import { invoiceRegistrationSave } from "@/api/salesManagement/invoiceRegistration.js";
-import useFormData from "@/hooks/useFormData";
-import useUserStore from "@/store/modules/user";
-import dayjs from "dayjs";
-
-const { proxy } = getCurrentInstance();
-const userStore = useUserStore();
-const tableData = ref([]);
-const productData = ref([]);
-const selectedRows = ref([]);
-const tableLoading = ref(false);
-const page = reactive({
- current: 1,
- size: 100,
-});
-const total = ref(0);
-// 鐢ㄦ埛淇℃伅琛ㄥ崟寮规鏁版嵁
-const operationType = ref("");
-const dialogFormVisible = ref(false);
-const data = reactive({
- searchForm: {
- customerName: "",
- status: false,
- customerContractNo: undefined, // 瀹㈡埛鍚堝悓鍙�
- projectName: undefined, // 椤圭洰鍚嶇О
- createUer: undefined, // 鐧昏浜�
- issueDate: undefined, // 寮�绁ㄦ棩鏈�
- createTime: undefined, // 褰曞叆鏃ユ湡锛�
- },
- form: {
- salesLedgerId: "",
- customerName: "",
- salesman: "",
- projectName: "",
- productData: [],
- invoiceNo: "",
- createUer: userStore.nickName,
- issueDate: dayjs().format("YYYY-MM-DD"),
- },
- rules: {
- salesLedgerId: [{ required: true, message: "璇烽�夋嫨", trigger: "change" }],
- createUer: [{ required: true, message: "璇烽�夋嫨", trigger: "blur" }],
- issueDate: [{ required: true, message: "璇烽�夋嫨", trigger: "change" }],
- invoiceNo: [{ required: true, message: "璇疯緭鍏�", trigger: "change" }],
- createTime: [{ required: true, message: "璇烽�夋嫨", trigger: "change" }],
- },
-});
-const { form, rules } = toRefs(data);
-const { form: searchForm, resetForm } = useFormData(data.searchForm);
-
-
-const changeDateRange = (date) => {
- if (date) {
- searchForm.entryDateStart = date[0];
- searchForm.entryDateEnd = date[1];
- getList();
- }
-};
-
-const clearRange = () => {
- searchForm.commonDate = [];
- searchForm.entryDateStart = undefined;
- searchForm.entryDateEnd = undefined;
- getList();
-};
-const formattedNumber = (row, column, cellValue) => {
- if (cellValue == 0) {
- return parseFloat(cellValue).toFixed(2);
- }
- if (cellValue) {
- return parseFloat(cellValue).toFixed(2);
- } else {
- return cellValue;
- }
-};
-
-const formattedInputNumber = (value) => {
- return value ? parseFloat(value).toFixed(2) : 0;
-};
-
-// 鏌ヨ鍒楄〃
-/** 鎼滅储鎸夐挳鎿嶄綔 */
-const handleQuery = () => {
- page.current = 1;
- getList();
-};
-const paginationChange = (obj) => {
- page.current = obj.page;
- page.size = obj.limit;
- getList();
-};
-const getList = () => {
- tableLoading.value = true;
- ledgerListPage({ ...searchForm, ...page }).then((res) => {
- tableLoading.value = false;
- tableData.value = res.records;
- total.value = res.total;
- expandedRowKeys.value = [];
- });
-};
-// 琛ㄦ牸閫夋嫨鏁版嵁
-const handleSelectionChange = (selection) => {
- console.log("selection", selection);
- selectedRows.value = selection.filter(
- (item) => item.salesContractNo !== undefined
- );
-};
-const expandedRowKeys = ref([]);
-// 灞曞紑琛�
-const expandChange = (row, expandedRows) => {
- if (expandedRows.length > 0) {
- expandedRowKeys.value = [];
- try {
- productList({ salesLedgerId: row.id, type: 1 }).then((res) => {
- const index = tableData.value.findIndex((item) => item.id === row.id);
- if (index > -1) {
- tableData.value[index].children = res.data;
- }
- expandedRowKeys.value.push(row.id);
- });
- } catch (error) {
- console.log(error);
- }
- } else {
- expandedRowKeys.value = [];
- }
-};
-// 涓昏〃鍚堣鏂规硶
-const summarizeMainTable = (param) => {
- return proxy.summarizeTable(param, [
- "contractAmount",
- "invoiceTotal",
- "noInvoiceAmountTotal",
- ]);
-};
-// 瀛愯〃鍚堣鏂规硶
-const summarizeChildrenTable = (param) => {
- return proxy.summarizeTable(param, [
- "taxInclusiveUnitPrice",
- "taxInclusiveTotalPrice",
- "taxExclusiveTotalPrice",
- "invoiceNum",
- "invoiceAmount",
- "currentInvoiceAmount",
- "noInvoiceNum",
- "noInvoiceAmount",
- "currentInvoiceNum",
- ]);
-};
-// 鎵撳紑寮规
-const openForm = () => {
- // 鍒ゆ柇鏄惁澶氶��
- if (selectedRows.value.length != 1) {
- proxy.$modal.msgError("璇烽�夋嫨涓�鏉″悎鍚�");
- return;
- }
- form.value = {};
- productData.value = [];
- getSalesLedgerWithProducts({ id: selectedRows.value[0].id }).then((res) => {
- form.value = { ...res };
- form.value.createTime = dayjs().format("YYYY-MM-DD");
- form.value.issueDate = dayjs().format("YYYY-MM-DD");
- form.value.createUer = userStore.nickName;
- productData.value = form.value.productData.map((item) => {
- return item;
- });
- dialogFormVisible.value = true;
- console.log("productData.value ", productData.value);
- });
-};
-// 鎻愪氦琛ㄥ崟
-const submitForm = () => {
- proxy.$refs["formRef"].validate((valid) => {
- if (valid) {
- form.value.productData = proxy.HaveJson(productData.value);
- invoiceRegistrationSave(form.value).then((res) => {
- proxy.$modal.msgSuccess("鎻愪氦鎴愬姛");
- closeDia();
- getList();
- });
- }
- });
-};
-// 鍏抽棴寮规
-const closeDia = () => {
- proxy.resetForm("formRef");
- dialogFormVisible.value = false;
-};
-// 瀵煎嚭
-const handleOut = () => {
- ElMessageBox.confirm("閫変腑鐨勫唴瀹瑰皢琚鍑猴紝鏄惁纭瀵煎嚭锛�", "瀵煎嚭", {
- confirmButtonText: "纭",
- cancelButtonText: "鍙栨秷",
- type: "warning",
- })
- .then(() => {
- proxy.download("/invoiceRegistration/export", {}, "寮�绁ㄧ櫥璁颁俊鎭�.xlsx");
- })
- .catch(() => {
- proxy.$modal.msg("宸插彇娑�");
- });
-};
-
-//鏈寮�绁ㄥけ鐒︽搷浣�
-const invoiceNumBlur = (row) => {
- if (!row.currentInvoiceNum) {
- row.currentInvoiceNum = 0;
- }
- if (row.currentInvoiceNum > row.tempNoInvoiceNum) {
- proxy.$modal.msgWarning("鏈寮�绁ㄦ暟涓嶅緱澶т簬鏈紑绁ㄦ暟");
- row.currentInvoiceNum = 0;
- }
- // 璁$畻鏈寮�绁ㄩ噾棰�
- row.currentInvoiceAmount = (
- row.currentInvoiceNum * row.taxInclusiveUnitPrice
- ).toFixed(2);
- // 璁$畻鏈紑绁ㄦ暟
- row.noInvoiceNum = (row.originalNoInvoiceNum - row.currentInvoiceNum).toFixed(
- 2
- );
- // 璁$畻鏈紑绁ㄩ噾棰�
- row.noInvoiceAmount = (
- row.tempnoInvoiceAmount - row.currentInvoiceAmount
- ).toFixed(2);
-};
-// 鏈寮�绁ㄩ噾棰濆け鐒︽搷浣�
-const invoiceAmountBlur = (row) => {
- if (!row.currentInvoiceAmount) {
- row.currentInvoiceAmount = 0;
- }
- // 璁$畻鏄惁瓒呰繃寮�绁ㄦ�婚噾棰�
- if (row.currentInvoiceAmount > row.tempnoInvoiceAmount) {
- proxy.$modal.msgWarning("鏈寮�绁ㄩ噾棰濅笉寰楀ぇ浜庢湭寮�绁ㄩ噾棰�");
- row.currentInvoiceAmount = 0;
- }
- // 璁$畻鏈寮�绁ㄦ暟
- row.currentInvoiceNum = (
- row.currentInvoiceAmount / row.taxInclusiveUnitPrice
- ).toFixed(2);
- console.log("row.currentInvoiceNum ", row.currentInvoiceNum);
- console.log(" row.originalNoInvoiceNum ", row.originalNoInvoiceNum);
- // 璁$畻鏈紑绁ㄦ暟
- row.noInvoiceNum = (row.originalNoInvoiceNum - row.currentInvoiceNum).toFixed(
- 2
- );
- // 璁$畻鏈紑绁ㄩ噾棰�
- row.noInvoiceAmount = (
- row.tempnoInvoiceAmount - row.currentInvoiceAmount
- ).toFixed(2);
-};
-
-onMounted(() => {
- getList();
-});
-</script>
-
-<style scoped lang="scss">
-.table_list {
- margin-top: unset;
-}
-.flex {
- display: flex;
-}
-.justify-between {
- justify-content: space-between;
-}
-::v-deep(.el-checkbox__label) {
- font-weight: bold;
-}
-</style>
diff --git a/src/views/salesManagement/receiptPayment/index.vue b/src/views/salesManagement/receiptPayment/index.vue
deleted file mode 100644
index b37ab85..0000000
--- a/src/views/salesManagement/receiptPayment/index.vue
+++ /dev/null
@@ -1,655 +0,0 @@
-<template>
- <div class="app-container">
- <div class="search_form">
- <el-form :inline="true" :model="searchForm" style="width: 100%">
- <el-row justify="space-between">
- <el-col :span="24">
- <el-form-item label="瀹㈡埛鍚嶇О">
- <el-input
- v-model="searchForm.customerName"
- placeholder="璇疯緭鍏�"
- @change="handleQuery"
- clearable
- prefix-icon="Search"
- />
- </el-form-item>
- <el-form-item label="瀹㈡埛鍚堝悓鍙�">
- <el-input
- v-model="searchForm.customerContractNo"
- placeholder="璇疯緭鍏�"
- @change="handleQuery"
- clearable
- prefix-icon="Search"
- />
- </el-form-item>
- <el-form-item label="椤圭洰鍚嶇О">
- <el-input
- v-model="searchForm.projectName"
- placeholder="璇疯緭鍏�"
- @change="handleQuery"
- clearable
- prefix-icon="Search"
- />
- </el-form-item>
- <el-form-item>
- <el-checkbox
- v-model="searchForm.status"
- label="涓嶆樉绀哄緟鍥炴涓�0"
- @change="handleQuery"
- />
- </el-form-item>
- <br/>
- <el-form-item label="寮�绁ㄦ棩鏈�">
- <el-date-picker style="width: 240px" v-model="searchForm.commonDate" value-format="YYYY-MM-DD"
- format="YYYY-MM-DD" type="daterange" start-placeholder="寮�濮嬫椂闂�" end-placeholder="缁撴潫鏃堕棿" clearable
- @change="changeDateRange" @clear="clearRange" />
- </el-form-item>
- <el-form-item>
- <el-button type="primary" @click="handleQuery"> 鎼滅储 </el-button>
- </el-form-item>
- </el-col>
- </el-row>
- </el-form>
- </div>
- <div class="table_list">
- <div class="actions">
- <div></div>
- <div>
- <el-button type="primary" @click="openForm('add')">
- 鏂板鍥炴
- </el-button>
- <el-button icon="Download" @click="handleOut"> 瀵煎嚭 </el-button>
- </div>
- </div>
- <el-table
- :data="tableData"
- border
- v-loading="tableLoading"
- @selection-change="handleSelectionChange"
- :row-key="(row) => row.id"
- show-summary
- :summary-method="summarizeMainTable"
- :expand-row-keys="expandedRowKeys"
- @expand-change="expandChange"
- stripe
- height="calc(100vh - 21.5em)"
- >
- <el-table-column align="center" type="selection" width="55" />
- <el-table-column type="expand">
- <template #default="props">
- <el-table
- :data="props.row.children"
- border
- show-summary
- :summary-method="summarizeChildrenTable"
- stripe
- >
- <el-table-column
- align="center"
- label="搴忓彿"
- type="index"
- width="60"
- />
- <el-table-column label="鍥炴鏃ユ湡" prop="receiptPaymentDate" width="130"/>
- <el-table-column label="鍥炴閲戦" prop="receiptPaymentAmount">
- <template #default="scope">
- <el-input-number :step="0.01" :min="0" style="width: 100%"
- v-model="scope.row.receiptPaymentAmount"
- :disabled="!scope.row.editType"
- :precision="2"
- placeholder="璇疯緭鍏�"
- clearable
- />
- </template>
- </el-table-column>
- <el-table-column label="鍥炴鏂瑰紡" prop="receiptPaymentType">
- <template #default="scope">
- <el-select
- v-model="scope.row.receiptPaymentType"
- placeholder="璇烽�夋嫨"
- clearable
- :disabled="!scope.row.editType"
- >
- <el-option
- v-for="item in receipt_payment_type"
- :key="item.value"
- :label="item.label"
- :value="item.value"
- />
- </el-select>
- </template>
- </el-table-column>
- <el-table-column label="鐧昏浜�" prop="registrant" width="90"/>
- <el-table-column label="鐧昏鏃ユ湡" prop="createTime" width="130"/>
- <el-table-column label="鎿嶄綔" width="150" align="center">
- <template #default="scope">
- <el-button
- link
- type="primary"
- size="small"
- @click="changeEditType(scope.row)"
- v-if="!scope.row.editType"
- :disabled="scope.row.registrant !== userStore.nickName"
- >缂栬緫</el-button
- >
- <el-button
- link
- type="primary"
- size="small"
- @click="saveReceiptPayment(scope.row)"
- v-if="scope.row.editType"
- :disabled="scope.row.registrant !== userStore.nickName"
- >淇濆瓨</el-button
- >
- <el-button
- link
- type="primary"
- size="small"
- @click="delReceiptRecord(scope.row)"
- :disabled="scope.row.registrant !== userStore.nickName"
- >鍒犻櫎</el-button
- >
- </template>
- </el-table-column>
- </el-table>
- </template>
- </el-table-column>
- <el-table-column align="center" label="搴忓彿" type="index" width="60" />
- <el-table-column
- label="寮�绁ㄦ棩鏈�"
- prop="invoiceDate"
- show-overflow-tooltip
- width="240"
- />
- <el-table-column
- label="閿�鍞悎鍚屽彿"
- prop="salesContractNo"
- show-overflow-tooltip
- width="240"
- />
- <el-table-column
- label="瀹㈡埛鍚堝悓鍙�"
- prop="customerContractNo"
- show-overflow-tooltip
- width="240"
-
- />
- <el-table-column
- label="瀹㈡埛鍚嶇О"
- prop="customerName"
- show-overflow-tooltip
- width="240"
- />
- <el-table-column
- label="椤圭洰鍚嶇О"
- prop="projectName"
- show-overflow-tooltip
- width="340"
- />
- <el-table-column
- label="浜у搧澶х被"
- prop="productCategory"
- show-overflow-tooltip
- width="100"
- />
- <el-table-column
- label="鍙戠エ鍙�"
- prop="invoiceNo"
- show-overflow-tooltip
- width="200"
- />
- <el-table-column
- label="鍙戠エ閲戦(鍏�)"
- prop="invoiceTotal"
- show-overflow-tooltip
- :formatter="formattedNumber"
- width="200"
- />
- <el-table-column label="绋庣巼(%)" prop="taxRate" show-overflow-tooltip />
- <el-table-column
- label="鍥炴閲戦(鍏�)"
- prop="receiptPaymentAmountTotal"
- show-overflow-tooltip
- :formatter="formattedNumber"
- width="200"
- />
- <el-table-column
- label="寰呭洖娆鹃噾棰�(鍏�)"
- prop="noReceiptAmount"
- show-overflow-tooltip
- width="200"
- >
- <template #default="{ row, column }">
- <el-text type="danger">
- {{ formattedNumber(row, column, row.noReceiptAmount) }}
- </el-text>
- </template>
- </el-table-column>
- </el-table>
- <pagination
- v-show="total > 0"
- :total="total"
- layout="total, sizes, prev, pager, next, jumper"
- :page="page.current"
- :limit="page.size"
- @pagination="paginationChange"
- />
- </div>
- <el-dialog
- v-model="dialogFormVisible"
- title="鏂板鍙戠エ鍙烽〉闈�"
- width="70%"
- @close="closeDia"
- >
- <el-form
- :model="form"
- label-width="140px"
- label-position="top"
- :rules="rules"
- ref="formRef"
- >
- <el-row :gutter="30">
- <el-col :span="12">
- <el-form-item label="閿�鍞悎鍚屽彿锛�" prop="salesContractNo">
- <el-input
- v-model="form.salesContractNo"
- placeholder="鑷姩濉厖"
- disabled
- />
- </el-form-item>
- </el-col>
- <el-col :span="12">
- <el-form-item label="瀹㈡埛鍚嶇О锛�" prop="customerName">
- <el-input
- v-model="form.customerName"
- placeholder="鑷姩濉厖"
- disabled
- />
- </el-form-item>
- </el-col>
- </el-row>
- <el-row :gutter="30">
- <el-col :span="12">
- <el-form-item label="鍙戠エ鍙凤細" prop="invoiceNo">
- <el-input
- v-model="form.invoiceNo"
- placeholder="鑷姩濉厖"
- disabled
- />
- </el-form-item>
- </el-col>
- <el-col :span="12">
- <el-form-item label="鍙戠エ閲戦(鍏�)锛�" prop="invoiceTotal">
- <el-input
- type="number"
- v-model="form.invoiceTotal"
- placeholder="鑷姩濉厖"
- :step="0.01"
- disabled
- />
- </el-form-item>
- </el-col>
- </el-row>
- <el-row :gutter="30">
- <el-col :span="12">
- <el-form-item label="绋庣巼锛�" prop="taxRate">
- <el-input
- type="number"
- v-model="form.taxRate"
- placeholder="鑷姩濉厖"
- :step="0.01"
- disabled
- />
- </el-form-item>
- </el-col>
- <el-col :span="12">
- <el-form-item label="鏈鍥炴閲戦锛�" prop="receiptPaymentAmount">
- <el-input-number :step="0.01" :min="0" style="width: 100%"
- :precision="2"
- v-model="form.receiptPaymentAmount"
- placeholder="璇疯緭鍏�"
- clearable
- />
- </el-form-item>
- </el-col>
- </el-row>
- <el-row :gutter="30">
- <el-col :span="12">
- <el-form-item label="鍥炴褰㈠紡锛�" prop="receiptPaymentType">
- <el-select
- v-model="form.receiptPaymentType"
- placeholder="璇烽�夋嫨"
- clearable
- >
- <el-option
- v-for="item in receipt_payment_type"
- :key="item.value"
- :label="item.label"
- :value="item.value"
- />
- </el-select>
- </el-form-item>
- </el-col>
- <el-col :span="12">
- <el-form-item label="鐧昏浜猴細" prop="registrant">
- <el-input
- v-model="form.registrant"
- placeholder="璇疯緭鍏�"
- clearable
- disabled
- />
- </el-form-item>
- </el-col>
- </el-row>
- <el-row :gutter="30">
- <el-col :span="12">
- <el-form-item label="鏉ユ鏃ユ湡锛�" prop="receiptPaymentDate">
- <el-date-picker
- style="width: 100%"
- v-model="form.receiptPaymentDate"
- value-format="YYYY-MM-DD"
- format="YYYY-MM-DD"
- type="date"
- placeholder="璇烽�夋嫨"
- clearable
- />
- </el-form-item>
- </el-col>
- </el-row>
- </el-form>
- <template #footer>
- <div class="dialog-footer">
- <el-button type="primary" @click="submitForm">纭</el-button>
- <el-button @click="closeDia">鍙栨秷</el-button>
- </div>
- </template>
- </el-dialog>
- </div>
-</template>
-
-<script setup>
-import pagination from "@/components/PIMTable/Pagination.vue";
-import { onMounted, ref } from "vue";
-import {
- receiptPaymentSaveOrUpdate,
- bindInvoiceNoRegPage,
- invoiceInfo,
- receiptPaymentHistoryListNoPage,
- receiptPaymentDel,
-} from "../../../api/salesManagement/receiptPayment.js";
-import useUserStore from "@/store/modules/user";
-import { ElMessage, ElMessageBox } from "element-plus";
-import useFormData from "@/hooks/useFormData";
-
-const userStore = useUserStore();
-const { proxy } = getCurrentInstance();
-const tableData = ref([]);
-const selectedRows = ref([]);
-const tableLoading = ref(false);
-const page = reactive({
- current: 1,
- size: 100,
-});
-const total = ref(0);
-const expandedRowKeys = ref([]);
-
-// 鐢ㄦ埛淇℃伅琛ㄥ崟寮规鏁版嵁
-const dialogFormVisible = ref(false);
-const data = reactive({
- searchForm: {
- searchText: "",
- status: true,
- customerName: "",
- customerContractNo: "",
- projectName: "",
- },
- form: {
- salesContractNo: "",
- customerName: "",
- invoiceNo: "",
- invoiceTotal: "",
- taxRate: "",
- receiptPaymentAmount: "",
- receiptPaymentType: "",
- registrant: "",
- receiptPaymentDate: "",
- },
- rules: {
- salesContractNo: [{ required: true, message: "璇烽�夋嫨", trigger: "change" }],
- customerName: [{ required: true, message: "璇疯緭鍏�", trigger: "blur" }],
- invoiceNo: [{ required: true, message: "璇烽�夋嫨", trigger: "change" }],
- invoiceTotal: [{ required: true, message: "璇疯緭鍏�", trigger: "blur" }],
- taxRate: [{ required: true, message: "璇烽�夋嫨", trigger: "change" }],
- receiptPaymentAmount: [
- { required: true, message: "璇烽�夋嫨", trigger: "change" },
- ],
- receiptPaymentType: [
- { required: true, message: "璇烽�夋嫨", trigger: "change" },
- ],
- registrant: [{ required: true, message: "璇烽�夋嫨", trigger: "change" }],
- receiptPaymentDate: [
- { required: true, message: "璇烽�夋嫨", trigger: "change" },
- ],
- },
-});
-const { form, rules } = toRefs(data);
-const { form: searchForm, resetForm } = useFormData(data.searchForm);
-const { receipt_payment_type } = proxy.useDict("receipt_payment_type");
-
-const formattedNumber = (row, column, cellValue) => {
- return parseFloat(cellValue).toFixed(2);
-};
-
-const changeDateRange = (date) => {
- if (date) {
- searchForm.invoiceDateStart = date[0];
- searchForm.invoiceDateEnd = date[1];
- getList();
- }
-};
-
-const clearRange = () => {
- searchForm.commonDate = [];
- searchForm.invoiceDateStart = undefined;
- searchForm.invoiceDateEnd = undefined;
- getList();
-};
-// 鏌ヨ鍒楄〃
-/** 鎼滅储鎸夐挳鎿嶄綔 */
-const handleQuery = () => {
- page.current = 1;
- getList();
-};
-const paginationChange = (obj) => {
- page.current = obj.page;
- page.size = obj.limit;
- getList();
-};
-const getList = () => {
- tableLoading.value = true;
- bindInvoiceNoRegPage({ ...searchForm, ...page })
- .then((res) => {
- tableLoading.value = false;
- tableData.value = res.data.records;
- total.value = res.data.total;
- if (expandedRowKeys.value.length > 0) {
- const arr = []
- const index = tableData.value.findIndex(item => item.id === expandedRowKeys.value[0]);
- if (index > -1) {
- arr.push(tableData.value[index]);
- expandChange(tableData.value[index], arr)
- }
- }
- })
- .catch(() => {
- tableLoading.value = false;
- });
-};
-// 灞曞紑琛�
-const expandChange = (row, expandedRows) => {
- if (expandedRows.length > 0) {
- expandedRowKeys.value = [];
- try {
- receiptPaymentHistoryListNoPage({
- invoiceLedgerId: row.id,
- type: 1,
- }).then((res) => {
- const index = tableData.value.findIndex((item) => item.id === row.id);
- if (index > -1) {
- if (res?.length > 0) {
- res.forEach((item) => {
- item.editType = false;
- });
- }
- tableData.value[index].children = res;
- }
- expandedRowKeys.value.push(row.id);
- });
- } catch (error) {
- console.log(error);
- }
- } else {
- expandedRowKeys.value = [];
- }
-};
-// 琛ㄦ牸閫夋嫨鏁版嵁
-const handleSelectionChange = (selection) => {
- console.log("selection", selection);
- selectedRows.value = selection.filter(
- (item) => item.customerContractNo !== null
- );
-};
-// 涓昏〃鍚堣鏂规硶
-const summarizeMainTable = (param) => {
- return proxy.summarizeTable(
- param,
- ["invoiceTotal", "receiptPaymentAmountTotal", "noReceiptAmount"],
- {
- ticketsNum: { noDecimal: true }, // 涓嶄繚鐣欏皬鏁�
- futureTickets: { noDecimal: true }, // 涓嶄繚鐣欏皬鏁�
- }
- );
-};
-// 瀛愯〃鍚堣鏂规硶
-const summarizeChildrenTable = (param) => {
- return proxy.summarizeTable(param, ["receiptPaymentAmount"]);
-};
-// 鎵撳紑寮规
-const openForm = () => {
- form.value = {};
- if (selectedRows.value.length !== 1) {
- proxy.$modal.msgError("璇烽�夋嫨涓�鏉℃暟鎹�");
- return;
- }
- if (selectedRows.value[0].noReceiptAmount == 0) {
- proxy.$modal.msgWarning("鏃犻渶鍐嶅洖娆�");
- return;
- }
- invoiceInfo({ id: selectedRows.value[0].id }).then((res) => {
- form.value = { ...res.data };
- form.value.invoiceLedgerId = form.value.id;
- form.value.id = "";
- form.value.registrant = userStore.nickName;
- });
- dialogFormVisible.value = true;
-};
-// 鎻愪氦琛ㄥ崟
-const submitForm = () => {
- proxy.$refs["formRef"].validate((valid) => {
- if (valid) {
- receiptPaymentSaveOrUpdate(form.value).then((res) => {
- proxy.$modal.msgSuccess("鎻愪氦鎴愬姛");
- closeDia();
- getList();
- });
- }
- });
-};
-// 鍏抽棴寮规
-const closeDia = () => {
- proxy.resetForm("formRef");
- dialogFormVisible.value = false;
-};
-
-// 鍒犻櫎鍥炴璁板綍
-const delReceiptRecord = (row) => {
- console.log("row", row);
- ElMessageBox.confirm("纭鍒犻櫎璇ヨ褰曞悧锛�", "鎻愮ず", {
- confirmButtonText: "纭畾",
- cancelButtonText: "鍙栨秷",
- type: "warning",
- })
- .then(async () => {
- try {
- let ids = [];
- ids.push(row.id);
- await receiptPaymentDel(ids);
- ElMessage.success("鍒犻櫎鎴愬姛");
- getList();
- } catch (error) {
- console.error("鍒犻櫎澶辫触:", error);
- ElMessage.error("鍒犻櫎澶辫触");
- }
- })
- .catch(() => {
- ElMessage.info("宸插彇娑堝垹闄�");
- });
-};
-
-// 缂栬緫淇敼鐘舵��
-const changeEditType = (row) => {
- row.editType = !row.editType;
-};
-
-// 淇濆瓨鍥炴璁板綍
-const saveReceiptPayment = (row) => {
- let updateData = {
- id: row.id,
- receiptPaymentType: row.receiptPaymentType,
- receiptPaymentAmount: row.receiptPaymentAmount,
- };
- receiptPaymentSaveOrUpdate(updateData).then((res) => {
- row.editType = !row.editType;
- getList();
- proxy.$modal.msgSuccess("鎻愪氦鎴愬姛");
- });
-};
-
-// 瀵煎嚭
-const handleOut = () => {
- ElMessageBox.confirm("閫変腑鐨勫唴瀹瑰皢琚鍑猴紝鏄惁纭瀵煎嚭锛�", "瀵煎嚭", {
- confirmButtonText: "纭",
- cancelButtonText: "鍙栨秷",
- type: "warning",
- })
- .then(() => {
- const ids = selectedRows.value.map((item) => item.id);
- proxy.download(
- `/receiptPayment/export`,
- { ids: `${ids}` },
- "鍥炴鐧昏妗f.xlsx"
- );
- })
- .catch(() => {
- proxy.$modal.msg("宸插彇娑�");
- });
-};
-
-onMounted(() => {
- getList();
-});
-</script>
-
-<style scoped lang="scss">
-.table_list {
- margin-top: unset;
-}
-::v-deep(.el-checkbox__label) {
- font-weight: bold;
-}
-.actions {
- display: flex;
- justify-content: space-between;
- margin-bottom: 10px;
-}
-</style>
diff --git a/src/views/salesManagement/receiptPaymentHistory/index.vue b/src/views/salesManagement/receiptPaymentHistory/index.vue
deleted file mode 100644
index ea373ea..0000000
--- a/src/views/salesManagement/receiptPaymentHistory/index.vue
+++ /dev/null
@@ -1,221 +0,0 @@
-<template>
- <div class="app-container">
- <el-form :model="searchForm" :inline="true">
- <el-form-item label="瀹㈡埛鍚嶇О">
- <el-input
- v-model="searchForm.searchText"
- placeholder="杈撳叆瀹㈡埛鍚嶇О鎼滅储"
- @change="handleQuery"
- clearable
- :prefix-icon="Search"
- />
- </el-form-item>
- <el-form-item label="瀹㈡埛鍚堝悓鍙�">
- <el-input
- v-model="searchForm.customerContractNo"
- placeholder="杈撳叆瀹㈡埛鍚堝悓鍙�"
- @change="handleQuery"
- clearable
- :prefix-icon="Search"
- />
- </el-form-item>
- <el-form-item label="椤圭洰鍚嶇О">
- <el-input
- v-model="searchForm.projectName"
- placeholder="杈撳叆椤圭洰鍚嶇О"
- @change="handleQuery"
- clearable
- :prefix-icon="Search"
- />
- </el-form-item>
- <el-form-item label="鍥炴鏃ユ湡">
- <el-date-picker
- v-model="searchForm.receiptPaymentDate"
- value-format="YYYY-MM-DD"
- format="YYYY-MM-DD"
- type="daterange"
- start-placeholder="寮�濮嬫椂闂�"
- end-placeholder="缁撴潫鏃堕棿"
- clearable
- style="width: 300px"
- @change="changeDateRange"
- @clear="clearRange"
- />
- </el-form-item>
- <el-form-item>
- <el-button type="primary" @click="handleQuery"> 鎼滅储 </el-button>
- </el-form-item>
- </el-form>
- <div class="table_list">
- <PIMTable
- rowKey="id"
- :column="tableColumn"
- :tableData="tableData"
- :page="page"
- :isSelection="true"
- :isShowSummary="isShowSummarySon"
- :summaryMethod="summarizeMainTable1"
- :tableLoading="tableLoading"
- :total="page.total"
- @pagination="pagination"
- @selection-change="handleSelectionChange"
- ></PIMTable>
- </div>
- </div>
-</template>
-
-<script setup>
-import { ref } from "vue";
-import { Search } from "@element-plus/icons-vue";
-import { receiptPaymentHistoryListPage } from "@/api/salesManagement/receiptPayment.js";
-import useFormData from "@/hooks/useFormData";
-import dayjs from "dayjs";
-
-const { proxy } = getCurrentInstance();
-const tableColumn = ref([
- {
- label: "閿�鍞悎鍚屽彿",
- prop: "salesContractNo",
- width:240
- },
- {
- label: "瀹㈡埛鍚堝悓鍙�",
- prop: "customerContractNo",
- width:240
- },
- {
- label: "鍥炴鏃ユ湡",
- prop: "receiptPaymentDate",
- width:100
- },
- {
- label: "瀹㈡埛鍚嶇О",
- prop: "customerName",
- width:240
- },
- {
- label: "椤圭洰鍚嶇О",
- prop: "projectName",
- width:200
- },
- {
- label: "鍥炴閲戦锛堝厓锛�",
- prop: "receiptPaymentAmount",
- width:200,
- formatData: (params) => {
- return params ? parseFloat(params).toFixed(2) : 0;
- },
- },
- {
- label: "鍥炴鏂瑰紡",
- prop: "receiptPaymentType",
- dataType: "tag",
- formatData: (params) => {
- if (params == 0) {
- return "鐢垫眹";
- } else if (params == 1) {
- return "鎵垮厬";
- } else {
- return null;
- }
- },
- formatType: (params) => {
- return "info";
- },
- },
- {
- label: "鐧昏浜�",
- prop: "registrant",
- },
- {
- label: "鐧昏鏃ユ湡",
- prop: "createTime",
- width:100
- },
-]);
-const tableData = ref([]);
-const selectedRows = ref([]);
-const tableLoading = ref(false);
-const page = reactive({
- current: 1,
- size: 100,
- total: 0,
-});
-const total = ref(0);
-
-const { form: searchForm } = useFormData({
- searchText: undefined,
- receiptPaymentDate: [
- dayjs().startOf("month").format("YYYY-MM-DD"),
- dayjs().endOf("month").format("YYYY-MM-DD"),
- ],
- receiptPaymentDateStart: dayjs()
- .startOf("month")
- .format("YYYY-MM-DD 00:00:00"),
- receiptPaymentDateEnd: dayjs().endOf("month").format("YYYY-MM-DD 23:59:59"),
- customerContractNo: undefined,
- projectName: undefined,
-});
-const { receipt_payment_type } = proxy.useDict("receipt_payment_type");
-const isShowSummarySon = ref(true);
-// 鏌ヨ鍒楄〃
-/** 鎼滅储鎸夐挳鎿嶄綔 */
-const handleQuery = () => {
- page.current = 1;
- getList();
-};
-const pagination = (obj) => {
- page.current = obj.page;
- page.size = obj.limit;
- getList();
-};
-const getList = () => {
- tableLoading.value = true;
- const { receiptPaymentDate, ...rest } = searchForm;
- receiptPaymentHistoryListPage({ ...rest, ...page }).then((res) => {
- tableLoading.value = false;
- tableData.value = res.records;
- page.total = res.total;
- });
-};
-// 瀛愯〃鍚堣鏂规硶
-const summarizeMainTable1 = (param) => {
- return proxy.summarizeTable(param, ["receiptPaymentAmount"], {
- ticketsNum: { noDecimal: true }, // 涓嶄繚鐣欏皬鏁�
- futureTickets: { noDecimal: true }, // 涓嶄繚鐣欏皬鏁�
- });
-};
-// 琛ㄦ牸閫夋嫨鏁版嵁
-const handleSelectionChange = (selection) => {
- selectedRows.value = selection;
-};
-
-const changeDateRange = (date) => {
- if (date) {
- searchForm.receiptPaymentDateStart = dayjs(date[0]).format(
- "YYYY-MM-DD 00:00:00"
- );
- searchForm.receiptPaymentDateEnd = dayjs(date[1]).format(
- "YYYY-MM-DD 23:59:59"
- );
- getList();
- }
-};
-
-const clearRange = () => {
- searchForm.receiptPaymentDate = [];
- searchForm.receiptPaymentDateStart = undefined;
- searchForm.receiptPaymentDateEnd = undefined;
- getList();
-};
-
-onMounted(() => {
- getList();
-});
-</script>
-
-<style scoped lang="scss">
-.table_list {
- margin-top: unset;
-}
-</style>
diff --git a/src/views/salesManagement/receiptPaymentLedger/index.vue b/src/views/salesManagement/receiptPaymentLedger/index.vue
deleted file mode 100644
index 3a4af2e..0000000
--- a/src/views/salesManagement/receiptPaymentLedger/index.vue
+++ /dev/null
@@ -1,273 +0,0 @@
-<template>
- <div class="app-container">
- <div class="search_form">
- <div>
- <span class="search_title">瀹㈡埛鍚嶇О锛�</span>
- <el-input
- v-model="searchForm.searchText"
- style="width: 240px"
- placeholder="杈撳叆瀹㈡埛鍚嶇О鎼滅储"
- @change="handleQuery"
- clearable
- prefix-icon="Search"
- />
- <el-button type="primary" @click="handleQuery" style="margin-left: 10px"
- >鎼滅储</el-button
- >
- </div>
- </div>
- <div style="display: flex">
- <div class="table_list">
- <el-table
- :data="tableData"
- border
- v-loading="tableLoading"
- :row-key="(row) => row.id"
- show-summary
- :summary-method="summarizeMainTable"
- @row-click="rowClickMethod"
- height="calc(100vh - 18.5em)"
- stripe
- >
- <el-table-column
- align="center"
- label="搴忓彿"
- type="index"
- width="60"
- />
- <el-table-column
- label="瀹㈡埛鍚嶇О"
- prop="customerName"
- show-overflow-tooltip
- width="200"
- />
- <el-table-column
- label="寮�绁ㄩ噾棰�(鍏�)"
- prop="invoiceTotal"
- show-overflow-tooltip
- :formatter="formattedNumber"
- width="200"
- />
- <el-table-column
- label="鍥炴閲戦(鍏�)"
- prop="receiptPaymentAmount"
- show-overflow-tooltip
- :formatter="formattedNumber"
- width="200"
- />
- <el-table-column
- label="搴旀敹閲戦(鍏�)"
- prop="unReceiptPaymentAmount"
- show-overflow-tooltip
- width="200"
- >
- <template #default="{ row, column }">
- <el-text type="danger">
- {{ formattedNumber(row, column, row.unReceiptPaymentAmount) }}
- </el-text>
- </template>
- </el-table-column>
- </el-table>
- <pagination
- v-show="total > 0"
- :total="total"
- layout="total, sizes, prev, pager, next, jumper"
- :page="page.current"
- :limit="page.size"
- @pagination="paginationChange"
- />
- </div>
- <div class="table_list">
- <el-table
- :data="receiptRecord"
- border
- :row-key="(row) => row.id"
- stripe
- show-summary
- :summary-method="summarizeMainTable1"
- height="calc(100vh - 18.5em)"
- >
- <el-table-column
- align="center"
- label="搴忓彿"
- type="index"
- width="60"
- />
- <el-table-column
- label="鍙戠敓鏃ユ湡"
- prop="happenTime"
- show-overflow-tooltip
- width="110"
- />
- <el-table-column
- label="寮�绁ㄩ噾棰�(鍏�)"
- prop="invoiceAmount"
- show-overflow-tooltip
- :formatter="formattedNumber"
- width="200"
- />
- <el-table-column
- label="鍥炴閲戦(鍏�)"
- prop="receiptAmount"
- show-overflow-tooltip
- :formatter="formattedNumber"
- width="200"
- />
- <el-table-column
- label="搴旀敹閲戦(鍏�)"
- prop="unReceiptAmount"
- show-overflow-tooltip
- width="200"
- >
- <template #default="{ row, column }">
- <el-text type="danger">
- {{ formattedNumber(row, column, row.unReceiptAmount) }}
- </el-text>
- </template>
- </el-table-column>
- </el-table>
- <pagination
- v-show="recordTotal > 0"
- :total="recordTotal"
- layout="total, sizes, prev, pager, next, jumper"
- :page="recordPage.current"
- :limit="recordPage.size"
- @pagination="recordPaginationChange"
- />
- </div>
- </div>
- </div>
-</template>
-
-<script setup>
-import {onMounted, ref} from "vue";
-import { invoiceLedgerSalesAccount } from "../../../api/salesManagement/invoiceLedger.js";
-import { customerInteractions } from "../../../api/salesManagement/receiptPayment.js";
-import Pagination from "../../../components/PIMTable/Pagination.vue";
-const { proxy } = getCurrentInstance();
-const tableData = ref([]);
-const receiptRecord = ref([]);
-const tableLoading = ref(false);
-const page = reactive({
- current: 1,
- size: 100,
-});
-const recordPage = reactive({
- current: 1,
- size: 100,
-});
-const total = ref(0);
-const recordTotal = ref(0);
-const data = reactive({
- searchForm: {
- searchText: "",
- invoiceDate: "",
- },
-});
-const customerId = ref("");
-const { searchForm } = toRefs(data);
-const originReceiptRecord = ref([]);
-// 鏌ヨ鍒楄〃
-/** 鎼滅储鎸夐挳鎿嶄綔 */
-const handleQuery = () => {
- page.current = 1;
- getList();
-};
-const paginationChange = (obj) => {
- console.log("paginationChange", current, limit);
- page.current = obj.page;
- page.size = obj.limit;
- getList();
-};
-const getList = () => {
- tableLoading.value = true;
- invoiceLedgerSalesAccount({ ...searchForm.value, ...page }).then((res) => {
- tableLoading.value = false;
- tableData.value = res.data.records;
- total.value = res.data.total;
- if (tableData.value.length > 0) {
- recordPage.current = 1;
- customerId.value = tableData.value[0].id;
- receiptPaymentList(customerId.value);
- }
- });
-};
-const formattedNumber = (row, column, cellValue) => {
- return parseFloat(cellValue).toFixed(2);
-};
-// 涓昏〃鍚堣鏂规硶
-const summarizeMainTable = (param) => {
- return proxy.summarizeTable(
- param,
- ["invoiceTotal", "receiptPaymentAmount", "unReceiptPaymentAmount"],
- {
- ticketsNum: { noDecimal: true }, // 涓嶄繚鐣欏皬鏁�
- futureTickets: { noDecimal: true }, // 涓嶄繚鐣欏皬鏁�
- }
- );
-};
-// 瀛愯〃鍚堣鏂规硶
-const summarizeMainTable1 = (param) => {
- var summarizeTable = proxy.summarizeTable(
- param,
- ["invoiceAmount", "receiptAmount", "unReceiptAmount"],
- {
- ticketsNum: { noDecimal: true }, // 涓嶄繚鐣欏皬鏁�
- futureTickets: { noDecimal: true }, // 涓嶄繚鐣欏皬鏁�
- }
- );
- // 鍙栨渶鍚庝竴琛屾暟鎹�;
- if (receiptRecord.value?.length > 0) {
- const index = tableData.value.findIndex(
- (item) => item.id == customerId.value
- );
- summarizeTable[summarizeTable.length - 1] =
- tableData.value[index].unReceiptPaymentAmount.toFixed(2);
- } else {
- summarizeTable[summarizeTable.length - 1] = 0.0;
- }
- return summarizeTable;
-};
-
-const receiptPaymentList = (id) => {
- const param = {
- customerId: id,
- };
- console.log("param", param);
- customerInteractions(param).then((res) => {
- originReceiptRecord.value = res.data;
- handlePagination({ page: 1, limit: recordPage.size });
- recordTotal.value = res.data.length;
- });
-};
-
-// 姹囨璁板綍鍒楄〃鍒嗛〉
-const recordPaginationChange = (pagination) => {
- handlePagination(pagination);
-};
-
-const rowClickMethod = (row) => {
- customerId.value = row.id;
- receiptPaymentList(customerId.value);
-};
-
-const handlePagination = ({ page, limit }) => {
- recordPage.current = page;
- recordPage.size = limit;
-
- const start = (page - 1) * limit;
- const end = start + limit;
-
- receiptRecord.value = originReceiptRecord.value.slice(start, end);
-};
-
-onMounted(() => {
- getList();
-});
-</script>
-
-<style scoped lang="scss">
-.table_list {
- width: 50%;
-}
-</style>
diff --git a/src/views/salesManagement/salesLedger/fileList.vue b/src/views/salesManagement/salesLedger/fileList.vue
deleted file mode 100644
index e9e3b87..0000000
--- a/src/views/salesManagement/salesLedger/fileList.vue
+++ /dev/null
@@ -1,43 +0,0 @@
-<template>
- <el-dialog v-model="dialogVisible" title="闄勪欢" width="40%" :before-close="handleClose">
- <el-table :data="tableData" border height="40vh" stripe>
- <el-table-column label="闄勪欢鍚嶇О" prop="name" min-width="400" show-overflow-tooltip />
- <el-table-column fixed="right" label="鎿嶄綔" width="100" align="center">
- <template #default="scope">
- <el-button link type="primary" size="small" @click="downLoadFile(scope.row)">涓嬭浇</el-button>
- <el-button link type="primary" size="small" @click="lookFile(scope.row)">棰勮</el-button>
- </template>
- </el-table-column>
- </el-table>
- </el-dialog>
- <filePreview ref="filePreviewRef" />
-</template>
-
-<script setup>
-import { ref } from 'vue'
-import filePreview from '@/components/filePreview/index.vue'
-
-const dialogVisible = ref(false)
-const tableData = ref([])
-const { proxy } = getCurrentInstance();
-const filePreviewRef = ref()
-const handleClose = () => {
- dialogVisible.value = false
-}
-const open = (list) => {
- dialogVisible.value = true
- tableData.value = list
-}
-const downLoadFile = (row) => {
- proxy.$download.name(row.url);
-
-}
-const lookFile = (row) => {
- filePreviewRef.value.open(row.url)
-}
-defineExpose({
- open
-})
-</script>
-
-<style></style>
\ No newline at end of file
diff --git a/src/views/salesManagement/salesLedger/index.vue b/src/views/salesManagement/salesLedger/index.vue
deleted file mode 100644
index ed8d43d..0000000
--- a/src/views/salesManagement/salesLedger/index.vue
+++ /dev/null
@@ -1,1016 +0,0 @@
-<template>
- <div class="app-container">
- <div class="search_form">
- <el-form :model="searchForm" :inline="true">
- <el-form-item label="瀹㈡埛鍚嶇О锛�">
- <el-input v-model="searchForm.customerName" placeholder="璇疯緭鍏�" clearable prefix-icon="Search"
- @change="handleQuery" />
- </el-form-item>
- <el-form-item label="瀹㈡埛鍚堝悓鍙凤細">
- <el-input v-model="searchForm.customerContractNo" placeholder="璇疯緭鍏�" clearable prefix-icon="Search"
- @change="handleQuery" />
- </el-form-item>
- <el-form-item label="閿�鍞悎鍚屽彿锛�">
- <el-input v-model="searchForm.salesContractNo" placeholder="璇疯緭鍏�" clearable prefix-icon="Search"
- @change="handleQuery" />
- </el-form-item>
- <el-form-item label="椤圭洰鍚嶇О锛�">
- <el-input v-model="searchForm.projectName" placeholder="璇疯緭鍏�" clearable prefix-icon="Search"
- @change="handleQuery" />
- </el-form-item>
- <el-form-item label="褰曞叆鏃ユ湡锛�">
- <el-date-picker v-model="searchForm.entryDate" value-format="YYYY-MM-DD" format="YYYY-MM-DD" type="daterange"
- placeholder="璇烽�夋嫨" clearable @change="changeDaterange" />
- </el-form-item>
- <el-form-item>
- <el-button type="primary" @click="handleQuery"> 鎼滅储 </el-button>
- </el-form-item>
- </el-form>
- </div>
- <div class="table_list">
- <div class="actions">
- <div></div>
- <div>
- <el-button type="primary" @click="openForm('add')">
- 鏂板鍙拌处
- </el-button>
- <el-button @click="handleOut">瀵煎嚭</el-button>
- <el-button type="danger" plain @click="handleDelete">鍒犻櫎</el-button>
- </div>
- </div>
- <el-table :data="tableData" border v-loading="tableLoading" @selection-change="handleSelectionChange"
- :expand-row-keys="expandedRowKeys" :row-key="(row) => row.id" show-summary style="width: 100%"
- :summary-method="summarizeMainTable" @expand-change="expandChange" height="calc(100vh - 18.5em)" stripe>
- <el-table-column align="center" type="selection" width="55" />
- <el-table-column type="expand">
- <template #default="props">
- <el-table :data="props.row.children" border show-summary :summary-method="summarizeChildrenTable" stripe>
- <el-table-column align="center" label="搴忓彿" type="index" width="60" />
- <el-table-column label="浜у搧澶х被" prop="productCategory" />
- <el-table-column label="瑙勬牸鍨嬪彿" prop="specificationModel" />
- <el-table-column label="鍗曚綅" prop="unit" />
- <el-table-column label="鏁伴噺" prop="quantity" />
- <el-table-column label="绋庣巼(%)" prop="taxRate" />
- <el-table-column label="鍚◣鍗曚环(鍏�)" prop="taxInclusiveUnitPrice" :formatter="formattedNumber" />
- <el-table-column label="鍚◣鎬讳环(鍏�)" prop="taxInclusiveTotalPrice" :formatter="formattedNumber" />
- <el-table-column label="涓嶅惈绋庢�讳环(鍏�)" prop="taxExclusiveTotalPrice" :formatter="formattedNumber" />
- </el-table>
- </template>
- </el-table-column>
- <el-table-column align="center" label="搴忓彿" type="index" width="60" />
- <el-table-column label="閿�鍞悎鍚屽彿" prop="salesContractNo" width="180" show-overflow-tooltip />
- <el-table-column label="瀹㈡埛鍚堝悓鍙�" prop="customerContractNo" width="180" show-overflow-tooltip />
- <el-table-column label="瀹㈡埛鍚嶇О" prop="customerName" width="300" show-overflow-tooltip />
- <el-table-column label="涓氬姟鍛�" prop="salesman" width="100" show-overflow-tooltip />
- <el-table-column label="椤圭洰鍚嶇О" prop="projectName" width="180" show-overflow-tooltip />
- <el-table-column label="浠樻鏂瑰紡" prop="paymentMethod" show-overflow-tooltip />
- <el-table-column label="鍚堝悓閲戦(鍏�)" prop="contractAmount" width="220" show-overflow-tooltip
- :formatter="formattedNumber" />
- <el-table-column label="宸插紑绁ㄩ噾棰�(鍏�)" prop="invoiceTotal" width="220" show-overflow-tooltip
- :formatter="formattedNumber" />
- <el-table-column label="鏈紑绁ㄩ噾棰�(鍏�)" prop="noInvoiceAmountTotal" width="220" show-overflow-tooltip
- :formatter="formattedNumber" />
- <el-table-column label="鍥炴閲戦(鍏�)" prop="receiptPaymentAmountTotal" width="220" show-overflow-tooltip
- :formatter="formattedNumber" />
- <el-table-column label="寰呭洖娆鹃噾棰�(鍏�)" prop="noReceiptAmount" width="220" show-overflow-tooltip
- :formatter="formattedNumber" />
- <el-table-column label="褰曞叆浜�" prop="entryPersonName" width="100" show-overflow-tooltip />
- <el-table-column label="褰曞叆鏃ユ湡" prop="entryDate" width="120" show-overflow-tooltip />
- <el-table-column label="绛捐鏃ユ湡" prop="executionDate" width="120" show-overflow-tooltip />
- <el-table-column fixed="right" label="鎿嶄綔" min-width="140" align="center">
- <template #default="scope">
- <el-button link type="primary" size="small" :disabled="scope.row.invoiceTotal>0 || scope.row.entryPersonName !== userStore.nickName" @click="openForm('edit', scope.row)">缂栬緫</el-button>
-<!-- <el-button link type="primary" size="small" @click="openForm('view', scope.row)">璇︽儏</el-button>-->
- <el-button link type="primary" size="small" @click="downLoadFile(scope.row)">闄勪欢</el-button>
- </template>
- </el-table-column>
- </el-table>
- <pagination v-show="total > 0" :total="total" layout="total, sizes, prev, pager, next, jumper"
- :page="page.current" :limit="page.size" @pagination="paginationChange" />
- </div>
- <el-dialog v-model="dialogFormVisible" :title="operationType === 'add' ? '鏂板閿�鍞彴璐﹂〉闈�' : '缂栬緫閿�鍞彴璐﹂〉闈�'" width="70%"
- @close="closeDia">
- <el-form :model="form" label-width="140px" label-position="top" :rules="rules" ref="formRef">
- <el-row :gutter="30">
- <el-col :span="12">
- <el-form-item label="閿�鍞悎鍚屽彿锛�" prop="salesContractNo">
- <el-input v-model="form.salesContractNo" placeholder="鑷姩鐢熸垚" clearable disabled />
- </el-form-item>
- </el-col>
- <el-col :span="12">
- <el-form-item label="涓氬姟鍛橈細" prop="salesman">
- <el-select v-model="form.salesman" placeholder="璇烽�夋嫨" clearable :disabled="operationType === 'view'">
- <el-option v-for="item in userList" :key="item.nickName" :label="item.nickName"
- :value="item.nickName" />
- </el-select>
- </el-form-item>
- </el-col>
- </el-row>
- <el-row :gutter="30">
- <el-col :span="12">
- <el-form-item label="瀹㈡埛鍚堝悓鍙凤細" prop="customerContractNo">
- <el-input v-model="form.customerContractNo" placeholder="璇疯緭鍏�" clearable :disabled="operationType === 'view'"/>
- </el-form-item>
- </el-col>
- <el-col :span="12">
- <el-form-item label="瀹㈡埛鍚嶇О锛�" prop="customerId">
- <el-select v-model="form.customerId" placeholder="璇烽�夋嫨" clearable :disabled="operationType === 'view'">
- <el-option v-for="item in customerOption" :key="item.id" :label="item.customerName" :value="item.id">
- {{
- item.customerName + "鈥斺��" + item.taxpayerIdentificationNumber
- }}
- </el-option>
- </el-select>
- </el-form-item>
- </el-col>
- </el-row>
- <el-row :gutter="30">
- <el-col :span="12">
- <el-form-item label="椤圭洰鍚嶇О锛�" prop="projectName">
- <el-input v-model="form.projectName" placeholder="璇疯緭鍏�" clearable :disabled="operationType === 'view'" />
- </el-form-item>
- </el-col>
- <el-col :span="12">
- <el-form-item label="绛捐鏃ユ湡锛�" prop="executionDate">
- <el-date-picker style="width: 100%" v-model="form.executionDate" value-format="YYYY-MM-DD"
- format="YYYY-MM-DD" type="date" placeholder="璇烽�夋嫨" clearable :disabled="operationType === 'view'" />
- </el-form-item>
- </el-col>
- </el-row>
- <el-row :gutter="30">
- <el-col :span="12">
- <el-form-item label="褰曞叆浜猴細" prop="entryPerson">
- <el-select v-model="form.entryPerson" placeholder="璇烽�夋嫨" clearable @change="changs" disabled>
- <el-option v-for="item in userList" :key="item.userId" :label="item.nickName" :value="item.userId" />
- </el-select>
- </el-form-item>
- </el-col>
- <el-col :span="12">
- <el-form-item label="褰曞叆鏃ユ湡锛�" prop="entryDate">
- <el-date-picker style="width: 100%" v-model="form.entryDate" value-format="YYYY-MM-DD" format="YYYY-MM-DD"
- type="date" placeholder="璇烽�夋嫨" clearable disabled />
- </el-form-item>
- </el-col>
- </el-row>
- <el-row :gutter="30">
- <el-col :span="12">
- <el-form-item label="浠樻鏂瑰紡">
- <el-input v-model="form.paymentMethod" placeholder="璇疯緭鍏�" clearable :disabled="operationType === 'view'" />
- </el-form-item>
- </el-col>
- </el-row>
- <el-row>
- <el-form-item label="浜у搧淇℃伅锛�" prop="entryDate">
- <el-button v-if="operationType !== 'view'" type="primary" @click="openProductForm('add')">娣诲姞</el-button>
- <el-button v-if="operationType !== 'view'" plain type="danger" @click="deleteProduct" >鍒犻櫎</el-button>
- </el-form-item>
- </el-row>
- <el-table :data="productData" border @selection-change="productSelected" show-summary stripe
- :summary-method="summarizeMainTable">
- <el-table-column align="center" type="selection" width="55" v-if="operationType !== 'view'" />
- <el-table-column align="center" label="搴忓彿" type="index" width="60" />
- <el-table-column label="浜у搧澶х被" prop="productCategory" />
- <el-table-column label="瑙勬牸鍨嬪彿" prop="specificationModel" />
- <el-table-column label="鍗曚綅" prop="unit" />
- <el-table-column label="鏁伴噺" prop="quantity" />
- <el-table-column label="绋庣巼(%)" prop="taxRate" />
- <el-table-column label="鍚◣鍗曚环(鍏�)" prop="taxInclusiveUnitPrice" :formatter="formattedNumber" />
- <el-table-column label="鍚◣鎬讳环(鍏�)" prop="taxInclusiveTotalPrice" :formatter="formattedNumber" />
- <el-table-column label="涓嶅惈绋庢�讳环(鍏�)" prop="taxExclusiveTotalPrice" :formatter="formattedNumber" />
- <el-table-column fixed="right" label="鎿嶄綔" min-width="60" align="center" v-if="operationType !== 'view'">
- <template #default="scope">
- <el-button link type="primary" size="small" @click="openProductForm('edit', scope.row,scope.$index)">缂栬緫</el-button>
- </template>
- </el-table-column>
- </el-table>
- <el-row :gutter="30">
- <el-col :span="24">
- <el-form-item label="澶囨敞路锛�" prop="remark">
- <el-input v-model="form.remark" placeholder="璇疯緭鍏�" clearable type="textarea" :rows="2" :disabled="operationType === 'view'" />
- </el-form-item>
- </el-col>
- </el-row>
- <el-row :gutter="30">
- <el-col :span="24">
- <el-form-item label="闄勪欢鏉愭枡锛�" prop="remark">
- <el-upload v-model:file-list="fileList" :action="upload.url" multiple ref="fileUpload" auto-upload
- :headers="upload.headers" :before-upload="handleBeforeUpload" :on-error="handleUploadError"
- :on-success="handleUploadSuccess" :on-remove="handleRemove">
- <el-button type="primary" v-if="operationType !== 'view'">涓婁紶</el-button>
- <template #tip v-if="operationType !== 'view'">
- <div class="el-upload__tip">
- 鏂囦欢鏍煎紡鏀寔
- doc锛宒ocx锛寈ls锛寈lsx锛宲pt锛宲ptx锛宲df锛宼xt锛寈ml锛宩pg锛宩peg锛宲ng锛実if锛宐mp锛宺ar锛寊ip锛�7z
- </div>
- </template>
- </el-upload>
- </el-form-item>
- </el-col>
- </el-row>
- </el-form>
- <template #footer>
- <div class="dialog-footer">
- <el-button type="primary" @click="submitForm">纭</el-button>
- <el-button @click="closeDia">鍙栨秷</el-button>
- </div>
- </template>
- </el-dialog>
- <el-dialog v-model="productFormVisible" :title="productOperationType === 'add' ? '鏂板浜у搧' : '缂栬緫浜у搧'" width="40%"
- @close="closeProductDia">
- <el-form :model="productForm" label-width="140px" label-position="top" :rules="productRules" ref="productFormRef">
- <el-row :gutter="30">
- <el-col :span="24">
- <el-form-item label="浜у搧澶х被锛�" prop="productCategory">
- <!-- <el-select v-model="productForm.productCategory" placeholder="璇烽�夋嫨" clearable>
- <el-option v-for="item in userList" :key="item.nickName" :label="item.nickName" :value="item.nickName"/>
- </el-select> -->
- <el-tree-select v-model="productForm.productCategory" placeholder="璇烽�夋嫨" clearable check-strictly
- @change="getModels" :data="productOptions" :render-after-expand="false" style="width: 100%" />
- </el-form-item>
- </el-col>
- </el-row>
- <el-row :gutter="30">
- <el-col :span="24">
- <el-form-item label="瑙勬牸鍨嬪彿锛�" prop="productModelId">
- <el-select v-model="productForm.productModelId" placeholder="璇烽�夋嫨" clearable @change="getProductModel">
- <el-option v-for="item in modelOptions" :key="item.id" :label="item.model" :value="item.id" />
- </el-select>
- </el-form-item>
- </el-col>
- </el-row>
- <el-row :gutter="30">
- <el-col :span="12">
- <el-form-item label="鍗曚綅锛�" prop="unit">
- <el-input v-model="productForm.unit" placeholder="璇疯緭鍏�" clearable />
- </el-form-item>
- </el-col>
- <el-col :span="12">
- <el-form-item label="绋庣巼(%)锛�" prop="taxRate">
- <el-select v-model="productForm.taxRate" placeholder="璇烽�夋嫨" clearable @change="calculateFromTaxRate">
- <el-option label="1" value="1" />
- <el-option label="6" value="6" />
- <el-option label="13" value="13" />
- </el-select>
- </el-form-item>
- </el-col>
- </el-row>
- <el-row :gutter="30">
- <el-col :span="12">
- <el-form-item label="鍚◣鍗曚环(鍏�)锛�" prop="taxInclusiveUnitPrice">
- <el-input-number :step="0.01" :min="0" v-model="productForm.taxInclusiveUnitPrice" style="width: 100%"
- :precision="2"
- placeholder="璇疯緭鍏�" clearable @change="calculateFromUnitPrice" />
- </el-form-item>
- </el-col>
- <el-col :span="12">
- <el-form-item label="鏁伴噺锛�" prop="quantity">
- <el-input-number :step="0.1" :min="0" v-model="productForm.quantity" placeholder="璇疯緭鍏�" clearable
- :precision="2"
- @change="calculateFromQuantity" style="width: 100%" />
- </el-form-item>
- </el-col>
- </el-row>
- <el-row :gutter="30">
- <el-col :span="12">
- <el-form-item label="鍚◣鎬讳环(鍏�)锛�" prop="taxInclusiveTotalPrice">
- <el-input v-model="productForm.taxInclusiveTotalPrice" placeholder="璇疯緭鍏�" clearable @change="calculateFromTotalPrice" />
- </el-form-item>
- </el-col>
- <el-col :span="12">
- <el-form-item label="涓嶅惈绋庢�讳环(鍏�)锛�" prop="taxExclusiveTotalPrice">
- <el-input v-model="productForm.taxExclusiveTotalPrice" placeholder="璇疯緭鍏�" clearable @change="calculateFromExclusiveTotalPrice" />
- </el-form-item>
- </el-col>
- </el-row>
- <el-row :gutter="30">
- <el-col :span="12">
- <el-form-item label="鍙戠エ绫诲瀷锛�" prop="invoiceType">
- <el-select v-model="productForm.invoiceType" placeholder="璇烽�夋嫨" clearable>
- <el-option label="澧炴櫘绁�" value="澧炴櫘绁�" />
- <el-option label="澧炰笓绁�" value="澧炰笓绁�" />
- </el-select>
- </el-form-item>
- </el-col>
- </el-row>
- </el-form>
- <template #footer>
- <div class="dialog-footer">
- <el-button type="primary" @click="submitProduct">纭</el-button>
- <el-button @click="closeProductDia">鍙栨秷</el-button>
- </div>
- </template>
- </el-dialog>
- <FileList ref="fileListRef" />
- </div>
-</template>
-
-<script setup>
-import { getToken } from "@/utils/auth";
-import pagination from "@/components/PIMTable/Pagination.vue";
-import {onMounted, ref} from "vue";
-import { ElMessageBox } from "element-plus";
-import useUserStore from "@/store/modules/user";
-import { userListNoPage } from "@/api/system/user.js";
-import FileList from "./fileList.vue";
-import {
- ledgerListPage,
- productList,
- customerList,
- addOrUpdateSalesLedger,
- getSalesLedgerWithProducts,
- delLedger,
- addOrUpdateSalesLedgerProduct,
- delProduct,
- delLedgerFile,
-} from "@/api/salesManagement/salesLedger.js";
-import { modelList, productTreeList } from "@/api/basicData/product.js";
-import useFormData from "@/hooks/useFormData.js";
-import dayjs from "dayjs";
-
-const userStore = useUserStore();
-const { proxy } = getCurrentInstance();
-const tableData = ref([]);
-const productData = ref([]);
-const selectedRows = ref([]);
-const productSelectedRows = ref([]);
-const userList = ref([]);
-const customerOption = ref([]);
-const productOptions = ref([]);
-const modelOptions = ref([]);
-const tableLoading = ref(false);
-const page = reactive({
- current: 1,
- size: 100,
-});
-const total = ref(0);
-const fileList = ref([]);
-
-// 鐢ㄦ埛淇℃伅琛ㄥ崟寮规鏁版嵁
-const operationType = ref("");
-const dialogFormVisible = ref(false);
-const data = reactive({
- searchForm: {
- customerName: "", // 瀹㈡埛鍚嶇О
- customerContractNo: "", // 瀹㈡埛鍚堝悓缂栧彿
- salesContractNo: "", // 閿�鍞悎鍚岀紪鍙�
- projectName: "", // 椤圭洰鍚嶇О
- entryDate: [
- dayjs().format("YYYY-MM-DD"),
- dayjs().add(1, "day").format("YYYY-MM-DD"),
- ], // 褰曞叆鏃ユ湡
- entryDateStart: dayjs().format("YYYY-MM-DD"),
- entryDateEnd: dayjs().add(1, "day").format("YYYY-MM-DD"),
- },
- form: {
- salesContractNo: "",
- salesman: "",
- customerContractNo: "",
- customerId: "",
- projectName: "",
- entryPerson: "",
- entryDate: "",
- maintenanceTime: "",
- productData: [],
- executionDate: "",
- paymentMethod: "",
- },
- rules: {
- salesman: [{ required: true, message: "璇烽�夋嫨", trigger: "change" }],
- customerContractNo: [
- { required: true, message: "璇疯緭鍏�", trigger: "blur" },
- ],
- customerId: [{ required: true, message: "璇烽�夋嫨", trigger: "change" }],
- projectName: [{ required: true, message: "璇疯緭鍏�", trigger: "blur" }],
- entryPerson: [{ required: true, message: "璇烽�夋嫨", trigger: "change" }],
- entryDate: [{ required: true, message: "璇烽�夋嫨", trigger: "change" }],
- executionDate: [{ required: true, message: "璇烽�夋嫨", trigger: "change" }],
- },
-});
-const { form, rules } = toRefs(data);
-const { form: searchForm } = useFormData(data.searchForm);
-// 浜у搧琛ㄥ崟寮规鏁版嵁
-const productFormVisible = ref(false);
-const productOperationType = ref("");
-const currentId = ref("");
-const productFormData = reactive({
- productForm: {
- productCategory: "",
- specificationModel: "",
- unit: "",
- quantity: "",
- taxInclusiveUnitPrice: "",
- taxRate: "",
- taxInclusiveTotalPrice: "",
- taxExclusiveTotalPrice: "",
- invoiceType: "",
- },
- productRules: {
- productCategory: [{ required: true, message: "璇烽�夋嫨", trigger: "change" }],
- productModelId: [{ required: true, message: "璇烽�夋嫨", trigger: "change" }],
- specificationModel: [
- { required: true, message: "璇烽�夋嫨", trigger: "change" },
- ],
- unit: [{ required: true, message: "璇疯緭鍏�", trigger: "blur" }],
- quantity: [{ required: true, message: "璇疯緭鍏�", trigger: "blur" }],
- taxInclusiveUnitPrice: [
- { required: true, message: "璇疯緭鍏�", trigger: "blur" },
- ],
- taxRate: [{ required: true, message: "璇烽�夋嫨", trigger: "change" }],
- taxInclusiveTotalPrice: [
- { required: true, message: "璇疯緭鍏�", trigger: "blur" },
- ],
- taxExclusiveTotalPrice: [
- { required: true, message: "璇疯緭鍏�", trigger: "blur" },
- ],
- invoiceType: [{ required: true, message: "璇烽�夋嫨", trigger: "change" }],
- },
-});
-const { productForm, productRules } = toRefs(productFormData);
-// 闃叉寰幆璁$畻鐨勬爣蹇�
-const isCalculating = ref(false);
-const upload = reactive({
- // 涓婁紶鐨勫湴鍧�
- url: import.meta.env.VITE_APP_BASE_API + "/file/upload",
- // 璁剧疆涓婁紶鐨勮姹傚ご閮�
- headers: { Authorization: "Bearer " + getToken() },
-});
-
-const changeDaterange = (value) => {
- if (value) {
- searchForm.entryDateStart = dayjs(value[0]).format("YYYY-MM-DD");
- searchForm.entryDateEnd = dayjs(value[1]).format("YYYY-MM-DD");
- } else {
- searchForm.entryDateStart = undefined;
- searchForm.entryDateEnd = undefined;
- }
- handleQuery();
-};
-
-// 鏌ヨ鍒楄〃
-/** 鎼滅储鎸夐挳鎿嶄綔 */
-const handleQuery = () => {
- page.current = 1;
- expandedRowKeys.value = [];
- getList();
-};
-const paginationChange = (obj) => {
- page.current = obj.page;
- page.size = obj.limit;
- getList();
-};
-const getList = () => {
- tableLoading.value = true;
- const { entryDate, ...rest } = searchForm;
- ledgerListPage({ ...rest, ...page })
- .then((res) => {
- tableLoading.value = false;
- tableData.value = res.records;
- tableData.value.map((item) => {
- item.children = [];
- });
- total.value = res.total;
- })
- .catch(() => {
- tableLoading.value = false;
- });
-};
-// 鑾峰彇浜у搧澶х被tree鏁版嵁
-const getProductOptions = () => {
- productTreeList().then((res) => {
- productOptions.value = convertIdToValue(res);
- });
-};
-const formattedNumber = (row, column, cellValue) => {
- return parseFloat(cellValue).toFixed(2);
-};
-// 鑾峰彇tree瀛愭暟鎹�
-const getModels = (value) => {
- productForm.value.productCategory = findNodeById(productOptions.value, value);
- modelList({ id: value }).then((res) => {
- modelOptions.value = res;
- });
-};
-const getProductModel = (value) => {
- console.log("value", value);
- const index = modelOptions.value.findIndex((item) => item.id === value);
- if (index !== -1) {
- productForm.value.specificationModel = modelOptions.value[index].model;
- productForm.value.unit = modelOptions.value[index].unit;
- } else {
- productForm.value.specificationModel = null;
- productForm.value.unit = null;
- }
-};
-const findNodeById = (nodes, productId) => {
- for (let i = 0; i < nodes.length; i++) {
- if (nodes[i].value === productId) {
- return nodes[i].label; // 鎵惧埌鑺傜偣锛岃繑鍥炶鑺傜偣
- }
- if (nodes[i].children && nodes[i].children.length > 0) {
- const foundNode = findNodeById(nodes[i].children, productId);
- if (foundNode) {
- return foundNode; // 鍦ㄥ瓙鑺傜偣涓壘鍒帮紝杩斿洖璇ヨ妭鐐�
- }
- }
- }
- return null; // 娌℃湁鎵惧埌鑺傜偣锛岃繑鍥瀗ull
-};
-function convertIdToValue(data) {
- return data.map((item) => {
- const { id, children, ...rest } = item;
- const newItem = {
- ...rest,
- value: id, // 灏� id 鏀逛负 value
- };
- if (children && children.length > 0) {
- newItem.children = convertIdToValue(children);
- }
-
- return newItem;
- });
-}
-// 琛ㄦ牸閫夋嫨鏁版嵁
-const handleSelectionChange = (selection) => {
- // 杩囨护鎺夊瓙鏁版嵁
- selectedRows.value = selection.filter((item) => item.children !== undefined);
- console.log("selection", selectedRows.value);
-};
-const productSelected = (selectedRows) => {
- productSelectedRows.value = selectedRows;
-};
-const expandedRowKeys = ref([]);
-// 灞曞紑琛�
-const expandChange = (row, expandedRows) => {
- if (expandedRows.length > 0) {
- expandedRowKeys.value = [];
- try {
- productList({ salesLedgerId: row.id, type: 1 }).then((res) => {
- const index = tableData.value.findIndex((item) => item.id === row.id);
- if (index > -1) {
- tableData.value[index].children = res.data;
- }
- expandedRowKeys.value.push(row.id);
- });
- } catch (error) {
- console.log(error);
- }
- } else {
- expandedRowKeys.value = [];
- }
-};
-// 涓昏〃鍚堣鏂规硶
-const summarizeMainTable = (param) => {
- return proxy.summarizeTable(param, [
- "contractAmount",
- "taxInclusiveTotalPrice",
- "taxExclusiveTotalPrice",
- 'invoiceTotal',
- 'noInvoiceAmountTotal',
- 'receiptPaymentAmountTotal',
- 'noReceiptAmount',
- ]);
-};
-// 瀛愯〃鍚堣鏂规硶
-const summarizeChildrenTable = (param) => {
- return proxy.summarizeTable(param, [
- "taxInclusiveUnitPrice",
- "taxInclusiveTotalPrice",
- "taxExclusiveTotalPrice",
- ]);
-};
-// 鎵撳紑寮规
-const openForm = async (type, row) => {
- operationType.value = type;
- form.value = {};
- productData.value = [];
- let userLists = await userListNoPage();
- userList.value = userLists.data;
- customerList().then((res) => {
- customerOption.value = res;
- });
- form.value.entryPerson = userStore.id;
- if (type !== "add") {
- currentId.value = row.id;
- getSalesLedgerWithProducts({ id: row.id, type: 1 }).then((res) => {
- form.value = { ...res };
- form.value.entryPerson = Number(res.entryPerson);
- productData.value = form.value.productData;
- fileList.value = form.value.salesLedgerFiles;
- });
- }
- // let userAll = await userStore.getInfo()
- // userList.value.forEach(element => {
- // if(userAll.user.nickName === element.nickName && userAll.user.userName === element.userName) {
- // form.value.entryPerson = userAll.user.userId // 璁剧疆榛樿涓氬姟鍛樹负褰撳墠鐢ㄦ埛
- // }
- // });
- form.value.entryDate = getCurrentDate(); // 璁剧疆榛樿褰曞叆鏃ユ湡涓哄綋鍓嶆棩鏈�
- dialogFormVisible.value = true;
-};
-function changs(val) {
- console.log(val);
-}
-// 涓婁紶鍓嶆牎妫�
-function handleBeforeUpload(file) {
- // 鏍℃鏂囦欢澶у皬
- // if (file.size > 1024 * 1024 * 10) {
- // proxy.$modal.msgError("涓婁紶鏂囦欢澶у皬涓嶈兘瓒呰繃10MB!");
- // return false;
- // }
- proxy.$modal.loading("姝e湪涓婁紶鏂囦欢锛岃绋嶅��...");
- return true;
-}
-// 涓婁紶澶辫触
-function handleUploadError(err) {
- proxy.$modal.msgError("涓婁紶鏂囦欢澶辫触");
- proxy.$modal.closeLoading();
-}
-// 涓婁紶鎴愬姛鍥炶皟
-function handleUploadSuccess(res, file, uploadFiles) {
- proxy.$modal.closeLoading();
- if (res.code === 200) {
- file.tempId = res.data.tempId;
- proxy.$modal.msgSuccess("涓婁紶鎴愬姛");
- } else {
- proxy.$modal.msgError(res.msg);
- proxy.$refs.fileUpload.handleRemove(file);
- }
-}
-// 绉婚櫎鏂囦欢
-function handleRemove(file) {
- if (operationType.value === "edit") {
- let ids = [];
- ids.push(file.id);
- delLedgerFile(ids).then((res) => {
- proxy.$modal.msgSuccess("鍒犻櫎鎴愬姛");
- });
- }
-}
-// 鎻愪氦琛ㄥ崟
-const submitForm = () => {
- proxy.$refs["formRef"].validate((valid) => {
- if (valid) {
- console.log('productData.value--', productData.value)
- if (productData.value !== null && productData.value.length > 0) {
- form.value.productData = proxy.HaveJson(productData.value);
- } else {
- proxy.$modal.msgWarning("璇锋坊鍔犱骇鍝佷俊鎭�");
- return;
- }
- let tempFileIds = [];
- if (fileList.value !== null && fileList.value.length > 0) {
- tempFileIds = fileList.value.map((item) => item.tempId);
- }
- form.value.tempFileIds = tempFileIds;
- form.value.type = 1;
- addOrUpdateSalesLedger(form.value).then((res) => {
- proxy.$modal.msgSuccess("鎻愪氦鎴愬姛");
- closeDia();
- getList();
- });
- }
- });
-};
-// 鍏抽棴寮规
-const closeDia = () => {
- proxy.resetForm("formRef");
- dialogFormVisible.value = false;
-};
-
-const productIndex = ref(0);
-// 鎵撳紑浜у搧寮规
-const openProductForm = (type, row,index) => {
- productOperationType.value = type;
- productForm.value = {};
- proxy.resetForm("productFormRef");
- if (type === "edit") {
- productForm.value = { ...row };
- productIndex.value = index;
- }
- productFormVisible.value = true;
- getProductOptions();
-};
-// 鎻愪氦浜у搧琛ㄥ崟
-const submitProduct = () => {
- proxy.$refs["productFormRef"].validate((valid) => {
- if (valid) {
- if (operationType.value === "edit") {
- submitProductEdit();
- } else {
- if(productOperationType.value === "add"){
- productData.value.push({ ...productForm.value });
- }else{
- productData.value[productIndex.value] = { ...productForm.value }
- }
- closeProductDia();
- }
- }
- });
-};
-const submitProductEdit = () => {
- productForm.value.salesLedgerId = currentId.value;
- productForm.value.type = 1
- addOrUpdateSalesLedgerProduct(productForm.value).then((res) => {
- proxy.$modal.msgSuccess("鎻愪氦鎴愬姛");
- closeProductDia();
- getSalesLedgerWithProducts({ id: currentId.value, type: 1 }).then((res) => {
- productData.value = res.productData;
- });
- });
-};
-// 鍒犻櫎浜у搧
-const deleteProduct = () => {
- if (productSelectedRows.value.length === 0) {
- proxy.$modal.msgWarning("璇烽�夋嫨鏁版嵁");
- return;
- }
- if (operationType.value === "add") {
- productSelectedRows.value.forEach((selectedRow) => {
- const index = productData.value.findIndex(
- (product) => product.id === selectedRow.id
- );
- if (index !== -1) {
- productData.value.splice(index, 1);
- }
- });
- } else {
- let ids = [];
- if (productSelectedRows.value.length > 0) {
- ids = productSelectedRows.value.map((item) => item.id);
- }
- ElMessageBox.confirm("閫変腑鐨勫唴瀹瑰皢琚垹闄わ紝鏄惁纭鍒犻櫎锛�", "瀵煎嚭", {
- confirmButtonText: "纭",
- cancelButtonText: "鍙栨秷",
- type: "warning",
- })
- .then(() => {
- delProduct(ids).then((res) => {
- proxy.$modal.msgSuccess("鍒犻櫎鎴愬姛");
- closeProductDia();
- getSalesLedgerWithProducts({ id: currentId.value, type: 1 }).then(
- (res) => {
- productData.value = res.productData;
- }
- );
- });
- })
- .catch(() => {
- proxy.$modal.msg("宸插彇娑�");
- });
- }
-};
-// 鍏抽棴浜у搧寮规
-const closeProductDia = () => {
- proxy.resetForm("productFormRef");
- productFormVisible.value = false;
-};
-// 瀵煎嚭
-const handleOut = () => {
- ElMessageBox.confirm("閫変腑鐨勫唴瀹瑰皢琚鍑猴紝鏄惁纭瀵煎嚭锛�", "瀵煎嚭", {
- confirmButtonText: "纭",
- cancelButtonText: "鍙栨秷",
- type: "warning",
- })
- .then(() => {
- proxy.download("/sales/ledger/export", {}, "閿�鍞彴璐�.xlsx");
- })
- .catch(() => {
- proxy.$modal.msg("宸插彇娑�");
- });
-};
-// 鍒犻櫎
-const handleDelete = () => {
- let ids = [];
- if (selectedRows.value.length > 0) {
- ids = selectedRows.value.map((item) => item.id);
- } else {
- proxy.$modal.msgWarning("璇烽�夋嫨鏁版嵁");
- return;
- }
- ElMessageBox.confirm("閫変腑鐨勫唴瀹瑰皢琚垹闄わ紝鏄惁纭鍒犻櫎锛�", "瀵煎嚭", {
- confirmButtonText: "纭",
- cancelButtonText: "鍙栨秷",
- type: "warning",
- })
- .then(() => {
- delLedger(ids).then((res) => {
- proxy.$modal.msgSuccess("鍒犻櫎鎴愬姛");
- getList();
- });
- })
- .catch(() => {
- proxy.$modal.msg("宸插彇娑�");
- });
-};
-// 鑾峰彇褰撳墠鏃ユ湡骞舵牸寮忓寲涓� YYYY-MM-DD
-function getCurrentDate() {
- const today = new Date();
- const year = today.getFullYear();
- const month = String(today.getMonth() + 1).padStart(2, "0"); // 鏈堜唤浠�0寮�濮�
- const day = String(today.getDate()).padStart(2, "0");
- return `${year}-${month}-${day}`;
-}
-
-const mathNum = () => {
- console.log("productForm.value", productForm.value);
- if (!productForm.value.taxInclusiveUnitPrice) {
- return;
- }
- if (!productForm.value.quantity) {
- return;
- }
- // 鍚◣鎬讳环璁$畻
- productForm.value.taxInclusiveTotalPrice =
- proxy.calculateTaxIncludeTotalPrice(
- productForm.value.taxInclusiveUnitPrice,
- productForm.value.quantity
- );
- if (productForm.value.taxRate) {
- // 涓嶅惈绋庢�讳环璁$畻
- productForm.value.taxExclusiveTotalPrice =
- proxy.calculateTaxExclusiveTotalPrice(
- productForm.value.taxInclusiveTotalPrice,
- productForm.value.taxRate
- );
- }
-};
-
-// 鏍规嵁鍚◣鎬讳环璁$畻鍚◣鍗曚环鍜屾暟閲�
-const calculateFromTotalPrice = () => {
- if (isCalculating.value) return;
-
- const totalPrice = parseFloat(productForm.value.taxInclusiveTotalPrice);
- const quantity = parseFloat(productForm.value.quantity);
-
- if (!totalPrice || !quantity || quantity <= 0) {
- return;
- }
-
- isCalculating.value = true;
-
- // 璁$畻鍚◣鍗曚环 = 鍚◣鎬讳环 / 鏁伴噺
- productForm.value.taxInclusiveUnitPrice = (totalPrice / quantity).toFixed(2);
-
- // 濡傛灉鏈夌◣鐜囷紝璁$畻涓嶅惈绋庢�讳环
- if (productForm.value.taxRate) {
- productForm.value.taxExclusiveTotalPrice =
- proxy.calculateTaxExclusiveTotalPrice(
- totalPrice,
- productForm.value.taxRate
- );
- }
-
- isCalculating.value = false;
-};
-
-// 鏍规嵁涓嶅惈绋庢�讳环璁$畻鍚◣鍗曚环鍜屾暟閲�
-const calculateFromExclusiveTotalPrice = () => {
- if (!productForm.value.taxRate) {
- proxy.$modal.msgWarning("璇峰厛閫夋嫨绋庣巼");
- return;
- }
- if (isCalculating.value) return;
-
- const exclusiveTotalPrice = parseFloat(productForm.value.taxExclusiveTotalPrice);
- const quantity = parseFloat(productForm.value.quantity);
- const taxRate = parseFloat(productForm.value.taxRate);
-
- if (!exclusiveTotalPrice || !quantity || quantity <= 0 || !taxRate) {
- return;
- }
-
- isCalculating.value = true;
-
- // 鍏堣绠楀惈绋庢�讳环 = 涓嶅惈绋庢�讳环 / (1 - 绋庣巼/100)
- const taxRateDecimal = taxRate / 100;
- const inclusiveTotalPrice = exclusiveTotalPrice / (1 - taxRateDecimal);
- productForm.value.taxInclusiveTotalPrice = inclusiveTotalPrice.toFixed(2);
-
- // 璁$畻鍚◣鍗曚环 = 鍚◣鎬讳环 / 鏁伴噺
- productForm.value.taxInclusiveUnitPrice = (inclusiveTotalPrice / quantity).toFixed(2);
-
- isCalculating.value = false;
-};
-
-// 鏍规嵁鏁伴噺鍙樺寲璁$畻鎬讳环
-const calculateFromQuantity = () => {
- if (!productForm.value.taxRate) {
- proxy.$modal.msgWarning("璇峰厛閫夋嫨绋庣巼");
- return;
- }
- if (isCalculating.value) return;
-
- const quantity = parseFloat(productForm.value.quantity);
- const unitPrice = parseFloat(productForm.value.taxInclusiveUnitPrice);
-
- if (!quantity || quantity <= 0 || !unitPrice) {
- return;
- }
-
- isCalculating.value = true;
-
- // 璁$畻鍚◣鎬讳环
- productForm.value.taxInclusiveTotalPrice = (unitPrice * quantity).toFixed(2);
-
- // 濡傛灉鏈夌◣鐜囷紝璁$畻涓嶅惈绋庢�讳环
- if (productForm.value.taxRate) {
- productForm.value.taxExclusiveTotalPrice =
- proxy.calculateTaxExclusiveTotalPrice(
- productForm.value.taxInclusiveTotalPrice,
- productForm.value.taxRate
- );
- }
-
- isCalculating.value = false;
-};
-
-// 鏍规嵁鍚◣鍗曚环鍙樺寲璁$畻鎬讳环
-const calculateFromUnitPrice = () => {
- if (!productForm.value.taxRate) {
- proxy.$modal.msgWarning("璇峰厛閫夋嫨绋庣巼");
- return;
- }
- if (isCalculating.value) return;
-
- const quantity = parseFloat(productForm.value.quantity);
- const unitPrice = parseFloat(productForm.value.taxInclusiveUnitPrice);
-
- if (!quantity || quantity <= 0 || !unitPrice) {
- return;
- }
-
- isCalculating.value = true;
-
- // 璁$畻鍚◣鎬讳环
- productForm.value.taxInclusiveTotalPrice = (unitPrice * quantity).toFixed(2);
-
- // 濡傛灉鏈夌◣鐜囷紝璁$畻涓嶅惈绋庢�讳环
- if (productForm.value.taxRate) {
- productForm.value.taxExclusiveTotalPrice =
- proxy.calculateTaxExclusiveTotalPrice(
- productForm.value.taxInclusiveTotalPrice,
- productForm.value.taxRate
- );
- }
-
- isCalculating.value = false;
-};
-
-// 鏍规嵁绋庣巼鍙樺寲璁$畻涓嶅惈绋庢�讳环
-const calculateFromTaxRate = () => {
- if (!productForm.value.taxRate) {
- proxy.$modal.msgWarning("璇峰厛閫夋嫨绋庣巼");
- return;
- }
- if (isCalculating.value) return;
-
- const inclusiveTotalPrice = parseFloat(productForm.value.taxInclusiveTotalPrice);
- const taxRate = parseFloat(productForm.value.taxRate);
-
- if (!inclusiveTotalPrice || !taxRate) {
- return;
- }
-
- isCalculating.value = true;
-
- // 璁$畻涓嶅惈绋庢�讳环
- productForm.value.taxExclusiveTotalPrice =
- proxy.calculateTaxExclusiveTotalPrice(
- inclusiveTotalPrice,
- taxRate
- );
-
- isCalculating.value = false;
-};
-/**
- * 涓嬭浇鏂囦欢
- *
- * @param row 涓嬭浇鏂囦欢鐨勭浉鍏充俊鎭璞�
- */
-const fileListRef = ref(null)
-const downLoadFile = (row) => {
- getSalesLedgerWithProducts({ id: row.id, type: 1 }).then((res) => {
- fileListRef.value.open(res.salesLedgerFiles)
- });
-
-}
-onMounted(() => {
- getList();
-});
-</script>
-
-<style scoped lang="scss">
-.ml-10 {
- margin-left: 10px;
-}
-
-.table_list {
- margin-top: unset;
-}
-
-.actions {
- display: flex;
- justify-content: space-between;
- margin-bottom: 10px;
-}
-</style>
diff --git a/vite.config.js b/vite.config.js
index f7cae21..a6b1bc9 100644
--- a/vite.config.js
+++ b/vite.config.js
@@ -8,8 +8,8 @@
const { VITE_APP_ENV } = env;
const baseUrl =
VITE_APP_ENV == "development"
- ? "http://192.168.1.147:7003" // 寮�鍙戠幆澧冨悗绔帴鍙�
- : "http://10.136.12.71:7003"; // 鐢熶骇鐜鍚庣鎺ュ彛
+ ? "http://127.0.0.1:7003" // 寮�鍙戠幆澧冨悗绔帴鍙�
+ : "http://10.136.12.71:8016"; // 鐢熶骇鐜鍚庣鎺ュ彛
return {
// 閮ㄧ讲鐢熶骇鐜鍜屽紑鍙戠幆澧冧笅鐨刄RL銆�
--
Gitblit v1.9.3