Commit 16f449811fcb69a9a0a2a3c84ca1dcdab2e5bde5

Authored by sanmu
1 parent c04647c3

feat: finish

Showing 32 changed files with 1357 additions and 1204 deletions
src/api/demo/table.ts
1 1 import { defHttp } from '/@/utils/http/axios';
2 2 import { DemoParams, DemoListGetResultModel } from './model/tableModel';
3 3 import { find } from 'lodash-es';
4   -import { FIELDS_BASE_INFO } from '/@/views/project/order/tableData';
  4 +import { FIELDS_BASE_INFO } from '../../views/project/order/constant';
5 5  
6 6 enum Api {
7 7 DEMO_LIST = '/table/getDemoList',
... ...
src/api/project/approve.ts
... ... @@ -4,7 +4,7 @@ import {
4 4 FIELDS_BASE_INFO,
5 5 FIELDS_PROFIT_INFO,
6 6 FIELDS_REPORT_INFO,
7   -} from '/@/views/project/order/tableData';
  7 +} from '../../views/project/order/constant';
8 8  
9 9 enum Api {
10 10 APPROVE = '/order/erp/audit/wait_audit_list',
... ...
src/api/project/order.ts
... ... @@ -19,6 +19,9 @@ enum Api {
19 19 DICT_LIST = '/order/erp/dictionary/list_by_page',
20 20  
21 21 ANALYSIS = '/order/erp/profit/analysis',
  22 +
  23 + OPT_LOG = '/order/erp/opt/log/list_by_page', // 操作日志
  24 + AUDIT_LOG = '/order/erp/audit/log/list_by_page', //审批日志
22 25 }
23 26  
24 27 export const orderCreate = async (data: any) => {
... ... @@ -26,6 +29,14 @@ export const orderCreate = async (data: any) => {
26 29 return res;
27 30 };
28 31  
  32 +export const getOrderOptLog = async (data: any) => {
  33 + return defHttp.post<any>({ url: Api.OPT_LOG, data });
  34 +};
  35 +
  36 +export const getOrderAuditLog = async (data: any) => {
  37 + return defHttp.post<any>({ url: Api.AUDIT_LOG, data });
  38 +};
  39 +
29 40 export const orderUpdate = async (data: any) => {
30 41 const res = await defHttp.post<any>({ url: Api.UPDATE, data }, { message: '操作成功' });
31 42 return res;
... ...
src/components/FieldUpload/src/FieldUpload.vue
1 1 <template>
  2 + <img :src="imgUrl" v-if="disableImg" width="100" height="100" />
2 3 <Upload
  4 + v-else
3 5 v-model:file-list="fileList"
4 6 name="file"
5 7 list-type="picture-card"
... ... @@ -18,7 +20,7 @@
18 20 </Upload>
19 21 </template>
20 22 <script lang="ts" setup>
21   - import { defineProps, ref } from 'vue';
  23 + import { defineProps, ref, watch } from 'vue';
22 24  
23 25 import { Upload, message } from 'ant-design-vue';
24 26 import { PlusOutlined, LoadingOutlined } from '@ant-design/icons-vue';
... ... @@ -26,8 +28,15 @@
26 28  
27 29 const props = defineProps({
28 30 imgUrl: String, // 期望 'value' 是一个字符串。根据您的需求调整类型。
  31 + disabled: Boolean,
29 32 });
30   - console.log('%c [ props ]-29', 'font-size:13px; background:pink; color:#bf2c9f;', props);
  33 + const disableImg = ref(false);
  34 + watch(
  35 + () => props.disabled,
  36 + (newValue) => {
  37 + disableImg.value = newValue;
  38 + },
  39 + );
31 40  
32 41 function getBase64(img: Blob, callback: (base64Url: string) => void) {
33 42 const reader = new FileReader();
... ... @@ -41,7 +50,6 @@
41 50  
42 51 const fileList = ref([]);
43 52 const loading = ref<boolean>(false);
44   - const imageUrl = ref<string>('');
45 53  
46 54 const handleChange = (info: UploadChangeParam) => {
47 55 // if (info.file.status === 'uploading') {
... ...
src/components/Table/src/components/settings/ColumnSetting.vue
... ... @@ -24,13 +24,14 @@
24 24 {{ t('component.table.settingIndexColumnShow') }}
25 25 </Checkbox> -->
26 26  
27   - <Checkbox
  27 + <!-- <Checkbox
28 28 v-model:checked="checkSelect"
29 29 @change="handleSelectCheckChange"
30 30 :disabled="!defaultRowSelection"
31 31 >
32 32 {{ t('component.table.settingSelectColumnShow') }}
33   - </Checkbox>
  33 + </Checkbox> -->
  34 + <span></span>
34 35  
35 36 <a-button size="small" type="link" @click="reset">
36 37 {{ t('common.resetText') }}
... ... @@ -109,6 +110,7 @@
109 110 nextTick,
110 111 unref,
111 112 computed,
  113 + onMounted,
112 114 } from 'vue';
113 115 import { Tooltip, Popover, Checkbox, Divider } from 'ant-design-vue';
114 116 import type { CheckboxChangeEvent } from 'ant-design-vue/lib/checkbox/interface';
... ... @@ -124,6 +126,9 @@
124 126 import { cloneDeep, omit } from 'lodash-es';
125 127 import Sortablejs from 'sortablejs';
126 128 import type Sortable from 'sortablejs';
  129 + import { getAuthCache, setAuthCache } from '/@/utils/auth';
  130 +
  131 + import { ORDER_COLUMN } from '/@/enums/cacheEnum';
127 132  
128 133 interface State {
129 134 checkAll: boolean;
... ... @@ -133,6 +138,7 @@
133 138 }
134 139  
135 140 interface Options {
  141 + children: any;
136 142 label: string;
137 143 value: string;
138 144 fixed?: boolean | 'left' | 'right';
... ... @@ -188,17 +194,37 @@
188 194 return unref(table?.getBindValues) || {};
189 195 });
190 196  
  197 + onMounted(() => {
  198 + init();
  199 + });
  200 +
191 201 watchEffect(() => {
192 202 const columns = table.getColumns();
193   - setTimeout(() => {
  203 +
  204 + setTimeout(async () => {
194 205 if (isSetColumnsFromThis) {
195 206 isSetColumnsFromThis = false;
196 207 } else if (columns.length) {
197   - init();
  208 + updateColumns();
  209 +
  210 + // setTimeout(() => {
  211 + // const cacheColumns = getAuthCache(ORDER_COLUMN);
  212 + // setColumns(cacheColumns);
  213 + // }, 1000);
198 214 }
199 215 }, 0);
200 216 });
201 217  
  218 + // onMounted(() => {
  219 + // const cacheColumns = getAuthCache(ORDER_COLUMN);
  220 + // console.log(
  221 + // '%c [ cacheColumns ]-210',
  222 + // 'font-size:13px; background:pink; color:#bf2c9f;',
  223 + // cacheColumns,
  224 + // );
  225 + // setColumns(cacheColumns);
  226 + // });
  227 +
202 228 watchEffect(() => {
203 229 const values = unref(getValues);
204 230 if (isSetPropsFromThis) {
... ... @@ -222,17 +248,64 @@
222 248 return ret;
223 249 }
224 250  
225   - async function init(isReset = false) {
  251 + async function init() {
  252 + plainOptions.value = [];
  253 +
  254 + // 获取所有列并设置 plainOptions
  255 + const allColumns = getColumns();
  256 + table.setCacheColumns?.(allColumns);
  257 +
  258 + plainSortOptions.value = allColumns;
  259 + plainOptions.value = allColumns
  260 + .map((item) => {
  261 + if (item.children) {
  262 + return item.children.map((item) => ({
  263 + ...item,
  264 + label: item.title,
  265 + value: item.dataIndex || item.title,
  266 + }));
  267 + }
  268 + return item;
  269 + })
  270 + .flat();
  271 +
  272 + // 从缓存中获取选中的列
  273 + const cacheColumns =
  274 + getAuthCache(ORDER_COLUMN) ||
  275 + (allColumns
  276 + .map((item) => {
  277 + if (item.children) {
  278 + return item.children.map((item) => {
  279 + if (item.defaultHidden) {
  280 + return '';
  281 + }
  282 + return item.dataIndex || item.title;
  283 + });
  284 + } else {
  285 + if (item.defaultHidden) {
  286 + return '';
  287 + }
  288 + return item.dataIndex || item.title;
  289 + }
  290 + })
  291 + .flat()
  292 + .filter(Boolean) as string[]);
  293 +
  294 + state.checkedList = cacheColumns;
  295 + setColumns(cacheColumns);
  296 + }
  297 +
  298 + async function updateColumns(isReset = false) {
226 299 // Sortablejs存在bug,不知道在哪个步骤中会向el append了一个childNode,因此这里先清空childNode
227 300 // 有可能复现上述问题的操作:拖拽一个元素,快速的上下移动,最后放到最后的位置中松手
228   - plainOptions.value = [];
229   - const columnListEl = unref(columnListRef);
230   - if (columnListEl && (columnListEl as any).$el) {
231   - const el = (columnListEl as any).$el as Element;
232   - Array.from(el.children).forEach((item) => el.removeChild(item));
233   - }
234   - await nextTick();
235   - const columns = isReset ? cloneDeep(cachePlainOptions.value) : getColumns();
  301 +
  302 + // const columnListEl = unref(columnListRef);
  303 + // if (columnListEl && (columnListEl as any).$el) {
  304 + // const el = (columnListEl as any).$el as Element;
  305 + // Array.from(el.children).forEach((item) => el.removeChild(item));
  306 + // }
  307 + // await nextTick();
  308 + // const columns = isReset ? cloneDeep(cachePlainOptions.value) : getColumns();
236 309  
237 310 const checkList = table
238 311 .getColumns({ ignoreAction: true, ignoreIndex: true })
... ... @@ -254,28 +327,17 @@
254 327 .flat()
255 328 .filter(Boolean) as string[];
256 329  
257   - // plainOptions.value = columns;
258   - plainSortOptions.value = columns;
259   - plainOptions.value = columns
260   - .map((item) => {
261   - if (item.children) {
262   - return item.children.map((item) => ({
263   - ...item,
264   - label: item.title,
265   - value: item.dataIndex || item.title,
266   - }));
267   - }
268   - return item;
269   - })
270   - .flat();
271 330 // 更新缓存配置
272   - table.setCacheColumns?.(columns);
273   - !isReset && (cachePlainOptions.value = cloneDeep(columns));
274   - state.defaultCheckList = checkList;
  331 + // !isReset && (cachePlainOptions.value = cloneDeep(columns));
  332 + // setColumns(cacheColumns);
  333 + // state.defaultCheckList = checkList;
275 334 state.checkedList = checkList;
276 335 // 是否列展示全选
277   - state.checkAll = checkList.length === columns.length;
  336 + // state.checkAll = checkList.length === columns.length;
278 337 inited = false;
  338 +
  339 + setColumns(checkList);
  340 +
279 341 handleVisibleChange();
280 342 }
281 343  
... ... @@ -330,7 +392,7 @@
330 392 // reset columns
331 393 function reset() {
332 394 setColumns(cachePlainOptions.value);
333   - init(true);
  395 + updateColumns(true);
334 396 checkIndex.value = !!cacheTableProps.showIndexColumn;
335 397 checkSelect.value = !!cacheTableProps.rowSelection;
336 398 table.setProps({
... ... @@ -371,6 +433,7 @@
371 433 }
372 434  
373 435 plainSortOptions.value = columns;
  436 +
374 437 setColumns(columns.filter((item) => state.checkedList.includes(item.value)));
375 438 },
376 439 });
... ... @@ -420,6 +483,7 @@
420 483 }
421 484  
422 485 function setColumns(columns: BasicColumn[] | string[]) {
  486 + setAuthCache(ORDER_COLUMN, columns);
423 487 isSetPropsFromThis = true;
424 488 isSetColumnsFromThis = true;
425 489  
... ...
src/enums/cacheEnum.ts
... ... @@ -25,6 +25,8 @@ export const APP_LOCAL_CACHE_KEY = &#39;COMMON__LOCAL__KEY__&#39;;
25 25 // base global session key
26 26 export const APP_SESSION_CACHE_KEY = 'COMMON__SESSION__KEY__';
27 27  
  28 +export const ORDER_COLUMN = 'ORDER_COLUMN';
  29 +
28 30 export enum CacheTypeEnum {
29 31 SESSION,
30 32 LOCAL,
... ...
src/layouts/default/header/index.vue
... ... @@ -49,7 +49,7 @@
49 49 /> -->
50 50  
51 51 <UserDropDown :theme="getHeaderTheme" />
52   -
  52 + <span className="text-gray-900">{{ nickName }}</span>
53 53 <!-- <SettingDrawer v-if="getShowSetting" :class="`${prefixCls}-action__item`" /> -->
54 54 </div>
55 55 </Header>
... ... @@ -77,6 +77,9 @@
77 77  
78 78 import { createAsyncComponent } from '/@/utils/factory/createAsyncComponent';
79 79 import { useLocale } from '/@/locales/useLocale';
  80 + import { useUserStoreWithOut } from '/@/store/modules/user';
  81 +
  82 + const userStore = useUserStoreWithOut();
80 83  
81 84 export default defineComponent({
82 85 name: 'LayoutHeader',
... ... @@ -167,6 +170,10 @@
167 170 return unref(getSplit) ? MenuModeEnum.HORIZONTAL : null;
168 171 });
169 172  
  173 + const nickName = computed(() => {
  174 + return userStore.getUserInfo?.nickName;
  175 + });
  176 +
170 177 return {
171 178 prefixCls,
172 179 getHeaderClass,
... ... @@ -189,6 +196,7 @@
189 196 getShowSettingButton,
190 197 getShowSetting,
191 198 getShowSearch,
  199 + nickName,
192 200 };
193 201 },
194 202 });
... ...
src/store/modules/user.ts
... ... @@ -92,8 +92,11 @@ export const useUserStore = defineStore({
92 92 const { mode, ...loginParams } = params;
93 93 const data = await loginApi(loginParams, mode);
94 94 const { token, user } = data;
  95 + console.log('%c [ user ]-95', 'font-size:13px; background:pink; color:#bf2c9f;', user);
95 96  
96 97 this.setToken(token);
  98 + this.setUserInfo(user);
  99 +
97 100 // this.setToken(
98 101 // 'Bearer eyJhbGciOiJIUzUxMiJ9.eyJzdWIiOiJhZG1pbiIsImF1dGgiOiJkZXB0OmVkaXQsdXNlcjpsaXN0LHJvbGVzOmFkZCx1c2VyOmFkZCxkZXB0OmFkZCxtZW51OmRlbCxyb2xlczpkZWwsbWVudTplZGl0LG1lbnU6bGlzdCxzdG9yYWdlOmxpc3Qsam9iOmVkaXQscm9sZXM6bGlzdCx1c2VyOmRlbCxkaWN0OmFkZCxkZXB0Omxpc3QsbWVudTphZGQsam9iOmRlbCxqb2I6bGlzdCx1c2VyOmVkaXQscm9sZXM6ZWRpdCxkaWN0OmRlbCxqb2I6YWRkLGRpY3Q6ZWRpdCxkZXB0OmRlbCIsImV4cCI6MTY5NjE0NTUzN30.Q9hcwnG9uJP3HHjwpd_3ZrV7LrZlMIL6JJBe0rcfqldE8SPq8JkBKElrGeu7GoCAc5EyN6wUUYcriwV5VhpZqQ',
99 102 // );
... ...
src/utils/cache/persistent.ts
... ... @@ -13,6 +13,7 @@ import {
13 13 APP_LOCAL_CACHE_KEY,
14 14 APP_SESSION_CACHE_KEY,
15 15 MULTIPLE_TABS_KEY,
  16 + ORDER_COLUMN,
16 17 } from '/@/enums/cacheEnum';
17 18 import { DEFAULT_CACHE_TIME } from '/@/settings/encryptionSetting';
18 19 import { toRaw } from 'vue';
... ... @@ -25,6 +26,7 @@ interface BasicStore {
25 26 [LOCK_INFO_KEY]: LockInfo;
26 27 [PROJ_CFG_KEY]: ProjectConfig;
27 28 [MULTIPLE_TABS_KEY]: RouteLocationNormalized[];
  29 + [ORDER_COLUMN]: any;
28 30 }
29 31  
30 32 type LocalStore = BasicStore;
... ...
src/utils/http/axios/Axios.ts
... ... @@ -234,7 +234,8 @@ export class VAxios {
234 234 return router.push('/login');
235 235 }
236 236 if (res.data.result !== 0 && res.data.message) {
237   - return createMessage.error(res.data.message);
  237 + createMessage.error(res.data.message);
  238 + return reject(res.data);
238 239 }
239 240  
240 241 if (message && res.data.result === 0) {
... ...
src/views/project/approve/BaseInfo.vue 0 → 100644
  1 +<template>
  2 + <h2>基本信息</h2>
  3 + <div v-for="field in baseInfos" :key="field.label">
  4 + <span className="w-[140px] inline-block text-right mr-3">{{ field.label }}:</span>
  5 + <span v-if="field.label !== '图片'">{{ field.value }}</span>
  6 + <span v-else><img :src="field.value" height="100" /></span>
  7 + </div>
  8 +</template>
  9 +
  10 +<script setup lang="ts">
  11 + defineProps({
  12 + baseInfos: Object,
  13 + });
  14 +</script>
... ...
src/views/project/approve/FieldPanel.vue
... ... @@ -17,28 +17,36 @@
17 17 </template>
18 18 </BasicTable>
19 19 <BasicDrawer
20   - :showFooter="!isApproved"
  20 + width="500"
  21 + :showFooter="!isApproved && role === ROLE.ADMIN"
21 22 @register="registerDrawer"
22 23 title="申请信息"
23 24 okText="通过"
24 25 @ok="handleTrue"
25 26 >
26   - <h2>基本信息</h2>
27   - <div v-for="field in baseInfos" :key="field">
28   - <span className="w-[140px] inline-block text-right mr-3">{{ field.label }}:</span
29   - ><span v-if="field.label !== '图片'">{{ field.value }}</span
30   - ><span v-else><img :src="field.value" height="100" /></span>
31   - </div>
  27 + <BaseInfo :baseInfos="baseInfos" />
32 28 <h2 className="mt-8">基本信息申请字段</h2>
33 29 <div>{{ fieldInfos.baseFields.join(' , ') }}</div>
  30 +
34 31 <h2 className="mt-8">利润分析表申请字段</h2>
35 32 <div>
36 33 {{ fieldInfos.profitFields.join(' , ') }}
37 34 </div>
  35 +
38 36 <h2 className="mt-8">项目报告书申请字段</h2>
39 37 <div>
40 38 <span>{{ fieldInfos.reportFields.join(' , ') }}</span>
41 39 </div>
  40 +
  41 + <h2 className="mt-8">跟单信息申请字段</h2>
  42 + <div>
  43 + <span>{{ fieldInfos.trackStageFields.join(' , ') }}</span>
  44 + </div>
  45 +
  46 + <h2 className="mt-8">质量检测申请字段</h2>
  47 + <div>
  48 + <span>{{ fieldInfos.inspectionStageFields.join(' , ') }}</span>
  49 + </div>
42 50 <template #appendFooter>
43 51 <a-button @click="handleFalse"> 不通过</a-button>
44 52 </template>
... ... @@ -46,14 +54,25 @@
46 54 </PageWrapper>
47 55 </template>
48 56 <script lang="ts">
49   - import { defineComponent, ref } from 'vue';
  57 + import { computed, defineComponent, ref } from 'vue';
50 58 import { BasicTable, useTable, TableAction } from '/@/components/Table';
51 59 import { PageWrapper } from '/@/components/Page';
52 60 import { BasicDrawer, useDrawer } from '/@/components/Drawer';
53 61  
54 62 import { approveAuditApi, getApprovedListApi, getWaitListApi } from '/@/api/project/approve';
55   - import { FIELDS_BASE_INFO, FIELDS_PROFIT_INFO, FIELDS_REPORT_INFO } from '../order/tableData';
  63 + import {
  64 + FIELDS_BASE_INFO,
  65 + FIELDS_INSPECTION_INFO,
  66 + FIELDS_PROFIT_INFO,
  67 + FIELDS_REPORT_INFO,
  68 + FIELDS_TRACK_STAGE_INFO,
  69 + } from '../order/tableData';
56 70 import { find, isEmpty } from 'lodash-es';
  71 + import { ROLE } from '../order//type.d';
  72 + import { useUserStoreWithOut } from '/@/store/modules/user';
  73 + import BaseInfo from './BaseInfo.vue';
  74 +
  75 + const userStore = useUserStoreWithOut();
57 76  
58 77 export default defineComponent({
59 78 components: {
... ... @@ -61,6 +80,7 @@
61 80 BasicTable,
62 81 BasicDrawer,
63 82 TableAction,
  83 + BaseInfo,
64 84 },
65 85 props: {
66 86 isApproved: { type: Boolean },
... ... @@ -73,6 +93,8 @@
73 93 baseFields: [],
74 94 reportFields: [],
75 95 profitFields: [],
  96 + inspectionStageFields: [],
  97 + trackStageFields: [],
76 98 });
77 99 const baseInfos = ref({});
78 100 const id = ref('');
... ... @@ -128,6 +150,8 @@
128 150 baseFields: [],
129 151 reportFields: [],
130 152 profitFields: [],
  153 + inspectionStageFields: [],
  154 + trackStageFields: [],
131 155 };
132 156 openDrawer(true, { data });
133 157  
... ... @@ -153,6 +177,22 @@
153 177 }
154 178 });
155 179  
  180 + !isEmpty(data.fieldInfos.trackStageFields) &&
  181 + Object.entries(data.fieldInfos.trackStageFields).map(([key, value]) => {
  182 + if (value === 'UN_LOCKED') {
  183 + const obj = find(FIELDS_TRACK_STAGE_INFO, { field: key });
  184 + fieldInfos.value.trackStageFields.push(obj?.label);
  185 + }
  186 + });
  187 +
  188 + !isEmpty(data.fieldInfos.inspectionStageFields) &&
  189 + Object.entries(data.fieldInfos.inspectionStageFields).map(([key, value]) => {
  190 + if (value === 'UN_LOCKED') {
  191 + const obj = find(FIELDS_INSPECTION_INFO, { field: key });
  192 + fieldInfos.value.inspectionStageFields.push(obj?.label);
  193 + }
  194 + });
  195 +
156 196 id.value = data.id;
157 197 baseInfos.value = FIELDS_BASE_INFO.map((field) => {
158 198 return {
... ... @@ -173,6 +213,10 @@
173 213 reload();
174 214 closeDrawer();
175 215 }
  216 +
  217 + const role = computed(() => {
  218 + return userStore.getUserInfo?.roleSmallVO?.code;
  219 + });
176 220 return {
177 221 handleProfitModal,
178 222 registerTable,
... ... @@ -187,7 +231,10 @@
187 231 baseInfos,
188 232 handleTrue,
189 233 handleFalse,
  234 + ROLE,
  235 + role,
190 236 };
191 237 },
192 238 });
193 239 </script>
  240 +../order/constant
... ...
src/views/project/approve/ProfitPanel.vue
... ... @@ -17,17 +17,13 @@
17 17 </template>
18 18 </BasicTable>
19 19 <BasicDrawer
20   - :showFooter="!isApproved"
  20 + :showFooter="!isApproved && role === ROLE.ADMIN"
21 21 @register="registerDrawer"
22 22 title="申请信息"
23 23 okText="通过"
24 24 @ok="handleTrue"
25 25 >
26   - <h2>基本信息</h2>
27   - <div v-for="field in baseInfos" :key="field" className="mb-8">
28   - <span className="w-[140px] inline-block text-right mr-3">{{ field.label }}:</span
29   - ><span>{{ field.value }}</span>
30   - </div>
  26 + <BaseInfo :baseInfos="baseInfos" />
31 27 <h2>项目报告书信息</h2>
32 28 <div v-for="field in fieldInfos" :key="field">
33 29 <span className="w-[140px] inline-block text-right mr-3">{{ field.label }}:</span
... ... @@ -40,13 +36,18 @@
40 36 </PageWrapper>
41 37 </template>
42 38 <script lang="ts">
43   - import { defineComponent, ref } from 'vue';
  39 + import { computed, defineComponent, ref } from 'vue';
44 40 import { BasicTable, useTable, TableAction } from '/@/components/Table';
45 41 import { PageWrapper } from '/@/components/Page';
46 42 import { BasicDrawer, useDrawer } from '/@/components/Drawer';
47 43  
48 44 import { approveAuditApi, getApprovedListApi, getWaitListApi } from '/@/api/project/approve';
49 45 import { FIELDS_BASE_INFO, FIELDS_PROFIT_INFO, FIELDS_REPORT_INFO } from '../order/tableData';
  46 + import { ROLE } from '../order//type.d';
  47 + import { useUserStoreWithOut } from '/@/store/modules/user';
  48 + import BaseInfo from './BaseInfo.vue';
  49 +
  50 + const userStore = useUserStoreWithOut();
50 51  
51 52 export default defineComponent({
52 53 components: {
... ... @@ -54,6 +55,7 @@
54 55 BasicTable,
55 56 BasicDrawer,
56 57 TableAction,
  58 + BaseInfo,
57 59 },
58 60 props: {
59 61 isApproved: { type: Boolean },
... ... @@ -140,6 +142,10 @@
140 142 reload();
141 143 closeDrawer();
142 144 }
  145 +
  146 + const role = computed(() => {
  147 + return userStore.getUserInfo?.roleSmallVO?.code;
  148 + });
143 149 return {
144 150 handleProfitModal,
145 151 registerTable,
... ... @@ -154,7 +160,10 @@
154 160 baseInfos,
155 161 handleTrue,
156 162 handleFalse,
  163 + role,
  164 + ROLE,
157 165 };
158 166 },
159 167 });
160 168 </script>
  169 +../order/constant
... ...
src/views/project/approve/ReportPanel.vue
... ... @@ -17,17 +17,13 @@
17 17 </template>
18 18 </BasicTable>
19 19 <BasicDrawer
20   - :showFooter="!isApproved"
  20 + :showFooter="!isApproved && role === ROLE.ADMIN"
21 21 @register="registerDrawer"
22 22 title="申请信息"
23 23 okText="通过"
24 24 @ok="handleTrue"
25 25 >
26   - <h2>基本信息</h2>
27   - <div v-for="field in baseInfos" :key="field" className="mb-8">
28   - <span className="w-[140px] inline-block text-right mr-3">{{ field.label }}:</span
29   - ><span>{{ field.value }}</span>
30   - </div>
  26 + <BaseInfo :baseInfos="baseInfos" />
31 27 <h2>项目报告书信息</h2>
32 28 <div v-for="field in fieldInfos" :key="field">
33 29 <span className="w-[140px] inline-block text-right mr-3">{{ field.label }}:</span
... ... @@ -40,19 +36,25 @@
40 36 </PageWrapper>
41 37 </template>
42 38 <script lang="ts">
43   - import { defineComponent, ref } from 'vue';
  39 + import { computed, defineComponent, ref } from 'vue';
44 40 import { BasicTable, useTable, TableAction } from '/@/components/Table';
45 41 import { PageWrapper } from '/@/components/Page';
46 42 import { BasicDrawer, useDrawer } from '/@/components/Drawer';
47 43  
48 44 import { approveAuditApi, getApprovedListApi, getWaitListApi } from '/@/api/project/approve';
49 45 import { FIELDS_BASE_INFO, FIELDS_REPORT_INFO } from '../order/tableData';
  46 + import { ROLE } from '../order//type.d';
  47 + import { useUserStoreWithOut } from '/@/store/modules/user';
  48 + import BaseInfo from './BaseInfo.vue';
  49 +
  50 + const userStore = useUserStoreWithOut();
50 51  
51 52 export default defineComponent({
52 53 components: {
53 54 PageWrapper,
54 55 BasicTable,
55 56 BasicDrawer,
  57 + BaseInfo,
56 58 TableAction,
57 59 },
58 60 props: {
... ... @@ -140,6 +142,10 @@
140 142 reload();
141 143 closeDrawer();
142 144 }
  145 +
  146 + const role = computed(() => {
  147 + return userStore.getUserInfo?.roleSmallVO?.code;
  148 + });
143 149 return {
144 150 handleProfitModal,
145 151 registerTable,
... ... @@ -154,7 +160,10 @@
154 160 baseInfos,
155 161 handleTrue,
156 162 handleFalse,
  163 + role,
  164 + ROLE,
157 165 };
158 166 },
159 167 });
160 168 </script>
  169 +../order/constant
... ...
src/views/project/order/CheckDetail.vue
... ... @@ -5,6 +5,7 @@
5 5 showFooter
6 6 title="字段编辑权限申请"
7 7 width="60%"
  8 + :destroyOnClose="true"
8 9 :isDetail="true"
9 10 @ok="handleSubmit"
10 11 :showDetailBack="false"
... ... @@ -13,10 +14,22 @@
13 14 <div>
14 15 <h3>基本信息</h3>
15 16 <BasicForm @register="registerForm" />
16   - <h3>利润分析</h3>
17   - <BasicForm @register="registerProfitForm" />
18   - <h3>项目报告书</h3>
19   - <BasicForm @register="registerReportForm" />
  17 + <template v-if="role === ROLE.ADMIN || role === ROLE.BUSINESS">
  18 + <h3>利润分析</h3>
  19 + <BasicForm @register="registerProfitForm" />
  20 + </template>
  21 + <template v-if="role === ROLE.ADMIN || role === ROLE.BUSINESS">
  22 + <h3>项目报告书</h3>
  23 + <BasicForm @register="registerReportForm" />
  24 + </template>
  25 + <template v-if="role === ROLE.ADMIN || role === ROLE.TRACKER">
  26 + <h3>跟单信息</h3>
  27 + <BasicForm @register="registerTrackForm" />
  28 + </template>
  29 + <template v-if="role === ROLE.ADMIN || role === ROLE.INSPECT">
  30 + <h3>质量信息</h3>
  31 + <BasicForm @register="registryInspectForm" />
  32 + </template>
20 33 </div>
21 34 <!-- <template #titleToolbar> <a-button type="primary"> 申请编辑权限 </a-button></template> -->
22 35  
... ... @@ -26,13 +39,22 @@
26 39 </BasicDrawer>
27 40 </template>
28 41 <script lang="ts">
29   - import { defineComponent, reactive, ref } from 'vue';
  42 + import { computed, defineComponent, reactive, ref } from 'vue';
30 43 import { BasicForm, useForm } from '/@/components/Form/index';
31 44 import { orderAuth } from '/@/api/project/order';
  45 + import { ROLE } from './type.d';
32 46  
33 47 import { BasicDrawer, useDrawerInner } from '/@/components/Drawer';
34   - import { FIELDS_BASE_INFO, FIELDS_PROFIT_INFO, FIELDS_REPORT_INFO } from './tableData';
  48 + import {
  49 + FIELDS_BASE_INFO,
  50 + FIELDS_INSPECTION_INFO,
  51 + FIELDS_PROFIT_INFO,
  52 + FIELDS_REPORT_INFO,
  53 + FIELDS_TRACK_STAGE_INFO,
  54 + } from './tableData';
  55 + import { useUserStoreWithOut } from '/@/store/modules/user';
35 56  
  57 + const userStore = useUserStoreWithOut();
36 58 const getSchema = (fields) =>
37 59 fields.map((item) => ({
38 60 field: `${item.field}`,
... ... @@ -60,6 +82,8 @@
60 82 const schemas = getSchema(FIELDS_BASE_INFO);
61 83 const profitSchemas = getSchema(FIELDS_PROFIT_INFO);
62 84 const reportSchemas = getSchema(FIELDS_REPORT_INFO);
  85 + const inspecSchemas = getSchema(FIELDS_INSPECTION_INFO);
  86 + const trackSchemas = getSchema(FIELDS_TRACK_STAGE_INFO);
63 87 const [registerForm, { getFieldsValue }] = useForm({
64 88 labelWidth: 120,
65 89 schemas,
... ... @@ -84,34 +108,73 @@
84 108 span: 24,
85 109 },
86 110 });
  111 + const [registryInspectForm, { getFieldsValue: getInspectFieldsValue }] = useForm({
  112 + labelWidth: 120,
  113 + schemas: inspecSchemas,
  114 + showActionButtonGroup: false,
  115 + actionColOptions: {
  116 + span: 24,
  117 + },
  118 + });
  119 + const [registerTrackForm, { getFieldsValue: getTrackFieldsValue }] = useForm({
  120 + labelWidth: 120,
  121 + schemas: trackSchemas,
  122 + showActionButtonGroup: false,
  123 + actionColOptions: {
  124 + span: 24,
  125 + },
  126 + });
87 127 const lockFields = reactive({});
88 128 const [register, { closeDrawer }] = useDrawerInner((data) => {
89 129 Object.assign(lockFields, data.lockFields);
90 130 id.value = data.id;
91 131 });
92 132  
  133 + const role = computed(() => {
  134 + return userStore.getUserInfo?.roleSmallVO?.code;
  135 + });
  136 +
93 137 const handleSubmit = async () => {
94 138 const baseFieldValues = getFieldsValue();
95 139 const profitFieldValues = getProfitFieldsValue();
96 140 const reportFieldValues = getReportFieldsValue();
  141 + const inspectFieldValues = getInspectFieldsValue();
  142 + const trackFieldValues = getTrackFieldsValue();
97 143  
98   - FIELDS_BASE_INFO.map(
99   - ({ field }) =>
100   - (baseFieldValues[field] =
101   - baseFieldValues[field] === 'UN_LOCKED' ? 'UN_LOCKED' : 'LOCKED'),
102   - );
  144 + if (baseFieldValues) {
  145 + FIELDS_BASE_INFO.map(
  146 + ({ field }) =>
  147 + (baseFieldValues[field] =
  148 + baseFieldValues[field] === 'UN_LOCKED' ? 'UN_LOCKED' : 'LOCKED'),
  149 + );
  150 + }
103 151  
104   - FIELDS_REPORT_INFO.map(
105   - ({ field }) =>
106   - (reportFieldValues[field] =
107   - reportFieldValues[field] === 'UN_LOCKED' ? 'UN_LOCKED' : 'LOCKED'),
108   - );
  152 + if (reportFieldValues)
  153 + FIELDS_REPORT_INFO.map(
  154 + ({ field }) =>
  155 + (reportFieldValues[field] =
  156 + reportFieldValues[field] === 'UN_LOCKED' ? 'UN_LOCKED' : 'LOCKED'),
  157 + );
109 158  
110   - FIELDS_PROFIT_INFO.map(
111   - ({ field }) =>
112   - (profitFieldValues[field] =
113   - profitFieldValues[field] === 'UN_LOCKED' ? 'UN_LOCKED' : 'LOCKED'),
114   - );
  159 + if (profitFieldValues)
  160 + FIELDS_PROFIT_INFO.map(
  161 + ({ field }) =>
  162 + (profitFieldValues[field] =
  163 + profitFieldValues[field] === 'UN_LOCKED' ? 'UN_LOCKED' : 'LOCKED'),
  164 + );
  165 + if (trackFieldValues)
  166 + FIELDS_TRACK_STAGE_INFO.map(
  167 + ({ field }) =>
  168 + (trackFieldValues[field] =
  169 + trackFieldValues[field] === 'UN_LOCKED' ? 'UN_LOCKED' : 'LOCKED'),
  170 + );
  171 +
  172 + if (inspectFieldValues)
  173 + FIELDS_INSPECTION_INFO.map(
  174 + ({ field }) =>
  175 + (inspectFieldValues[field] =
  176 + inspectFieldValues[field] === 'UN_LOCKED' ? 'UN_LOCKED' : 'LOCKED'),
  177 + );
115 178  
116 179 // !isEmpty(baseFieldValues) &&
117 180 // Object.keys(baseFieldValues.baseFields)?.map((key) => {
... ... @@ -141,6 +204,8 @@
141 204 { baseFields: baseFieldValues },
142 205 { profitAnalysisFields: profitFieldValues },
143 206 { reportFields: reportFieldValues },
  207 + { trackStageFields: trackFieldValues },
  208 + { inspectionStageFields: inspectFieldValues },
144 209 );
145 210 await orderAuth(values);
146 211 closeDrawer();
... ... @@ -151,7 +216,11 @@
151 216 registerForm,
152 217 registerProfitForm,
153 218 registerReportForm,
  219 + registryInspectForm,
  220 + registerTrackForm,
154 221 handleSubmit,
  222 + ROLE,
  223 + role,
155 224 };
156 225 },
157 226 });
... ...
src/views/project/order/FieldDetail.vue
... ... @@ -3,6 +3,7 @@
3 3 @register="register"
4 4 v-bind="$attrs"
5 5 title="title"
  6 + :destroyOnClose="true"
