Commit 52586d31e2b5021689b8168fbbb04a1372760937

Authored by boyang
1 parent 27fc15bb

更换第四版

src/api/project/global.ts
... ... @@ -3,27 +3,15 @@ import { defHttp } from '/@/utils/http/axios';
3 3 enum Api {
4 4 DATA = '/order/erp/index/data',
5 5 CHART_DATA = '/order/erp/index/chartData',
6   -
7   - SALES_DATA = '/order/erp/index/totalSalesStatistics', //销售额完成情况
8   - CUSTOMER_SALES = '/order/erp/index/salesStatusEveryCustomer', //每个客户销售额情况
9 6 }
10 7  
11   -export const getApiData = async (params?) => {
12   - const res = await defHttp.get<any>({ url: Api.DATA, params });
13   - return res;
14   -};
15   -
16   -export const getChartData = async (params?) => {
17   - const res = await defHttp.get<any>({ url: Api.CHART_DATA, params });
18   - return res;
19   -};
20   -
21   -export const getSalesData = async (params?) => {
22   - const res = await defHttp.get<any>({ url: Api.SALES_DATA, params });
  8 +export const getApiData = async () => {
  9 + const res = await defHttp.get<any>({ url: Api.DATA });
23 10 return res;
24 11 };
25 12  
26   -export const getCustomerSalesData = async (params?) => {
27   - const res = await defHttp.get<any>({ url: Api.CUSTOMER_SALES, params });
  13 +export const getChartData = async () => {
  14 + const res = await defHttp.get<any>({ url: Api.CHART_DATA });
  15 + console.log(res, '5656reschatdata');
28 16 return res;
29 17 };
... ...
src/store/modules/data.ts
... ... @@ -3,16 +3,9 @@ import type { UserInfo } from &#39;/#/store&#39;;
3 3 import { defineStore } from 'pinia';
4 4 import { store } from '/@/store';
5 5 import { RoleEnum } from '/@/enums/roleEnum';
6   -import { exchangeTab } from '@/store/modules/user';
7 6  
8   -import {
9   - getApiData,
10   - getChartData,
11   - getSalesData,
12   - getCustomerSalesData,
13   -} from '/@/api/project/global';
  7 +import { getApiData, getChartData } from '/@/api/project/global';
14 8 import { formatToDate } from '/@/utils/dateUtil';
15   -import { watch } from 'vue';
16 9  
17 10 interface UserState {
18 11 userInfo: Nullable<UserInfo>;
... ... @@ -29,10 +22,6 @@ export const useDataStore = defineStore({
29 22 data: {},
30 23 // token
31 24 chartData: {},
32   - //销售额完成情况
33   - salesData: {},
34   - //每个客户销售额
35   - customerChartData1: {},
36 25 }),
37 26 getters: {
38 27 getData(state) {
... ... @@ -41,12 +30,6 @@ export const useDataStore = defineStore({
41 30 getChartData(state) {
42 31 return state.chartData;
43 32 },
44   - getSalesData(state) {
45   - return state.salesData;
46   - },
47   - getCustomerChartData1(state) {
48   - return state.customerChartData1;
49   - },
50 33 },
51 34 actions: {
52 35 setData(info) {
... ... @@ -55,12 +38,6 @@ export const useDataStore = defineStore({
55 38 setChartData(data) {
56 39 this.chartData = data;
57 40 },
58   - setSalesData(info) {
59   - this.salesData = info ? info : '';
60   - },
61   - setCustomerChartData1(data) {
62   - this.customerChartData1 = data;
63   - },
64 41  
65 42 async getFetchData(): Promise<any> {
66 43 try {
... ... @@ -70,17 +47,10 @@ export const useDataStore = defineStore({
70 47 return Promise.reject(error);
71 48 }
72 49 },
73   - async getFetchData2(): Promise<any> {
74   - try {
75   - const data = await getSalesData();
76   - this.salesData = data;
77   - } catch (error) {
78   - return Promise.reject(error);
79   - }
80   - },
81 50 async getFetchChartData(): Promise<any> {
82 51 try {
83 52 const data = await getChartData();
  53 + console.log(data, '5656chartData');
84 54 const x = [],
85 55 y = [];
86 56 data.forEach((value) => {
... ... @@ -88,23 +58,7 @@ export const useDataStore = defineStore({
88 58 y.push(value.orderCount);
89 59 });
90 60 this.chartData = { x, y };
91   - } catch (error) {
92   - return Promise.reject(error);
93   - }
94   - },
95   - async getCustomerSalesData1(): Promise<any> {
96   - try {
97   - const data = await getCustomerSalesData();
98   -
99   - const x = [],
100   - y = [],
101   - z = [];
102   - for (const key in data) {
103   - x.push(key);
104   - y.push(data[key].salesAmount);
105   - z.push(data[key].target);
106   - }
107   - this.customerChartData1 = { x, y, z };
  61 + console.log(this.getChartData, '5656 this.chartData');
108 62 } catch (error) {
109 63 return Promise.reject(error);
110 64 }
... ...
src/views/dashboard/analysis/components/GrowCard.vue
1 1 <template>
2   - <div class="md:flex" v-if="exchangeTab === 'tab1'">
  2 + <div class="md:flex">
3 3 <template v-for="(item, index) in growCardList" :key="item.title">
4 4 <Card
5 5 size="small"
... ... @@ -24,21 +24,6 @@
24 24 </Card>
25 25 </template>
26 26 </div>
27   - <div class="md:flex" v-if="exchangeTab === 'tab2'">
28   - <template v-for="(item, index) in growCardList2" :key="item.title">
29   - <Card
30   - size="small"
31   - :loading="loading"
32   - :title="item.title"
33   - class="md:w-1/4 w-full !md:mt-0"
34   - :class="{ '!md:mr-4': index + 1 < 5, '!mt-4': index > 0 }"
35   - >
36   - <div class="py-4 px-4 flex justify-between items-center" style="font-size: 20px">
37   - {{ item.value }}
38   - </div>
39   - </Card>
40   - </template>
41   - </div>
42 27 </template>
43 28 <script lang="ts" setup>
44 29 import { CountTo } from '/@/components/CountTo/index';
... ... @@ -46,40 +31,17 @@
46 31 import { Tag, Card } from 'ant-design-vue';
47 32 import { growCardList } from '../data';
48 33 import { useDataStoreWithOut } from '/@/store/modules/data';
49   - import { computed, onMounted, ref, watch, watchEffect } from 'vue';
50   - import {
51   - exchangeTab,
52   - businessPersonIn,
53   - customerCodeIn,
54   - dateTime,
55   - period,
56   - } from '/@/store/modules/user';
57   - import { number } from 'vue-types';
58   - import { getSalesData, getApiData } from '/@/api/project/global';
59   - import { useOrderStoreWithOut } from '/@/store/modules/order';
  34 + import { computed } from 'vue';
60 35  
61 36 const dataStore = useDataStoreWithOut();
62   - const data1 = ref();
63   - watch(
64   - [dateTime, period],
65   - async ([newDateTime, newPeriod], [oldBusinessPersonIn, oldCustomerCodeIn]) => {
66   - console.log('businessPersonIn changed from', oldBusinessPersonIn, 'to', newDateTime);
67   - console.log('customerCodeIn changed from', oldCustomerCodeIn, 'to', newPeriod);
68 37  
69   - // 在这里添加你希望在这两个值改变时执行的逻辑
70   - data1.value = await getApiData({
71   - dateTime: newDateTime,
72   - period: newPeriod,
73   - });
74   - },
75   - );
76 38 const growCardList = computed(() => {
77 39 const data = dataStore.getData;
78 40 return [
79 41 {
80 42 title: '订单完成',
81 43 icon: 'visit-count|svg',
82   - value: data1.value?.allCount || 0,
  44 + value: data?.orderFinishedCount || 0,
83 45 total: 120000,
84 46 color: 'green',
85 47 action: '月',
... ... @@ -87,7 +49,7 @@
87 49 {
88 50 title: '跟单和质检中',
89 51 icon: 'total-sales|svg',
90   - value: data1.value?.trackingAndInspectingList || 0,
  52 + value: data?.orderInspectingCount || 0,
91 53 total: 500000,
92 54 color: 'blue',
93 55 action: '月',
... ... @@ -95,7 +57,7 @@
95 57 {
96 58 title: '利润分析表待审核',
97 59 icon: 'download-count|svg',
98   - value: data1.value?.profitList || 0,
  60 + value: data?.orderProfitWaitAuditCount || 0,
99 61 total: 120000,
100 62 color: 'orange',
101 63 action: '周',
... ... @@ -103,7 +65,7 @@
103 65 {
104 66 title: '项目报告书待审核',
105 67 icon: 'transaction|svg',
106   - value: data1.value?.reportList || 0,
  68 + value: data?.orderReportWaitAuditCount || 0,
107 69 total: 50000,
108 70 color: 'purple',
109 71 action: '年',
... ... @@ -111,94 +73,17 @@
111 73 {
112 74 title: '订单初始化',
113 75 icon: 'transaction|svg',
114   - value: data1.value?.orderInitList || 0,
  76 + value: data?.orderCount || 0,
115 77 total: 50000,
116 78 color: 'purple',
117 79 action: '年',
118 80 },
119 81 ];
120 82 });
121   - const data2 = ref();
122   - // watchEffect(async () => {
123   - // data2.value = await getSalesData({
124   - // businessPersonIn: businessPersonIn,
125   - // customerCodeIn: customerCodeIn,
126   - // });
127   - // });
128   - onMounted(async () => {
129   - data1.value = await getApiData({
130   - dateTime: dateTime.value,
131   - period: period.value,
132   - });
133   - data2.value = await getSalesData({
134   - businessPersonIn: businessPersonIn.value,
135   - customerCodeIn: customerCodeIn.value,
136   - });
137   - });
138   - watch(
139   - [businessPersonIn, customerCodeIn],
140   - async ([newDateTime, newPeriod], [oldBusinessPersonIn, oldCustomerCodeIn]) => {
141   - console.log('businessPersonIn changed from', oldBusinessPersonIn, 'to', newDateTime);
142   - console.log('customerCodeIn changed from', oldCustomerCodeIn, 'to', newPeriod);
143   -
144   - // 在这里添加你希望在这两个值改变时执行的逻辑
145   - data2.value = await getSalesData({
146   - businessPersonIn: newDateTime,
147   - customerCodeIn: newPeriod,
148   - });
149   - },
150   - );
151   - const growCardList2 = computed(() => {
152   - return [
153   - {
154   - title: '总销售额',
155   - icon: 'visit-count|svg',
156   - value: data2.value?.yearlySalesAmountTarget || 0,
157   - total: 120000,
158   - color: 'green',
159   - action: '年',
160   - },
161   - {
162   - title: '总销售额完成率',
163   - icon: 'visit-count|svg',
164   - value: data2.value?.yearlySalesAmountCompletionRate || 0,
165   - total: 120000,
166   - color: 'green',
167   - action: '年',
168   - },
169   - {
170   - title: '每月销售额目标',
171   - icon: 'visit-count|svg',
172   - value: data2.value?.monthlySalesAmountTarget || 0,
173   - total: 120000,
174   - color: 'green',
175   - action: '月',
176   - },
177   - {
178   - title: '当月销售额完成率',
179   - icon: 'visit-count|svg',
180   - value: data2.value?.monthlySalesAmountCompletionRate || 0,
181   - total: 120000,
182   - color: 'green',
183   - action: '月',
184   - },
185   - {
186   - title: '今日销售额',
187   - icon: 'visit-count|svg',
188   - value: data2.value?.daylySalesAmount || 0,
189   - total: 120000,
190   - color: 'green',
191   - action: '日',
192   - },
193   - ];
194   - });
195 83  
196 84 defineProps({
197 85 loading: {
198 86 type: Boolean,
199 87 },
200   - exchangeTab: {
201   - type: String,
202   - },
203 88 });
204 89 </script>
... ...
src/views/dashboard/analysis/components/SiteAnalysis.vue
... ... @@ -9,7 +9,7 @@
9 9 <VisitAnalysis />
10 10 </p>
11 11 <p v-if="activeKey === 'tab2'">
12   - <VisitAnalysisBar style="margin-top: 100px" />
  12 + <VisitAnalysisBar />
13 13 </p>
14 14 </Card>
15 15 </template>
... ... @@ -18,8 +18,6 @@
18 18 import { Card } from 'ant-design-vue';
19 19 import VisitAnalysis from './VisitAnalysis.vue';
20 20 import VisitAnalysisBar from './VisitAnalysisBar.vue';
21   - import { exchangeTab } from '@/store/modules/user';
22   - import type { SelectProps } from 'ant-design-vue';
23 21  
24 22 const activeKey = ref('tab1');
25 23  
... ... @@ -28,40 +26,13 @@
28 26 key: 'tab1',
29 27 tab: '订单趋势',
30 28 },
31   - {
32   - key: 'tab2',
33   - tab: '销售额完成率',
34   - },
  29 + // {
  30 + // key: 'tab2',
  31 + // tab: '访问量',
  32 + // },
35 33 ];
36 34  
37 35 function onTabChange(key) {
38 36 activeKey.value = key;
39   - exchangeTab.value = key;
40 37 }
41 38 </script>
42   -<style scoped>
43   - .custom-radio-group .ant-radio-button-wrapper {
44   - background-color: white; /* 未选中按钮的背景颜色为白色 */
45   - color: #1684fc; /* 未选中按钮的文字颜色为 #1684fc */
46   - border-color: #1684fc; /* 未选中按钮的边框颜色 */
47   - }
48   -
49   - .custom-radio-group .ant-radio-button-wrapper-checked {
50   - background-color: #1684fc; /* 选中按钮的背景颜色为 #1684fc */
51   - color: white; /* 选中按钮的文字颜色为白色 */
52   - border-color: #1684fc; /* 选中按钮的边框颜色 */
53   - }
54   -
55   - .custom-radio-group .ant-radio-button-wrapper-checked:hover {
56   - background-color: #1684fc; /* 悬停在选中按钮时保持相同的背景颜色 */
57   - color: white; /* 悬停在选中按钮时保持文字为白色 */
58   - }
59   -
60   - .custom-radio-group .ant-radio-button-wrapper:hover {
61   - border-color: #1684fc; /* 悬停在未选中按钮时的边框颜色 */
62   - }
63   -
64   - .custom-radio-group .ant-radio-button-wrapper:not(.ant-radio-button-wrapper-checked):hover {
65   - color: #1684fc; /* 悬停在未选中按钮时文字颜色为 #1684fc */
66   - }
67   -</style>
... ...
src/views/dashboard/analysis/components/VisitAnalysis.vue
1 1 <template>
2   - <span style="margin-left: 50px; font-size: 18px">选择年份:</span>
3   - <a-select
4   - v-model:value="yearValue"
5   - show-search
6   - placeholder="请选择"
7   - style="width: 200px"
8   - :options="yearOptions"
9   - :filter-option="filterOption"
10   - @change="handleChangeYear"
11   - />
12   - <div style="position: fixed; top: 80px; right: 70px">
13   - <a-radio-group
14   - v-model:value="periodCopy"
15   - class="custom-radio-group"
16   - :style="{ marginLeft: '100px' }"
17   - >
18   - <a-radio-button value="月" @click="handlePeriodChange('月')">月</a-radio-button>
19   - <a-radio-button value="年" @click="handlePeriodChange('年')">年</a-radio-button>
20   - </a-radio-group>
21   - </div>
22 2 <div ref="chartRef" :style="{ height: '500px', width }"></div>
23 3 </template>
24 4  
... ... @@ -28,71 +8,15 @@
28 8 import { basicProps } from './props';
29 9 import { max } from 'lodash-es';
30 10 import { useDataStoreWithOut } from '/@/store/modules/data';
31   - import { getChartData } from '/@/api/project/global';
32   - import { dateTime, period } from '/@/store/modules/user';
33   - import { useMessage } from '/@/hooks/web/useMessage';
34 11  
35 12 defineProps({
36 13 ...basicProps,
37 14 });
38   - const yearValue = ref();
39   - const yearOptions = [
40   - // {
41   - // label: '2025',
42   - // value: 2025,
43   - // },
44   - {
45   - label: '2024',
46   - value: 2024,
47   - },
48   - {
49   - label: '2023',
50   - value: 2023,
51   - },
52   - ];
53   - const periodCopy = ref();
54   - const { createMessage } = useMessage(); //错误提示组件
55   - const { error } = createMessage;
56 15 const chartRef = ref<HTMLDivElement | null>(null);
57 16 const { setOptions } = useECharts(chartRef as Ref<HTMLDivElement>);
58   - const filterOption = (input: string, option: any) => {
59   - return option.value.toLowerCase().indexOf(input.toLowerCase()) >= 0;
60   - };
61   - function handlePeriodChange(value) {
62   - //没选年份报错
63   - if (value == '月') {
64   - if (dateTime.value == undefined) {
65   - error('请选择年份');
66   - return;
67   - }
68   - } else if (value == '年') {
69   - yearValue.value = null;
70   - }
71   - period.value = value;
72   - }
73   - function handleChangeYear(value) {
74   - if (period.value == null) {
75   - period.value = '月';
76   - periodCopy.value = '月';
77   - }
78   - yearValue.value = value;
79   - dateTime.value = yearValue.value;
80   - }
81 17 const dataStore = useDataStoreWithOut();
82   - //监控选择器变化
83   - watchEffect(async () => {
84   - // const data = dataStore?.getChartData || {};
85   - const chartData = await getChartData({
86   - dateTime: dateTime.value,
87   - period: period.value,
88   - });
89   - const x = [],
90   - y = [];
91   - for (const key in chartData) {
92   - x.push(chartData[key].date);
93   - y.push(chartData[key].count);
94   - }
95   - const data = { x, y };
  18 + watchEffect(() => {
  19 + const data = dataStore?.getChartData || {};
96 20 const maxY = data?.y ? max(data?.y) : 0;
97 21 setOptions({
98 22 tooltip: {
... ... @@ -106,6 +30,7 @@
106 30 },
107 31 xAxis: {
108 32 type: 'category',
  33 + boundaryGap: false,
109 34 data: data?.x,
110 35 splitLine: {
111 36 show: true,
... ... @@ -162,29 +87,3 @@
162 87 });
163 88 });
164 89 </script>
165   -<style scoped>
166   - .custom-radio-group .ant-radio-button-wrapper {
167   - border-color: #1684fc; /* 未选中按钮的边框颜色 */
168   - background-color: white; /* 未选中按钮的背景颜色为白色 */
169   - color: #1684fc; /* 未选中按钮的文字颜色为 #1684fc */
170   - }
171   -
172   - .custom-radio-group .ant-radio-button-wrapper-checked {
173   - border-color: #1684fc; /* 选中按钮的边框颜色 */
174   - background-color: #1684fc; /* 选中按钮的背景颜色为 #1684fc */
175   - color: white; /* 选中按钮的文字颜色为白色 */
176   - }
177   -
178   - .custom-radio-group .ant-radio-button-wrapper-checked:hover {
179   - background-color: #1684fc; /* 悬停在选中按钮时保持相同的背景颜色 */
180   - color: white; /* 悬停在选中按钮时保持文字为白色 */
181   - }
182   -
183   - .custom-radio-group .ant-radio-button-wrapper:hover {
184   - border-color: #1684fc; /* 悬停在未选中按钮时的边框颜色 */
185   - }
186   -
187   - .custom-radio-group .ant-radio-button-wrapper:not(.ant-radio-button-wrapper-checked):hover {
188   - color: #1684fc; /* 悬停在未选中按钮时文字颜色为 #1684fc */
189   - }
190   -</style>
... ...
src/views/dashboard/analysis/components/VisitAnalysisBar.vue
1 1 <template>
2   - <div style="margin-bottom: 30px">
3   - <span v-if="role === ROLE.ADMIN">
4   - <span style="font-size: 18px; margin-right: 10px">业务员</span>
5   - <a-select
6   - v-model:value="value1"
7   - show-search
8   - placeholder="请选择"
9   - style="width: 200px"
10   - :options="customerCodeOptions"
11   - :filter-option="filterOption"
12   - @focus="handleFocus"
13   - @blur="handleBlur"
14   - @change="handleChangeBusiness"
15   - />
16   - <span style="font-size: 18px; margin-left: 50px; margin-right: 10px">客户编码</span>
17   - <a-select
18   - v-model:value="value2"
19   - show-search
20   - placeholder="请选择"
21   - style="width: 200px"
22   - :options="businessPersonOptions"
23   - :filter-option="filterOption"
24   - @focus="handleFocus"
25   - @blur="handleBlur"
26   - @change="handleChangeCustomer"
27   - />
28   - <span style="right: 10px"
29   - ><a-button
30   - type="default"
31   - @click="clearData"
32   - :style="{ marginLeft: '100px', borderRadius: '5px 5px 5px 5px' }"
33   - >
34   - 重置
35   - </a-button>
36   - <a-button
37   - :style="{ marginLeft: '20px', borderRadius: '5px 5px 5px 5px' }"
38   - shape="default"
39   - type="primary"
40   - @click="updateData"
41   - >查询</a-button
42   - ></span
43   - ></span
44   - >
45   - <div style="position: fixed; top: 80px; right: 70px">
46   - <a-radio-group
47   - v-model:value="periodChange"
48   - class="custom-radio-group"
49   - :style="{ marginLeft: '100px' }"
50   - >
51   - <a-radio-button value="MONTH" @click="handlePeriodChange('MONTH')">月</a-radio-button>
52   - <a-radio-button value="QUARTER" @click="handlePeriodChange('QUARTER')">季度</a-radio-button>
53   - <a-radio-button value="YEAR" @click="handlePeriodChange('YEAR')">年</a-radio-button>
54   - </a-radio-group>
55   - </div></div
56   - >
57   - <div v-if="role !== ROLE.ADMIN" style="margin-bottom: 60px"></div>
58   - <div ref="chartRef" :style="{ height: '400px', width }"></div>
  2 + <div ref="chartRef" :style="{ height, width }"></div>
59 3 </template>
60 4 <script lang="ts">
61 5 import { basicProps } from './props';
62 6 </script>
63 7 <script lang="ts" setup>
64   - import { computed, onMounted, ref, Ref, watchEffect } from 'vue';
  8 + import { onMounted, ref, Ref } from 'vue';
65 9 import { useECharts } from '/@/hooks/web/useECharts';
66   - import { useDataStoreWithOut } from '/@/store/modules/data';
67   - import { businessPersonIn, customerCodeIn, useUserStoreWithOut } from '@/store/modules/user';
68   -
69   - //biaoji
70   - import type { SelectProps } from 'ant-design-vue';
71   - import { getCustomerSalesData } from '/@/api/project/global';
72   - import { useOrderStoreWithOut } from '/@/store/modules/order';
73   - import { useOrderInfo } from '/@/hooks/component/order';
74   - import { ROLE } from '/@/views/project/order/type.d';
75   -
76   - const userStore = useUserStoreWithOut();
77   - const user = userStore.getUserInfo;
78   - const role = computed(() => {
79   - return user?.roleSmallVO?.code;
80   - });
81   - const orderStore = useOrderStoreWithOut();
82   - onMounted(async () => {
83   - await orderStore.getDict();
84   - });
85   - const { customerCode: customerCodeOptions, businessPerson: businessPersonOptions } =
86   - useOrderInfo(orderStore);
87   -
88   - const periodChange = ref('MONTH');
89   - // const businessPersonInChange = ref();
90   - const businessPersonInChange: string[] = [];
91   - const customerCodeInChange: string[] = [];
92   - const handleChangeBusiness = (value: string) => {
93   - if (businessPersonInChange.length === 0) {
94   - // 如果数组为空,直接将 value 值放入数组
95   - businessPersonInChange.push(value);
96   - } else {
97   - // 如果数组不为空,清空数组再将 value 值放入数组
98   - businessPersonInChange.length = 0; // 也可以使用 array.splice(0, array.length);
99   - businessPersonInChange.push(value);
100   - }
101   - // console.log(`5656selected ${businessPersonInChange}`);
102   - };
103   - const handleChangeCustomer = (value: string) => {
104   - if (customerCodeInChange.length === 0) {
105   - // 如果数组为空,直接将 value 值放入数组
106   - customerCodeInChange.push(value);
107   - } else {
108   - // 如果数组不为空,清空数组再将 value 值放入数组
109   - customerCodeInChange.length = 0; // 也可以使用 array.splice(0, array.length);
110   - customerCodeInChange.push(value);
111   - }
112   - // console.log(`5656selected ${customerCodeInChange}`);
113   - };
114   - const handleBlur = () => {};
115   - const handleFocus = () => {};
116   - const filterOption = (input: string, option: any) => {
117   - return option.value.toLowerCase().indexOf(input.toLowerCase()) >= 0;
118   - };
119   -
120   - const value1 = ref();
121   - const value2 = ref();
122   -
123   - function handlePeriodChange(value) {
124   - periodChange.value = value;
125   - }
126   - //biaoji
127 10  
128 11 defineProps({
129 12 ...basicProps,
130 13 });
131   - const dataStore = useDataStoreWithOut();
132 14  
133 15 const chartRef = ref<HTMLDivElement | null>(null);
134 16 const { setOptions } = useECharts(chartRef as Ref<HTMLDivElement>);
135   -
136   - function updateData() {
137   - customerCodeIn.value = value1.value;
138   - businessPersonIn.value = value2.value;
139   - }
140   - function clearData() {
141   - customerCodeIn.value = null;
142   - businessPersonIn.value = null;
143   - value1.value = null;
144   - value2.value = null;
145   - }
146   -
147   - watchEffect(async () => {
148   - // const data1 = dataStore?.getCustomerChartData1 || {};
149   - const data2 = await getCustomerSalesData({
150   - businessPersonIn: businessPersonIn.value,
151   - customerCodeIn: customerCodeIn.value,
152   - period: periodChange.value,
153   - });
154   - const x = [],
155   - y = [],
156   - z = [];
157   - for (const key in data2) {
158   - x.push(key);
159   - y.push(data2[key].salesAmount);
160   - z.push(data2[key].target);
161   - }
162   - const customerChartData1 = { x, y, z };
  17 + onMounted(() => {
163 18 setOptions({
164 19 tooltip: {
165 20 trigger: 'axis',
... ... @@ -170,65 +25,23 @@
170 25 },
171 26 },
172 27 },
173   - legend: {
174   - data: ['销售额', '销售目标'],
175   - },
176   - grid: { left: '1%', right: '1%', top: '10 %', bottom: 0, containLabel: true },
  28 + grid: { left: '1%', right: '1%', top: '2 %', bottom: 0, containLabel: true },
177 29 xAxis: {
178 30 type: 'category',
179   - data: customerChartData1?.x,
  31 + data: [...new Array(12)].map((_item, index) => `${index + 1}月`),
180 32 },
181 33 yAxis: {
182 34 type: 'value',
183   - // // max: 8000,
184   - // splitNumber: 4,
  35 + max: 8000,
  36 + splitNumber: 4,
185 37 },
186 38 series: [
187 39 {
188   - name: '销售额',
189   - data: customerChartData1?.y,
  40 + data: [3000, 2000, 3333, 5000, 3200, 4200, 3200, 2100, 3000, 5100, 6000, 3200, 4800],
190 41 type: 'bar',
191 42 barMaxWidth: 80,
192 43 },
193   - {
194   - name: '销售目标',
195   - smooth: true,
196   - data: customerChartData1?.z,
197   - type: 'line',
198   - areaStyle: {
199   - color: 'rgba(255, 255, 255, 0)',
200   - },
201   - itemStyle: {
202   - color: 'rgba(124, 205, 214)',
203   - },
204   - },
205 44 ],
206 45 });
207 46 });
208 47 </script>
209   -<style scoped>
210   - .custom-radio-group .ant-radio-button-wrapper {
211   - background-color: white; /* 未选中按钮的背景颜色为白色 */
212   - color: #1684fc; /* 未选中按钮的文字颜色为 #1684fc */
213   - border-color: #1684fc; /* 未选中按钮的边框颜色 */
214   - }
215   -
216   - .custom-radio-group .ant-radio-button-wrapper-checked {
217   - background-color: #1684fc; /* 选中按钮的背景颜色为 #1684fc */
218   - color: white; /* 选中按钮的文字颜色为白色 */
219   - border-color: #1684fc; /* 选中按钮的边框颜色 */
220   - }
221   -
222   - .custom-radio-group .ant-radio-button-wrapper-checked:hover {
223   - background-color: #1684fc; /* 悬停在选中按钮时保持相同的背景颜色 */
224   - color: white; /* 悬停在选中按钮时保持文字为白色 */
225   - }
226   -
227   - .custom-radio-group .ant-radio-button-wrapper:hover {
228   - border-color: #1684fc; /* 悬停在未选中按钮时的边框颜色 */
229   - }
230   -
231   - .custom-radio-group .ant-radio-button-wrapper:not(.ant-radio-button-wrapper-checked):hover {
232   - color: #1684fc; /* 悬停在未选中按钮时文字颜色为 #1684fc */
233   - }
234   -</style>
... ...
src/views/dashboard/analysis/data.ts
... ... @@ -49,54 +49,3 @@ export const growCardList: GrowCardItem[] = [
49 49 action: '年',
50 50 },
51 51 ];
52   -
53   -export const growCardList2: GrowCardItem[] = [
54   - {
55   - title: '总销售额',
56   - icon: 'visit-count|svg',
57   - value: 2000,
58   - total: 120000,
59   - color: 'green',
60   - action: '年',
61   - },
62   - {
63   - title: '总销售额完成率',
64   - icon: 'visit-count|svg',
65   - value: 2000,
66   - total: 120000,
67   - color: 'green',
68   - action: '年',
69   - },
70   - {
71   - title: '每月销售额目标',
72   - icon: 'visit-count|svg',
73   - value: 2000,
74   - total: 120000,
75   - color: 'green',
76   - action: '月',
77   - },
78   - {
79   - title: '当月销售额完成率',
80   - icon: 'visit-count|svg',
81   - value: 2000,
82   - total: 120000,
83   - color: 'green',
84   - action: '月',
85   - },
86   - {
87   - title: '当月销售额完成率',
88   - icon: 'visit-count|svg',
89   - value: 2000,
90   - total: 120000,
91   - color: 'green',
92   - action: '日',
93   - },
94   - {
95   - title: '今日销售额',
96   - icon: 'visit-count|svg',
97   - value: 2000,
98   - total: 120000,
99   - color: 'green',
100   - action: '日',
101   - },
102   -];
... ...
src/views/dashboard/analysis/index.vue
1 1 <template>
2 2 <div class="p-4">
3   - <GrowCard :loading="loading" class="enter-y" :exchangeTab="exchangeTab" />
  3 + <GrowCard :loading="loading" class="enter-y" />
4 4 <SiteAnalysis class="!my-4 enter-y" :loading="loading" />
5 5 <!-- <div class="md:flex enter-y">
6 6 <VisitRadar class="md:w-1/3 w-full" :loading="loading" />
... ... @@ -10,24 +10,17 @@
10 10 </div>
11 11 </template>
12 12 <script lang="ts" setup>
13   - import { onMounted, ref, watch } from 'vue';
  13 + import { onMounted, ref } from 'vue';
14 14 import GrowCard from './components/GrowCard.vue';
15 15 import SiteAnalysis from './components/SiteAnalysis.vue';
16 16 import { useDataStoreWithOut } from '/@/store/modules/data';
17   - import { exchangeTab } from '@/store/modules/user';
18 17  
19 18 const loading = ref(true);
20 19 const dataStore = useDataStoreWithOut();
21   - watch(
22   - () => exchangeTab.value,
23   - () => {},
24   - );
  20 +
25 21 onMounted(() => {
26 22 dataStore.getFetchData();
27   - dataStore.getFetchData2();
28 23 dataStore.getFetchChartData();
29   - dataStore.getCustomerSalesData1();
30   - exchangeTab.value;
31 24 });
32 25  
33 26 setTimeout(() => {
... ...
src/views/project/approve/PayPanel.vue
... ... @@ -113,7 +113,10 @@
113 113 </a-list> -->
114 114 <template #appendFooter>
115 115 <a-button
116   - v-if="(!isApproved && role === ROLE.ADMIN) || (!isApproved && showInvoice)"
  116 + v-if="
  117 + ((!isApproved && role === ROLE.ADMIN) || (!isApproved && showInvoice)) &&
  118 + (role !== ROLE.BUSINESS || role !== ROLE.TRACKER)
  119 + "
117 120 @click="handleFalse"
118 121 >
119 122 不通过</a-button
... ...
src/views/project/config/index.vue
... ... @@ -24,9 +24,9 @@
24 24 <Tabs.TabPane key="6" tab="提成成本配置">
25 25 <TablePanel :searchInfo="{ relationCode: 'costSettingItem' }" :column="6" />
26 26 </Tabs.TabPane>
27   - <Tabs.TabPane key="7" tab="销售额配置" v-if="role !== ROLE.FINANCE">
  27 + <!-- <Tabs.TabPane key="7" tab="销售额配置" v-if="role !== ROLE.FINANCE">
28 28 <TablePanel :searchInfo="{ relationCode: 'salesAmount' }" :column="7" />
29   - </Tabs.TabPane>
  29 + </Tabs.TabPane> -->
30 30 <Tabs.TabPane key="8" tab="生产科应付日期">
31 31 <TablePanel :searchInfo="{ relationCode: 'produHodTime' }" :column="8" />
32 32 </Tabs.TabPane>
... ...