flowManage.vue 8.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351
  1. <template>
  2. <div>
  3. <el-row>
  4. <el-col :span="2">
  5. <el-button
  6. icon="Plus"
  7. type="primary"
  8. @click="openAddDrawer"
  9. >
  10. 新增流程
  11. </el-button>
  12. </el-col>
  13. <el-col :span="3">
  14. <el-button
  15. icon="Edit"
  16. type="primary"
  17. @click="openNodeManage"
  18. >节点编辑</el-button>
  19. </el-col>
  20. </el-row>
  21. <el-row style="margin-top: 20px">
  22. <el-col :span="24">
  23. <el-table />
  24. </el-col>
  25. </el-row>
  26. <el-drawer
  27. v-model="nodeManageShow"
  28. title="节点管理"
  29. size="55%"
  30. >
  31. <node-manage />
  32. </el-drawer>
  33. <el-drawer
  34. v-model="editProcessShow"
  35. :title="processDrawerTitle"
  36. size="37%"
  37. >
  38. <el-form
  39. label-position="left"
  40. label-width="100"
  41. size="large"
  42. >
  43. <el-form-item label="流程名称:">
  44. <el-input
  45. v-model="editProcessData.process.processName"
  46. placeholder="请输入审核流程名称"
  47. />
  48. </el-form-item>
  49. <el-form-item label="流程内容:">
  50. <el-input
  51. v-model="editProcessData.process.processContent"
  52. placeholder="请输入审核流程内容"
  53. />
  54. </el-form-item>
  55. <el-form-item label="流程类型:">
  56. <el-select
  57. v-model="editProcessData.process.processType"
  58. placeholder="请选择流程类型"
  59. >
  60. <el-option
  61. v-for="item in processType"
  62. :key="item.id"
  63. :label="item.value"
  64. :value="item.value"
  65. />
  66. </el-select>
  67. </el-form-item>
  68. </el-form>
  69. <el-row
  70. style="margin-top: 20px"
  71. justify="end"
  72. >
  73. <el-col :span="4">
  74. <el-button
  75. type="primary"
  76. icon="Notebook"
  77. @click="openEffectDialog"
  78. >效果图</el-button>
  79. </el-col>
  80. <el-col :span="4">
  81. <el-button
  82. type="primary"
  83. icon="Plus"
  84. @click="openProcessNodeDialog()"
  85. >添加节点</el-button>
  86. </el-col>
  87. </el-row>
  88. <el-row style="margin-top: 20px">
  89. <el-col :span="24">
  90. <el-table
  91. height="470"
  92. :data="intermediary"
  93. >
  94. <el-table-column
  95. label="节点顺序"
  96. align="center"
  97. width="180"
  98. prop="nodeOrder"
  99. />
  100. <el-table-column
  101. label="节点名称"
  102. align="center"
  103. prop="nodeName"
  104. />
  105. <el-table-column
  106. label="节点审核人"
  107. align="center"
  108. prop="nodeHead"
  109. />
  110. <el-table-column
  111. label="操作"
  112. align="center"
  113. >
  114. <template #default="scope">
  115. <el-button
  116. icon="Delete"
  117. type="primary"
  118. text
  119. @click="deleteProcessNode(scope.row)"
  120. >删除</el-button>
  121. </template>
  122. </el-table-column>
  123. </el-table>
  124. </el-col>
  125. </el-row>
  126. <el-row
  127. style="margin-top: 50px"
  128. justify="end"
  129. >
  130. <el-button
  131. type="primary"
  132. size="large"
  133. @click="editProcess"
  134. >确认</el-button>
  135. </el-row>
  136. </el-drawer>
  137. <el-dialog
  138. v-model="processNodeDialog"
  139. :title="processNodeTitle"
  140. width="40%"
  141. >
  142. <el-form
  143. size="large"
  144. label-position="left"
  145. label-width="90"
  146. style="margin-top: 20px"
  147. >
  148. <el-form-item label="节点名称:">
  149. <el-select
  150. v-model="addProcessNodeData.nodeId"
  151. @change="changeNodeName"
  152. >
  153. <el-option
  154. v-for="item in nodeList"
  155. :key="item.ID"
  156. :label="item.nodeName"
  157. :value="item.ID"
  158. />
  159. </el-select>
  160. </el-form-item>
  161. <el-form-item label="节点顺序:">
  162. <el-select v-model="addProcessNodeData.nodeOrder">
  163. <el-option
  164. v-for="(item,index) in orderList"
  165. :key="index"
  166. :label="item"
  167. :value="item"
  168. />
  169. </el-select>
  170. </el-form-item>
  171. </el-form>
  172. <template #footer>
  173. <el-button
  174. size="large"
  175. type="primary"
  176. @click="addProcessNodes"
  177. >确认</el-button>
  178. </template>
  179. </el-dialog>
  180. <el-dialog
  181. v-model="processEffectShow"
  182. title="流程效果图"
  183. width="45%"
  184. align-center
  185. >
  186. <el-row
  187. v-show="intermediary.length > 1"
  188. style="margin-top: 20px;height: 150px"
  189. >
  190. <el-col :span="24">
  191. <el-steps
  192. :active="processActive"
  193. space="20%"
  194. align-center
  195. >
  196. <el-step
  197. v-for="item in intermediary"
  198. :key="item.nodeId"
  199. :title="item.nodeName"
  200. :description="item.nodeHead"
  201. />
  202. </el-steps>
  203. </el-col>
  204. </el-row>
  205. </el-dialog>
  206. </div>
  207. </template>
  208. <script setup>
  209. import NodeManage from './components/nodeManage.vue'
  210. import { ref, onMounted, reactive } from 'vue'
  211. import { nodeData } from '@/pinia/node/node'
  212. import { getAllNode } from '@/api/node'
  213. import { ElMessage } from 'element-plus'
  214. import { postProcess, getAllProcess } from '@/api/process'
  215. defineOptions({
  216. name: 'FlowManage'
  217. })
  218. const record = nodeData()
  219. onMounted(() => {
  220. // 获取节点列表
  221. record.queryNodeList()
  222. queryAllNode()
  223. // 查看流程
  224. queryAllProcess()
  225. })
  226. // .....................................节点
  227. const nodeManageShow = ref(false)
  228. const openNodeManage = () => {
  229. nodeManageShow.value = true
  230. }
  231. const nodeList = reactive([])
  232. // 查询所有节点
  233. const queryAllNode = () => {
  234. getAllNode().then(res => {
  235. if (res.code === 0) {
  236. nodeList.length = 0
  237. nodeList.push(...res.data)
  238. // console.log('节点列表', nodeList)
  239. }
  240. })
  241. }
  242. // .....................................流程
  243. const editProcessShow = ref(false)
  244. const processDrawerTitle = ref('新增流程')
  245. // 添加流程数据
  246. const editProcessData = reactive({
  247. process: {
  248. processName: '',
  249. processContent: '',
  250. processType: ''
  251. },
  252. processNodes: []
  253. })
  254. const openAddDrawer = () => {
  255. editProcessShow.value = true
  256. }
  257. // 为流程添加节点
  258. const processNodeDialog = ref(false)
  259. const processNodeTitle = ref('新增流程节点')
  260. const orderList = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20]
  261. const processType = [{ id: 1, value: '立项' }, { id: 2, value: '费用' }]
  262. const addProcessNodeData = reactive({
  263. nodeId: 0,
  264. nodeOrder: 1,
  265. nodeName: '',
  266. nodeHead: ''
  267. })
  268. const openProcessNodeDialog = () => {
  269. processNodeDialog.value = true
  270. addProcessNodeData.nodeId = nodeList[0].ID
  271. addProcessNodeData.nodeName = nodeList[0].nodeName
  272. console.log(nodeList[0])
  273. addProcessNodeData.nodeHead = nodeList[0].approver.nickName
  274. }
  275. const intermediary = ref([])
  276. const changeNodeName = (val) => {
  277. addProcessNodeData.nodeId = val
  278. nodeList.forEach(item => {
  279. if (item.ID === val) {
  280. addProcessNodeData.nodeName = item.nodeName
  281. addProcessNodeData.nodeHead = item.approver.nickName
  282. }
  283. })
  284. }
  285. const addProcessNodes = () => {
  286. const obj = {}
  287. Object.assign(obj, addProcessNodeData)
  288. intermediary.value.push(obj)
  289. processActive.value = intermediary.value.length
  290. processNodeDialog.value = false
  291. }
  292. const deleteProcessNode = (row) => {
  293. intermediary.value.forEach((item, index) => {
  294. if (row.nodeId === item.nodeId) {
  295. intermediary.value.splice(index, 1)
  296. }
  297. })
  298. }
  299. const editProcess = () => {
  300. const arr = intermediary.value
  301. arr.forEach(item => {
  302. const obj = {
  303. nodeId: item.nodeId,
  304. nodeOrder: item.nodeOrder,
  305. }
  306. editProcessData.processNodes.push(obj)
  307. })
  308. for (const key in editProcessData) {
  309. if (key === 'processNodes') {
  310. if (editProcessData[key].length < 2) {
  311. ElMessage.error('节点的个数不足以构成流程(最少为2)')
  312. return
  313. }
  314. } else {
  315. if (editProcessData[key] === '') {
  316. ElMessage.error('请将流程的基本信息填写完整')
  317. return
  318. }
  319. }
  320. }
  321. postProcess(editProcessData).then(res => {
  322. if (res.code === 0) {
  323. console.log(res.data)
  324. }
  325. })
  326. }
  327. // 流程效果图
  328. const processActive = ref(0)
  329. const processEffectShow = ref(false) // 弹窗显示
  330. const openEffectDialog = () => {
  331. processEffectShow.value = true
  332. } // 打开弹窗
  333. // 查看所有流程
  334. const queryAllProcess = () => {
  335. getAllProcess().then(res => {
  336. if (res.code === 0) {
  337. console.log('流程列表', res.data)
  338. }
  339. })
  340. }
  341. </script>
  342. <style scoped>
  343. </style>