6 7 width="60%"
7 8 :isDetail="true"
8 9 :showDetailBack="false"
... ...
src/views/project/order/FormDetail.vue deleted 100644 → 0
1   -<template>
2   - <BasicDrawer
3   - v-bind="$attrs"
4   - showFooter
5   - @register="register"
6   - @ok="handleSubmit"
7   - title=""
8   - width="28%"
9   - ref="formRef"
10   - :isDetail="true"
11   - :showDetailBack="false"
12   - okText="保存"
13   - :mask="false"
14   - class="z-20"
15   - >
16   - <div className="mt-[-16px]">
17   - <Tabs v-model:activeKey="activeKey">
18   - <TabPanel key="1" tab="基本信息" :forceRender="true">
19   - <BaseFormPanel ref="baseFormPanelRef" :id="id" />
20   - </TabPanel>
21   - <TabPanel key="2" tab="利润分析" :forceRender="true" v-if="!!id">
22   - <ProfitFormPanel ref="profitFormPanelRef" :id="id" />
23   - </TabPanel>
24   - <TabPanel key="3" tab="项目报告书" :forceRender="true" v-if="!!id">
25   - <ReportFormPanel ref="reportFormPanelRef" :id="id" />
26   - </TabPanel>
27   - <TabPanel key="4" tab="跟单信息" :forceRender="true" v-if="!!id">
28   - <TrackFormPanel ref="trackFormPanelRef" :id="id" />
29   - </TabPanel>
30   - <TabPanel key="5" tab="质检信息" :forceRender="true" v-if="!!id">
31   - <InspectionFormPanel ref="inspectionFormPanelRef" :id="id" />
32   - </TabPanel>
33   - </Tabs>
34   - </div>
35   - <!-- <BasicForm @register="registerForm" />
36   - <BasicForm @register="registerForm" />
37   - <BasicForm @register="registerForm" /> -->
38   - <!-- <template #titleToolbar> <a-button type="primary"> 申请编辑权限 </a-button></template> -->
39   -
40   - <!-- <template #appendFooter>
41   - <a-button type="primary" @click="onGoCheckDetail"> 申请权限</a-button>
42   - </template> -->
43   - </BasicDrawer>
44   -</template>
45   -<script lang="ts">
46   - import { computed, defineComponent, reactive, ref, toRaw, watch, toRefs } from 'vue';
47   - import { BasicForm, FormActionType, FormSchema, useForm } from '/@/components/Form/index';
48   - import { orderCreate, orderUpdate, uploadImg } from '/@/api/project/order';
49   - import { BasicDrawer, useDrawerInner } from '/@/components/Drawer';
50   - import { useOrderStoreWithOut } from '/@/store/modules/order';
51   - import { useOrderInfo } from '/@/hooks/component/order';
52   - import { dateUtil } from '/@/utils/dateUtil';
53   - import {} from './tableData';
54   - import ProfitFormPanel from './component/ProfitFormPanel.vue';
55   - import ReportFormPanel from './component/ReportFormPanel.vue';
56   - import TrackFormPanel from './component/TrackFormPanel.vue';
57   - import InspectionFormPanel from './component/InspectionFormPanel.vue';
58   - import BaseFormPanel from './component/BaseFormPanel.vue';
59   -
60   - import { Tabs } from 'ant-design-vue';
61   -
62   - const TabPanel = Tabs.TabPane;
63   -
64   - export default defineComponent({
65   - components: {
66   - BasicDrawer,
67   - BasicForm,
68   - BaseFormPanel,
69   - Tabs,
70   - TabPanel,
71   - ProfitFormPanel,
72   - ReportFormPanel,
73   - TrackFormPanel,
74   - InspectionFormPanel,
75   - },
76   -
77   - props: {
78   - detailData: {
79   - type: Object,
80   - },
81   - onGoCheckDetail: {
82   - type: Function,
83   - },
84   - },
85   - emits: ['success'],
86   - setup(_, { emit }) {
87   - const orderStore = useOrderStoreWithOut();
88   - const activeKey = ref('1');
89   - const profitFormPanelRef = ref();
90   - const reportFormPanelRef = ref();
91   - const trackFormPanelRef = ref();
92   - const inspectionFormPanelRef = ref();
93   - const baseFormPanelRef = ref();
94   -
95   - const {
96   - customerCode,
97   - projectNo,
98   - productionDepartment,
99   - innerNo,
100   - poColor,
101   - cnColor,
102   - productStyle,
103   - outboundType,
104   - packetType,
105   - } = useOrderInfo(orderStore);
106   -
107   - const formRef = ref<FormActionType | null>(null);
108   - const id = ref('');
109   -
110   - // const customerCode = computed(() => {
111   - // const dictInfo = orderStore.getDictInfo;
112   - // return map(dictInfo?.customerCode, transformDictInfo);
113   - // });
114   -
115   - // const projectNo = computed(() => {
116   - // const dictInfo = orderStore.getDictInfo;
117   - // return map(dictInfo?.projectNo, transformDictInfo);
118   - // });
119   -
120   - const picUrl = ref('');
121   - let fields = reactive({ baseFields: {} });
122   - const getDisable = (code) => {
123   - return code === 'LOCKED' && !!id.value;
124   - };
125   -
126   - const schemas = computed(() => {
127   - return [
128   - {
129   - field: 'baseInfo.customerCode',
130   - component: 'Select',
131   - label: '客户编码',
132   - rules: [{ required: true }],
133   - colProps: {
134   - span: 24,
135   - },
136   - componentProps: {
137   - options: customerCode,
138   - disabled: getDisable(fields?.baseFields.customerCode),
139   - },
140   - },
141   - {
142   - field: 'baseInfo.projectNo',
143   - component: 'Select',
144   - componentProps: {
145   - options: projectNo,
146   - disabled: getDisable(fields?.baseFields?.projectNo),
147   - },
148   - label: '项目号',
149   - rules: [{ required: true }],
150   - colProps: {
151   - span: 24,
152   - },
153   - },
154   - {
155   - field: 'baseInfo.productionDepartment',
156   - component: 'Select',
157   - label: '生产科',
158   - rules: [{ required: true }],
159   - colProps: {
160   - span: 24,
161   - },
162   - componentProps: {
163   - options: productionDepartment,
164   - disabled: getDisable(fields?.baseFields?.productionDepartment),
165   - },
166   - },
167   - {
168   - field: 'baseInfo.innerNo',
169   - component: 'Select',
170   - label: '内部编号',
171   - rules: [{ required: true }],
172   -
173   - colProps: {
174   - span: 24,
175   - },
176   - componentProps: {
177   - options: innerNo,
178   - disabled: getDisable(fields?.baseFields?.innerNo),
179   - },
180   - },
181   - {
182   - field: 'baseInfo.customerPo',
183   - component: 'Input',
184   - label: '客户po号',
185   - rules: [{ required: true }],
186   - componentProps: {
187   - disabled: getDisable(fields?.baseFields?.customerPo),
188   - },
189   - colProps: {
190   - span: 24,
191   - },
192   - },
193   - {
194   - field: 'baseInfo.customerStyle',
195   - component: 'Input',
196   - label: '客户STYLE',
197   - rules: [{ required: true }],
198   -
199   - colProps: {
200   - span: 24,
201   - },
202   - componentProps: {
203   - disabled: getDisable(fields?.baseFields?.customerStyle),
204   - },
205   - },
206   - {
207   - field: 'baseInfo.collection',
208   - component: 'Input',
209   - label: 'COLLECTION (style description)',
210   - rules: [{ required: true }],
211   -
212   - colProps: {
213   - span: 24,
214   - },
215   - componentProps: {
216   - disabled: getDisable(fields?.baseFields?.collection),
217   - },
218   - },
219   - {
220   - field: 'baseInfo.poColor',
221   - component: 'Select',
222   - label: 'PO COLOR',
223   - rules: [{ required: true }],
224   -
225   - colProps: {
226   - span: 24,
227   - },
228   - componentProps: {
229   - options: poColor,
230   - disabled: getDisable(fields?.baseFields?.poColor),
231   - },
232   - },
233   - {
234   - field: 'baseInfo.cnColor',
235   - component: 'Select',
236   - label: '颜色中文',
237   - rules: [{ required: true }],
238   -
239   - colProps: {
240   - span: 24,
241   - },
242   - componentProps: {
243   - options: cnColor,
244   - disabled: getDisable(fields?.baseFields?.cnColor),
245   - },
246   - },
247   - {
248   - field: 'baseInfo.picUrl',
249   - component: 'FieldUpload',
250   - label: '图片',
251   - rules: [{ required: true }],
252   - colProps: {
253   - span: 24,
254   - },
255   - componentProps: {
256   - imgUrl: picUrl,
257   - disabled: getDisable(fields?.baseFields?.picUrl),
258   - onChange: (res) => {
259   - if (res.file?.response?.data) picUrl.value = res.file?.response?.data;
260   - },
261   - },
262   - },
263   - {
264   - field: 'baseInfo.productionComment',
265   - component: 'Input',
266   - rules: [{ required: true }],
267   - label: '生产要求',
268   - componentProps: {
269   - disabled: getDisable(fields?.baseFields?.productionComment),
270   - },
271   - colProps: {
272   - span: 24,
273   - },
274   - },
275   - {
276   - field: 'baseInfo.orderCount',
277   - component: 'InputNumber',
278   - rules: [{ required: true }],
279   - label: '数量',
280   - colProps: {
281   - span: 24,
282   - },
283   - componentProps: {
284   - disabled: getDisable(fields?.baseFields?.orderCount),
285   - },
286   - },
287   - {
288   - field: 'baseInfo.orderComposition',
289   - component: 'Input',
290   - rules: [{ required: true }],
291   - label: '订单成分',
292   - colProps: {
293   - span: 24,
294   - },
295   - componentProps: {
296   - disabled: getDisable(fields?.baseFields?.orderComposition),
297   - },
298   - },
299   - {
300   - field: 'baseInfo.productStyle',
301   - component: 'Select',
302   - rules: [{ required: true }],
303   - label: '款式类型',
304   - colProps: {
305   - span: 24,
306   - },
307   - componentProps: {
308   - options: productStyle,
309   - disabled: getDisable(fields?.baseFields?.productStyle),
310   - },
311   - },
312   - {
313   - field: 'baseInfo.productionDepartmentConsignTime',
314   - component: 'DatePicker',
315   - label: '生成科拖货时间',
316   - colProps: {
317   - span: 24,
318   - },
319   - componentProps: {
320   - disabled: getDisable(fields?.baseFields?.productionDepartmentConsignTime),
321   - },
322   - rules: [{ required: true }],
323   - },
324   - {
325   - field: 'baseInfo.orderHodTime',
326   - component: 'DatePicker',
327   - label: '订单上HOD时间',
328   - colProps: {
329   - span: 24,
330   - },
331   - componentProps: {
332   - disabled: getDisable(fields?.baseFields?.orderHodTime),
333   - },
334   - rules: [{ required: true }],
335   - },
336   - {
337   - field: 'baseInfo.outboundType',
338   - component: 'Select',
339   - label: '出库类型',
340   - colProps: {
341   - span: 24,
342   - },
343   - rules: [{ required: true }],
344   - componentProps: {
345   - disabled: getDisable(fields?.baseFields?.outboundType),
346   - options: outboundType,
347   - },
348   - },
349   - {
350   - field: 'baseInfo.packetType',
351   - component: 'Select',
352   - label: '包装类型',
353   - colProps: {
354   - span: 24,
355   - },
356   - rules: [{ required: true }],
357   - componentProps: {
358   - options: packetType,
359   - disabled: getDisable(fields?.baseFields?.packetType),
360   - },
361   - },
362   - ];
363   - });
364   - const [registerForm, { setFieldsValue, getFieldsValue, resetFields }] = useForm({
365   - labelWidth: 120,
366   - schemas,
367   - showActionButtonGroup: false,
368   - actionColOptions: {
369   - span: 24,
370   - },
371   - });
372   -
373   - const [register, { closeDrawer }] = useDrawerInner((data) => {
374   - if (!data.id) {
375   - id.value = '';
376   - picUrl.value = '';
377   - // 新建
378   - baseFormPanelRef?.value?.resetFields();
379   - profitFormPanelRef?.value?.resetFields();
380   - reportFormPanelRef?.value?.resetFields();
381   - trackFormPanelRef?.value?.resetFields();
382   - inspectionFormPanelRef?.value?.resetFields();
383   -
384   - return;
385   - }
386   - id.value = data.id;
387   -
388   - // 方式1
389   - picUrl.value = data.picUrl;
390   - data.orderHodTime = data.orderHodTime ? dateUtil(data.orderHodTime) : null;
391   - data.productionDepartmentConsignTime = data.productionDepartmentConsignTime
392   - ? dateUtil(data.productionDepartmentConsignTime)
393   - : null;
394   -
395   - fields.baseFields = {
396   - ...fields.baseFields,
397   - ...data.lockFields.baseFields,
398   - };
399   -
400   - if (id.value) {
401   - setTimeout(() => {
402   - // 基本信息
403   - baseFormPanelRef.value.fields = { ...data.lockFields?.baseFields } || {};
404   - baseFormPanelRef.value.setFieldsValue({
405   - ...toRaw(data),
406   - });
407   - baseFormPanelRef.value.picUrl = data.picUrl;
408   - baseFormPanelRef.value.smallPicUrl = data.smallPicUrl;
409   -
410   - // 利润分析
411   - profitFormPanelRef.value.fields = { ...data.lockFields?.profitAnalysisFields } || {};
412   - profitFormPanelRef?.value?.setFieldsValue({
413   - ...toRaw(data.profitAnalysisInfo),
414   - });
415   -
416   - // 项目报告书
417   - reportFormPanelRef.value.fields = { ...data.lockFields?.reportFields } || {};
418   - reportFormPanelRef?.value?.setFieldsValue({
419   - ...toRaw(data.reportInfo),
420   - });
421   -
422   - // 跟单信息
423   - trackFormPanelRef.value.fields = { ...data.lockFields?.trackStageFields } || {};
424   - trackFormPanelRef?.value?.setFieldsValue({
425   - ...toRaw(data.trackStageInfo),
426   - });
427   -
428   - // 质检信息
429   - inspectionFormPanelRef.value.fields =
430   - { ...data.lockFields?.inspectionStageFields } || {};
431   - inspectionFormPanelRef?.value?.setFieldsValue({
432   - ...toRaw(data.inspectionStageInfo),
433   - });
434   - }, 100);
435   - } else {
436   - setFieldsValue({});
437   - }
438   - });
439   -
440   - const handleSubmit = async () => {
441   - if (id.value) {
442   - const forms = { orderId: id.value } as any;
443   - if (activeKey.value === '1') {
444   - forms.baseInfo = baseFormPanelRef?.value?.getFieldsValue() || {};
445   - forms.baseInfo = {
446   - ...forms.baseInfo,
447   - picUrl: baseFormPanelRef?.value?.picUrl || '',
448   - smallPicUrl: baseFormPanelRef?.value?.smallPicUrl || '',
449   - };
450   - } else if (activeKey.value === '2') {
451   - forms.profitAnalysisInfo = profitFormPanelRef?.value?.getFieldsValue() || {};
452   - } else if (activeKey.value === '3') {
453   - forms.reportInfo = reportFormPanelRef?.value?.getFieldsValue() || {};
454   - } else if (activeKey.value === '4') {
455   - forms.trackStageInfo = trackFormPanelRef?.value?.getFieldsValue() || {};
456   - } else if (activeKey.value === '5') {
457   - forms.inspectionStageInfo = inspectionFormPanelRef?.value?.getFieldsValue() || {};
458   - }
459   -
460   - await orderUpdate(forms);
461   - } else {
462   - // const v2 = profitFormPanelRef?.value?.getFieldsValue() || {};
463   - // const v3 = reportFormPanelRef?.value?.getFieldsValue() || {};
464   - // const v4 = trackFormPanelRef?.value?.getFieldsValue() || {};
465   - // const v5 = inspectionFormPanelRef?.value?.getFieldsValue() || {};
466   -
467   - // values.profitAnalysisInfo = { ...v2 };
468   - // values.reportInfo = { ...v3 };
469   - // values.trackStageInfo = { ...v4 };
470   - // values.inspectionStageInfo = { ...v5 };
471   - const values = baseFormPanelRef?.value?.getFieldsValue() || {};
472   -
473   - const forms = {
474   - baseInfo: {
475   - ...values,
476   - picUrl: baseFormPanelRef?.value?.picUrl || '',
477   - smallPicUrl: baseFormPanelRef?.value?.smallPicUrl || '',
478   - },
479   - };
480   - await orderCreate(forms);
481   - }
482   - closeDrawer();
483   - emit('success', {});
484   - };
485   - return {
486   - id,
487   - profitFormPanelRef,
488   - reportFormPanelRef,
489   - trackFormPanelRef,
490   - baseFormPanelRef,
491   - inspectionFormPanelRef,
492   - activeKey,
493   - formRef,
494   - schemas,
495   - register,
496   - registerForm,
497   - handleSubmit,
498   - };
499   - },
500   - });
501   -</script>
502   -
503   -<style scoped>
504   - .ant-drawer {
505   - position: fixed;
506   - z-index: 9999;
507   - }
508   -</style>
src/views/project/order/component/BaseFormPanel.vue renamed to src/views/project/order/FormDetail/BaseFormPanel.vue
... ... @@ -44,7 +44,7 @@
44 44 packetType,
45 45 } = useOrderInfo(orderStore);
46 46  
47   - const schemas = computed(() => {
  47 + var schemas = computed(() => {
48 48 const options = {
49 49 customerCode,
50 50 projectNo,
... ... @@ -58,6 +58,11 @@
58 58 };
59 59  
60 60 const res = FIELDS_BASE_INFO.map((item) => {
  61 + console.log(
  62 + '%c [ ]-62',
  63 + 'font-size:13px; background:pink; color:#bf2c9f;',
  64 + getDisable(fields.value?.baseFields?.picUrl, props.id),
  65 + );
61 66 if (item.field === 'picUrl') {
62 67 return {
63 68 field: 'picUrl',
... ... @@ -68,12 +73,15 @@
68 73 span: 24,
69 74 },
70 75 componentProps: {
71   - imgUrl: picUrl,
72   - disabled: getDisable(fields.value?.baseFields?.picUrl),
  76 + imgUrl: picUrl.value,
  77 + disabled: getDisable(get(fields.value, 'picUrl'), props.id),
73 78 onChange: (res) => {
74 79 if (res.file?.response?.data) {
75 80 picUrl.value = res.file?.response?.data?.picUrl;
76 81 smallPicUrl.value = res.file?.response?.data?.smallPicUrl;
  82 +
  83 + setFieldsValue({ picUrl: picUrl.value });
  84 + clearValidate('picUrl');
77 85 }
78 86 },
79 87 },
... ... @@ -94,22 +102,23 @@
94 102 return res;
95 103 });
96 104  
97   - const [registerForm, { setFieldsValue, getFieldsValue, resetFields }] = useForm({
98   - labelWidth: 120,
99   - schemas,
100   - showActionButtonGroup: false,
101   - actionColOptions: {
102   - span: 24,
103   - },
104   - });
  105 + var [registerForm, { setFieldsValue, getFieldsValue, resetFields, validate, clearValidate }] =
  106 + useForm({
  107 + labelWidth: 120,
  108 + schemas,
  109 + showActionButtonGroup: false,
  110 + actionColOptions: {
  111 + span: 24,
  112 + },
  113 + });
105 114  
106 115 return {
107 116 fields,
108   - schemas,
109 117 registerForm,
110 118 getFieldsValue,
111 119 setFieldsValue,
112 120 resetFields,
  121 + validate,
113 122 picUrl,
114 123 smallPicUrl,
115 124 };
... ...
src/views/project/order/component/InspectionFormPanel.vue renamed to src/views/project/order/FormDetail/InspectionFormPanel.vue
... ... @@ -66,3 +66,4 @@
66 66 },
67 67 });
68 68 </script>
  69 +../constant
... ...
src/views/project/order/component/ProfitFormPanel.vue renamed to src/views/project/order/FormDetail/ProfitFormPanel.vue
... ... @@ -43,7 +43,7 @@
43 43 });
44 44 });
45 45  
46   - const [registerForm, { setFieldsValue, getFieldsValue }] = useForm({
  46 + const [registerForm, { setFieldsValue, getFieldsValue, resetFields }] = useForm({
47 47 labelWidth: 120,
48 48 schemas,
49 49 showActionButtonGroup: false,
... ... @@ -51,7 +51,8 @@
51 51 span: 24,
52 52 },
53 53 });
54   - return { fields, schemas, registerForm, getFieldsValue, setFieldsValue };
  54 + return { fields, schemas, registerForm, getFieldsValue, setFieldsValue, resetFields };
55 55 },
56 56 });
57 57 </script>
  58 +../constant
