8954b107 by lxs

分级分类任务更新

1 parent 6181cbd2
...@@ -31,7 +31,7 @@ router.beforeEach(async (to, from, next) => { ...@@ -31,7 +31,7 @@ router.beforeEach(async (to, from, next) => {
31 return; 31 return;
32 } 32 }
33 // 是否已登录 33 // 是否已登录
34 if (userStore.isLogin) { 34 if (1) {
35 // 是否已根据权限动态生成并注册路由 35 // 是否已根据权限动态生成并注册路由
36 if (routeStore.isGenerate) { 36 if (routeStore.isGenerate) {
37 // 导航栏如果不是 single 模式,则需要根据 path 定位主导航的选中状态 37 // 导航栏如果不是 single 模式,则需要根据 path 定位主导航的选中状态
......
...@@ -24,6 +24,27 @@ const routes: RouteRecordRaw[] = [ ...@@ -24,6 +24,27 @@ const routes: RouteRecordRaw[] = [
24 }, 24 },
25 }, 25 },
26 { 26 {
27 path: 'task-edit',
28 name: 'taskEdit',
29 component: () => import('@/views/data_inventory/taskEdit.vue'),
30 meta: {
31 title: '编辑-',
32 sidebar: false,
33 breadcrumb: false,
34 cache: true,
35 reuse: true,
36 editPage: true,
37 activeMenu: '/data-inventory/classify-grade-manage/template-config'
38 },
39 beforeEnter: (to, from) => {
40 if (to.query.name) {
41 to.meta.title = `编辑-${to.query.name}`;
42 } else {
43 to.meta.title = '分类分级任务-新增';
44 }
45 }
46 },
47 {
27 path: 'template-config', 48 path: 'template-config',
28 name: 'templateConfig', 49 name: 'templateConfig',
29 component: () => import('@/views/data_inventory/templateConfig.vue'), 50 component: () => import('@/views/data_inventory/templateConfig.vue'),
......
...@@ -3,14 +3,243 @@ ...@@ -3,14 +3,243 @@
3 </route> 3 </route>
4 4
5 <script lang="ts" setup name="taskConfig"> 5 <script lang="ts" setup name="taskConfig">
6 import { ref ,onMounted} from "vue"; 6 import { ref, onMounted } from "vue";
7 import { useRouter, useRoute } from "vue-router";
8 import useUserStore from "@/store/modules/user";
9 import { ElMessage, ElMessageBox } from "element-plus";
10
11 import useDataAssetStore from "@/store/modules/dataAsset";
12 import { getListingList, listingDelete, listingUpdateStatus, filterVal, getParamsDataList } from "@/api/modules/dataProduct";
13 import { TableColumnWidth } from '@/utils/enum';
14
15 import Table from "@/components/Table/index.vue";
16
17 const { proxy } = getCurrentInstance() as any;
18 const router = useRouter();
19 const userStore = useUserStore();
20 const userData = JSON.parse(userStore.userData);
21 const assetStore = useDataAssetStore();
22 const page = ref({
23 limit: 50,
24 curr: 1,
25 sizes: [
26 { label: "10", value: 10 },
27 { label: "50", value: 50 },
28 { label: "100", value: 100 },
29 { label: "150", value: 150 },
30 { label: "200", value: 200 },
31 ],
32 });
33 const searchItemValue: any = ref({});
34 const currTableData: any = ref({});
35 const tableInfo = ref({
36 id: "mapping-table",
37 fields: [
38 { label: "序号", type: "index", width: 56, align: "center", fixed: "left" },
39 { label: "任务名称", field: "damCode", width: 96 },
40 { label: "目录名称", field: "damName", width: 120 },
41 { label: "分类分级模板", field: "damTypeName", width: 200 },
42 { label: "元数据", field: "damTypeName", width: 200 },
43 // {
44 // label: "是否公共数据", field: "isPublicData", width: 120, getName: (scope) => {
45 // return scope.row.isPublicData == 'Y' ? '是' : '否';
46 // }
47 // },
48 {
49 label: "执行状态", field: "approveState", width: TableColumnWidth.STATE, align: 'center', type: "tag", getName: (scope) => {
50 return filterVal(scope.row.approveState, 'approveState');
51 }
52 },
53 { label: "任务修改人", field: "damName", width: 120 },
54 { label: "修改时间", field: "updateTime", width: TableColumnWidth.DATETIME },
55 { label: "确认次数", field: "damName", width: 96, align: 'right' },
56 { label: "结果确认人", field: "damName", width: 120 },
57 { label: "确认时间", field: "updateTime", width: TableColumnWidth.DATETIME },
58 {
59 label: "结果状态", field: "approveState", width: TableColumnWidth.STATE, align: 'center', type: "tag", getName: (scope) => {
60 return filterVal(scope.row.approveState, 'approveState');
61 }
62 },
63 ],
64 loading: false,
65 data: [],
66 page: {
67 type: "normal",
68 rows: 0,
69 ...page.value,
70 },
71 actionInfo: {
72 label: "操作",
73 type: "btn",
74 width: 200,
75 btns: (scope) => {
76 let row = scope.row, btnArr: any = [];
77 if (row.approveState == 'Y') {
78 if (row.listingStatus == 'Y') {
79 btnArr.splice(0, 0, { label: "详情", value: "detail" });
80 } else {
81 btnArr.splice(0, 0, { label: "编辑", value: "edit" }, { label: "详情", value: "detail" }, { label: "删除", value: "delete" });
82 }
83 } else {
84 if (row.approveState == 'A') {
85 btnArr.splice(0, 0, { label: "详情", value: "detail" });
86 } else {
87 btnArr.splice(0, 0, { label: "编辑", value: "edit" }, { label: "详情", value: "detail" }, { label: "删除", value: "delete" });
88 }
89 }
90 return btnArr;
91 },
92 },
93 });
94
95 const getTableData = () => {
96 tableInfo.value.loading = true;
97 getListingList(
98 Object.assign({}, searchItemValue.value, {
99 pageIndex: page.value.curr,
100 pageSize: page.value.limit,
101 })
102 ).then((res: any) => {
103 tableInfo.value.loading = false;
104 tableInfo.value.data = res.data.records || [];
105 tableInfo.value.page.curr = res.data.pageIndex;
106 tableInfo.value.page.limit = res.data.pageSize;
107 tableInfo.value.page.rows = res.data.totalRows;
108 })
109 .catch((res) => {
110 tableInfo.value.loading = false;
111 });
112 };
113
114 const tableBtnClick = (scope, btn) => {
115 const type = btn.value;
116 const row = scope.row;
117 currTableData.value = row;
118 if (type == "detail" || type === "edit") {
119 toPath(type);
120 } else if (type === "delete") {
121 open("此操作将永久删除,是否继续?", "warning");
122 }
123 };
124
125 const toPath = (type) => {
126 if (type == 'add') {
127 router.push({
128 name: "taskEdit",
129 query: {
130 type
131 },
132 });
133 } else {
134 router.push({
135 name: "taskEdit",
136 query: {
137 guid: currTableData.value.guid,
138 name: currTableData.value.damName,
139 type
140 },
141 });
142 }
143 }
144
145 const tablePageChange = (info) => {
146 page.value.curr = Number(info.curr);
147 page.value.limit = Number(info.limit);
148 tableInfo.value.page.limit = page.value.limit;
149 tableInfo.value.page.curr = page.value.curr;
150 getTableData();
151 };
152
153 const open = (msg, type, isBatch = false) => {
154 ElMessageBox.confirm(msg, "提示", {
155 confirmButtonText: "确定",
156 cancelButtonText: "取消",
157 type: type,
158 }).then(() => {
159 const guids = [currTableData.value.guid];
160 listingDelete(guids).then((res: any) => {
161 if (res.code == proxy.$passCode) {
162 getFirstPageData();
163 ElMessage({
164 type: "success",
165 message: "删除成功",
166 });
167 } else {
168 ElMessage({
169 type: "error",
170 message: res.msg,
171 });
172 }
173 }).catch((res) => {
174 tableInfo.value.loading = false;
175 });
176 });
177 };
178
179 const getFirstPageData = () => {
180 page.value.curr = 1
181 tableInfo.value.page.curr = 1;
182 getTableData();
183 }
184
185 onActivated(() => {
186 if (assetStore.isRefresh) {//如果是首次加载,则不需要调用
187 getFirstPageData();
188 assetStore.set(false);
189 }
190 })
191
192 onBeforeMount(() => {
193
194 })
7 195
8 </script> 196 </script>
9 197
10 <template> 198 <template>
11 <div>分类分级任务</div> 199 <div class="container_wrap" v-if="tableInfo.data.length">
200 <div class="table_tool_wrap">
201 <div class="table_title">分类分级任务</div>
202 </div>
203 <div class="table_panel_wrap">
204 <Table :tableInfo="tableInfo" @tableBtnClick="tableBtnClick" @tablePageChange="tablePageChange" />
205 </div>
206 </div>
207 <div class="container_wrap" v-else>
208 <div class="card-noData">
209 <img src="@/assets/images/no-data.png" :style="{ width: '96px', height: '96px' }" />
210 <p>暂无分类分级任务,<span class="text_btn" @click="toPath('add')">去新建</span></p>
211 </div>
212 </div>
12 </template> 213 </template>
13 214
14 <style lang="scss" scoped> 215 <style scoped lang="scss">
216 .table_tool_wrap {
217 width: 100%;
218 height: 40px !important;
219 padding: 0 8px;
220
221 .table_title {
222 height: 40px;
223 line-height: 40px;
224 font-weight: 600;
225 font-size: 16px;
226 color: #212121;
227 }
228 }
229
230 .table_panel_wrap {
231 width: 100%;
232 height: calc(100% - 40px);
233 padding: 0px 8px 0;
234 }
15 235
236 .card-noData {
237 position: absolute;
238 top: 50%;
239 left: 50%;
240 transform: translate(-50%, -50%);
241 display: flex;
242 flex-direction: column;
243 align-items: center;
244 }
16 </style> 245 </style>
......
1 <route lang="yaml">
2 name: taskEdit //分类分级任务编辑
3 </route>
4
5 <script lang="ts" setup name="taskEdit">
6 import { ref, onMounted } from "vue";
7 import { useRouter, useRoute } from "vue-router";
8 import useUserStore from "@/store/modules/user";
9 import { ElMessage, ElMessageBox } from "element-plus";
10 import { Search } from "@element-plus/icons-vue";
11 import useDataAssetStore from "@/store/modules/dataAsset";
12 import { getListingList, listingDelete, listingUpdateStatus, filterVal, getParamsDataList } from "@/api/modules/dataProduct";
13 import { TableColumnWidth } from '@/utils/enum';
14
15 import Table from "@/components/Table/index.vue";
16
17 const { proxy } = getCurrentInstance() as any;
18 const router = useRouter();
19 const userStore = useUserStore();
20 const userData = JSON.parse(userStore.userData);
21 const assetStore = useDataAssetStore();
22
23 const step = ref(0);
24 const selectIndex = ref(0);
25 const asideSearchInput = ref("");
26 const permissionList: any = ref([])
27 const listLoading = ref(false)
28 const currpermissionList: any = ref([])
29 const templateInfo = ref({})
30 const treeIndex: any = ref({})
31
32 const treeInfo = ref({
33 id: "data-pickup-tree",
34 filter: true,
35 queryValue: "",
36 queryPlaceholder: "输入组织名称搜索",
37 props: {
38 label: "organisationName",
39 value: "guid",
40 },
41 nodeKey: 'guid',
42 expandedKey: [],
43 expandOnNodeClick: false,
44 data: [],
45 });
46
47 const page = ref({
48 limit: 50,
49 curr: 1,
50 sizes: [
51 { label: "10", value: 10 },
52 { label: "50", value: 50 },
53 { label: "100", value: 100 },
54 { label: "150", value: 150 },
55 { label: "200", value: 200 },
56 ],
57 });
58 const searchItemValue: any = ref({});
59 const currTableData: any = ref({});
60 const tableInfo = ref({
61 id: "mapping-table",
62 fields: [
63 { label: "序号", type: "index", width: 56, align: "center", fixed: "left" },
64 { label: "标签", field: "damCode", width: 96 },
65 { label: "分类", field: "damTypeName", width: 380 },
66 { label: "分级", field: "damName", width: 55 },
67 { label: "规则", field: "damTypeName", width: 380 },
68 ],
69 loading: false,
70 data: [],
71 page: {
72 type: "normal",
73 rows: 0,
74 ...page.value,
75 },
76 actionInfo: {
77 label: "操作",
78 type: "btn",
79 width: 200,
80 btns: (scope) => {
81 let row = scope.row, btnArr: any = [];
82 if (row.approveState == 'Y') {
83 if (row.listingStatus == 'Y') {
84 btnArr.splice(0, 0, { label: "详情", value: "detail" });
85 } else {
86 btnArr.splice(0, 0, { label: "编辑", value: "edit" }, { label: "详情", value: "detail" }, { label: "删除", value: "delete" });
87 }
88 } else {
89 if (row.approveState == 'A') {
90 btnArr.splice(0, 0, { label: "详情", value: "detail" });
91 } else {
92 btnArr.splice(0, 0, { label: "编辑", value: "edit" }, { label: "详情", value: "detail" }, { label: "删除", value: "delete" });
93 }
94 }
95 return btnArr;
96 },
97 },
98 });
99
100 const nodeClick = (data) => {
101 treeIndex.value = data
102 toSearch({})
103 }
104
105 const getTableData = () => {
106 tableInfo.value.loading = true;
107 getListingList(
108 Object.assign({}, searchItemValue.value, {
109 pageIndex: page.value.curr,
110 pageSize: page.value.limit,
111 })
112 ).then((res: any) => {
113 tableInfo.value.loading = false;
114 tableInfo.value.data = res.data.records || [];
115 tableInfo.value.page.curr = res.data.pageIndex;
116 tableInfo.value.page.limit = res.data.pageSize;
117 tableInfo.value.page.rows = res.data.totalRows;
118 })
119 .catch((res) => {
120 tableInfo.value.loading = false;
121 });
122 };
123
124 const tableBtnClick = (scope, btn) => {
125 const type = btn.value;
126 const row = scope.row;
127 currTableData.value = row;
128 if (type == "detail" || type === "edit") {
129 toPath(type);
130 } else if (type === "delete") {
131 open("此操作将永久删除,是否继续?", "warning");
132 }
133 };
134
135 const toPath = (type) => {
136 if (type == 'add') {
137 router.push({
138 name: "productListingDetail",
139 query: {
140 type
141 },
142 });
143 } else {
144 router.push({
145 name: "productListingDetail",
146 query: {
147 guid: currTableData.value.guid,
148 name: currTableData.value.damName,
149 type
150 },
151 });
152 }
153 }
154
155 const tablePageChange = (info) => {
156 page.value.curr = Number(info.curr);
157 page.value.limit = Number(info.limit);
158 tableInfo.value.page.limit = page.value.limit;
159 tableInfo.value.page.curr = page.value.curr;
160 getTableData();
161 };
162
163 const open = (msg, type, isBatch = false) => {
164 ElMessageBox.confirm(msg, "提示", {
165 confirmButtonText: "确定",
166 cancelButtonText: "取消",
167 type: type,
168 }).then(() => {
169 const guids = [currTableData.value.guid];
170 listingDelete(guids).then((res: any) => {
171 if (res.code == proxy.$passCode) {
172 getFirstPageData();
173 ElMessage({
174 type: "success",
175 message: "删除成功",
176 });
177 } else {
178 ElMessage({
179 type: "error",
180 message: res.msg,
181 });
182 }
183 }).catch((res) => {
184 tableInfo.value.loading = false;
185 });
186 });
187 };
188
189 const getFirstPageData = () => {
190 page.value.curr = 1
191 tableInfo.value.page.curr = 1;
192 getTableData();
193 }
194
195 const querySearch = (queryString: string) => {
196 listLoading.value = true
197 const results = queryString
198 ? currpermissionList.value.filter(item => item.dataPermissionName.indexOf(queryString) > -1)
199 : permissionList.value;
200 currpermissionList.value = results
201 listLoading.value = false
202 }
203
204 const btnClick = async (btn, bType = null) => {
205 const type = btn.value;
206 };
207
208 onActivated(() => {
209
210 })
211
212 onBeforeMount(() => {
213
214 })
215
216 </script>
217
218 <template>
219 <div class="container_wrap full flex">
220 <div class="aside_wrap">
221 <div class="aside_title">选择分类分级模板</div>
222 <div class="aside_search">
223 <el-input v-model.trim="asideSearchInput" placeholder="请输入关键字" :prefix-icon="Search" clearable
224 @change="querySearch" />
225 </div>
226 <div class="aside_list" v-loading="listLoading" v-infinite-scroll="handleScroll">
227 <div class="list_item" v-for="(item, i) in currpermissionList" :class="{ active: selectIndex == i }"
228 @click="selectIndex = i; changTable();" v-preReClick>{{ item.dataPermissionName }}</div>
229 </div>
230 </div>
231 <div class="main_wrap">
232 <div class="template_panel">
233 <div class="panel_title">
234 <p class="title_text">{{ templateInfo.title }}</p>
235 <div class="title_desc">
236 <p class="desc_group" v-for="desc in templateInfo.descGroup">
237 <span class="desc_label">{{ desc.label }}</span>
238 <span class="desc_value">{{ desc.value }}</span>
239 </p>
240 </div>
241 </div>
242 <div class="panel_tags">
243 <el-tag v-for="tag in templateInfo.tags" :type="tag.type">{{ tag.name }}</el-tag>
244 </div>
245 <p class="panel_desc">{{ templateInfo.desc }}</p>
246 </div>
247 <div>
248 <div class="box_left aside_wrap">
249 <div class="aside_title">组织列表</div>
250 <Tree :treeInfo="treeInfo" @nodeClick="nodeClick" />
251 </div>
252 <div class="box_right">
253 <div class="panel_title">人员信息</div>
254 <div class="table_panel_wrap">
255 <Table :tableInfo="tableInfo" @tableBtnClick="tableBtnClick" @tablePageChange="tablePageChange" />
256 </div>
257 </div>
258 </div>
259 <div class="tool_btns">
260 <div class="btns">
261 <el-button @click="btnClick({ value: 'cancel' })" v-if="step == 0">取消</el-button>
262 <el-button @click="btnClick({ value: 'prev' })" v-if="step == 1">上一步</el-button>
263 <el-button type="primary" @click="btnClick({ value: 'next' })" v-if="step == 0">下一步</el-button>
264 <el-button type="primary" @click="btnClick({ value: 'next' })" v-if="step == 1">后台运行</el-button>
265 </div>
266 </div>
267 </div>
268 </div>
269 </template>
270
271 <style scoped lang="scss">
272 .table_tool_wrap {
273 width: 100%;
274 height: 40px !important;
275 padding: 0 8px;
276
277 .table_title {
278 height: 40px;
279 line-height: 40px;
280 font-weight: 600;
281 font-size: 16px;
282 color: #212121;
283 }
284 }
285
286 .table_panel_wrap {
287 width: 100%;
288 height: calc(100% - 40px);
289 padding: 0px 8px 0;
290 }
291
292 .card-noData {
293 position: absolute;
294 top: 50%;
295 left: 50%;
296 transform: translate(-50%, -50%);
297 display: flex;
298 flex-direction: column;
299 align-items: center;
300 }
301 </style>
Styling with Markdown is supported
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!