From 3e25f86345d869ed6c1485ab2c1f5fbc27b26dc5 Mon Sep 17 00:00:00 2001
From: gaoshp <291585735@qq.com>
Date: 星期五, 04 七月 2025 19:12:19 +0800
Subject: [PATCH] 添加程序

---
 src/api/flow/todolist.js                       |   31 +++++
 src/views/flow/components/TodolistRightTop.vue |   86 ++++++++++++++
 src/views/flow/components/TodolistLeft.vue     |  162 +++++++++++++++++++++++++++
 src/views/flow/todolist.vue                    |   57 +++++++-
 4 files changed, 325 insertions(+), 11 deletions(-)

diff --git a/src/api/flow/todolist.js b/src/api/flow/todolist.js
index 9b8a7d3..bc743b3 100644
--- a/src/api/flow/todolist.js
+++ b/src/api/flow/todolist.js
@@ -1,7 +1,7 @@
 /*
  * @Date: 2025-06-12 22:38:05
  * @LastEditors: gaoshp
- * @LastEditTime: 2025-06-17 21:22:59
+ * @LastEditTime: 2025-07-01 23:38:48
  * @FilePath: /mdmweb/src/api/flow/todolist.js
  */
 import request from '@/axios';
@@ -29,4 +29,33 @@
     method: 'get',
     params,
   });
+}
+export const getAppList = (current, size, params) => {
+  return request({
+    url: '/blade-mdm/program/ncfile/programpickpage',
+    method: 'get',
+    params: {
+      ...params,
+      current,
+      size,
+    },
+  })
+}
+export const getSelectedAppList = processInstanceId => {
+  return request({
+    url: '/blade-mdm/program/ncfile/list-by-process',
+    method: 'get',
+    params: {
+      processInstanceId
+    },
+  })
+}
+export const getContent = id => {
+  return request({
+    url: '/blade-mdm/program/ncfile/content',
+    method: 'get',
+    params: {
+      id
+    },
+  })
 }