... ...
src/views/project/order/component/ReportFormPanel.vue renamed to src/views/project/order/FormDetail/ReportFormPanel.vue
... ... @@ -67,3 +67,4 @@
67 67 },
68 68 });
69 69 </script>
  70 +../constant
... ...
src/views/project/order/component/TrackFormPanel.vue renamed to src/views/project/order/FormDetail/TrackFormPanel.vue
... ... @@ -48,3 +48,4 @@
48 48 },
49 49 });
50 50 </script>
  51 +../constant
... ...
src/views/project/order/FormDetail/index.vue 0 → 100644
  1 +<template>
  2 + <BasicDrawer
  3 + v-bind="$attrs"
  4 + showFooter
  5 + @register="register"
  6 + @ok="handleSubmit"
  7 + title=""
  8 + :destroyOnClose="true"
  9 + width="28%"
  10 + ref="formRef"
  11 + :isDetail="true"
  12 + :showDetailBack="false"
  13 + okText="保存"
  14 + :mask="false"
  15 + class="z-20"
  16 + >
  17 + <div className="mt-[-16px]">
  18 + <Tabs v-model:activeKey="activeKey">
  19 + <TabPanel key="1" tab="基本信息" :forceRender="true" v-if="role !== ROLE.INSPECT">
  20 + <BaseFormPanel ref="baseFormPanelRef" :id="id" />
  21 + </TabPanel>
  22 + <TabPanel
  23 + key="2"
  24 + tab="利润分析"
  25 + :forceRender="true"
  26 + v-if="!!id && (role === ROLE.ADMIN || role === ROLE.BUSINESS)"
  27 + >
  28 + <ProfitFormPanel ref="profitFormPanelRef" :id="id" />
  29 + </TabPanel>
  30 + <TabPanel
  31 + key="3"
  32 + tab="项目报告书"
  33 + :forceRender="true"
  34 + v-if="!!id && (role === ROLE.ADMIN || role === ROLE.BUSINESS)"
  35 + >
  36 + <ReportFormPanel ref="reportFormPanelRef" :id="id" />
  37 + </TabPanel>
  38 + <TabPanel
  39 + key="4"
  40 + tab="跟单信息"
  41 + :forceRender="true"
  42 + v-if="!!id && (role === ROLE.ADMIN || role === ROLE.TRACKER)"
  43 + >
  44 + <TrackFormPanel ref="trackFormPanelRef" :id="id" />
  45 + </TabPanel>
  46 + <TabPanel
  47 + key="5"
  48 + tab="质检信息"
  49 + :forceRender="true"
  50 + v-if="!!id && (role === ROLE.ADMIN || role === ROLE.INSPECT)"
  51 + >
  52 + <InspectionFormPanel ref="inspectionFormPanelRef" :id="id" />
  53 + </TabPanel>
  54 + </Tabs>
  55 + </div>
  56 + <!-- <template #titleToolbar> <a-button type="primary"> 申请编辑权限 </a-button></template> -->
  57 +
  58 + <!-- <template #appendFooter>
  59 + <a-button type="primary" @click="onGoCheckDetail"> 申请权限</a-button>
  60 + </template> -->
  61 + </BasicDrawer>
  62 +</template>
  63 +<script lang="ts">
  64 + import { computed, defineComponent, reactive, ref, toRaw, watch, toRefs } from 'vue';
  65 + import { FormActionType, FormSchema, useForm } from '/@/components/Form/index';
  66 + import { orderCreate, orderUpdate, uploadImg } from '/@/api/project/order';
  67 + import { BasicDrawer, useDrawerInner } from '/@/components/Drawer';
  68 + import { dateUtil } from '/@/utils/dateUtil';
  69 + import ProfitFormPanel from './ProfitFormPanel.vue';
  70 + import ReportFormPanel from './ReportFormPanel.vue';
  71 + import TrackFormPanel from './TrackFormPanel.vue';
  72 + import InspectionFormPanel from './InspectionFormPanel.vue';
  73 + import BaseFormPanel from './BaseFormPanel.vue';
  74 + import { useUserStoreWithOut } from '/@/store/modules/user';
  75 + import { ROLE } from '../type.d';
  76 +
  77 + import { Tabs } from 'ant-design-vue';
  78 +
  79 + const userStore = useUserStoreWithOut();
  80 +
  81 + const TabPanel = Tabs.TabPane;
  82 +
  83 + export default defineComponent({
  84 + components: {
  85 + BasicDrawer,
  86 + BaseFormPanel,
  87 + Tabs,
  88 + TabPanel,
  89 + ProfitFormPanel,
  90 + ReportFormPanel,
  91 + TrackFormPanel,
  92 + InspectionFormPanel,
  93 + },
  94 +
  95 + props: {
  96 + detailData: {
  97 + type: Object,
  98 + },
  99 + onGoCheckDetail: {
  100 + type: Function,
  101 + },
  102 + },
  103 + emits: ['success'],
  104 + setup(_, { emit }) {
  105 + const activeKey = ref('1');
  106 + const baseFormPanelRef = ref();
  107 + const profitFormPanelRef = ref();
  108 + const reportFormPanelRef = ref();
  109 + const trackFormPanelRef = ref();
  110 + const inspectionFormPanelRef = ref();
  111 +
  112 + const formRef = ref<FormActionType | null>(null);
  113 + const id = ref('');
  114 +
  115 + const role = computed(() => {
  116 + return userStore.getUserInfo?.roleSmallVO?.code;
  117 + });
  118 +
  119 + const picUrl = ref('');
  120 + let fields = reactive({ baseFields: {} });
  121 +
  122 + const [register, { closeDrawer }] = useDrawerInner((data) => {
  123 + if (!data.id) {
  124 + id.value = '';
  125 + picUrl.value = '';
  126 + // 新建
  127 + baseFormPanelRef?.value?.resetFields();
  128 + profitFormPanelRef?.value?.resetFields();
  129 + reportFormPanelRef?.value?.resetFields();
  130 + trackFormPanelRef?.value?.resetFields();
  131 + inspectionFormPanelRef?.value?.resetFields();
  132 +
  133 + return;
  134 + }
  135 + id.value = data.id;
  136 +
  137 + // 方式1
  138 + picUrl.value = data.picUrl;
  139 + data.orderHodTime = data.orderHodTime ? dateUtil(data.orderHodTime) : null;
  140 + data.productionDepartmentConsignTime = data.productionDepartmentConsignTime
  141 + ? dateUtil(data.productionDepartmentConsignTime)
  142 + : null;
  143 +
  144 + fields.baseFields = {
  145 + ...fields.baseFields,
  146 + ...data.lockFields.baseFields,
  147 + };
  148 +
  149 + if (id.value) {
  150 + setTimeout(() => {
  151 + // 基本信息
  152 + if (baseFormPanelRef.value) {
  153 + baseFormPanelRef.value.fields = { ...data.lockFields?.baseFields } || {};
  154 + baseFormPanelRef.value.setFieldsValue({
  155 + ...toRaw(data),
  156 + });
  157 + baseFormPanelRef.value.picUrl = data.picUrl;
  158 + baseFormPanelRef.value.smallPicUrl = data.smallPicUrl;
  159 + }
  160 +
  161 + if (profitFormPanelRef.value) {
  162 + // 利润分析
  163 + profitFormPanelRef.value.fields = { ...data.lockFields?.profitAnalysisFields } || {};
  164 + profitFormPanelRef?.value?.setFieldsValue({
  165 + ...toRaw(data.profitAnalysisInfo),
  166 + });
  167 + }
  168 +
  169 + if (reportFormPanelRef.value) {
  170 + // 项目报告书
  171 + reportFormPanelRef.value.fields = { ...data.lockFields?.reportFields } || {};
  172 + reportFormPanelRef?.value?.setFieldsValue({
  173 + ...toRaw(data.reportInfo),
  174 + });
  175 + }
  176 + if (trackFormPanelRef.value) {
  177 + // 跟单信息
  178 + trackFormPanelRef.value.fields = { ...data.lockFields?.trackStageFields } || {};
  179 + trackFormPanelRef?.value?.setFieldsValue({
  180 + ...toRaw(data.trackStageInfo),
  181 + });
  182 + }
  183 +
  184 + if (inspectionFormPanelRef.value) {
  185 + // 质检信息
  186 + inspectionFormPanelRef.value.fields =
  187 + { ...data.lockFields?.inspectionStageFields } || {};
  188 + inspectionFormPanelRef?.value?.setFieldsValue({
  189 + ...toRaw(data.trackStageInfo),
  190 + });
  191 + }
  192 + }, 100);
  193 + } else {
  194 + baseFormPanelRef.value.resetFields();
  195 + }
  196 + });
  197 +
  198 + const handleSubmit = async () => {
  199 + if (id.value) {
  200 + const forms = { orderId: id.value } as any;
  201 + if (activeKey.value === '1') {
  202 + try {
  203 + await baseFormPanelRef?.value?.validate();
  204 +
  205 + forms.baseInfo = baseFormPanelRef?.value?.getFieldsValue() || {};
  206 + forms.baseInfo = {
  207 + ...forms.baseInfo,
  208 + picUrl: baseFormPanelRef?.value?.picUrl || '',
  209 + smallPicUrl: baseFormPanelRef?.value?.smallPicUrl || '',
  210 + };
  211 + await orderUpdate(forms);
  212 + closeDrawer();
  213 + emit('success', {});
  214 + } catch (error) {
  215 + console.log(error);
  216 + }
  217 + } else {
  218 + if (activeKey.value === '2') {
  219 + forms.profitAnalysisInfo = profitFormPanelRef?.value?.getFieldsValue() || {};
  220 + } else if (activeKey.value === '3') {
  221 + forms.reportInfo = reportFormPanelRef?.value?.getFieldsValue() || {};
  222 + } else if (activeKey.value === '4') {
  223 + forms.trackStageInfo = trackFormPanelRef?.value?.getFieldsValue() || {};
  224 + } else if (activeKey.value === '5') {
  225 + forms.inspectionStageInfo = inspectionFormPanelRef?.value?.getFieldsValue() || {};
  226 + }
  227 + await orderUpdate(forms);
  228 + closeDrawer();
  229 + emit('success', {});
  230 + }
  231 + } else {
  232 + try {
  233 + await baseFormPanelRef?.value?.validate();
  234 +
  235 + // 新建只有基本信息
  236 + const values = baseFormPanelRef?.value?.getFieldsValue() || {};
  237 +
  238 + const forms = {
  239 + baseInfo: {
  240 + ...values,
  241 + picUrl: baseFormPanelRef?.value?.picUrl || '',
  242 + smallPicUrl: baseFormPanelRef?.value?.smallPicUrl || '',
  243 + },
  244 + };
  245 + await orderCreate(forms);
  246 + closeDrawer();
  247 + emit('success', {});
  248 + } catch (error) {
  249 + console.log(error);
  250 + }
  251 + }
  252 + };
  253 + return {
  254 + id,
  255 + profitFormPanelRef,
  256 + reportFormPanelRef,
  257 + trackFormPanelRef,
  258 + baseFormPanelRef,
  259 + inspectionFormPanelRef,
  260 + activeKey,
  261 + formRef,
  262 + ROLE,
  263 + role,
  264 + register,
  265 + handleSubmit,
  266 + };
  267 + },
  268 + });
  269 +</script>
  270 +
  271 +<style scoped>
  272 + .ant-drawer {
  273 + position: fixed;
  274 + z-index: 9999;
  275 + }
  276 +</style>
