Przeglądaj źródła

添加流程管理

zs 8 miesięcy temu
rodzic
commit
dab25079e2

+ 1 - 0
src/lang/package/zh-cn/common.js

@@ -10,6 +10,7 @@ export default {
   exam: '审核',
   dict: '字典数据',
   sign: '报名',
+  process: '流程',
   journal: '期刊',
   directory: '目录',
   delete_confirm: '您确定删除该数据?',

+ 1 - 0
src/lang/package/zh-cn/menus.js

@@ -30,6 +30,7 @@ export default {
   match: '赛事管理',
   match_info: '赛事信息管理',
   match_sign: '报名管理',
+  match_process: '流程管理',
   achievement: '成果管理',
   project: '项目管理',
   footplate: '平台管理',

+ 11 - 0
src/lang/package/zh-cn/pages.js

@@ -375,6 +375,17 @@ export default {
     remark: '备注',
     DialogTitle: '查看报名情况'
   },
+  process: {
+    addDialogTitle: '新增流程',
+    upDialogTitle: '修改流程',
+    name: '流程名称',
+    time: '时间',
+    signPerson: '报名人员',
+    brief: '简介',
+    order_num: '顺序',
+    is_use: '是否启用',
+    nameMessage: '请输入流程名称'
+  },
   dept: {
     dialogTitle: '部门信息',
     rDialogTitle: '部门资源',

+ 40 - 0
src/store/api/platform/process.js

@@ -0,0 +1,40 @@
+import { defineStore } from 'pinia'
+import { AxiosWrapper } from '@/utils/axios-wrapper'
+import { get } from 'lodash-es'
+const url = '/matchPath'
+const axios = new AxiosWrapper()
+
+export const ProcessStore = defineStore('process', () => {
+  const query = async ({ skip = 0, limit = undefined, ...info } = {}) => {
+    let cond = {}
+    if (skip) cond.skip = skip
+    if (limit) cond.limit = limit
+    cond = { ...cond, ...info }
+    const res = await axios.$get(`${url}`, cond)
+    return res
+  }
+  const fetch = async (payload) => {
+    const res = await axios.$get(`${url}/${payload}`)
+    return res
+  }
+  const create = async (payload) => {
+    const res = await axios.$post(`${url}`, payload)
+    return res
+  }
+  const update = async (payload) => {
+    const id = get(payload, 'id', get(payload, 'id'))
+    const res = await axios.$post(`${url}/${id}`, payload)
+    return res
+  }
+  const del = async (payload) => {
+    const res = await axios.$delete(`${url}/${payload}`)
+    return res
+  }
+  return {
+    query,
+    fetch,
+    create,
+    update,
+    del
+  }
+})

+ 6 - 1
src/views/match/info/index.vue

@@ -9,7 +9,7 @@
       </template>
     </custom-search-bar>
     <custom-button-bar :fields="buttonFields" @add="toAdd" @select="toMoreDelect"></custom-button-bar>
-    <custom-table :data="data" :fields="fields" @query="search" :total="total" :opera="opera" @sign="toSign" @exam="toExam" @edit="toEdit" @delete="toDelete" @toSelect="toSelect" :select="true">
+    <custom-table :data="data" :fields="fields" @query="search" :total="total" :opera="opera" @process="toProcess" @sign="toSign" @exam="toExam" @edit="toEdit" @delete="toDelete" @toSelect="toSelect" :select="true">
       <template #is_use="{ row }">
         <el-tag v-if="row.is_use == '0'" type="success" @click="toUse(row, '1')">启用</el-tag>
         <el-tag v-else type="info" @click="toUse(row, '0')">禁用</el-tag>
@@ -142,6 +142,7 @@ const fields = [
   { label: t('pages.match.status'), model: 'status', format: (i) => getDict(i, 'status') }
 ]
 const opera = [
+  { label: t('common.process'), method: 'process', display: (i) => i.scale === '0' },
   { label: t('common.sign'), method: 'sign', type: 'warning' },
   {
     label: t('common.update'),
@@ -319,6 +320,10 @@ const toEdit = (data) => {
 const toSign = (data) => {
   router.push({ path: '/match/sign', query: { id: data.id } })
 }
+// 流程管理
+const toProcess = (data) => {
+  router.push({ path: '/match/process', query: { id: data.id } })
+}
 // 删除
 const toDelete = async (data) => {
   const res = await store.del(data.id)

+ 157 - 0
src/views/match/process/index.vue

@@ -0,0 +1,157 @@
+<template>
+  <div id="index">
+    <el-row>
+      <el-col :span="24" class="main animate__animated animate__backInRight" v-loading="loading">
+        <el-button type="primary" @click="toBack()">返回</el-button>
+        <el-col :span="24" class="one">
+          <custom-button-bar :fields="buttonFields" @add="toAdd"></custom-button-bar>
+        </el-col>
+        <el-col :span="24" class="two">
+          <custom-search-bar :fields="fields.filter((f) => f.isSearch)" v-model="searchForm" @search="search" @reset="toReset"></custom-search-bar>
+          <custom-table :data="data" :fields="fields" @query="search" :total="total" :opera="opera" @edit="toEdit" @delete="toDelete">
+            <template #is_use="{ row }">
+              <el-tag v-if="row.is_use == '0'" type="success" @click="toUse(row, '1')">启用</el-tag>
+              <el-tag v-else type="info" @click="toUse(row, '0')">禁用</el-tag>
+            </template>
+          </custom-table>
+        </el-col>
+      </el-col>
+    </el-row>
+    <el-dialog v-model="dialog.show" :title="dialog.title" :destroy-on-close="false" @close="toClose">
+      <el-row>
+        <el-col :span="24" v-if="dialog.type == '1'">
+          <custom-form v-model="form" :fields="formFields" :rules="rules" @save="toSave">
+            <template #is_use>
+              <el-radio v-for="i in isUseList" :key="i.id" :label="i.value">{{ i.label }}</el-radio>
+            </template>
+            <template #brief>
+              <WangEditor v-model="form.brief" />
+            </template>
+          </custom-form>
+        </el-col>
+      </el-row>
+    </el-dialog>
+  </div>
+</template>
+
+<script setup>
+import { cloneDeep, get } from 'lodash-es'
+const $checkRes = inject('$checkRes')
+const { t } = useI18n()
+// 接口
+import { ProcessStore } from '@/store/api/platform/process'
+import { DictDataStore } from '@/store/api/system/dictData'
+const store = ProcessStore()
+const dictDataStore = DictDataStore()
+// 路由
+const route = useRoute()
+const data = ref([])
+const searchForm = ref({})
+const fields = [
+  { label: t('pages.process.name'), model: 'name', isSearch: true },
+  { label: t('pages.process.time'), model: 'time', isSearch: true },
+  { label: t('pages.process.order_num'), model: 'order_num' },
+  { label: t('pages.process.is_use'), model: 'is_use', format: (i) => getDict(i, 'is_use') }
+]
+const opera = [
+  { label: t('common.update'), method: 'edit' },
+  {
+    label: t('common.delete'),
+    method: 'delete',
+    confirm: true,
+    type: 'danger'
+  }
+]
+let skip = 0
+let limit = inject('limit')
+const total = ref(0)
+const formFields = ref([
+  { label: t('pages.process.name'), model: 'name' },
+  { label: t('pages.process.time'), model: 'time', type: 'date' },
+  { label: t('pages.process.order_num'), model: 'order_num', type: 'number' },
+  { label: t('pages.process.brief'), model: 'brief', custom: true },
+  { label: t('pages.process.is_use'), model: 'is_use', type: 'radio' }
+])
+const rules = reactive({
+  name: [{ required: true, message: t('pages.process.nameMessage'), trigger: 'blur' }]
+})
+const dialog = ref({ type: '1', show: false, title: t('pages.process.DialogTitle') })
+const buttonFields = [{ label: t('common.create'), method: 'add' }]
+const form = ref({})
+// 字典表
+const isUseList = ref([])
+// 加载中
+const loading = ref(false)
+// 请求
+onMounted(async () => {
+  loading.value = true
+  await searchOther()
+  await search({ skip, limit })
+  loading.value = false
+})
+const searchOther = async () => {
+  let result
+  // 是否使用
+  result = await dictDataStore.query({ code: 'isUse', is_use: '0' })
+  if ($checkRes(result)) isUseList.value = result.data
+}
+const search = async (query = { skip, limit }) => {
+  skip = query.skip
+  limit = query.limit
+  const info = { skip: query.skip, limit: query.limit, ...searchForm.value, match: route.query.id }
+  const res = await store.query(info)
+  if (res.errcode == '0') {
+    data.value = res.data
+    total.value = res.total
+  }
+}
+// 字典数据转换
+const getDict = (data, model) => {
+  if (data) {
+    let res
+    if (model == 'is_use') res = isUseList.value.find((f) => f.value == data)
+    return get(res, 'label')
+  }
+}
+// 添加
+const toAdd = () => {
+  dialog.value = { type: '1', show: true, title: t('pages.process.addDialogTitle') }
+}
+// 修改
+const toEdit = (data) => {
+  form.value = data
+  dialog.value = { type: '1', show: true, title: t('pages.process.upDialogTitle') }
+}
+// 删除
+const toDelete = async (data) => {
+  const res = await store.del(data.id)
+  if ($checkRes(res, true)) {
+    search({ skip, limit })
+  }
+}
+const toSave = async () => {
+  const data = cloneDeep(form.value)
+  let res
+  if (get(data, 'id')) res = await store.update(data)
+  else res = await store.create({ ...data, match: route.query.id })
+  if ($checkRes(res, true)) {
+    search({ skip, limit })
+    toClose()
+  }
+}
+const toClose = () => {
+  form.value = {}
+  dialog.value = { show: false }
+}
+// 返回上一页
+const toBack = () => {
+  window.history.go(-1)
+}
+</script>
+<style scoped lang="scss">
+.main {
+  .one {
+    text-align: right;
+  }
+}
+</style>