\ No newline at end of file
diff --git a/src/views/flow/components/TodolistLeft.vue b/src/views/flow/components/TodolistLeft.vue
new file mode 100644
index 0000000..9201af8
--- /dev/null
+++ b/src/views/flow/components/TodolistLeft.vue
@@ -0,0 +1,162 @@
+<!--
+ * @Date: 2025-07-01 20:45:15
+ * @LastEditors: gaoshp
+ * @LastEditTime: 2025-07-01 23:50:05
+ * @FilePath: /mdmweb/src/views/flow/components/TodolistLeft.vue
+-->
+<template>
+    <basic-container>
+        <div class="tool" v-show="row.taskDefinitionKey === 'programmingTask'">
+            <el-button type="primary" @click="addApp">娣诲姞绋嬪簭</el-button>
+        </div>
+        <el-table :data="tableData" border @row-click="showContent">
+            <el-table-column prop="code" label="缂栧彿">
+            </el-table-column>
+            <el-table-column prop="name" label="绋嬪簭鍚嶇О">
+            </el-table-column>
+            <el-table-column prop="name" label="宸ュ簭鍚嶇О">
+            </el-table-column>
+        </el-table>
+        <h4>绋嬪簭鍐呭</h4>
+        <div v-html="appContent" class="app-content">
+        </div>
+        <el-dialog title="绋嬪簭閫夋嫨" v-model="appDialog" width="50%" v-if="appDialog">
+            <avue-crud :option="optionApp" v-model="form" v-model:page="page" ref="crud" :data="appData"
+                @current-change="currentChange" @size-change="sizeChange"
+                @on-load="onLoad" @selection-change="selectionChange">
+                <template #search="{ }"></template>
+                <template #search-menu="{ }"></template>
+            </avue-crud>
+            <div slot="footer" class="dialog-footer">
+                <el-button @click="appDialog = false">鍙� 娑�</el-button>
+                <el-button type="primary" @click="add">纭� 瀹�</el-button>
+            </div>
+        </el-dialog>
+    </basic-container>
+</template>
+
+<script>
+import { getAppList,getSelectedAppList,getContent } from '@/api/flow/todolist';
+export default {
+    props: {
+        row: {
+            type: Object,
+        }
+    },
+    data() {
+        return {
+            tableData: [],//宸查�夌▼搴�
+            appContent: '',//绋嬪簭鍐呭
+            appDialog: false,
+            form: {},
+            page: {
+                page: 1,
+                size: 10,
+                total: 0,
+            },
+            appData: [],
+            selectionList: [],
+            optionApp: {
+                menu: false,
+                gridBtn: false,
+                addBtn: false,
+                editBtn: false,
+                delBtn: false,
+                columnBtn: false,
+                refreshBtn: false,
+                searchShowBtn: false,
+                tip: false,
+                searchShow: false,
+                dialogWidth: '60%',
+                border: true,
+                index: true,
+                selection: true,
+                menuWidth: 100,
+                dialogClickModal: false,
+                column: [
+                    {
+                        label: 'machineCode',
+                        prop: '璁惧缂栧彿',
+                    },
+                    {
+                        label: '绋嬪簭鍚嶇О',
+                        prop: 'name',
+                    },
+                    {
+                        label: '宸ュ簭鍚嶇О',
+                        prop: 'processName',
+                    },
+                ],
+            },
+        }
+    },
+    mounted() {
+        console.log(this.row,'row')
+        getSelectedAppList(this.row.processInstanceId).then(res => {
+            if (res.data.code !== 200) {
+                this.$message.error('鑾峰彇宸查�夌▼搴忓け璐�');
+                return;
+            } else {
+                this.appData = res.data
+            }
+            this.$emit('selection-change',this.tableData)
+        })
+        this.onLoad(this.page);
+    },
+    methods: {
+        addApp() {
+            this.appDialog = true;
+        },
+        currentChange(currentPage) {
+            this.page.currentPage = currentPage;
+        },
+        sizeChange(pageSize) {
+            this.page.pageSize = pageSize;
+        },
+        selectionChange(list) {
+            this.selectionList = list;
+        },
+        onLoad(page, params = {}) {
+            const query = {}
+            getAppList(page.currentPage, page.pageSize, Object.assign(query, params)).then(res => {
+                const data = res.data.data;
+                this.page.total = data.total;
+                this.appData = data.records;
+            });
+        },
+        add () {
+            console.log('add')
+            this.tableData = this.tableData.concat(this.selectionList.filter(item => {
+                return !this.tableData.some(existingItem => existingItem.id === item.id);
+            }));
+            this.appDialog = false;
+            this.$emit('selection-change',this.tableData)
+        },
+        showContent (row, column, event) {
+            getContent(row.id).then(res => {
+                if(res.data.code === 200) {
+                    this.appContent = res.data.data
+                } else {
+                    this.appContent = '绋嬪簭鍐呭鍔犺浇澶辫触'
+                }
+            })
+        }
+    },
+}
+</script>
+
+<style lang="scss" scoped>
+.tool {
+    text-align: right;
+    margin-bottom: 10px;
+}
+
+.dialog-footer {
+    text-align: center;
+}
+.app-content {
+    background-color: #fffee1;
+    padding: 10px;
+    min-height: 100px;
+}
+</style>
\ No newline at end of file
diff --git a/src/views/flow/components/TodolistRightTop.vue b/src/views/flow/components/TodolistRightTop.vue
new file mode 100644
index 0000000..4c45f2e
--- /dev/null
+++ b/src/views/flow/components/TodolistRightTop.vue
@@ -0,0 +1,86 @@
+<!--
+ * @Date: 2025-07-01 20:45:15
+ * @LastEditors: gaoshp
+ * @LastEditTime: 2025-07-01 23:54:33
+ * @FilePath: /mdmweb/src/views/flow/components/TodolistRightTop.vue
+-->
+<template>
+    <basic-container>
+    <el-form :inline="true" :model="formInline" class="demo-form-inline" label-width="120px" disabled>
+        <el-form-item label="娴佺▼鏍囬">
+            <el-input v-model="formInline.user" placeholder=""></el-input>
+        </el-form-item>
+        <el-form-item label="鍒涘缓浜�">
+            <el-input v-model="formInline.user" placeholder=""></el-input>
+        </el-form-item>
+        <el-form-item label="璁捐鐗堟">
+            <el-input v-model="formInline.user" placeholder=""></el-input>
+        </el-form-item>
+        <el-form-item label="宸ヨ壓鐗堟">
+            <el-input v-model="formInline.user" placeholder=""></el-input>
+        </el-form-item>
+        <el-form-item label="浠诲姟杞﹂棿">
+            <el-input v-model="formInline.user" placeholder=""></el-input>
+        </el-form-item>
+        <el-form-item label="浜у搧鍨嬪彿">
+            <el-input v-model="formInline.user" placeholder=""></el-input>
+        </el-form-item>
+        <el-form-item label="宸ュ簭鍙�">
+            <el-input v-model="formInline.user" placeholder=""></el-input>
+        </el-form-item>
+        <el-form-item label="宸ュ簭鍚嶇О">
+            <el-input v-model="formInline.user" placeholder=""></el-input>
+        </el-form-item>
+        <el-form-item label="闆剁粍浠跺彿">
+            <el-input v-model="formInline.user" placeholder=""></el-input>
+        </el-form-item>
+        <el-form-item label="闆剁粍浠跺悕绉�">
+            <el-input v-model="formInline.user" placeholder=""></el-input>
+        </el-form-item>
+        <el-form-item label="鍔犲伐鏈哄簥">
+            <el-input v-model="formInline.user" placeholder=""></el-input>
+        </el-form-item>
+        <el-form-item label="杩囩▼鍗″彿">
+            <el-input v-model="formInline.user" placeholder=""></el-input>
+        </el-form-item>
+        <el-form-item label="鍒涘缓鏃堕棿">
+            <el-input v-model="formInline.user" placeholder=""></el-input>
+        </el-form-item>
+        <el-form-item label="璁″垝鍔犲伐鏃堕棿">
+            <el-input v-model="formInline.user" placeholder=""></el-input>
+        </el-form-item>
+        <el-form-item label="鎻忚堪">
+            <el-input v-model="formInline.user" placeholder=""></el-input>
+        </el-form-item>
+        <el-form-item label="绋嬪簭鍖呭悕">
+            <el-input v-model="formInline.user" placeholder=""></el-input>
+        </el-form-item>
+        <el-form-item label="褰撳墠鑺傜偣">
+            <el-input v-model="formInline.user" placeholder=""></el-input>
+        </el-form-item>
+    </el-form>
+    </basic-container>
+</template>
+
+<script>
+export default {
+    props: {
+        row: {
+            type: Object,
+        }
+    },
+    data() {
+        return {
+            formInline: {}
+        }
+    },
+    mounted() {
+        // Initialize formInline with row data
+        this.formInline = {
+            ...this.row
+        }
+    }
+}
+</script>
+
+<style lang="scss" scoped></style>
\ No newline at end of file
diff --git a/src/views/flow/todolist.vue b/src/views/flow/todolist.vue
index 6587758..848f1c1 100644
--- a/src/views/flow/todolist.vue
+++ b/src/views/flow/todolist.vue
@@ -13,15 +13,28 @@
                 </el-button>
             </template>
         </avue-crud>
