ソースを参照

mod: 添加剂库存

weieryang 1 ヶ月 前
コミット
a877805194

+ 10 - 0
apps/web-ele/src/api/task/index.ts

@@ -1,6 +1,7 @@
1 1
 import { requestClient } from '#/api/request';
2 2
 
3 3
 enum Api {
4
+  additiveInventoryHandle = '/formAdditiveInventory/inventory/handle',
4 5
   emergencyWySubmit = '/formEmergencyDrill/drill/submit',
5 6
   emergencyWySubmitReport = '/formEmergencyDrill/drill/submitReport',
6 7
   groupLogBase = '/formTeamShiftLog/log/handle',
@@ -92,3 +93,12 @@ export function handleTurnInRateSurvey(params: any) {
92 93
 export function handleMarketingSurvey(params: any) {
93 94
   return requestClient.put(`${Api.marketingSurveyHandle}`, params);
94 95
 }
96
+
97
+/**
98
+ * 添加剂库存处理
99
+ * @param params 处理参数
100
+ * @returns
101
+ */
102
+export function handleAdditiveInventory(params: any) {
103
+  return requestClient.put(`${Api.additiveInventoryHandle}`, params);
104
+}

+ 188 - 0
apps/web-ele/src/views/schedule/detail/components/additive.vue

@@ -0,0 +1,188 @@
1
+<script lang="ts" setup>
2
+// @ts-ignore
3
+import { computed, ref } from 'vue';
4
+
5
+import { ElCard } from 'element-plus';
6
+
7
+// @ts-ignore
8
+import { useVbenVxeGrid } from '#/adapter/vxe-table';
9
+
10
+// 定义组件的Props接口
11
+interface AdditiveProps {
12
+  taskDetail: any;
13
+}
14
+
15
+// 接收父组件传递的任务详情数据
16
+const props = defineProps<AdditiveProps>();
17
+
18
+// 计算属性,获取添加剂库存数据
19
+const additiveInventoryData = computed(() => {
20
+  return props.taskDetail || [];
21
+});
22
+
23
+// 格式化数值,保留两位小数
24
+const formatNumber = (value: number | string) => {
25
+  if (value === undefined || value === null || value === '') return '-';
26
+  const num = Number(value);
27
+  if (isNaN(num)) return '-';
28
+  return num.toFixed(2);
29
+};
30
+
31
+// 表格列配置
32
+const tableColumns: any = [
33
+  {
34
+    field: 'additiveType',
35
+    title: '添加剂类型',
36
+    width: 120,
37
+    fixed: 'left',
38
+    formatter: ({ row }) => {
39
+      return row.additiveType || '-';
40
+    },
41
+  },
42
+  {
43
+    field: 'initialInventory',
44
+    title: '期初库存',
45
+    width: 120,
46
+    formatter: ({ row }) => {
47
+      return formatNumber(row.initialInventory);
48
+    },
49
+  },
50
+  {
51
+    field: 'purchase',
52
+    title: '进货',
53
+    width: 100,
54
+    formatter: ({ row }) => {
55
+      return formatNumber(row.purchase);
56
+    },
57
+  },
58
+  {
59
+    field: 'useAmount',
60
+    title: '使用',
61
+    width: 100,
62
+    formatter: ({ row }) => {
63
+      return formatNumber(row.useAmount);
64
+    },
65
+  },
66
+  {
67
+    field: 'expectedInventory',
68
+    title: '期末应存',
69
+    width: 120,
70
+    formatter: ({ row }) => {
71
+      return formatNumber(row.expectedInventory);
72
+    },
73
+  },
74
+  {
75
+    field: 'actualInventory',
76
+    title: '期末实存',
77
+    width: 120,
78
+    formatter: ({ row }) => {
79
+      return formatNumber(row.actualInventory);
80
+    },
81
+  },
82
+  {
83
+    field: 'registerDate',
84
+    title: '登记日期',
85
+    width: 180,
86
+    formatter: ({ row }) => {
87
+      return row.registerDate || '-';
88
+    },
89
+  },
90
+];
91
+
92
+// 初始化表格配置
93
+const gridOptions: any = {
94
+  size: 'medium',
95
+  toolbarConfig: {
96
+    custom: false,
97
+    refresh: false,
98
+    zoom: false,
99
+  },
100
+  pagerConfig: {
101
+    enabled: false,
102
+  },
103
+  proxyConfig: {
104
+    ajax: {
105
+      query: async () => {
106
+        return {
107
+          items: props.taskDetail || [],
108
+        };
109
+      },
110
+    },
111
+  },
112
+  columns: tableColumns,
113
+};
114
+
115
+// 表格数据
116
+const tableDatas = ref<any>([]);
117
+// 使用BasicTable组件
118
+const [BasicTable, basicTableApi] = useVbenVxeGrid({
119
+  gridOptions,
120
+});
121
+</script>
122
+
123
+<template>
124
+  <ElCard>
125
+    <template #header>
126
+      <div class="flex items-center gap-4">
127
+        <div style="width: 4px; height: 12px; background-color: #215acd"></div>
128
+        <span
129
+          class="text-lg font-bold text-gray-800"
130
+          style="font-size: 14px; font-weight: 600"
131
+        >
132
+          添加剂库存详情
133
+        </span>
134
+      </div>
135
+    </template>
136
+
137
+    <div class="task-info">
138
+      <!-- 添加剂库存表格 -->
139
+
140
+      <div class="mb-6">
141
+        <BasicTable table-title="" class="w-full" />
142
+      </div>
143
+    </div>
144
+  </ElCard>
145
+</template>
146
+
147
+<style scoped lang="scss">
148
+.task-info {
149
+  .section-title {
150
+    display: flex;
151
+    align-items: center;
152
+    gap: 8px;
153
+    margin: 20px 0 12px 0;
154
+
155
+    .section-bar {
156
+      width: 4px;
157
+      height: 12px;
158
+      background-color: #215acd;
159
+    }
160
+
161
+    .section-text {
162
+      font-size: 14px;
163
+      font-weight: 600;
164
+      color: var(--text-color-primary);
165
+    }
166
+  }
167
+
168
+  :deep(.el-descriptions) {
169
+    margin-bottom: 0 !important;
170
+  }
171
+
172
+  :deep(.el-descriptions__label) {
173
+    font-size: 14px;
174
+    font-weight: 400;
175
+    color: var(--text-color-secondary);
176
+  }
177
+
178
+  :deep(.el-descriptions__content) {
179
+    font-size: 14px;
180
+    font-weight: 500;
181
+    color: var(--text-color-primary);
182
+  }
183
+
184
+  :deep(.el-descriptions__table) {
185
+    background: transparent !important;
186
+  }
187
+}
188
+</style>

+ 192 - 0
apps/web-ele/src/views/schedule/detail/drawer/additive/config-data.tsx

@@ -0,0 +1,192 @@
1
+// @ts-ignore: 忽略
2
+import type { FormSchemaGetter } from '#/adapter/form';
3
+// @ts-ignore: 忽略
4
+import type { VxeGridProps } from '#/adapter/vxe-table';
5
+
6
+import { ElDatePicker, ElInputNumber } from 'element-plus';
7
+
8
+// 抽屉表单配置
9
+export const drawerFormSchema: any | FormSchemaGetter = () => [
10
+  {
11
+    fieldName: 'additiveInventoryTable',
12
+    label: '添加剂库存表格',
13
+    hideLabel: true,
14
+    renderComponentContent: () => {
15
+      return {
16
+        default: () => [],
17
+      };
18
+    },
19
+  },
20
+];
21
+
22
+// 默认表格列配置
23
+export const defautTableColumns: VxeGridProps['columns'] = [
24
+  {
25
+    field: 'additiveType',
26
+    title: '添加剂类型',
27
+    width: 120,
28
+    fixed: 'left',
29
+    formatter: ({ row }) => {
30
+      return row.additiveType || '-';
31
+    },
32
+  },
33
+  {
34
+    field: 'additiveModel ',
35
+    title: '添加剂型号',
36
+    width: 120,
37
+    editRender: { name: 'input' },
38
+    // formatter: ({ row }) => {
39
+    //   return row.additiveModel || '-';
40
+    // },
41
+  },
42
+  {
43
+    field: 'initialInventory',
44
+    title: '期初库存',
45
+    width: 120,
46
+    editRender: { name: 'input' },
47
+    formatter: ({ row }) => {
48
+      return row.initialInventory || '-';
49
+    },
50
+    slots: {
51
+      default: (data: any) => {
52
+        return data.row.initialInventory || '-';
53
+      },
54
+      edit: (data: any) => {
55
+        return (
56
+          <ElInputNumber
57
+            controls-position="right"
58
+            max={1_000_000}
59
+            min={0}
60
+            step={1}
61
+            v-model={data.row.initialInventory}
62
+          />
63
+        );
64
+      },
65
+    },
66
+  },
67
+  {
68
+    field: 'purchase',
69
+    title: '进货',
70
+    width: 100,
71
+    editRender: { name: 'input' },
72
+    formatter: ({ row }) => {
73
+      return row.purchase || '-';
74
+    },
75
+    slots: {
76
+      default: (data: any) => {
77
+        return data.row.purchase || '-';
78
+      },
79
+      edit: (data: any) => {
80
+        return (
81
+          <ElInputNumber
82
+            controls-position="right"
83
+            max={1_000_000}
84
+            min={0}
85
+            step={1}
86
+            v-model={data.row.purchase}
87
+          />
88
+        );
89
+      },
90
+    },
91
+  },
92
+  {
93
+    field: 'useAmount',
94
+    title: '使用',
95
+    width: 100,
96
+    editRender: { name: 'input' },
97
+    formatter: ({ row }) => {
98
+      return row.useAmount || '-';
99
+    },
100
+    slots: {
101
+      default: (data: any) => {
102
+        return data.row.useAmount || '-';
103
+      },
104
+      edit: (data: any) => {
105
+        return (
106
+          <ElInputNumber
107
+            controls-position="right"
108
+            max={1_000_000}
109
+            min={0}
110
+            step={1}
111
+            v-model={data.row.useAmount}
112
+          />
113
+        );
114
+      },
115
+    },
116
+  },
117
+  {
118
+    field: 'expectedInventory',
119
+    title: '期末应存',
120
+    width: 120,
121
+    editRender: { name: 'input' },
122
+    formatter: ({ row }) => {
123
+      return row.expectedInventory || '-';
124
+    },
125
+    slots: {
126
+      default: (data: any) => {
127
+        return data.row.expectedInventory || '-';
128
+      },
129
+      edit: (data: any) => {
130
+        return (
131
+          <ElInputNumber
132
+            controls-position="right"
133
+            max={1_000_000}
134
+            min={0}
135
+            step={1}
136
+            v-model={data.row.expectedInventory}
137
+          />
138
+        );
139
+      },
140
+    },
141
+  },
142
+  {
143
+    field: 'actualInventory',
144
+    title: '期末实存',
145
+    width: 120,
146
+    editRender: { name: 'input' },
147
+    formatter: ({ row }) => {
148
+      return row.actualInventory || '-';
149
+    },
150
+    slots: {
151
+      default: (data: any) => {
152
+        return data.row.actualInventory || '-';
153
+      },
154
+      edit: (data: any) => {
155
+        return (
156
+          <ElInputNumber
157
+            controls-position="right"
158
+            max={1_000_000}
159
+            min={0}
160
+            step={1}
161
+            v-model={data.row.actualInventory}
162
+          />
163
+        );
164
+      },
165
+    },
166
+  },
167
+  {
168
+    field: 'registerDate',
169
+    title: '登记日期',
170
+    width: 180,
171
+    editRender: {
172
+      name: 'input',
173
+    },
174
+    formatter: ({ row }) => {
175
+      return row.registerDate || '-';
176
+    },
177
+    slots: {
178
+      default: (data: any) => {
179
+        return data.row.registerDate || '-';
180
+      },
181
+      edit: (data: any) => {
182
+        return (
183
+          <ElDatePicker
184
+            format="YYYY-MM-DD"
185
+            v-model={data.row.registerDate}
186
+            valueFormat="YYYY-MM-DD"
187
+          />
188
+        );
189
+      },
190
+    },
191
+  },
192
+];

+ 136 - 0
apps/web-ele/src/views/schedule/detail/drawer/additive/index.vue

@@ -0,0 +1,136 @@
1
+<script setup lang="ts">
2
+// @ts-ignore: 忽略
3
+import type { VxeGridProps } from '#/adapter/vxe-table';
4
+
5
+import { ref } from 'vue';
6
+
7
+// @ts-ignore: 忽略
8
+import { useVbenDrawer, useVbenForm } from '@vben/common-ui';
9
+
10
+// @ts-ignore: 忽略
11
+import { useVbenVxeGrid } from '#/adapter/vxe-table';
12
+// @ts-ignore: 忽略
13
+import { handleAdditiveInventory } from '#/api/task';
14
+
15
+// @ts-ignore: 忽略
16
+import { defautTableColumns, drawerFormSchema } from './config-data.tsx';
17
+
18
+// 定义事件
19
+const emit = defineEmits<{ reload: [] }>();
20
+
21
+// 初始化表单配置
22
+const [Form, formApi] = useVbenForm({
23
+  showDefaultActions: false,
24
+  schema: drawerFormSchema(),
25
+});
26
+
27
+// 初始化任务参数
28
+const taskParams = ref({
29
+  taskId: '',
30
+  taskName: '',
31
+  taskList: '',
32
+});
33
+
34
+// 初始化抽屉组件
35
+const [Drawer, drawerApi] = useVbenDrawer({
36
+  async onOpenChange(isOpen: boolean) {
37
+    if (!isOpen) {
38
+      return;
39
+    }
40
+    try {
41
+      drawerApi.drawerLoading(true);
42
+      const { taskId, taskName, taskList } = drawerApi.getData();
43
+      taskParams.value.taskId = taskId;
44
+      taskParams.value.taskName = taskName;
45
+      taskParams.value.taskList = taskList;
46
+    } catch (error) {
47
+      console.error(error);
48
+    } finally {
49
+      drawerApi.drawerLoading(false);
50
+    }
51
+  },
52
+  onClosed() {
53
+    formApi.resetForm();
54
+  },
55
+  async onConfirm() {
56
+    try {
57
+      this.confirmLoading = true;
58
+      const { valid } = await formApi.validate();
59
+      if (!valid) {
60
+        return;
61
+      }
62
+
63
+      const list = basicTableApi.grid.getData();
64
+      const params: any = [];
65
+      list.forEach((item: any) => {
66
+        params.push({
67
+          ...item,
68
+          taskId: taskParams.value.taskId,
69
+        });
70
+      });
71
+
72
+      // 这里可以调用API提交数据
73
+      await handleAdditiveInventory(params);
74
+
75
+      emit('reload');
76
+      drawerApi.close();
77
+    } catch (error) {
78
+      console.error(error);
79
+    } finally {
80
+      this.confirmLoading = false;
81
+    }
82
+  },
83
+});
84
+
85
+// 初始化表格配置
86
+const gridOptions: VxeGridProps = {
87
+  size: 'medium',
88
+  toolbarConfig: {
89
+    custom: false,
90
+    refresh: false,
91
+    zoom: false,
92
+  },
93
+  pagerConfig: {
94
+    enabled: false,
95
+  },
96
+  proxyConfig: {
97
+    ajax: {
98
+      query: async () => {
99
+        // 这里可以调用API获取表格数据
100
+        // const list = taskParams.value.taskList;
101
+        // if (list.)
102
+        return {
103
+          items: taskParams.value.taskList, // 初始数据为空
104
+        };
105
+      },
106
+    },
107
+  },
108
+  columns: defautTableColumns,
109
+  editConfig: {
110
+    mode: 'cell',
111
+    trigger: 'click',
112
+  },
113
+};
114
+
115
+// 初始化表格组件
116
+const [BasicTable, basicTableApi] = useVbenVxeGrid({
117
+  gridOptions,
118
+});
119
+</script>
120
+
121
+<template>
122
+  <Drawer :title="taskParams.taskName">
123
+    <Form>
124
+      <!-- 添加剂库存表格插槽 -->
125
+      <template #additiveInventoryTable>
126
+        <BasicTable table-title="" class="w-full" />
127
+      </template>
128
+    </Form>
129
+  </Drawer>
130
+</template>
131
+
132
+<style scoped lang="scss">
133
+:deep(.el-input-number) {
134
+  width: 100%;
135
+}
136
+</style>

+ 2 - 0
apps/web-ele/src/views/schedule/detail/drawer/index.ts

@@ -1,5 +1,7 @@
1
+export { default as AdditiveDrawer } from './additive/index.vue';
1 2
 export { default as CompetitionDrawer } from './competition/index.vue';
2 3
 export { default as EmergencyWyDrawer } from './emergency/index.vue';
4
+
3 5
 export { default as EntranceDrawer } from './entrance/index.vue';
4 6
 
5 7
 export { default as GroupLogDrawer } from './groupLog/index.vue';

+ 19 - 0
apps/web-ele/src/views/schedule/detail/index.vue

@@ -36,6 +36,8 @@ import firstaidkitInfoPage from '#/views/oilstation/firstaidkit/index.vue';
36 36
 // @ts-ignore: 证照档案
37 37
 import idPhotoInfoPage from '#/views/oilstation/idphoto/index.vue';
38 38
 
39
+import AdditiveComponent from './components/additive.vue';
40
+// @ts-ignore
39 41
 // @ts-ignore
40 42
 import BiddingComponent from './components/bidding.vue';
41 43
 // @ts-ignore
@@ -64,6 +66,7 @@ import WeeklyEvaluationComponent from './components/weekly-evaluation.vue';
64 66
 import WeeklyComponent from './components/weekly.vue';
65 67
 import { mobileTaskTypes } from './config-data';
66 68
 import {
69
+  AdditiveDrawer,
67 70
   CompetitionDrawer,
68 71
   EmergencyWyDrawer,
69 72
   EntranceDrawer,
@@ -276,6 +279,11 @@ const DynamicDrawerComponent = defineComponent({
276 279
         Component = UploadDrawer;
277 280
       } else if (taskInfo.value.formType === 'form') {
278 281
         switch (taskInfo.value.subFormType) {
282
+          case 'additive_inventory':
283
+          case 'additive_inventory2': {
284
+            Component = AdditiveDrawer;
285
+            break;
286
+          }
279 287
           case 'competition_price_survey': {
280 288
             Component = CompetitionDrawer;
281 289
             break;
@@ -760,6 +768,17 @@ onMounted(async () => {
760 768
         />
761 769
 
762 770
         <!-- 处理信息组件 -->
771
+        <AdditiveComponent
772
+          :task-detail="taskInfo.taskList"
773
+          v-if="
774
+            taskInfo.formType === 'form' &&
775
+            ['additive_inventory', 'additive_inventory2'].includes(
776
+              taskInfo.subFormType,
777
+            )
778
+          "
779
+        />
780
+
781
+        <!-- 处理信息组件 -->
763 782
         <!-- <ElCard v-if="taskInfo.status === 3">
764 783
           <template #header>
765 784
             <div class="flex items-center gap-4">