... ...
src/views/project/order/HistoryDetail.vue
1 1 <template>
2 2 <BasicDrawer
  3 + @register="register"
3 4 v-bind="$attrs"
4 5 title="操作记录"
5 6 width="60%"
6 7 :isDetail="true"
7 8 :showDetailBack="false"
8 9 okText="保存"
  10 + :destroyOnClose="true"
9 11 >
10   - <Tabs animated>
11   - <template v-for="i in achieveList" :key="i.key">
12   - <TabPane :tab="i.name" />
13   - </template>
  12 + <Tabs v-model:activeKey="activeKey" className="my-0">
  13 + <TabPanel :key="1" tab="操作记录" className="w-full">
  14 + <a-list :pagination="pagination1" className="w-full">
  15 + <template v-for="item in list1" :key="item.id">
  16 + <a-list-item class="list">
  17 + <a-list-item-meta>
  18 + <template #avatar> </template>
  19 + <template #title>
  20 + <span>{{ item.userName }}</span>
  21 + </template>
  22 + <template #description>
  23 + <div class="description">
  24 + {{ item.optType }}
  25 + </div>
  26 + <div class="info">
  27 + <div><span>操作时间:</span>{{ formatToDateTime(item.createTime) }}</div>
  28 + </div>
  29 + </template>
  30 + </a-list-item-meta>
  31 + </a-list-item>
  32 + </template>
  33 + </a-list>
  34 + </TabPanel>
  35 + <TabPanel :key="2" tab="审批记录" className="w-full">
  36 + <a-list :pagination="pagination2" className="w-full">
  37 + <template v-for="item in list2" :key="item.id">
  38 + <a-list-item class="list">
  39 + <a-list-item-meta>
  40 + <template #avatar> </template>
  41 + <template #title>
  42 + <span>{{ item.applyUserName }}</span>
  43 + </template>
  44 + <template #description>
  45 + <div class="description">
  46 + {{ item.applyRemark }}
  47 + </div>
  48 + <div class="info">
  49 + <div><span>操作时间:</span>{{ formatToDateTime(item.createTime) }}</div>
  50 + </div>
  51 + </template>
  52 + </a-list-item-meta>
  53 + </a-list-item>
  54 + </template>
  55 + </a-list>
  56 + </TabPanel>
