123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709 |
- <template>
- <div>
- <!-- 无待办显示 -->
- <div class="applyList_null" v-if="applyList.length == 0">
- <a-empty />
- </div>
- <div class="applyTab">
- <a-card class="cardTask" v-for="item in applyList" :key="item.id">
- <p class="pTitle">
- <span>
- <img src="@assets/title.png" />
- </span>
- <i>
- {{ item.processName }}
- </i>
- </p>
- <p v-if="item.currTaskName">
- 当前审批环节:
- <span style="color:black;">
- {{ item.currTaskName }}
- </span>
- </p>
- <p>
- 创建时间:
- <span style="color:black;">
- {{ item.createTime }}
- </span>
- </p>
- <!-- 状态 -->
- <p class="fl">
- 状态:
- <span v-if="item.status == 0" class="statusComm" style="background:rgb(9, 40, 52,.2);">
- 草稿
- </span>
- <span v-if="item.status == 1" class="statusComm" style="background:rgb(252, 96, 10,.2);">
- 处理中
- </span>
- <span v-if="item.status == 2" class="statusComm" style="background:rgb(9, 40, 52,.2);">
- 已结束
- </span>
- <span v-if="item.status == 3" class="statusComm" style="background:rgb(9, 40, 52,.2);">
- 已撤回
- </span>
- </p>
- <!-- 结果 -->
- <p class="fr">
- 结果:
- <span class="resultComm" v-if="item.result == 0" style="background:rgba(52, 123, 152,.5);">
- 未提交
- </span>
- <span class="resultComm" v-else-if="item.result == 1" style="background:rgb(252, 96, 10,.5);">
- 处理中
- </span>
- <span class="resultComm" v-else-if="item.result == 2" style="background:rgb(9, 40, 52,.5);">
- 通过
- </span>
- <span class="resultComm" v-else-if="item.result == 3" style="background:rgba(9, 40, 52,.5);">
- 驳回
- </span>
- </p>
- <a-divider></a-divider>
- <!-- 操作 -->
- <div class="operation">
- <div class="btns">
- <!-- 结果 0 -->
- <span v-if="item.status == 0">
- <a-button
- class="itemBtn"
- ghost
- @click="apply(item)"
- style="box-shadow: 8px 8px 8px rgba(128, 128, 128,.9);color:#00A0E9;"
- >
- 提交申请
- </a-button>
- <a-button
- class="itemBtn"
- ghost
- @click="edit(item)"
- style="box-shadow: 8px 8px 8px rgba(128, 128, 128,.7);color:orange;"
- >
- 编辑
- </a-button>
- <a-popconfirm title="确定删除吗?" placement="left" @confirm="() => remove(item)">
- <a-button class="itemBtn" ghost style="box-shadow: 8px 8px 8px rgba(128, 128, 128,.7);color:#4e73b9;">
- 删除
- </a-button>
- </a-popconfirm>
- </span>
- <!-- 处理中 渲染的按钮 -->
- <span v-if="item.status == 1" class="ingBtns">
- <a-button
- class="itemBtn"
- ghost
- @click="cancel(item)"
- style="box-shadow: 8px 8px 8px rgba(128, 128, 128,.7);color:#8000ff;"
- >
- 撤回
- </a-button>
- <a-button
- class="itemBtn"
- ghost
- @click="history(item)"
- style="box-shadow: 8px 8px 8px rgba(128, 128, 128,.7);color:blue;"
- >
- 查看进度
- </a-button>
- <a-button
- class="itemBtn"
- ghost
- @click="detail(item)"
- style="box-shadow: 8px 8px 8px rgba(128, 128, 128,.7);color:#999;"
- >
- 表单数据
- </a-button>
- </span>
- <!-- 驳回 状态 渲染的按钮 -->
- <span v-if="item.status == 2 || item.status == 3" class="overBtns">
- <a-button
- class="itemBtn"
- ghost
- @click="apply(item)"
- style="box-shadow: 8px 8px 8px rgba(128, 128, 128);color:#00A0E9;"
- >
- 重新申请
- </a-button>
- <a-button
- class="itemBtn"
- ghost
- @click="edit(item)"
- style="box-shadow: 8px 8px 8px rgba(128, 128, 128);color:#000000;"
- >
- 编辑
- </a-button>
- <a-button
- class="itemBtn"
- ghost
- @click="history(item)"
- style="box-shadow: 8px 8px 8px rgba(128, 128, 128);color:blue;"
- >
- 审批历史
- </a-button>
- <a-popconfirm title="确定删除吗?" placement="left" @confirm="() => remove(item)">
- <a-button class="itemBtn" ghost style="box-shadow: 8px 8px 8px rgba(128, 128, 128);color:red;">
- 删除
- </a-button>
- </a-popconfirm>
- </span>
- </div>
- </div>
- </a-card>
- <!--流程申请选择-->
- <a-drawer
- title="选择流程"
- width="33%"
- placement="right"
- :closable="false"
- @close="processModalVisible = false"
- :visible="processModalVisible"
- >
- <a-input-search style="margin-bottom: 10px;width: 200px" placeholder="输入流程名称" @search="onSearchProcess" />
- <a-empty description="无流程可供选择" v-if="activeKeyAll.length == 0" />
- <div v-else>
- <a-collapse v-model="activeKey">
- <a-collapse-panel
- v-for="(value, index) in activeKeyAll"
- :header="filterDictText(dictOptions, value) || '未分类'"
- :key="value"
- >
- <a-list :grid="{ gutter: 10, column: 1 }" :dataSource="processDataMap[value]">
- <a-list-item slot="renderItem" slot-scope="item">
- <a-card>
- <div slot="title">
- <a-row>
- <a-col span="12" :title="item.name">{{ item.name }} </a-col>
- <a-col span="12" style="text-align: right;">
- <a href="javascript:void (0)" @click="chooseProcess(item)">发起申请</a>
- </a-col>
- </a-row>
- </div>
- <b>版本:</b>v.{{ item.version }}
- <br />
- <b>说明:</b>{{ item.description }}
- </a-card>
- </a-list-item>
- </a-list>
- </a-collapse-panel>
- </a-collapse>
- </div>
- </a-drawer>
- <!--流程表单-->
- <a-modal :title="lcModa.title" v-model="lcModa.visible" :footer="null" :maskClosable="false" width="100%">
- <component
- :disabled="lcModa.disabled"
- v-if="lcModa.visible"
- :is="lcModa.formComponent"
- :processData="lcModa.processData"
- :isNew="lcModa.isNew"
- @afterSubmit="afterSub"
- @close=";(lcModa.visible = false), (lcModa.disabled = false)"
- ></component>
- </a-modal>
- <!--提交申请表单-->
- <a-modal title="提交申请" v-model="modalVisible" :mask-closable="false" :width="500" :footer="null">
- <div v-if="modalVisible">
- <a-form-item label="选择审批人" v-show="showAssign">
- <a-select
- style="width: 100%"
- v-model="form.assignees"
- placeholder="请选择"
- mode="multiple"
- :allowClear="true"
- >
- <a-select-option v-for="(item, i) in assigneeList" :key="i" :value="item.username">
- {{ item.realname }}
- </a-select-option>
- </a-select>
- </a-form-item>
- <a-form-item label="下一审批人" v-show="isGateway">
- <a-alert type="info" showIcon message="分支网关处不支持自定义选择下一审批人,将自动下发给所有可审批人。"
- >,将发送给下一节点所有人</a-alert
- >
- </a-form-item>
- <a-form-item label="优先级" prop="priority">
- <a-select v-model="form.priority" placeholder="请选择" :allowClear="true" style="width: 100%">
- <a-select-option :value="0">普通</a-select-option>
- <a-select-option :value="1">重要</a-select-option>
- <a-select-option :value="2">紧急</a-select-option>
- </a-select>
- </a-form-item>
- <a-form-item label="消息通知">
- <a-checkbox v-model="form.sendMessage">站内消息通知</a-checkbox>
- <!-- <a-checkbox v-model="form.sendSms" disabled>短信通知</a-checkbox>
- <a-checkbox v-model="form.sendEmail" disabled>邮件通知</a-checkbox> -->
- </a-form-item>
- <!-- 提交 -->
- <div slot="footer">
- <a-button type="text" @click="modalVisible = false">取消</a-button>
- <div style="display:inline-block;width: 20px;"></div>
- <a-button type="primary" :disabled="submitLoading" @click="applySubmit">提交</a-button>
- </div>
- </div>
- </a-modal>
- <!-- 审批历史 -->
- <a-modal title="审批历史" v-model="modalLsVisible" :mask-closable="false" :width="'100%'" :footer="null">
- <div v-if="modalLsVisible">
- <historyModal :procInstId="procInstId"></historyModal>
- </div>
- </a-modal>
- <!-- 确认撤回 -->
- <a-modal title="确认撤回" v-model="modalCancelVisible" :mask-closable="false" :width="500">
- <a-form ref="delForm" v-model="cancelForm" :label-width="70" v-if="modalCancelVisible">
- <a-form-item label="撤回原因" prop="reason">
- <a-input type="textarea" v-model="cancelForm.reason" :rows="4" />
- </a-form-item>
- </a-form>
- <div slot="footer">
- <a-button type="text" @click="modalCancelVisible = false">取消</a-button>
- <a-button type="primary" :disabled="submitLoading" @click="handelSubmitCancel">提交</a-button>
- </div>
- </a-modal>
- </div>
- </div>
- </template>
- <script>
- import HistoryModal from '@views/user/tabs/HistoryModal'
- import { defineComponent } from 'vue'
- import { JeecgListMixin } from '@/mixins/JeecgListMixin'
- import { activitiMixin } from '@/views/activiti/mixins/activitiMixin'
- import { filterObj } from '@/utils/util'
- import JEllipsis from '@/components/jeecg/JEllipsis'
- import { deleteAction, getAction, downFile } from '@/api/manage'
- import pick from 'lodash.pick'
- import JTreeSelect from '@/components/jeecg/JTreeSelect'
- import { initDictOptions, filterDictText } from '@/components/dict/JDictSelectUtil'
- import historicDetail from '@/views/activiti/historicDetail'
- export default {
- name: 'applyTab',
- mixins: [activitiMixin, JeecgListMixin],
- components: {
- JEllipsis,
- JTreeSelect,
- HistoryModal
- },
- data() {
- return {
- applyList: [], // 申请列表
- description: '我的申请',
- dictOptions: [],
- url: {
- list: '/actBusiness/listData',
- getProcessDataList: '/activiti_process/listData',
- delByIds: '/actBusiness/delByIds',
- getFirstNode: '/actProcessIns/getFirstNode',
- applyBusiness: '/actBusiness/apply',
- cancelApply: '/actBusiness/cancel'
- },
- // 查询条件
- queryParam: {
- createTimeRange: [],
- keyWord: ''
- },
- // 表头
- labelCol: {
- xs: { span: 4 },
- sm: { span: 4 }
- },
- wrapperCol: {
- xs: { span: 20 },
- sm: { span: 20 }
- },
- processModalVisible: null,
- activeKeyAll: [],
- activeKey: [],
- processDataMap: {},
- searchProcessKey: null,
- addApplyLoading: false,
- lcModa: {
- title: '',
- disabled: false,
- visible: false,
- formComponent: null,
- isNew: false
- },
- form: {
- priority: 0,
- assignees: [],
- sendMessage: true
- },
- modalVisible: false,
- showAssign: false,
- assigneeList: [],
- isGateway: false,
- dictPriority: [],
- submitLoading: false,
- error: '',
- /*审批历史*/
- modalLsVisible: false,
- procInstId: '',
- modalCancelVisible: false,
- cancelForm: {}
- }
- },
- methods: {
- //初始化字典 - 流程分类
- initDictConfig() {
- initDictOptions('bpm_process_type').then(res => {
- if (res.success) {
- this.dictOptions = res.result
- }
- })
- },
- //字典
- filterDictText(dictOptions, text) {
- if (dictOptions instanceof Array) {
- for (let dictItem of dictOptions) {
- if (text === dictItem.value) {
- return dictItem.text
- }
- }
- }
- return text || text == 'null' ? '' : text
- },
- //进度列表
- getProcessList() {
- this.addApplyLoading = true
- this.postFormAction(this.url.getProcessDataList, { status: 1, roles: true })
- .then(res => {
- this.activeKeyAll = []
- if (res.success) {
- var result = res.result || []
- if (result.length > 0) {
- let searchProcessKey = this.searchProcessKey
- if (searchProcessKey) {
- //过滤条件
- result = _.filter(result, function(o) {
- return o.name.indexOf(searchProcessKey) > -1
- })
- }
- this.processDataMap = _.groupBy(result, 'categoryId')
- for (const categoryId in this.processDataMap) {
- this.activeKeyAll.push(categoryId)
- }
- this.activeKey = this.activeKeyAll
- }
- this.processModalVisible = true
- } else {
- this.$message.warning(res.message)
- }
- })
- .finally(() => (this.addApplyLoading = false))
- },
- //
- loadData(arg) {
- console.log('我可以自动调用loadData')
- if (!this.url.list) {
- this.$message.error('请设置url.list属性!')
- return
- }
- //加载数据 若传入参数1则加载第一页的内容
- if (arg === 1) {
- this.ipagination.current = 1
- }
- var params = this.getQueryParams() //查询条件
- this.loading = true
- getAction(this.url.list, params).then(res => {
- if (res.success) {
- let records = res.result || []
- this.applyList = records
- this.ipagination.total = records.length
- }
- if (res.code === 510) {
- this.$message.warning(res.message)
- }
- this.loading = false
- })
- },
- //分页、排序、筛选变化时触发
- handleTableChange(pagination, filters, sorter) {
- //TODO 筛选
- console.log('走这没 分页啊')
- console.log(Object)
- if (Object.keys(sorter).length > 0) {
- console.log(Object)
- console.log(Object.key)
- this.isorter.column = sorter.field
- this.isorter.order = 'ascend' == sorter.order ? 'asc' : 'desc'
- }
- this.ipagination = pagination
- this.loadData()
- },
- // 选择参数
- getQueryParams() {
- var param = Object.assign({}, this.queryParam, this.isorter)
- delete param.createTimeRange // 时间参数不传递后台
- return filterObj(param)
- },
- // 重置
- searchReset() {
- var that = this
- var logType = that.queryParam.logType
- that.queryParam = {} //清空查询区域参数
- that.queryParam.logType = logType
- that.loadData(this.ipagination.current)
- },
- //
- onDateChange: function(value, dateString) {
- console.log(dateString[0], dateString[1])
- this.queryParam.createTime_begin = dateString[0]
- this.queryParam.createTime_end = dateString[1]
- },
- //
- onDateOk(value) {
- console.log(value)
- },
- // 申请
- apply(v) {
- if (!v.procDefId || v.procDefId == 'null') {
- this.$message.error('流程定义为空')
- return
- }
- this.form.id = v.id
- this.form.procDefId = v.procDefId
- this.form.title = v.title
- // 加载审批人
- this.getAction(this.url.getFirstNode, { procDefId: v.procDefId }).then(res => {
- if (res.success) {
- if (res.result.type == 3 || res.result.type == 4) {
- this.isGateway = true
- this.modalVisible = true
- this.form.firstGateway = true
- this.showAssign = false
- this.error = ''
- return
- }
- this.form.firstGateway = false
- this.isGateway = false
- if (res.result.users && res.result.users.length > 0) {
- this.error = ''
- this.assigneeList = res.result.users
- // 默认勾选
- let ids = []
- res.result.users.forEach(e => {
- ids.push(e.username)
- })
- this.form.assignees = ids
- this.showAssign = true
- } else {
- this.form.assignees = []
- this.showAssign = true
- this.error = '审批节点未分配候选审批人员,请联系管理员!'
- }
- if (this.error) {
- this.$message.error(this.error)
- return
- }
- this.modalVisible = true
- this.loadData()
- } else {
- this.$message.error(res.message)
- }
- })
- },
- //重新申请 提交
- applySubmit() {
- if (this.showAssign && this.form.assignees.length < 1) {
- this.error = '请至少选择一个审批人'
- this.$message.error(this.error)
- return
- } else {
- this.error = ''
- }
- this.submitLoading = true
- var params = Object.assign({}, this.form)
- params.assignees = params.assignees.join(',')
- this.postFormAction(this.url.applyBusiness, params)
- .then(res => {
- if (res.success) {
- this.$message.success('操作成功')
- this.loadData()
- this.modalVisible = false
- console.log('重新申请的提交 走这没')
- this.loadData()
- } else {
- this.$message.error(res.message)
- }
- console.log('这是哪 走这没')
- this.loadData()
- })
- .finally(() => (this.submitLoading = false))
- },
- // 编辑
- edit(r, isView) {
- if (!r.routeName) {
- this.$message.warning('该流程信息未配置表单,请联系开发人员!')
- return
- }
- if (r.routeName.indexOf('外部表单') != -1) {
- alert('调用其他项目页面')
- } else if (r.routeName.indexOf('自定义') != -1) {
- isView = isView || false
- this.lcModa.disabled = isView
- this.lcModa.title = '修改流程业务信息:' + r.title
- if (isView) this.lcModa.title = '查看流程业务信息:' + r.title
- let com = { component: () => import(`@/views/activiti/form/demoForm2`) }
- this.lcModa.formComponent = com.component
- this.lcModa.isNew = false
- this.lcModa.processData = r
- this.lcModa.visible = true
- } else {
- isView = isView || false
- this.lcModa.disabled = isView
- this.lcModa.title = '修改流程业务信息:' + r.title
- if (isView) this.lcModa.title = '查看流程业务信息:' + r.title
- this.lcModa.formComponent = this.getFormComponent(r.routeName).component
- this.lcModa.processData = r
- this.lcModa.isNew = false
- this.lcModa.visible = true
- }
- },
- // 删除
- remove(r) {
- console.log('点击了删除')
- this.postFormAction(this.url.delByIds, { ids: r.id }).then(res => {
- if (res.success) {
- this.$message.success(res.message)
- this.loadData()
- } else {
- this.$message.error(res.message)
- }
- })
- },
- // 撤回
- cancel(v) {
- this.cancelForm.id = v.id
- this.cancelForm.procInstId = v.procInstId
- this.modalCancelVisible = true
- },
- //
- handelSubmitCancel() {
- this.submitLoading = true
- this.postFormAction(this.url.cancelApply, this.cancelForm)
- .then(res => {
- if (res.success) {
- this.$message.success('操作成功')
- this.loadData()
- this.modalCancelVisible = false
- } else {
- this.$message.error(res.message)
- }
- })
- .finally(() => (this.submitLoading = false))
- },
- // 历史
- history(v) {
- if (!v.procInstId) {
- this.$message.error('流程实例ID不存在')
- return
- }
- this.procInstId = v.procInstId
- this.modalLsVisible = true
- },
- // 详情
- detail(v) {
- // this.$refs.modal.detail("1","8a8080f079ea4ed50179ea4f6c470001")
- this.edit(v, true)
- },
- // 发起申请 可删
- addApply() {
- this.getProcessList()
- },
- //
- onSearchProcess(value) {
- this.searchProcessKey = value
- this.getProcessList()
- },
- //
- chooseProcess(v) {
- console.log(v)
- // this.$refs.modal.add("1")
- if (!v.routeName) {
- this.$message.warning('该流程信息未配置表单,请联系开发人员!')
- return
- }
- if (v.routeName.indexOf('外部表单') != -1) {
- alert('调用其他项目页面')
- } else if (v.routeName.indexOf('自定义') != -1) {
- this.lcModa.disabled = false
- let com = { component: () => import(`@/views/activiti/form/demoForm2`) }
- this.lcModa.formComponent = com.component
- this.lcModa.title = '发起流程:' + v.name
- this.lcModa.isNew = true
- this.lcModa.processData = v
- this.lcModa.visible = true
- } else {
- this.lcModa.disabled = false
- this.lcModa.formComponent = this.getFormComponent(v.routeName).component
- this.lcModa.title = '发起流程:' + v.name
- this.lcModa.isNew = true
- this.lcModa.processData = v
- this.lcModa.visible = true
- }
- console.log('发起', v)
- },
- //
- afterSub(formData) {
- this.lcModa.visible = false
- this.loadData()
- }
- }
- }
- </script>
- <style src="@assets/less/overwrite.less" lang="less" scoped></style>
- <style lang="less">
- @import '~@assets/less/common.less';
- </style>
- <style lang="less" scoped></style>
|