mirror of
https://github.com/kuaifan/dootask.git
synced 2025-12-16 14:12:51 +00:00
feat:工作流前端进度 - 95%
This commit is contained in:
parent
596594d8b3
commit
09f48c32c7
@ -2,16 +2,16 @@
|
|||||||
|
|
||||||
namespace App\Http\Controllers\Api;
|
namespace App\Http\Controllers\Api;
|
||||||
|
|
||||||
use Cache;
|
|
||||||
use Request;
|
use Request;
|
||||||
use Carbon\Carbon;
|
|
||||||
use App\Models\User;
|
use App\Models\User;
|
||||||
use App\Module\Base;
|
use App\Module\Base;
|
||||||
use App\Module\Ihttp;
|
use App\Module\Ihttp;
|
||||||
|
use App\Tasks\PushTask;
|
||||||
use App\Models\WebSocketDialog;
|
use App\Models\WebSocketDialog;
|
||||||
use App\Models\WorkflowProcMsg;
|
use App\Models\WorkflowProcMsg;
|
||||||
use App\Exceptions\ApiException;
|
use App\Exceptions\ApiException;
|
||||||
use App\Models\WebSocketDialogMsg;
|
use App\Models\WebSocketDialogMsg;
|
||||||
|
use Hhxsv5\LaravelS\Swoole\Task\Task;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @apiDefine workflow
|
* @apiDefine workflow
|
||||||
@ -47,6 +47,28 @@ class WorkflowController extends AbstractController
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @api {get} api/workflow/user/department 02. 获取当前用户部门
|
||||||
|
*
|
||||||
|
* @apiDescription 需要token身份
|
||||||
|
* @apiVersion 1.0.0
|
||||||
|
* @apiGroup workflow
|
||||||
|
* @apiName user__department
|
||||||
|
*
|
||||||
|
* @apiQuery {Number} id 流程ID
|
||||||
|
*
|
||||||
|
* @apiSuccess {Number} ret 返回状态码(1正确、0错误)
|
||||||
|
* @apiSuccess {String} msg 返回信息(错误描述)
|
||||||
|
* @apiSuccess {Object} data 返回数据
|
||||||
|
*/
|
||||||
|
public function user__department()
|
||||||
|
{
|
||||||
|
// User::auth();
|
||||||
|
// $data['id'] = intval(Request::input('id'));
|
||||||
|
// $workflow = $this->getProcessById($data['id']);
|
||||||
|
// return Base::retSuccess('success', $workflow);
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @api {post} api/workflow/procdef/all 02. 查询流程定义
|
* @api {post} api/workflow/procdef/all 02. 查询流程定义
|
||||||
*
|
*
|
||||||
@ -211,7 +233,22 @@ class WorkflowController extends AbstractController
|
|||||||
if($process['is_finished'] == true) {
|
if($process['is_finished'] == true) {
|
||||||
$dialog = WebSocketDialog::checkUserDialog($botUser, $process['start_user_id']);
|
$dialog = WebSocketDialog::checkUserDialog($botUser, $process['start_user_id']);
|
||||||
$this->workflowMsg('workflow_submitter', $dialog, $botUser, ['userid' => $data['userid']], $process, $pass);
|
$this->workflowMsg('workflow_submitter', $dialog, $botUser, ['userid' => $data['userid']], $process, $pass);
|
||||||
|
}else if ($process['candidate']) {
|
||||||
|
// 下个审批人
|
||||||
|
$userid = explode(',', $process['candidate']);
|
||||||
|
$toUser = User::whereIn('userid', $userid)->get()->toArray();
|
||||||
|
foreach ($toUser as $val) {
|
||||||
|
if ($val['bot']) {
|
||||||
|
continue;
|
||||||
}
|
}
|
||||||
|
$dialog = WebSocketDialog::checkUserDialog($botUser, $val['userid']);
|
||||||
|
if (empty($dialog)) {
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
$this->workflowMsg('workflow_reviewer', $dialog, $botUser, $val, $process,'start');
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
// 抄送人
|
// 抄送人
|
||||||
$notifier = $this->handleProcessNode($process, $task['step']);
|
$notifier = $this->handleProcessNode($process, $task['step']);
|
||||||
if ($notifier && $pass == 'pass') {
|
if ($notifier && $pass == 'pass') {
|
||||||
@ -686,6 +723,20 @@ class WorkflowController extends AbstractController
|
|||||||
$proc_msg->userid = $toUser['userid'];
|
$proc_msg->userid = $toUser['userid'];
|
||||||
$proc_msg->save();
|
$proc_msg->save();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// 更新工作报告 未读数量
|
||||||
|
if($type == 'workflow_reviewer' && $toUser['userid']){
|
||||||
|
$params = [
|
||||||
|
'userid' => [ $toUser['userid'], User::auth()->userid() ],
|
||||||
|
'msg' => [
|
||||||
|
'type' => 'workflow',
|
||||||
|
'action' => 'backlog',
|
||||||
|
'userid' => $toUser['userid'],
|
||||||
|
]
|
||||||
|
];
|
||||||
|
Task::deliver(new PushTask($params, false));
|
||||||
|
}
|
||||||
|
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -710,6 +761,9 @@ class WorkflowController extends AbstractController
|
|||||||
}
|
}
|
||||||
$val['node_user_list'][$k]['userimg'] = User::getAvatar($info->userid, $info->userimg, $info->email, $info->nickname);
|
$val['node_user_list'][$k]['userimg'] = User::getAvatar($info->userid, $info->userimg, $info->email, $info->nickname);
|
||||||
}
|
}
|
||||||
|
}else if($val['aprover_id']){
|
||||||
|
$info = User::whereUserid($val['aprover_id'])->first();
|
||||||
|
$val['userimg'] = $info ? User::getAvatar($info->userid, $info->userimg, $info->email, $info->nickname) : '';
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
$info = User::whereUserid($res['start_user_id'])->first();
|
$info = User::whereUserid($res['start_user_id'])->first();
|
||||||
|
|||||||
@ -11,7 +11,7 @@
|
|||||||
<UserAvatar :userid="userId" :size="36" tooltipDisabled/>
|
<UserAvatar :userid="userId" :size="36" tooltipDisabled/>
|
||||||
</div>
|
</div>
|
||||||
<span>{{userInfo.nickname}}</span>
|
<span>{{userInfo.nickname}}</span>
|
||||||
<Badge v-if="reportUnreadNumber > 0" class="manage-box-top-report" :overflow-count="999" :count="reportUnreadNumber"/>
|
<Badge v-if="(reportUnreadNumber + backlogUnreadNumber) > 0" class="manage-box-top-report" :overflow-count="999" :count="reportUnreadNumber + backlogUnreadNumber"/>
|
||||||
<Badge v-else-if="!!clientNewVersion" class="manage-box-top-report" dot/>
|
<Badge v-else-if="!!clientNewVersion" class="manage-box-top-report" dot/>
|
||||||
<div class="manage-box-arrow">
|
<div class="manage-box-arrow">
|
||||||
<Icon type="ios-arrow-up" />
|
<Icon type="ios-arrow-up" />
|
||||||
@ -90,6 +90,10 @@
|
|||||||
v-else-if="item.path === 'workReport' && reportUnreadNumber > 0"
|
v-else-if="item.path === 'workReport' && reportUnreadNumber > 0"
|
||||||
class="manage-menu-report-badge"
|
class="manage-menu-report-badge"
|
||||||
:count="reportUnreadNumber"/>
|
:count="reportUnreadNumber"/>
|
||||||
|
<Badge
|
||||||
|
v-else-if="item.path === 'review' && backlogUnreadNumber > 0"
|
||||||
|
class="manage-menu-report-badge"
|
||||||
|
:count="backlogUnreadNumber"/>
|
||||||
</div>
|
</div>
|
||||||
</DropdownItem>
|
</DropdownItem>
|
||||||
</template>
|
</template>
|
||||||
@ -396,6 +400,7 @@ export default {
|
|||||||
this.$store.dispatch("getUserInfo").catch(_ => {})
|
this.$store.dispatch("getUserInfo").catch(_ => {})
|
||||||
this.$store.dispatch("getTaskPriority").catch(_ => {})
|
this.$store.dispatch("getTaskPriority").catch(_ => {})
|
||||||
this.$store.dispatch("getReportUnread", 0)
|
this.$store.dispatch("getReportUnread", 0)
|
||||||
|
this.$store.dispatch("getBacklogUnread", 0)
|
||||||
//
|
//
|
||||||
this.$store.dispatch("needHome").then(_ => {
|
this.$store.dispatch("needHome").then(_ => {
|
||||||
this.needStartHome = true
|
this.needStartHome = true
|
||||||
@ -441,6 +446,7 @@ export default {
|
|||||||
'dialogIns',
|
'dialogIns',
|
||||||
|
|
||||||
'reportUnreadNumber',
|
'reportUnreadNumber',
|
||||||
|
'backlogUnreadNumber',
|
||||||
]),
|
]),
|
||||||
|
|
||||||
...mapGetters(['dashboardTask']),
|
...mapGetters(['dashboardTask']),
|
||||||
@ -686,6 +692,11 @@ export default {
|
|||||||
this.$store.dispatch("getReportUnread", 1000)
|
this.$store.dispatch("getReportUnread", 1000)
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
|
case 'workflow':
|
||||||
|
if (action == 'backlog') {
|
||||||
|
this.$store.dispatch("getBacklogUnread", 1000)
|
||||||
|
}
|
||||||
|
break;
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
deep: true,
|
deep: true,
|
||||||
|
|||||||
@ -2374,7 +2374,7 @@ export default {
|
|||||||
let domAudits = $(target).parents(".open-review-details")
|
let domAudits = $(target).parents(".open-review-details")
|
||||||
if( domAudits.length > 0 ){
|
if( domAudits.length > 0 ){
|
||||||
let dataId = domAudits[0].getAttribute("data-id")
|
let dataId = domAudits[0].getAttribute("data-id")
|
||||||
if( window.innerWidth < 425 ){
|
if( window.innerWidth < 426 ){
|
||||||
this.goForward({name: 'manage-review-details', query: { id: domAudits[0].getAttribute("data-id") } });
|
this.goForward({name: 'manage-review-details', query: { id: domAudits[0].getAttribute("data-id") } });
|
||||||
}else{
|
}else{
|
||||||
this.approveDetailsShow = true;
|
this.approveDetailsShow = true;
|
||||||
|
|||||||
@ -45,7 +45,7 @@
|
|||||||
<p class="review-process-state">{{$L('已提交')}}</p>
|
<p class="review-process-state">{{$L('已提交')}}</p>
|
||||||
</div>
|
</div>
|
||||||
<div class="review-process-right">
|
<div class="review-process-right">
|
||||||
<p>{{ getTimeAgo(item.claim_time) }}</p>
|
<p v-if="parseInt(getTimeAgo(item.claim_time)) < showTimeNum">{{ getTimeAgo(item.claim_time) }}</p>
|
||||||
<p>{{item.claim_time?.substr(0,16)}}</p>
|
<p>{{item.claim_time?.substr(0,16)}}</p>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
@ -56,7 +56,7 @@
|
|||||||
>
|
>
|
||||||
<p class="timeline-title">{{$L('审批')}}</p>
|
<p class="timeline-title">{{$L('审批')}}</p>
|
||||||
<div style="display: flex;">
|
<div style="display: flex;">
|
||||||
<Avatar :src="item.node_user_list && item.node_user_list[0]?.userimg" size="38"/>
|
<Avatar :src="(item.node_user_list && item.node_user_list[0]?.userimg) || item.userimg" size="38"/>
|
||||||
<div style="margin-left: 10px;flex: 1;">
|
<div style="margin-left: 10px;flex: 1;">
|
||||||
<p class="review-process-name">{{item.approver}}</p>
|
<p class="review-process-name">{{item.approver}}</p>
|
||||||
<p class="review-process-state" style="color: #6d6d6d;" v-if="!item.identitylink">待审批</p>
|
<p class="review-process-state" style="color: #6d6d6d;" v-if="!item.identitylink">待审批</p>
|
||||||
@ -68,7 +68,7 @@
|
|||||||
</p>
|
</p>
|
||||||
</div>
|
</div>
|
||||||
<div class="review-process-right">
|
<div class="review-process-right">
|
||||||
<p>
|
<p v-if="parseInt(getTimeAgo(item.claim_time)) < showTimeNum">
|
||||||
{{ item.identitylink?.state==0 ?
|
{{ item.identitylink?.state==0 ?
|
||||||
($L('已等待') + " " + getTimeAgo( datas.node_infos[key-1].claim_time,2)) :
|
($L('已等待') + " " + getTimeAgo( datas.node_infos[key-1].claim_time,2)) :
|
||||||
(item.claim_time ? getTimeAgo(item.claim_time) : '')
|
(item.claim_time ? getTimeAgo(item.claim_time) : '')
|
||||||
@ -77,6 +77,7 @@
|
|||||||
<p>{{item.claim_time?.substr(0,16)}}</p>
|
<p>{{item.claim_time?.substr(0,16)}}</p>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
<p class="comment" v-if="item.identitylink?.state==2">“{{ datas.latest_comment }}”</p>
|
||||||
</TimelineItem>
|
</TimelineItem>
|
||||||
<!-- 抄送 -->
|
<!-- 抄送 -->
|
||||||
<TimelineItem v-for="(item,key) in datas.node_infos" :key="key" :color="item.is_finished ? 'green' : '#ccc'" v-if="item.type == 'notifier' && item._show">
|
<TimelineItem v-for="(item,key) in datas.node_infos" :key="key" :color="item.is_finished ? 'green' : '#ccc'" v-if="item.type == 'notifier' && item._show">
|
||||||
@ -111,7 +112,7 @@
|
|||||||
<div style="flex: 1;"></div>
|
<div style="flex: 1;"></div>
|
||||||
<Button type="success" v-if="(datas.candidate || '').split(',').indexOf(userId + '') != -1" @click="approve(1)">{{$L('同意')}}</Button>
|
<Button type="success" v-if="(datas.candidate || '').split(',').indexOf(userId + '') != -1" @click="approve(1)">{{$L('同意')}}</Button>
|
||||||
<Button type="error" v-if="(datas.candidate || '').split(',').indexOf(userId + '') != -1" @click="approve(2)">{{$L('拒绝')}}</Button>
|
<Button type="error" v-if="(datas.candidate || '').split(',').indexOf(userId + '') != -1" @click="approve(2)">{{$L('拒绝')}}</Button>
|
||||||
<Button type="warning" v-if="userId == datas.start_user_id" @click="revocation">{{$L('撤销')}}</Button>
|
<Button type="warning" v-if="isShowWarningBtn" @click="revocation">{{$L('撤销')}}</Button>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
</template>
|
</template>
|
||||||
@ -131,9 +132,8 @@ export default {
|
|||||||
data() {
|
data() {
|
||||||
return {
|
return {
|
||||||
modalTransferIndex:window.modalTransferIndex,
|
modalTransferIndex:window.modalTransferIndex,
|
||||||
datas:{
|
datas:{},
|
||||||
|
showTimeNum:24
|
||||||
}
|
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
watch: {
|
watch: {
|
||||||
@ -144,7 +144,6 @@ export default {
|
|||||||
},
|
},
|
||||||
data: {
|
data: {
|
||||||
handler(newValue,oldValue) {
|
handler(newValue,oldValue) {
|
||||||
console.log(newValue)
|
|
||||||
if(newValue.id){
|
if(newValue.id){
|
||||||
this.getInfo()
|
this.getInfo()
|
||||||
}
|
}
|
||||||
@ -152,6 +151,17 @@ export default {
|
|||||||
deep: true
|
deep: true
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
|
computed: {
|
||||||
|
isShowWarningBtn(){
|
||||||
|
let is = this.userId == this.datas.start_user_id;
|
||||||
|
(this.datas.node_infos || []).map(h=>{
|
||||||
|
if(h.type != 'starter' && h.is_finished == true) {
|
||||||
|
is = false;
|
||||||
|
}
|
||||||
|
})
|
||||||
|
return is;
|
||||||
|
},
|
||||||
|
},
|
||||||
mounted() {
|
mounted() {
|
||||||
this.init()
|
this.init()
|
||||||
},
|
},
|
||||||
@ -230,7 +240,7 @@ export default {
|
|||||||
type:"textarea",
|
type:"textarea",
|
||||||
okText: type == 1 ? "同意" : "拒绝",
|
okText: type == 1 ? "同意" : "拒绝",
|
||||||
onOk: (desc) => {
|
onOk: (desc) => {
|
||||||
if (!desc) {
|
if (type !=1 && !desc) {
|
||||||
return `请输入审批意见`
|
return `请输入审批意见`
|
||||||
}
|
}
|
||||||
this.$store.dispatch("call", {
|
this.$store.dispatch("call", {
|
||||||
@ -269,7 +279,7 @@ export default {
|
|||||||
this.$emit('revocation')
|
this.$emit('revocation')
|
||||||
}).catch(({msg}) => {
|
}).catch(({msg}) => {
|
||||||
$A.modalError(msg);
|
$A.modalError(msg);
|
||||||
reject(msg);
|
resolve();
|
||||||
});
|
});
|
||||||
return false
|
return false
|
||||||
})
|
})
|
||||||
|
|||||||
@ -7,10 +7,10 @@
|
|||||||
<div class="review-nav">
|
<div class="review-nav">
|
||||||
<h1>{{$L('审批中心')}}</h1>
|
<h1>{{$L('审批中心')}}</h1>
|
||||||
</div>
|
</div>
|
||||||
<Button v-for="item in procdefList" :loading="loadIng > 0" type="primary" @click="initiate(item)" style="margin-right:10px;">{{item.name}}</Button>
|
<Button v-for="(item,key) in procdefList" :loading="loadIng > 0" :key="key" type="primary" @click="initiate(item)" style="margin-right:10px;">{{item.name}}</Button>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
<Tabs :value="tabsValue" @on-click="tabsClick" style="margin: 0 20px;height: 100%;">
|
<Tabs :value="tabsValue" @on-click="tabsClick" style="margin: 0 20px;height: 100%;" size="small">
|
||||||
<TabPane :label="$L('待办') + (backlogTotal > 0 ? ('('+backlogTotal+')') : '')" name="backlog" style="height: 100%;">
|
<TabPane :label="$L('待办') + (backlogTotal > 0 ? ('('+backlogTotal+')') : '')" name="backlog" style="height: 100%;">
|
||||||
<div class="review-main-search">
|
<div class="review-main-search">
|
||||||
<div style="display: flex;gap: 10px;">
|
<div style="display: flex;gap: 10px;">
|
||||||
@ -29,7 +29,7 @@
|
|||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
<div class="review-main-right">
|
<div class="review-main-right">
|
||||||
<listDetails v-if="!detailsShow" :data="details" @approve="tabsClick" @revocation="tabsClick"></listDetails>
|
<listDetails v-if="!detailsShow && tabsValue=='backlog'" :data="details" @approve="tabsClick" @revocation="tabsClick"></listDetails>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
</TabPane>
|
</TabPane>
|
||||||
@ -51,7 +51,7 @@
|
|||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
<div class="review-main-right">
|
<div class="review-main-right">
|
||||||
<listDetails v-if="!detailsShow" :data="details" @approve="tabsClick" @revocation="tabsClick"></listDetails>
|
<listDetails v-if="!detailsShow && tabsValue=='done'" :data="details" @approve="tabsClick" @revocation="tabsClick"></listDetails>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
</TabPane>
|
</TabPane>
|
||||||
@ -75,7 +75,7 @@
|
|||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
<div class="review-main-right">
|
<div class="review-main-right">
|
||||||
<listDetails v-if="!detailsShow" :data="details" @approve="tabsClick" @revocation="tabsClick"></listDetails>
|
<listDetails v-if="!detailsShow && tabsValue=='notify'" :data="details" @approve="tabsClick" @revocation="tabsClick"></listDetails>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
</TabPane>
|
</TabPane>
|
||||||
@ -100,7 +100,7 @@
|
|||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
<div class="review-main-right">
|
<div class="review-main-right">
|
||||||
<listDetails v-if="!detailsShow" :data="details" @approve="tabsClick" @revocation="tabsClick"></listDetails>
|
<listDetails v-if="!detailsShow && tabsValue=='initiated'" :data="details" @approve="tabsClick" @revocation="tabsClick"></listDetails>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
</TabPane>
|
</TabPane>
|
||||||
@ -116,8 +116,13 @@
|
|||||||
<!--发起-->
|
<!--发起-->
|
||||||
<Modal v-model="addShow" :title="$L(addTitle)" :mask-closable="false">
|
<Modal v-model="addShow" :title="$L(addTitle)" :mask-closable="false">
|
||||||
<Form ref="initiateRef" :model="addData" :rules="addRule" label-width="auto" @submit.native.prevent>
|
<Form ref="initiateRef" :model="addData" :rules="addRule" label-width="auto" @submit.native.prevent>
|
||||||
|
<FormItem v-if="departmentList.length>1" prop="department_id" :label="$L('选择部门')">
|
||||||
|
<Select v-model="addData.department_id" :placeholder="$L('请选择部门')">
|
||||||
|
<Option v-for="(item, index) in departmentList" :value="item.id" :key="index">{{ item.name }}</Option>
|
||||||
|
</Select>
|
||||||
|
</FormItem>
|
||||||
<FormItem v-if="(addTitle || '').indexOf('班') == -1" prop="type" :label="$L('假期类型')">
|
<FormItem v-if="(addTitle || '').indexOf('班') == -1" prop="type" :label="$L('假期类型')">
|
||||||
<Select v-model="addData.type" :placeholder="$L('请选择')">
|
<Select v-model="addData.type" :placeholder="$L('请选择假期类型')">
|
||||||
<Option v-for="(item, index) in selectTypes" :value="item" :key="index">{{ item }}</Option>
|
<Option v-for="(item, index) in selectTypes" :value="item" :key="index">{{ item }}</Option>
|
||||||
</Select>
|
</Select>
|
||||||
</FormItem>
|
</FormItem>
|
||||||
@ -146,6 +151,7 @@
|
|||||||
<Button type="primary" :loading="loadIng > 0" @click="onInitiate">{{$L('确认')}}</Button>
|
<Button type="primary" :loading="loadIng > 0" @click="onInitiate">{{$L('确认')}}</Button>
|
||||||
</div>
|
</div>
|
||||||
</Modal>
|
</Modal>
|
||||||
|
|
||||||
</div>
|
</div>
|
||||||
</template>
|
</template>
|
||||||
|
|
||||||
@ -153,6 +159,7 @@
|
|||||||
import list from "./list.vue";
|
import list from "./list.vue";
|
||||||
import listDetails from "./details.vue";
|
import listDetails from "./details.vue";
|
||||||
import DrawerOverlay from "../../../components/DrawerOverlay";
|
import DrawerOverlay from "../../../components/DrawerOverlay";
|
||||||
|
import { mapState } from 'vuex'
|
||||||
export default {
|
export default {
|
||||||
components:{list,listDetails,DrawerOverlay},
|
components:{list,listDetails,DrawerOverlay},
|
||||||
name: "review",
|
name: "review",
|
||||||
@ -195,29 +202,61 @@ export default {
|
|||||||
addTitle:'',
|
addTitle:'',
|
||||||
addShow:false,
|
addShow:false,
|
||||||
addData: {
|
addData: {
|
||||||
|
department_id:0,
|
||||||
type: '',
|
type: '',
|
||||||
startTime:"",
|
startTime:"",
|
||||||
endTime:"",
|
endTime:"",
|
||||||
},
|
},
|
||||||
addRule: {
|
addRule: {
|
||||||
|
department_id:{ type: 'number',required: true, message: this.$L('请选择部门!'), trigger: 'change' },
|
||||||
type: { type: 'string',required: true, message: this.$L('请选择假期类型!'), trigger: 'change' },
|
type: { type: 'string',required: true, message: this.$L('请选择假期类型!'), trigger: 'change' },
|
||||||
startTime: { type: 'string',required: true, message: this.$L('请选择开始时间!'), trigger: 'change' },
|
startTime: { type: 'string',required: true, message: this.$L('请选择开始时间!'), trigger: 'change' },
|
||||||
endTime:{ type: 'string',required: true, message: this.$L('请选择结束时间!'), trigger: 'change' },
|
endTime:{ type: 'string',required: true, message: this.$L('请选择结束时间!'), trigger: 'change' },
|
||||||
description:{ type: 'string',required: true, message: this.$L('请选择结束时间!'), trigger: 'change' },
|
description:{ type: 'string',required: true, message: this.$L('请选择结束时间!'), trigger: 'change' },
|
||||||
},
|
},
|
||||||
selectTypes:["年假","事假","病假","调休","产假","陪产假","婚假","丧假","哺乳假"]
|
selectTypes:["年假","事假","病假","调休","产假","陪产假","婚假","丧假","哺乳假"],
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
computed: {
|
||||||
|
...mapState([ 'wsMsg','userInfo','userIsAdmin' ]),
|
||||||
|
departmentList(){
|
||||||
|
let departmentNames = (this.userInfo.department_name || '').split(',');
|
||||||
|
return (this.userInfo.department || []).map((h,index)=>{
|
||||||
|
return {
|
||||||
|
id:h,
|
||||||
|
name:departmentNames[index]
|
||||||
|
};
|
||||||
|
})
|
||||||
|
}
|
||||||
|
},
|
||||||
|
watch: {
|
||||||
|
wsMsg: {
|
||||||
|
handler(info) {
|
||||||
|
const {type, action} = info;
|
||||||
|
switch (type) {
|
||||||
|
case 'workflow':
|
||||||
|
if (action == 'backlog') {
|
||||||
|
this.tabsClick()
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
},
|
||||||
|
deep: true,
|
||||||
|
},
|
||||||
|
},
|
||||||
mounted() {
|
mounted() {
|
||||||
this.tabsValue = "initiated"
|
this.tabsValue = "backlog"
|
||||||
this.tabsClick()
|
this.tabsClick()
|
||||||
this.getProcdef()
|
this.getProcdef()
|
||||||
this.getBacklogList()
|
this.getBacklogList()
|
||||||
|
this.addData.department_id = this.userInfo.department[0] || 0;
|
||||||
},
|
},
|
||||||
methods:{
|
methods:{
|
||||||
|
|
||||||
// tab切换事件
|
// tab切换事件
|
||||||
tabsClick(val){
|
tabsClick(val){
|
||||||
|
this.__tabsClick && clearTimeout(this.__tabsClick)
|
||||||
|
this.__tabsClick = setTimeout(() => {
|
||||||
this.tabsValue = val || this.tabsValue
|
this.tabsValue = val || this.tabsValue
|
||||||
if(val!=""){
|
if(val!=""){
|
||||||
this.approvalType = this.searchState = "all"
|
this.approvalType = this.searchState = "all"
|
||||||
@ -234,6 +273,7 @@ export default {
|
|||||||
if(this.tabsValue == 'initiated'){
|
if(this.tabsValue == 'initiated'){
|
||||||
this.getInitiatedList();
|
this.getInitiatedList();
|
||||||
}
|
}
|
||||||
|
}, 200)
|
||||||
},
|
},
|
||||||
|
|
||||||
// 列表点击事件
|
// 列表点击事件
|
||||||
@ -244,7 +284,7 @@ export default {
|
|||||||
this.initiatedList.map(h=>{ h._active = false; })
|
this.initiatedList.map(h=>{ h._active = false; })
|
||||||
item._active = true;
|
item._active = true;
|
||||||
//
|
//
|
||||||
if( window.innerWidth < 425 ){
|
if( window.innerWidth < 426 ){
|
||||||
this.goForward({name: 'manage-review-details', query: { id: item.id } });
|
this.goForward({name: 'manage-review-details', query: { id: item.id } });
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
@ -398,7 +438,7 @@ export default {
|
|||||||
url: 'workflow/process/start',
|
url: 'workflow/process/start',
|
||||||
data: {
|
data: {
|
||||||
proc_name:this.addTitle,
|
proc_name:this.addTitle,
|
||||||
department_id:1,
|
department_id:this.addData.department_id,
|
||||||
var: JSON.stringify(this.addData)
|
var: JSON.stringify(this.addData)
|
||||||
},
|
},
|
||||||
method: 'post',
|
method: 'post',
|
||||||
@ -421,8 +461,21 @@ export default {
|
|||||||
}
|
}
|
||||||
</script>
|
</script>
|
||||||
|
|
||||||
<style scoped>
|
<style lang="scss">
|
||||||
.review-details{
|
.page-review .review-details{
|
||||||
border-radius: 8px;
|
border-radius: 8px;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
.page-review .ivu-tabs-nav {
|
||||||
|
display: flex;
|
||||||
|
width: 350px;
|
||||||
|
@media (max-width: 1010px) {
|
||||||
|
width: 100%;
|
||||||
|
}
|
||||||
|
.ivu-tabs-tab{
|
||||||
|
font-size: 15px;
|
||||||
|
flex:1;
|
||||||
|
text-align: center;
|
||||||
|
}
|
||||||
|
}
|
||||||
</style>
|
</style>
|
||||||
|
|||||||
27
resources/assets/js/store/actions.js
vendored
27
resources/assets/js/store/actions.js
vendored
@ -457,6 +457,7 @@ export default {
|
|||||||
dispatch("getProjects").catch(() => {});
|
dispatch("getProjects").catch(() => {});
|
||||||
dispatch("getDialogs").catch(() => {});
|
dispatch("getDialogs").catch(() => {});
|
||||||
dispatch("getReportUnread", 1000);
|
dispatch("getReportUnread", 1000);
|
||||||
|
dispatch("getBacklogUnread", 1000);
|
||||||
dispatch("getTaskForDashboard");
|
dispatch("getTaskForDashboard");
|
||||||
dispatch("dialogMsgRead");
|
dispatch("dialogMsgRead");
|
||||||
//
|
//
|
||||||
@ -485,6 +486,32 @@ export default {
|
|||||||
}, typeof timeout === "number" ? timeout : 1000)
|
}, typeof timeout === "number" ? timeout : 1000)
|
||||||
},
|
},
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 获取审批待办未读数量
|
||||||
|
* @param state
|
||||||
|
* @param dispatch
|
||||||
|
* @param timeout
|
||||||
|
*/
|
||||||
|
getBacklogUnread({state, dispatch}, timeout) {
|
||||||
|
window.__getBacklogUnread && clearTimeout(window.__getBacklogUnread)
|
||||||
|
window.__getBacklogUnread = setTimeout(() => {
|
||||||
|
if (state.userId === 0) {
|
||||||
|
state.backlogUnreadNumber = 0;
|
||||||
|
} else {
|
||||||
|
dispatch("call", {
|
||||||
|
url: 'workflow/process/findTask',
|
||||||
|
data: {
|
||||||
|
page:1,
|
||||||
|
page_size: 500,
|
||||||
|
}
|
||||||
|
}).then(({data}) => {
|
||||||
|
state.backlogUnreadNumber = data.total || 0;
|
||||||
|
}).catch(_ => {});
|
||||||
|
}
|
||||||
|
}, typeof timeout === "number" ? timeout : 1000)
|
||||||
|
},
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 获取/更新会员信息
|
* 获取/更新会员信息
|
||||||
* @param dispatch
|
* @param dispatch
|
||||||
|
|||||||
3
resources/assets/js/store/state.js
vendored
3
resources/assets/js/store/state.js
vendored
@ -179,4 +179,7 @@ export default {
|
|||||||
apiKeyData: {},
|
apiKeyData: {},
|
||||||
localKeyPair: {},
|
localKeyPair: {},
|
||||||
localKeyLock: false,
|
localKeyLock: false,
|
||||||
|
|
||||||
|
// 审批待办未读数量
|
||||||
|
backlogUnreadNumber: 0,
|
||||||
};
|
};
|
||||||
|
|||||||
@ -699,6 +699,25 @@
|
|||||||
background-color: $primary-color;
|
background-color: $primary-color;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
.open-review-details{
|
||||||
|
.cause{
|
||||||
|
border-bottom: 1px solid #e3e3e3;
|
||||||
|
border-top: 1px solid #e3e3e3;
|
||||||
|
padding-bottom: 10px;
|
||||||
|
margin-top: 10px;
|
||||||
|
>span:first-child{
|
||||||
|
display: inline-block;
|
||||||
|
padding: 15px 0;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
.btn-raw{
|
||||||
|
display: flex;
|
||||||
|
text-align: center;
|
||||||
|
gap: 10px;
|
||||||
|
padding: 10px 0 5px 0;
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
8
resources/assets/sass/pages/page-review.scss
vendored
8
resources/assets/sass/pages/page-review.scss
vendored
@ -220,4 +220,12 @@
|
|||||||
align-items: center;
|
align-items: center;
|
||||||
gap: 10px;
|
gap: 10px;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
.comment{
|
||||||
|
border-radius:5px;
|
||||||
|
background-color: #eaeaea;
|
||||||
|
padding: 3px 10px;
|
||||||
|
margin-top: 5px;
|
||||||
|
margin-left: 45px;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
@ -109,15 +109,15 @@
|
|||||||
@elseif ($type === 'notice')
|
@elseif ($type === 'notice')
|
||||||
{{$notice}}
|
{{$notice}}
|
||||||
@elseif ($type === 'workflow_reviewer')
|
@elseif ($type === 'workflow_reviewer')
|
||||||
<span class="open-review-details" data-id="{{$data->id}}"><b style="border-bottom: 1px solid #e3e3e3;padding-bottom: 10px;">{{$data->nickname}}提交的「{{$data->proc_def_name}}」待你审批</b>
|
<span class="open-review-details" data-id="{{$data->id}}"><b>{{$data->nickname}}提交的「{{$data->proc_def_name}}」待你审批</b>
|
||||||
<div style="border-bottom: 1px solid #e3e3e3;padding: 10px 0;"><span style="display: inline-block;padding:15px 0;">申请人:<span style="color:#84c56a">{{'@'}}{{$data->nickname}}</span> {{$data->department}}</span>
|
<div class="cause"><span>申请人:<span style="color:#84c56a">{{'@'}}{{$data->nickname}}</span> {{$data->department}}</span>
|
||||||
<b>审批事由</b>
|
<b>审批事由</b>
|
||||||
@if ($data->type)
|
@if ($data->type)
|
||||||
<span>假期类型:{{$data->type}}</span>
|
<span>假期类型:{{$data->type}}</span>
|
||||||
@endif
|
@endif
|
||||||
<span>开始时间:{{$data->start_time}}</span>
|
<span>开始时间:{{$data->start_time}}</span>
|
||||||
<span>结束时间:{{$data->end_time}}</span>
|
<span>结束时间:{{$data->end_time}}</span>
|
||||||
</div><div style="display: flex;text-align: center;gap: 10px;padding: 10px 0 5px 0;">
|
</div><div class="btn-raw">
|
||||||
@if ($action === 'pass')
|
@if ($action === 'pass')
|
||||||
<Button type="button" class="ivu-btn ivu-btn-small" style="flex: 1;">已同意</Button>
|
<Button type="button" class="ivu-btn ivu-btn-small" style="flex: 1;">已同意</Button>
|
||||||
@elseif ($action === 'refuse')
|
@elseif ($action === 'refuse')
|
||||||
@ -130,27 +130,27 @@
|
|||||||
@endif
|
@endif
|
||||||
</div></span>
|
</div></span>
|
||||||
@elseif ($type === 'workflow_notifier')
|
@elseif ($type === 'workflow_notifier')
|
||||||
<span class="open-review-details" data-id="{{$data->id}}"><b style="border-bottom: 1px solid #e3e3e3;padding-bottom: 10px;">抄送{{$data->nickname}}提交的「{{$data->proc_def_name}}」记录</b>
|
<span class="open-review-details" data-id="{{$data->id}}"><b>抄送{{$data->nickname}}提交的「{{$data->proc_def_name}}」记录</b>
|
||||||
<div style="border-bottom: 1px solid #e3e3e3;padding: 10px 0;"><span style="display: inline-block;padding:15px 0;">申请人:<span style="color:#84c56a">{{'@'}}{{$data->nickname}}</span> {{$data->department}}</span>
|
<div class="cause"><span>申请人:<span style="color:#84c56a">{{'@'}}{{$data->nickname}}</span> {{$data->department}}</span>
|
||||||
<b>审批事由</b>
|
<b>审批事由</b>
|
||||||
@if ($data->type)
|
@if ($data->type)
|
||||||
<span>假期类型:{{$data->type}}</span>
|
<span>假期类型:{{$data->type}}</span>
|
||||||
@endif
|
@endif
|
||||||
<span>开始时间:{{$data->start_time}}</span>
|
<span>开始时间:{{$data->start_time}}</span>
|
||||||
<span>结束时间:{{$data->end_time}}</span>
|
<span>结束时间:{{$data->end_time}}</span>
|
||||||
</div><div style="display: flex;text-align: center;gap: 10px;padding: 10px 0 5px 0;">
|
</div><div class="btn-raw">
|
||||||
<Button type="button" class="ivu-btn ivu-btn-primary ivu-btn-small" style="flex: 1;">查看详情</Button>
|
<Button type="button" class="ivu-btn ivu-btn-primary ivu-btn-small" style="flex: 1;">查看详情</Button>
|
||||||
</div></span>
|
</div></span>
|
||||||
@elseif ($type === 'workflow_submitter')
|
@elseif ($type === 'workflow_submitter')
|
||||||
<span class="open-review-details" data-id="{{$data->id}}"><b style="border-bottom: 1px solid #e3e3e3;padding-bottom: 10px;"> @if ($action === 'pass')您发起的「{{$data->proc_def_name}}」已通过 @else您发起的「{{$data->proc_def_name}}」被{{$data->nickname}}拒绝 @endif</b>
|
<span class="open-review-details" data-id="{{$data->id}}"><b> @if ($action === 'pass')您发起的「{{$data->proc_def_name}}」已通过 @else您发起的「{{$data->proc_def_name}}」被{{$data->nickname}}拒绝 @endif</b>
|
||||||
<div style="border-bottom: 1px solid #e3e3e3;padding: 10px 0;"><span style="display: inline-block;padding:15px 0;">申请人:<span style="color:#84c56a">{{'@'}}{{$data->nickname}}</span> {{$data->department}}</span>
|
<div class="cause"><span>申请人:<span style="color:#84c56a">{{'@'}}{{$data->nickname}}</span> {{$data->department}}</span>
|
||||||
<b>审批事由</b>
|
<b>审批事由</b>
|
||||||
@if ($data->type)
|
@if ($data->type)
|
||||||
<span>假期类型:{{$data->type}}</span>
|
<span>假期类型:{{$data->type}}</span>
|
||||||
@endif
|
@endif
|
||||||
<span>开始时间:{{$data->start_time}}</span>
|
<span>开始时间:{{$data->start_time}}</span>
|
||||||
<span>结束时间:{{$data->end_time}}</span>
|
<span>结束时间:{{$data->end_time}}</span>
|
||||||
</div><div style="display: flex;text-align: center;gap: 10px;padding: 10px 0 5px 0;">
|
</div><div class="btn-raw">
|
||||||
<Button type="button" class="ivu-btn ivu-btn-primary ivu-btn-small" style="flex: 1;">查看详情</Button>
|
<Button type="button" class="ivu-btn ivu-btn-primary ivu-btn-small" style="flex: 1;">查看详情</Button>
|
||||||
</div></span>
|
</div></span>
|
||||||
@else
|
@else
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user