14 57 </Tabs>
15   - <PageWrapper class="prefixCls">
16   - <a-list :pagination="pagination" style="width: 100%">
17   - <template v-for="item in list" :key="item.id">
18   - <a-list-item class="list">
19   - <a-list-item-meta>
20   - <template #avatar>
21   - <!-- <Icon class="icon" v-if="item.icon" :icon="item.icon" :color="item.color" /> -->
22   - </template>
23   - <template #title>
24   - <!-- <span>{{ item.title }}</span> -->
25   - <span>操作人</span>
26   - <!-- <div class="extra" v-if="item.extra">
27   - {{ item.extra }}
28   - </div> -->
29   - </template>
30   - <template #description>
31   - <div class="description">
32   - <!-- {{ item.description }} -->
33   - 干了什么
34   - </div>
35   - <div class="info">
36   - <div><span>操作时间</span>{{ item.datetime }}</div>
37   - </div>
38   - </template>
39   - </a-list-item-meta>
40   - </a-list-item>
41   - </template>
42   - </a-list>
43   - </PageWrapper>
44   - <!-- <template #titleToolbar> <a-button type="primary"> 申请编辑权限 </a-button></template> -->
45 58  
  59 + <!-- <template #titleToolbar> <a-button type="primary"> 申请编辑权限 </a-button></template> -->
46 60 <template #appendFooter>
47 61 <!-- <a-button type="primary" @click="onGoCheckDetail"> 申请权限</a-button> -->
48 62 </template>
49 63 </BasicDrawer>
50 64 </template>
51 65 <script lang="ts">
52   - import { defineComponent } from 'vue';
  66 + import { defineComponent, ref, computed } from 'vue';
53 67 import { Tabs, Progress, Row, Col, List } from 'ant-design-vue';
54   - import { BasicForm, FormSchema, useForm } from '/@/components/Form/index';
55   - import { cardList } from './data';
56   - import { PageWrapper } from '/@/components/Page';
  68 + import { FormSchema, useForm } from '/@/components/Form/index';
57 69  
58 70 import { BasicDrawer, useDrawerInner } from '/@/components/Drawer';
  71 + import { getOrderAuditLog, getOrderOptLog } from '/@/api/project/order';
  72 + import { formatToDateTime } from '/@/utils/dateUtil';
  73 +
  74 + const TabPanel = Tabs.TabPane;