-        <el-dialog title="瀹℃壒" append-to-body v-model="approveBox" width="30%">
-            <avue-form ref="form" :option="optionApprove" v-model="formApprove" @submit="handleSubmit" />
-            <!-- <template #footer>
-                <span class="dialog-footer">
-                    <el-button @click="deployBox = false">鍙� 娑�</el-button>
-                    <el-button type="primary" @click="handleDoDeploy" :loading="deployLoading">纭� 瀹�</el-button>
-                </span>
-            </template> -->
-        </el-dialog>
+        <!-- <el-dialog title="瀹℃壒" append-to-body v-model="approveBox" width="100%">
+            <div class="approve-box">
+                <div class="left">
+                    <TodolistLeft :row="row"/>
+                </div>
+                <div class="right">
+                    <TodolistRightTop :row="row" />
+                    <avue-form ref="form" :option="optionApprove" v-model="formApprove" @submit="handleSubmit" />
+                </div>
+            </div>
+        </el-dialog> -->
+        <el-drawer title="瀹℃壒" append-to-body v-model="approveBox" size="100%">
+            <div class="approve-box">
+                <div class="left">
+                    <TodolistLeft :row="row" @selection-change="selectionChange"/>
+                </div>
+                <div class="right">
+                    <TodolistRightTop :row="row" />
+                    <avue-form ref="form" :option="optionApprove" v-model="formApprove" @submit="handleSubmit" />
+                </div>
+            </div>
+        </el-drawer>
     </basic-container>
 </template>
 
@@ -29,9 +42,16 @@
 import { getList, approve,getAssignee } from '@/api/flow/todolist';
 import { mapGetters } from 'vuex';
 import dayjs from 'dayjs';
+import TodolistLeft from './components/TodolistLeft.vue';
+import TodolistRightTop from './components/TodolistRightTop.vue';
 export default {
+    components: {
+        TodolistLeft,
+        TodolistRightTop
+    },
     data() {
         return {
+            applist: [],
             assigneeData: [],
             row: {},
             approveBox: false,
@@ -258,6 +278,7 @@
                 ...this.formApprove,
                 taskId: this.row.taskId,
                 processInstanceId: this.row.processInstanceId,
+                programIds: this.applist.map(v => v.id).join(','),
             }).then(res => {
                 this.$message.success('瀹℃壒鎴愬姛');
                 this.approveBox = false;
@@ -326,8 +347,24 @@
                 this.loading = false;
             });
         },
+        selectionChange (applist) {
+            this.applist = applist
+        },
     },
 };
 </script>
 
-<style></style>
+<style scoped="scoped" lang="scss">
+.approve-box {
+    display: flex;
+    & > div {
+        border: 1px solid #ccc;
+    }
+    .left {
+        width: 400px;
+    }
+    .right {
+        flex:1;
+    }
+}
+</style>

--
Gitblit v1.9.3