59 75  
60 76 const schemas: FormSchema[] = [
61 77 {
... ... @@ -83,7 +99,7 @@
83 99 const achieveList = [
84 100 {
85 101 key: '1',
86   - name: '编辑记录',
  102 + name: '操作记录',
87 103 },
88 104 {
89 105 key: '2',
... ... @@ -94,10 +110,10 @@
94 110 components: {
95 111 BasicDrawer,
96 112 Tabs,
  113 + TabPanel,
97 114 [List.name]: List,
98 115 [List.Item.name]: List.Item,
99 116 AListItemMeta: List.Item.Meta,
100   - PageWrapper,
101 117 },
102 118 props: {
103 119 onGoCheckDetail: {
... ... @@ -105,45 +121,71 @@
105 121 },
106 122 },
107 123 setup() {
108   - const [registerForm, { setFieldsValue }] = useForm({
109   - labelWidth: 120,
110   - schemas,
111   - showActionButtonGroup: false,
112   - actionColOptions: {
113   - span: 24,
114   - },
115   - });
  124 + const list1 = ref([]);
  125 + const total1 = ref(0);
  126 + const page1 = ref(1);
  127 +
  128 + const list2 = ref([]);
  129 + const total2 = ref(0);
  130 + const page2 = ref(1);
  131 + const orderId = ref('');
  132 + const activeKey = ref(1);
  133 +
  134 + const getOrderOptLogFunc = async (data, index, page) => {
  135 + if (index === 1) {
  136 + const res = await getOrderOptLog({ orderId: data.id, page: page, pageSize: 20 });
  137 + list1.value = res.records;
  138 + total1.value = res.total;
  139 + page1.value = page;
  140 + } else {
  141 + const res = await getOrderAuditLog({ orderId: data.id, page: page, pageSize: 20 });
  142 + list2.value = res.records;
  143 + total2.value = res.total;
  144 + page2.value = page;
  145 + }
  146 + };
116 147 const [register] = useDrawerInner((data) => {
117   - // 方式1
118   - setFieldsValue({
119   - field2: data.data,
120   - field1: data.info,
121   - });
  148 + orderId.value = data.id;
  149 + getOrderOptLogFunc(orderId.value, 1, 1);
  150 + getOrderOptLogFunc(orderId.value, 2, 1);
  151 + });
  152 +
  153 + const pagination1 = computed(() => {
  154 + return {
  155 + show: true,
  156 + pageSize: 20,
  157 + page: page1.value,
  158 + total: total1.value,
  159 + onChange(cur) {
  160 + getOrderOptLogFunc(orderId.value, 1, cur);
  161 + },
  162 + };
  163 + });
  164 +
  165 + const pagination2 = computed(() => {
  166 + return {
  167 + show: true,
  168 + pageSize: 20,
  169 + page: page1.value,
  170 + total: total1.value,
  171 + onChange(cur) {
  172 + getOrderOptLogFunc(orderId.value, 2, cur);
  173 + },
  174 + };
122 175 });
  176 +
123 177 return {
124 178 register,
125 179 schemas,
126   - registerForm,
127 180 achieveList,
128   - list: cardList,
  181 + list1,
  182 + list2,
129 183 prefixCls: 'account-center',
130   -
131   - pagination: {
132   - show: true,
133   - pageSize: 3,
134   - },
  184 + pagination1,
  185 + pagination2,
  186 + activeKey,
  187 + formatToDateTime,
135 188 };
136 189 },
137 190 });
138 191 </script>
139   -
140   -<style lang="less" scoped>
141   - .account-center {
142   - &-bottom {
143   - margin: 0 16px 16px;
144   - padding: 10px;
145   - border-radius: 3px;
146   - background-color: @component-background;
147   - }
148   - }
149   -</style>
... ...
src/views/project/order/ProfitAnalysis.vue
... ... @@ -4,10 +4,10 @@
4 4 destroyOnClose
5 5 @register="register"
6 6 title="利润分析表"
7   - :helpMessage="['提示1', '提示2']"
8 7 @visible-change="handleShow"
9 8 :footer="null"
10 9 >
  10 + <!-- :helpMessage="['提示1', '提示2']" -->
11 11 <!-- <template #insertFooter>
12 12 <a-button type="primary" danger @click="setLines" :disabled="loading">点我更新内容</a-button>
13 13 </template> -->
... ... @@ -19,7 +19,7 @@
19 19 layout="vertical"
20 20 :collapseOptions="{ canExpand: true, helpMessage: 'help me' }"
21 21 :column="2"
22   - :data="mockData"
  22 + :data="info"
23 23 :schema="schema"
24 24 />
25 25 </BasicModal>
... ... @@ -35,33 +35,31 @@
35 35 setup() {
36 36 const loading = ref(true);
37 37 const lines = ref(10);
  38 + const info = ref({});
38 39 const [register, { setModalProps, redoModalHeight }] = useModalInner(async (data) => {
39 40 const orderIds = toRaw(data.data);
40 41 const res = await orderAnalysis({ orderIds });
  42 +
  43 + info.value = {
  44 + ...(res || {}),
  45 + };
41 46 });
42   - const mockData = {
43   - username: '100',
44   - nickName: '100',
45   - age: '123',
46   - phone: '1222',
47   - addr: '2332',
48   - };
49 47  
50 48 const schema: DescItem[] = [
51 49 {
52   - field: 'username',
  50 + field: 'customerTotalPrice',
53 51 label: '客户总金额',
54 52 },
55 53 {
56   - field: 'nickName',
  54 + field: 'packetTotalPrice',
57 55 label: '供应商总价',
58 56 },
59 57 {
60   - field: 'phone',
  58 + field: 'productionDepartmentTotalPrice',
61 59 label: '包装费用',
62 60 },
63 61 {
64   - field: 'addr',
  62 + field: 'profitRate',
65 63 label: '总利润率',
66 64 },
67 65 ];
... ... @@ -88,7 +86,7 @@
88 86 function setLines() {
89 87 lines.value = Math.round(Math.random() * 20 + 10);
90 88 }
91   - return { register, loading, handleShow, lines, setLines, mockData, schema };
  89 + return { register, loading, handleShow, lines, setLines, info, schema };
92 90 },
93 91 });
94 92 </script>
... ...
src/views/project/order/data.tsx deleted 100644 → 0
1   -export const cardList = (() => {
2   - const result: any[] = [];
3   - for (let i = 0; i < 6; i++) {
4   - result.push({
5   - id: i,
6   - title: 'Vben Admin',
7   - description: '基于Vue Next, TypeScript, Ant Design Vue实现的一套完整的企业级后台管理系统',
8   - datetime: '2020-11-26 17:39',
9   - extra: '编辑',
10   - icon: 'logos:vue',
11   - color: '#1890ff',
12   - author: 'Vben',
13   - percent: 20 * (i + 1),
14   - });
15   - }
16   - return result;
17   -})();
src/views/project/order/index.vue
... ... @@ -44,13 +44,6 @@
44 44 },
45 45 ]"
46 46 :dropDownActions="[
47   - // {
48   - // label: '启用',
49   - // popConfirm: {
50   - // title: '是否启用?',
51   - // confirm: handleOpen.bind(null, record),
52   - // },
53   - // },
54 47 {
55 48 label: '历史记录',
56 49 onClick: handleHistory.bind(null, record),
... ... @@ -94,22 +87,24 @@
94 87 import { FormOutlined } from '@ant-design/icons-vue';
95 88 import HeaderCell from '/@/components/Table/src/components/HeaderCell.vue';
96 89 import { Alert } from 'ant-design-vue';
97   - import { SELECT_FIELD_COLUMNS } from './selectData';
98 90  
99 91 import { useDrawer } from '/@/components/Drawer';
100 92 import ProfitAnalysis from './ProfitAnalysis.vue';
101 93 import { useModal } from '/@/components/Modal';
102 94  
103   - import { getFormConfig, getOrderColumns } from './tableData';
104   - import FormDetail from './FormDetail.vue';
  95 + import { getFormConfig, getOrderColumns, SELECT_FIELD_COLUMNS } from './tableData';
  96 + import FormDetail from './FormDetail/index.vue';
105 97 import CheckDetail from './CheckDetail.vue';
106 98 import HistoryDetail from './HistoryDetail.vue';
107 99 import FieldDetail from './FieldDetail.vue';
108 100 import { createImgPreview } from '/@/components/Preview/index';
109 101 import { getOrderList, orderExport } from '/@/api/project/order';
110 102 import { useOrderStoreWithOut } from '/@/store/modules/order';
  103 + import { keyBy, reduce } from 'lodash-es';
  104 + import { useUserStoreWithOut } from '/@/store/modules/user';
111 105  
112 106 const orderStore = useOrderStoreWithOut();
  107 + const userStore = useUserStoreWithOut();
113 108  
114 109 export default defineComponent({
115 110 components: {
... ... @@ -132,26 +127,20 @@
132 127 const [historyDetailRegister, { openDrawer: openHistoryDetailDrawer }] = useDrawer();
133 128 const [fieldDetailRegister, { openDrawer: openFieldDetailDrawer }] = useDrawer();
134 129  
  130 + const user = userStore.getUserInfo;
  131 +
135 132 const [checkModalRegister, { openDrawer: openCheckDetailDrawer }] = useDrawer();
136 133 onMounted(async () => {
137 134 await orderStore.getDict();
138 135 });
139 136  
140   - const [registerTable, { getForm, reload }] = useTable({
  137 + const [registerTable, { getForm, reload, getColumns }] = useTable({
141 138 api: getOrderList,
142 139 title: '订单列表',
143   - // api: () => {
144   - // const res = demoListApi();
145   - // total.value = res.data.total;
146   - // return res;
147   - // // },
148   - // pagination: {
149   - // total: 30,
150   - // },
151 140 pagination: {
152 141 total: 60,
153 142 },
154   - columns: getOrderColumns(),
  143 + columns: getOrderColumns(user?.roleSmallVO?.code),
155 144 useSearchForm: true,
156 145 formConfig: getFormConfig(),
157 146 showTableSetting: true,
... ... @@ -161,8 +150,8 @@
161 150 rowSelection: {
162 151 type: 'checkbox',
163 152 selectedRowKeys: checkedKeys,
164   - onSelect: onSelect,
165   - onSelectAll: onSelectAll,
  153 + onSelect,
  154 + onSelectAll,
166 155 },
167 156 actionColumn: {
168 157 width: 160,
... ... @@ -216,8 +205,6 @@
216 205 return false;
217 206 }
218 207  
219   - function handleOpen(record: Recordable) {}
220   -
221 208 function handleProfitModal() {
222 209 openProfitModal(true, {
223 210 data: checkedKeys.value,
... ... @@ -246,7 +233,66 @@
246 233 }
247 234  
248 235 async function handleExport() {
249   - await orderExport();
  236 + const columns = getColumns();
  237 + const colObj = keyBy(columns, 'dataIndex');
  238 + const {
  239 + trackStageInfo,
  240 + reportInfo,
  241 + profitAnalysisInfo,
  242 + inspectionStageInfo,
  243 + ...baseFields
  244 + } = colObj;
  245 +
  246 + for (const key in baseFields) {
  247 + baseFields[key] = 'selected';
  248 + }
  249 + delete baseFields.action;
  250 +
  251 + const fieldVO = {
  252 + baseFields,
  253 + profitAnalysisFields: profitAnalysisInfo?.children?.length
  254 + ? reduce(
  255 + profitAnalysisInfo.children,
  256 + (result, item) => {
  257 + result[item.dataIndex] = 'selected';
  258 + return result;
  259 + },
  260 + {},
  261 + )
  262 + : {},
  263 + reportFields: reportInfo?.children?.length
  264 + ? reduce(
  265 + reportInfo.children,
  266 + (result, item) => {
  267 + result[item.dataIndex] = 'selected';
  268 + return result;
  269 + },
  270 + {},
  271 + )
  272 + : {},
  273 + trackStageFields: trackStageInfo?.children?.length
  274 + ? reduce(
  275 + trackStageInfo.children,
  276 + (result, item) => {
  277 + result[item.dataIndex] = 'selected';
  278 + return result;
  279 + },
  280 + {},
  281 + )
  282 + : {},
  283 + inspectionStageFields: inspectionStageInfo?.children?.length
  284 + ? reduce(
  285 + inspectionStageInfo.children,
  286 + (result, item) => {
  287 + result[item.dataIndex] = 'selected';
  288 + return result;
  289 + },
  290 + {},
  291 + )
  292 + : {},
  293 + };
  294 +
  295 + await orderExport({ fieldVO });
250 296 }
251 297  
252 298 const handleFormSuccess = () => {
... ... @@ -255,7 +301,6 @@
255 301  
256 302 return {
257 303 SELECT_FIELD_COLUMNS,
258   -
259 304 fieldDetailRegister,
260 305 profitModalRegister,
261 306 historyDetailRegister,
... ... @@ -267,7 +312,6 @@
267 312 onSelect,
268 313 handleEdit,
269 314 handleCheck,
270   - handleOpen,
271 315 onSelectAll,
272 316 tooltipVisible,
273 317 handleFieldVisible,
... ... @@ -297,3 +341,4 @@
297 341 height: 100px;
298 342 }
299 343 </style>
  344 +./constant
... ...
src/views/project/order/selectData.tsx deleted 100644 → 0
1   -export const SELECT_FIELD_COLUMNS = [
2   - 'projectNo',
3   - 'customerCode',
4   - 'innerNo',
5   - 'poColor',
6   - 'cnColor',
7   - 'productStyle',
8   - 'outboundType',
9   - 'packetType',
10   - 'midCheckResult',
11   - 'endCheckResult',
12   -];
src/views/project/order/tableData.tsx
  1 +import { ROLE } from './type.d';
1 2 import { useOrderInfo } from '/@/hooks/component/order';
2 3 import { useOrderStoreWithOut } from '/@/store/modules/order';
3 4  
4   -export function getOrderColumns() {
5   - return [
6   - {
7   - title: '客户编码',
8   - width: 150,
9   - dataIndex: 'customerCode',
10   - },
11   - {
12   - title: '项目号',
13   - width: 150,
14   - dataIndex: 'projectNo',
15   - },
16   - {
17   - title: '生产科',
18   - width: 150,
19   - dataIndex: 'productionDepartment',
20   - },
21   - {
22   - title: '内部编号',
23   - width: 150,
24   - dataIndex: 'innerNo',
25   - },
26   - {
27   - title: '客户po号',
28   - width: 150,
29   - dataIndex: 'customerPo',
30   - },
  5 +// 角色
  6 +// 业务员- 查看all,编辑-利润分析,报告书
  7 +// 跟单员- 查看利润分析(单价和总金额),跟单,质检,编辑
  8 +// 质检员- 查看跟单,质检,编辑质检
31 9  
32   - {
33   - title: '客户STYLE',
34   - width: 150,
35   - dataIndex: 'customerStyle',
36   - },
  10 +// 可选择的列
  11 +export const SELECT_FIELD_COLUMNS = [
  12 + 'projectNo',
  13 + 'customerCode',
  14 + 'innerNo',
  15 + 'poColor',
  16 + 'cnColor',
  17 + 'productStyle',
  18 + 'outboundType',
  19 + 'packetType',
  20 + 'midCheckResult',
  21 + 'endCheckResult',
  22 +];
37 23  
38   - {
39   - title: 'Modelo(REFERENCE)',
40   - width: 150,
41   - dataIndex: 'modeleLo',
42   - },
  24 +/**
  25 + *
  26 + * @returns 订单列表数据
  27 + */
  28 +const ORDER_LIST_BASE_FIELDS = [
  29 + {
  30 + title: '客户编码',
  31 + width: 150,
  32 + dataIndex: 'customerCode',
  33 + },
  34 + {
  35 + title: '项目号',
  36 + width: 150,
  37 + dataIndex: 'projectNo',
  38 + },
  39 + {
  40 + title: '生产科',
  41 + width: 150,
  42 + dataIndex: 'productionDepartment',
  43 + },
  44 + {
  45 + title: '内部编号',
  46 + width: 150,
  47 + dataIndex: 'innerNo',
  48 + },
  49 + {
  50 + title: '客户po号',
  51 + width: 150,
  52 + dataIndex: 'customerPo',
  53 + },
43 54  
44   - {
45   - title: 'COLLECTION (style description)',
46   - width: 150,
47   - dataIndex: 'collection',
48   - },
  55 + {
  56 + title: '客户STYLE',
  57 + width: 150,
  58 + dataIndex: 'customerStyle',
  59 + },
49 60  
50   - {
51   - title: 'PO COLOR',
52   - width: 150,
53   - dataIndex: 'poColor',
54   - },
55   - {
56   - title: '颜色中文',
57   - width: 150,
58   - dataIndex: 'cnColor',
59   - },
  61 + {
  62 + title: 'Modelo(REFERENCE)',
  63 + width: 150,
  64 + dataIndex: 'modeleLo',
  65 + },
60 66  
61   - {
62   - title: '图片',
63   - width: 150,
64   - dataIndex: 'picUrl',
65   - },
66   - {
67   - title: '生产要求',
68   - width: 150,
69   - dataIndex: 'productionComment',
70   - },
71   - {
72   - title: '数量',
73   - width: 150,
74   - dataIndex: 'orderCount',
75   - },
76   - {
77   - title: '订单成分',
78   - width: 150,
79   - dataIndex: 'orderComposition',
80   - },
81   - {
82   - title: '款式类型',
83   - width: 150,
84   - dataIndex: 'productStyle',
85   - },
86   - {
87   - title: '生成科拖货时间',
88   - width: 150,
89   - dataIndex: 'productionDepartmentConsignTime',
90   - },
91   - {
92   - title: '订单上HOD时间',
93   - width: 150,
94   - dataIndex: 'orderHodTime',
95   - },
  67 + {
  68 + title: 'COLLECTION (style description)',
  69 + width: 150,
  70 + dataIndex: 'collection',
  71 + },
96 72  
97   - {
98   - title: '出库类型',
99   - width: 150,
100   - dataIndex: 'outboundType',
101   - },
102   - {
103   - title: '包装类型',
104   - width: 150,
105   - dataIndex: 'packetType',
106   - },
107   - // {
108   - // title: 'id',
109   - // width: 150,
110   - // dataIndex: 'id',
111   - // },
112   - {
113   - title: '项目完成报告信息',
114   - width: 150,
115   - dataIndex: 'reportInfo',
116   - children: [
117   - {
118   - title: '想法来源',
119   - width: 150,
120   - dataIndex: 'reportInfo.ideaSource',
121   - customRender: (column) => {
122   - const { record } = column || {};
123   - return record?.reportInfo?.ideaSource;
124   - },
  73 + {
  74 + title: 'PO COLOR',
  75 + width: 150,
  76 + dataIndex: 'poColor',
  77 + },
  78 + {
  79 + title: '颜色中文',
  80 + width: 150,
  81 + dataIndex: 'cnColor',
  82 + },
  83 +
  84 + {
  85 + title: '图片',
  86 + width: 150,
  87 + dataIndex: 'picUrl',
  88 + },
  89 + {
  90 + title: '生产要求',
  91 + width: 150,
  92 + dataIndex: 'productionComment',
  93 + },
  94 + {
  95 + title: '数量',
  96 + width: 150,
  97 + dataIndex: 'orderCount',
  98 + },
  99 + {
  100 + title: '订单成分',
  101 + width: 150,
  102 + dataIndex: 'orderComposition',
  103 + },
  104 + {
  105 + title: '款式类型',
  106 + width: 150,
  107 + dataIndex: 'productStyle',
  108 + },
  109 + {
  110 + title: '生成科拖货时间',
  111 + width: 150,
  112 + dataIndex: 'productionDepartmentConsignTime',
  113 + },
  114 + {
  115 + title: '订单上HOD时间',
  116 + width: 150,
  117 + dataIndex: 'orderHodTime',
  118 + },
  119 + {
  120 + title: '出库类型',
  121 + width: 150,
  122 + dataIndex: 'outboundType',
  123 + },
  124 + {
  125 + title: '包装类型',
  126 + width: 150,
  127 + dataIndex: 'packetType',
  128 + },
  129 +];
  130 +
  131 +const ORDER_LIST_REPORT_FIELDS = [
  132 + {
  133 + title: '项目完成报告信息',
  134 + width: 150,
  135 + dataIndex: 'reportInfo',
  136 + children: [
  137 + {
  138 + title: '想法来源',
  139 + width: 150,
  140 + dataIndex: 'reportInfo.ideaSource',
  141 + customRender: (column) => {
  142 + const { record } = column || {};
  143 + return record?.reportInfo?.ideaSource;
125 144 },
126   - {
127   - title: '手工初型',
128   - width: 150,
129   - dataIndex: 'reportInfo.manualPreform',
130   - customRender: (column) => {
131   - const { record } = column || {};
132   - return record?.reportInfo?.manualPreform;
133   - },
  145 + },
  146 + {
  147 + title: '手工初型',
  148 + width: 150,
  149 + dataIndex: 'reportInfo.manualPreform',
  150 + customRender: (column) => {
  151 + const { record } = column || {};
  152 + return record?.reportInfo?.manualPreform;
134 153 },
135   - {
136   - title: '想法和手工比例分配',
137   - width: 150,
138   - dataIndex: 'reportInfo.ideaManualRate',
139   - customRender: (column) => {
140   - const { record } = column || {};
141   - return record?.reportInfo?.ideaManualRate;
142   - },
  154 + },
  155 + {
  156 + title: '想法和手工比例分配',
  157 + width: 150,
  158 + dataIndex: 'reportInfo.ideaManualRate',
  159 + customRender: (column) => {
  160 + const { record } = column || {};
  161 + return record?.reportInfo?.ideaManualRate;
143 162 },
144   - ],
145   - },
146   - {
147   - title: '利润分析信息',
148   - width: 150,
149   - dataIndex: 'profitAnalysisInfo',
150   - children: [
151   - {
152   - title: '客户单价',
153   - width: 150,
154   - dataIndex: 'customerPrice',
155   - customRender: (column) => {
156   - const { record } = column || {};
157   - return record?.profitAnalysisInfo?.customerPrice;
158   - },
  163 + },
  164 + ],
  165 + },
  166 +];
  167 +
  168 +const ORDER_LIST_PROFIT_FIELDS = [
  169 + {
  170 + title: '利润分析信息',
  171 + width: 150,
  172 + dataIndex: 'profitAnalysisInfo',
  173 + children: [
  174 + {
  175 + title: '客户单价',
  176 + width: 150,
  177 + dataIndex: 'customerPrice',
  178 + customRender: (column) => {
  179 + const { record } = column || {};
  180 + return record?.profitAnalysisInfo?.customerPrice;
159 181 },
160   - {
161   - title: '客户总价',
162   - width: 150,
163   - dataIndex: 'customerTotalPrice',
164   - customRender: (column) => {
165   - const { record } = column || {};
166   - return record?.profitAnalysisInfo?.customerTotalPrice;
167   - },
  182 + },
  183 + {
  184 + title: '客户总价',
  185 + width: 150,
  186 + dataIndex: 'customerTotalPrice',
  187 + customRender: (column) => {
  188 + const { record } = column || {};
  189 + return record?.profitAnalysisInfo?.customerTotalPrice;
168 190 },
169   - {
170   - title: '生成科单价',
171   - width: 150,
172   - dataIndex: 'productionDepartmentPrice',
173   - customRender: (column) => {
174   - const { record } = column || {};
175   - return record?.profitAnalysisInfo?.productionDepartmentPrice;
176   - },
  191 + },
  192 + {
  193 + title: '生成科单价',
  194 + width: 150,
  195 + dataIndex: 'productionDepartmentPrice',
  196 + customRender: (column) => {
  197 + const { record } = column || {};
  198 + return record?.profitAnalysisInfo?.productionDepartmentPrice;
177 199 },
178   - {
179   - title: '包装费用',
180   - width: 150,
181   - dataIndex: 'packetPrice',
182   - customRender: (column) => {
183   - const { record } = column || {};
184   - return record?.profitAnalysisInfo?.packetPrice;
185   - },
  200 + },
  201 + {
  202 + title: '包装费用',
  203 + width: 150,
  204 + dataIndex: 'packetPrice',
  205 + customRender: (column) => {
  206 + const { record } = column || {};
  207 + return record?.profitAnalysisInfo?.packetPrice;
186 208 },
187   - {
188   - title: '包装费用合计',
189   - width: 150,
190   - dataIndex: 'packetTotalPrice',
191   - customRender: (column) => {
192   - const { record } = column || {};
193   - return record?.profitAnalysisInfo?.packetTotalPrice;
194   - },
  209 + },
  210 + {
  211 + title: '包装费用合计',
  212 + width: 150,
  213 + dataIndex: 'packetTotalPrice',
  214 + customRender: (column) => {
  215 + const { record } = column || {};
  216 + return record?.profitAnalysisInfo?.packetTotalPrice;
195 217 },
196   - {
197   - title: '汇率',
198   - width: 150,
199   - dataIndex: 'exchangeRate',
200   - customRender: (column) => {
201   - const { record } = column || {};
202   - return record?.profitAnalysisInfo?.exchangeRate;
203   - },
  218 + },
  219 + {
  220 + title: '汇率',
  221 + width: 150,
  222 + dataIndex: 'exchangeRate',
  223 + customRender: (column) => {
  224 + const { record } = column || {};
  225 + return record?.profitAnalysisInfo?.exchangeRate;
204 226 },
205   - {
206   - title: '利润率',
207   - width: 150,
208   - dataIndex: 'profitRate',
209   - customRender: (column) => {
210   - const { record } = column || {};
211   - return record?.profitAnalysisInfo?.profitRate;
212   - },
  227 + },
  228 + {
  229 + title: '利润率',
  230 + width: 150,
  231 + dataIndex: 'profitRate',
  232 + customRender: (column) => {
  233 + const { record } = column || {};
  234 + return record?.profitAnalysisInfo?.profitRate;
213 235 },
214   - ],
215   - },
216   - {
217   - title: '跟单信息',
218   - width: 150,
219   - dataIndex: 'trackStageInfo',
220   - children: [
221   - {
222   - title: 'pp date',
223   - width: 150,
224   - dataIndex: 'ppTime',
225   - customRender: (column) => {
226   - const { record } = column || {};
227   - return record?.trackStageInfo?.ppTime;
228   - },
  236 + },
  237 + ],
  238 + },
  239 +];
  240 +
  241 +const ORDER_LIST_TRACK_FIELDS = [
  242 + {
  243 + title: '跟单信息',
  244 + width: 150,
  245 + dataIndex: 'trackStageInfo',
  246 + children: [
  247 + {
  248 + title: 'pp date',
  249 + width: 150,
  250 + dataIndex: 'ppTime',
  251 + customRender: (column) => {
  252 + const { record } = column || {};
  253 + return record?.trackStageInfo?.ppTime;
229 254 },
230   - {
231   - title: 'pp样品确认意见',
232   - width: 150,
233   - dataIndex: 'ppConfirmResult',
234   - customRender: (column) => {
235   - const { record } = column || {};
236   - return record?.trackStageInfo?.ppConfirmResult;
237   - },
  255 + },
  256 + {
  257 + title: 'pp样品确认意见',
  258 + width: 150,
  259 + dataIndex: 'ppConfirmResult',
  260 + customRender: (column) => {
  261 + const { record } = column || {};
  262 + return record?.trackStageInfo?.ppConfirmResult;
238 263 },
239   - {
240   - title: 'EXTRA,SHOWROOM,ONLINE sample发送时间',
241   - width: 250,
242   - dataIndex: 'esoSampleSendTime',
243   - customRender: (column) => {
244   - const { record } = column || {};
245   - return record?.trackStageInfo?.esoSampleSendTime;
246   - },
  264 + },
  265 + {
  266 + title: 'EXTRA,SHOWROOM,ONLINE sample发送时间',
  267 + width: 250,
  268 + dataIndex: 'esoSampleSendTime',
  269 + customRender: (column) => {
  270 + const { record } = column || {};
  271 + return record?.trackStageInfo?.esoSampleSendTime;
247 272 },
248   - {
249   - title: 'shippment sample 发送时间',
250   - width: 150,
251   - dataIndex: 'shippmentSampleSendTime',
252   - customRender: (column) => {
253   - const { record } = column || {};
254   - return record?.trackStageInfo?.shippmentSampleSendTime;
255   - },
  273 + },
  274 + {
  275 + title: 'shippment sample 发送时间',
  276 + width: 150,
  277 + dataIndex: 'shippmentSampleSendTime',
  278 + customRender: (column) => {
  279 + const { record } = column || {};
  280 + return record?.trackStageInfo?.shippmentSampleSendTime;
256 281 },
257   - {
258   - title: 'shipment sample确认意见',
259   - width: 150,
260   - dataIndex: 'shippmentSampleConfirmResult',
261   - customRender: (column) => {
262   - const { record } = column || {};
263   - return record?.trackStageInfo?.shippmentSampleConfirmResult;
264   - },
  282 + },
  283 + {
  284 + title: 'shipment sample确认意见',
  285 + width: 150,
  286 + dataIndex: 'shippmentSampleConfirmResult',
  287 + customRender: (column) => {
  288 + const { record } = column || {};
  289 + return record?.trackStageInfo?.shippmentSampleConfirmResult;
265 290 },
266   - {
267   - title: '自测通过时间',
268   - width: 150,
269   - dataIndex: 'selfTestPassTime',
270   - customRender: (column) => {
271   - const { record } = column || {};
272   - return record?.trackStageInfo?.selfTestPassTime;
273   - },
  291 + },
  292 + {
  293 + title: '自测通过时间',
  294 + width: 150,
  295 + dataIndex: 'selfTestPassTime',
  296 + customRender: (column) => {
  297 + const { record } = column || {};
  298 + return record?.trackStageInfo?.selfTestPassTime;
274 299 },
275   - {
276   - title: 'Aitex测试发送时间',
277   - width: 150,
278   - dataIndex: 'aitexTestSendTime',
279   - customRender: (column) => {
280   - const { record } = column || {};
281   - return record?.trackStageInfo?.aitexTestSendTime;
282   - },
  300 + },
  301 + {
  302 + title: 'Aitex测试发送时间',
  303 + width: 150,
  304 + dataIndex: 'aitexTestSendTime',
  305 + customRender: (column) => {
  306 + const { record } = column || {};
  307 + return record?.trackStageInfo?.aitexTestSendTime;
283 308 },
284   - {
285   - title: 'Aitex测试结果',
286   - width: 150,
287   - dataIndex: 'aitexTestFinishResult',
288   - customRender: (column) => {
289   - const { record } = column || {};
290   - return record?.trackStageInfo?.aitexTestFinishResult;
291   - },
  309 + },
  310 + {
  311 + title: 'Aitex测试结果',
  312 + width: 150,
  313 + dataIndex: 'aitexTestFinishResult',
  314 + customRender: (column) => {
  315 + const { record } = column || {};
  316 + return record?.trackStageInfo?.aitexTestFinishResult;
292 317 },
293   - {
294   - title: 'SGS测试发送时间',
295   - width: 150,
296   - dataIndex: 'sgsTestSendTime',
297   - customRender: (column) => {
298   - const { record } = column || {};
299   - return record?.trackStageInfo?.sgsTestSendTime;
300   - },
  318 + },
  319 + {
  320 + title: 'SGS测试发送时间',
  321 + width: 150,
  322 + dataIndex: 'sgsTestSendTime',
  323 + customRender: (column) => {
  324 + const { record } = column || {};
  325 + return record?.trackStageInfo?.sgsTestSendTime;
301 326 },
302   - {
303   - title: 'SGS测试结果',
304   - width: 150,
305   - dataIndex: 'sgsTestFinishResult',
306   - customRender: (column) => {
307   - const { record } = column || {};
308   - return record?.trackStageInfo?.sgsTestFinishResult;
309   - },
  327 + },
  328 + {
  329 + title: 'SGS测试结果',
  330 + width: 150,
  331 + dataIndex: 'sgsTestFinishResult',
  332 + customRender: (column) => {
  333 + const { record } = column || {};
  334 + return record?.trackStageInfo?.sgsTestFinishResult;
310 335 },
311   - {
312   - title: 'Barcode sticker arrival time',
313   - width: 150,
314   - dataIndex: 'barcodeStickerArrivalTime',
315   - customRender: (column) => {
316   - const { record } = column || {};
317   - return record?.trackStageInfo?.barcodeStickerArrivalTime;
318   - },
  336 + },
  337 + {
  338 + title: 'Barcode sticker arrival time',
  339 + width: 150,
  340 + dataIndex: 'barcodeStickerArrivalTime',
  341 + customRender: (column) => {
  342 + const { record } = column || {};
  343 + return record?.trackStageInfo?.barcodeStickerArrivalTime;
319 344 },
320   - {
321   - title: '最晚包材到货时间',
322   - width: 150,
323   - dataIndex: 'latestArrivalTime',
324   - customRender: (column) => {
325   - const { record } = column || {};
326   - return record?.trackStageInfo?.latestArrivalTime;
327   - },
  345 + },
  346 + {
  347 + title: '最晚包材到货时间',
  348 + width: 150,
  349 + dataIndex: 'latestArrivalTime',
  350 + customRender: (column) => {
  351 + const { record } = column || {};
  352 + return record?.trackStageInfo?.latestArrivalTime;
328 353 },
329   - {
330   - title: '最晚订舱+报关资料时间',
331   - width: 150,
332   - dataIndex: 'latestBkTime',
333   - customRender: (column) => {
334   - const { record } = column || {};
335   - return record?.trackStageInfo?.latestBkTime;
336   - },
  354 + },
  355 + {
  356 + title: '最晚订舱+报关资料时间',
  357 + width: 150,
  358 + dataIndex: 'latestBkTime',
  359 + customRender: (column) => {
  360 + const { record } = column || {};
  361 + return record?.trackStageInfo?.latestBkTime;
337 362 },
338   - ],
339   - },
340   - {
341   - title: '质检信息',
342   - width: 150,
343   - dataIndex: 'inspectionStageInfo',
344   - children: [
345   - {
346   - title: 'midCheckApplyTime',
347   - width: 150,
348   - label: '中期验货申请时间',
349   - dataIndex: 'midCheckApplyTime',
350   - customRender: (column) => {
351   - const { record } = column || {};
352   - return record?.inspectionStageInfo?.midCheckApplyTime;
353   - },
  363 + },
  364 + ],
  365 + },
  366 +];
  367 +
  368 +const ORDER_LIST_INSPECT_FIELDS = [
  369 + {
  370 + title: '质检信息',
  371 + width: 150,
  372 + dataIndex: 'inspectionStageInfo',
  373 + children: [
  374 + {
  375 + title: 'midCheckApplyTime',
  376 + width: 150,
  377 + label: '中期验货申请时间',
  378 + dataIndex: 'midCheckApplyTime',
  379 + customRender: (column) => {
  380 + const { record } = column || {};
  381 + return record?.inspectionStageInfo?.midCheckApplyTime;
354 382 },
355   - {
356   - title: '中期验货(功能性-拉力/跌落等、外观性-颜色/规格等、耐久性-烤厅等)',
357   - width: 300,
358   - dataIndex: 'midCheckComment',
359   - customRender: (column) => {
360   - const { record } = column || {};
361   - return record?.inspectionStageInfo?.midCheckComment;
362   - },
  383 + },
  384 + {
  385 + title: '中期验货(功能性-拉力/跌落等、外观性-颜色/规格等、耐久性-烤厅等)',
  386 + width: 300,
  387 + dataIndex: 'midCheckComment',
  388 + customRender: (column) => {
  389 + const { record } = column || {};
  390 + return record?.inspectionStageInfo?.midCheckComment;
363 391 },
364   - {
365   - title: '中期验货结果PASS / FAIL',
366   - width: 150,
367   - dataIndex: 'midCheckResult',
368   - customRender: (column) => {
369   - const { record } = column || {};
370   - return record?.inspectionStageInfo?.midCheckResult;
371   - },
  392 + },
  393 + {
  394 + title: '中期验货结果PASS / FAIL',
  395 + width: 150,
  396 + dataIndex: 'midCheckResult',
  397 + customRender: (column) => {
  398 + const { record } = column || {};
  399 + return record?.inspectionStageInfo?.midCheckResult;
372 400 },
373   - {
374   - title: '尾期验货申请时间',
375   - width: 150,
376   - dataIndex: 'endCheckApplyTime',
377   - customRender: (column) => {
378   - const { record } = column || {};
379   - return record?.inspectionStageInfo?.endCheckApplyTime;
380   - },
  401 + },
  402 + {
  403 + title: '尾期验货申请时间',
  404 + width: 150,
  405 + dataIndex: 'endCheckApplyTime',
  406 + customRender: (column) => {
  407 + const { record } = column || {};
  408 + return record?.inspectionStageInfo?.endCheckApplyTime;
381 409 },
382   - {
383   - title: '长度/规格',
384   - width: 150,
385   - dataIndex: 'specification',
386   - customRender: (column) => {
387   - const { record } = column || {};
388   - return record?.inspectionStageInfo?.specification;
389   - },
  410 + },
  411 + {
  412 + title: '长度/规格',
  413 + width: 150,
  414 + dataIndex: 'specification',
  415 + customRender: (column) => {
  416 + const { record } = column || {};
  417 + return record?.inspectionStageInfo?.specification;
390 418 },
391   - {
392   - title: '功能性不良',
393   - width: 150,
394   - dataIndex: 'functionality',
395   - customRender: (column) => {
396   - const { record } = column || {};
397   - return record?.inspectionStageInfo?.functionality;
398   - },
  419 + },
  420 + {
  421 + title: '功能性不良',
  422 + width: 150,
  423 + dataIndex: 'functionality',
  424 + customRender: (column) => {
  425 + const { record } = column || {};
  426 + return record?.inspectionStageInfo?.functionality;
399 427 },
400   - {
401   - title: '电镀不良',
402   - width: 150,
403   - dataIndex: 'electroplate',
404   - customRender: (column) => {
405   - const { record } = column || {};
406   - return record?.inspectionStageInfo?.electroplate;
407   - },
  428 + },
  429 + {
  430 + title: '电镀不良',
  431 + width: 150,
  432 + dataIndex: 'electroplate',
  433 + customRender: (column) => {
  434 + const { record } = column || {};
  435 + return record?.inspectionStageInfo?.electroplate;
408 436 },
409   - {
410   - title: '不良1',
411   - width: 150,
412   - dataIndex: 'value1',
413   - customRender: (column) => {
414   - const { record } = column || {};
415   - return record?.inspectionStageInfo?.value1;
416   - },
  437 + },
  438 + {
  439 + title: '不良1',
  440 + width: 150,
  441 + dataIndex: 'value1',
  442 + customRender: (column) => {
  443 + const { record } = column || {};
  444 + return record?.inspectionStageInfo?.value1;
417 445 },
  446 + },
418 447  
419   - {
420   - title: '不良2',
421   - width: 150,
422   - dataIndex: 'value2',
423   - customRender: (column) => {
424   - const { record } = column || {};
425   - return record?.inspectionStageInfo?.value2;
426   - },
  448 + {
  449 + title: '不良2',
  450 + width: 150,
  451 + dataIndex: 'value2',
  452 + customRender: (column) => {
  453 + const { record } = column || {};
  454 + return record?.inspectionStageInfo?.value2;
427 455 },
428   - {
429   - title: '其他不良3',
430   - width: 150,
431   - dataIndex: 'value3',
432   - customRender: (column) => {
433   - const { record } = column || {};
434   - return record?.inspectionStageInfo?.value3;
435   - },
  456 + },
  457 + {
  458 + title: '其他不良3',
  459 + width: 150,
  460 + dataIndex: 'value3',
  461 + customRender: (column) => {
  462 + const { record } = column || {};
  463 + return record?.inspectionStageInfo?.value3;
436 464 },
437   - {
438   - title: '包装:卡片、条码、箱贴,箱单 ',
439   - width: 150,
440   - dataIndex: 'boxPacket',
441   - customRender: (column) => {
442   - const { record } = column || {};
443   - return record?.inspectionStageInfo?.boxPacket;
444   - },
  465 + },
  466 + {
  467 + title: '包装:卡片、条码、箱贴,箱单 ',
  468 + width: 150,
  469 + dataIndex: 'boxPacket',
  470 + customRender: (column) => {
  471 + const { record } = column || {};
  472 + return record?.inspectionStageInfo?.boxPacket;
445 473 },
446   - {
447   - title: '尾期验货结果PASS / FAIL',
448   - width: 150,
449   - dataIndex: 'endCheckResult',
450   - customRender: (column) => {
451   - const { record } = column || {};
452   - return record?.inspectionStageInfo?.endCheckResult;
453   - },
  474 + },
  475 + {
  476 + title: '尾期验货结果PASS / FAIL',
  477 + width: 150,
  478 + dataIndex: 'endCheckResult',
  479 + customRender: (column) => {
  480 + const { record } = column || {};
  481 + return record?.inspectionStageInfo?.endCheckResult;
454 482 },
455   - ],
456   - },
457   - ];
  483 + },
  484 + ],
  485 + },
  486 +];
  487 +export function getOrderColumns(role: ROLE) {
  488 + if (role === ROLE.ADMIN || role === ROLE.BUSINESS) {
  489 + return [
  490 + ...ORDER_LIST_BASE_FIELDS,
  491 + ...ORDER_LIST_PROFIT_FIELDS,
  492 + ...ORDER_LIST_REPORT_FIELDS,
  493 + ...ORDER_LIST_TRACK_FIELDS,
  494 + ...ORDER_LIST_INSPECT_FIELDS,
  495 + ];
  496 + }
  497 +
  498 + if (role === ROLE.TRACKER) {
  499 + return [
  500 + ...ORDER_LIST_BASE_FIELDS,
  501 + ...ORDER_LIST_PROFIT_FIELDS.map((item) => {
  502 + const children = item.children.filter(
  503 + (k) => k.dataIndex !== 'exchangeRate' && k.dataIndex !== 'profitRate',
  504 + );
  505 + item.children = children;
  506 + return item;
  507 + }),
  508 + ...ORDER_LIST_TRACK_FIELDS,
  509 + ...ORDER_LIST_INSPECT_FIELDS,
  510 + ];
  511 + }
  512 +
  513 + if (role === ROLE.INSPECT) {
  514 + return [...ORDER_LIST_BASE_FIELDS, ...ORDER_LIST_TRACK_FIELDS, ...ORDER_LIST_INSPECT_FIELDS];
  515 + }
  516 +
  517 + return [];
458 518 }
  519 +
459 520 // 基本信息
460 521 export const FIELDS_BASE_INFO = [
461 522 {
... ... @@ -583,20 +644,20 @@ export const FIELDS_REPORT_INFO = [
583 644 component: 'Select',
584 645 optionField: 'ideaSource',
585 646 label: '想法来源',
586   - rules: [{ required: true }],
  647 + // rules: [{ required: true }],
587 648 },
588 649 {
589 650 field: 'manualPreform',
590 651 component: 'Select',
591 652 optionField: 'manualPreform',
592 653 label: '手工初型',
593   - rules: [{ required: true }],
  654 + // rules: [{ required: true }],
594 655 },
595 656 {
596 657 field: 'ideaManualRate',
597 658 component: 'Input',
598 659 label: '想法和手工比例分配',
599   - rules: [{ required: true }],
  660 + // rules: [{ required: true }],
600 661 },
601 662 ];
602 663  
... ... @@ -731,13 +792,19 @@ export const FIELDS_PROFIT_INFO = [
731 792 field: 'customerPrice',
732 793 component: 'InputNumber',
733 794 label: '客户单价',
734   - rules: [{ required: true }],
  795 + // rules: [{ required: true }],
735 796 },
  797 + // {
  798 + // field: 'customerTotalPrice',
  799 + // component: 'InputNumber',
  800 + // label: '客户总价',
  801 + // rules: [{ required: true }],
  802 + // },
736 803 {
737 804 field: 'customerCurrency',
738 805 component: 'Select',
739   - label: '客户单价单位',
740   - rules: [{ required: true }],
  806 + label: '客户单价货币单位',
  807 + // rules: [{ required: true }],
741 808 componentProps: {
742 809 options: [
743 810 { label: '$', value: '$' },
... ... @@ -746,15 +813,15 @@ export const FIELDS_PROFIT_INFO = [
746 813 },
747 814 },
748 815 {
749   - field: 'customerTotalPrice',
  816 + field: 'productionDepartmentPrice',
750 817 component: 'InputNumber',
751   - label: '客户总价',
752   - rules: [{ required: true }],
  818 + label: '生成科单价',
  819 + // rules: [{ required: true }],
753 820 },
754 821 {
755   - field: 'customerTotalCurrency',
  822 + field: 'productionDepartmentCurrency',
756 823 component: 'Select',
757   - label: '客户总价单位',
  824 + label: '生成科货币单位',
758 825 rules: [{ required: true }],
759 826 componentProps: {
760 827 options: [
... ... @@ -763,35 +830,29 @@ export const FIELDS_PROFIT_INFO = [
763 830 ],
764 831 },
765 832 },
766   - {
767   - field: 'productionDepartmentPrice',
768   - component: 'InputNumber',
769   - label: '生成科单价',
770   - rules: [{ required: true }],
771   - },
772 833 // {
773 834 // field: 'productionDepartmentPrice',
774 835 // component: 'InputNumber',
775 836 // label: '生成科总价¥',
776 837 // rules: [{ required: true }],
777 838 // },
  839 + {
  840 + label: '包装费用',
  841 + component: 'InputNumber',
  842 + field: 'packetPrice',
  843 + // rules: [{ required: true }],
  844 + },
778 845 // {
779   - // label: '包装费用$',
  846 + // label: '包装费用合计',
780 847 // component: 'InputNumber',
781   - // field: 'packetPrice',
  848 + // field: 'packetTotalPrice',
782 849 // rules: [{ required: true }],
783 850 // },
784 851 {
785   - label: '包装费用合计',
786   - component: 'InputNumber',
787   - field: 'packetTotalPrice',
788   - rules: [{ required: true }],
789   - },
790   - {
791   - label: '包装费用合计单位',
  852 + label: '包装费用货币单位',
792 853 component: 'Select',
793 854 field: 'packetCurrency',
794   - rules: [{ required: true }],
  855 + // rules: [{ required: true }],
795 856 componentProps: {
796 857 options: [
797 858 { label: '$', value: '$' },
... ... @@ -803,7 +864,7 @@ export const FIELDS_PROFIT_INFO = [
803 864 label: '汇率',
804 865 component: 'InputNumber',
805 866 field: 'exchangeRate',
806   - rules: [{ required: true }],
  867 + // rules: [{ required: true }],
807 868 },
808 869 // {
809 870 // label: '利润率',
... ... @@ -819,75 +880,75 @@ export const FIELDS_INSPECTION_INFO = [
819 880 field: 'midCheckApplyTime',
820 881 component: 'DatePicker',
821 882 label: '中期验货申请时间',
822   - rules: [{ required: true }],
  883 + // rules: [{ required: true }],
823 884 },
824 885 {
825 886 field: 'midCheckComment',
826 887 component: 'Input',
827 888 label: '中期验货(功能性-拉力/跌落等、外观性-颜色/规格等、耐久性-烤厅等)',
828   - rules: [{ required: true }],
  889 + // rules: [{ required: true }],
829 890 },
830 891 {
831 892 field: 'midCheckResult',
832 893 component: 'Select',
833 894 optionField: 'midCheckResult',
834 895 label: '中期验货结果PASS / FAIL',
835   - rules: [{ required: true }],
  896 + // rules: [{ required: true }],
836 897 },
837 898 {
838 899 field: 'endCheckApplyTime',
839 900 component: 'DatePicker',
840 901 label: '尾期验货申请时间',
841   - rules: [{ required: true }],
  902 + // rules: [{ required: true }],
842 903 },
843 904 {
844 905 field: 'specification',
845 906 component: 'Input',
846 907 label: '长度/规格',
847   - rules: [{ required: true }],
  908 + // rules: [{ required: true }],
848 909 },
849 910 {
850 911 field: 'functionality',
851 912 component: 'Input',
852 913 label: '功能性不良',
853   - rules: [{ required: true }],
  914 + // rules: [{ required: true }],
854 915 },
855 916 {
856 917 field: 'electroplate',
857 918 component: 'Input',
858 919 label: '电镀不良',
859   - rules: [{ required: true }],
  920 + // rules: [{ required: true }],
860 921 },
861 922 {
862 923 field: 'value1',
863 924 component: 'Input',
864 925 label: '不良1',
865   - rules: [{ required: true }],
  926 + // rules: [{ required: true }],
866 927 },
867 928 {
868 929 field: 'value2',
869 930 component: 'Input',
870 931 label: '不良2',
871   - rules: [{ required: true }],
  932 + // rules: [{ required: true }],
872 933 },
873 934 {
874 935 field: 'value3',
875 936 component: 'Input',
876 937 label: '其他不良3',
877   - rules: [{ required: true }],
  938 + // rules: [{ required: true }],
878 939 },
879 940 {
880 941 field: 'boxPacket',
881 942 component: 'Input',
882 943 label: '包装:卡片、条码、箱贴,箱单',
883   - rules: [{ required: true }],
  944 + // rules: [{ required: true }],
884 945 },
885 946 {
886 947 field: 'endCheckResult',
887 948 component: 'Select',
888 949 label: '尾期验货结果PASS / FAIL',
889 950 optionField: 'endCheckResult',
890   - rules: [{ required: true }],
  951 + // rules: [{ required: true }],
891 952 },
892 953 ];
893 954  
... ...
src/views/project/order/type.d.ts 0 → 100644
  1 +export enum ROLE {
  2 + ADMIN = 'admin', // 超管
  3 + BUSINESS = 'business_user', // 业务员
  4 + TRACKER = 'tracker_user', // 跟单员
  5 + INSPECT = 'inspect_user', // 质检员
  6 +}
... ...
src/views/project/order/utils.ts 0 → 100644
  1 +export const isAuthShow = (role: string) => {};
... ...
src/views/sys/login/LoginForm.vue
... ... @@ -171,16 +171,16 @@
171 171 if (userInfo) {
172 172 notification.success({
173 173 message: t('sys.login.loginSuccessTitle'),
174   - description: `${t('sys.login.loginSuccessDesc')}: ${userInfo.realName}`,
  174 + description: `${t('sys.login.loginSuccessDesc')}: ${userInfo.nickName}`,
175 175 duration: 3,
176 176 });
177 177 }
178 178 } catch (error) {
179   - createErrorModal({
180   - title: t('sys.api.errorTip'),
181   - content: (error as unknown as Error).message || t('sys.api.networkExceptionMsg'),
182   - getContainer: () => document.body.querySelector(`.${prefixCls}`) || document.body,
183   - });
  179 + // createErrorModal({
  180 + // title: t('sys.api.errorTip'),
  181 + // content: (error as unknown as Error).message || t('sys.api.networkExceptionMsg'),
  182 + // getContainer: () => document.body.querySelector(`.${prefixCls}`) || document.body,
  183 + // });
184 184 } finally {
185 185 loading.value = false;
186 186 }
... ...