|
@@ -1,41 +1,80 @@
|
|
|
<template>
|
|
|
<div>
|
|
|
- <el-form-item label="用户类型">
|
|
|
- <el-select v-model="userTaskForm.type">
|
|
|
- <el-option label="指定人" :value="0" />
|
|
|
- <el-option label="候选用户" :value="1" />
|
|
|
- <el-option label="候选角色" :value="2" />
|
|
|
- </el-select>
|
|
|
- </el-form-item>
|
|
|
- <el-form-item label="处理用户" v-if="userTaskForm.type === 0">
|
|
|
+ <el-radio-group v-model="userTaskForm.type" @change="updateDataType">
|
|
|
+ <el-radio label="candidateUsers">用户</el-radio>
|
|
|
+ <el-radio label="candidateRole">角色</el-radio>
|
|
|
+ <el-radio label="candidatePost">岗位</el-radio>
|
|
|
+ <el-radio label="candidateDept">部门</el-radio>
|
|
|
+ <el-radio label="startUserId">发起人</el-radio>
|
|
|
+ <el-radio label="assignee">指定人</el-radio>
|
|
|
+ <el-radio label="deptLeader">部门领导</el-radio>
|
|
|
+ <el-radio label="variable">变量</el-radio>
|
|
|
+ <!-- <el-radio label="superDeptLeader">上级部门领导</el-radio>-->
|
|
|
+ </el-radio-group>
|
|
|
+ <el-form-item label="选择用户" v-if="userTaskForm.type === 'assignee'">
|
|
|
<el-input v-model="userTaskForm.assigneeName">
|
|
|
<template #append>
|
|
|
<el-button :icon="Search()" @click="userSelect" type="danger" />
|
|
|
</template>
|
|
|
</el-input>
|
|
|
</el-form-item>
|
|
|
- <el-form-item label="候选用户" v-if="userTaskForm.type === 1">
|
|
|
+ <el-form-item label="选择用户" v-if="userTaskForm.type === 'candidateUsers'">
|
|
|
<el-input v-model="userTaskForm.candidateUsersName">
|
|
|
<template #append>
|
|
|
<el-button :icon="Search()" @click="userGroupSelect" type="danger" />
|
|
|
</template>
|
|
|
</el-input>
|
|
|
</el-form-item>
|
|
|
- <el-form-item label="候选角色" v-if="userTaskForm.type === 2">
|
|
|
+ <el-form-item label="选择角色" v-if="userTaskForm.type === 'candidateRole'">
|
|
|
<el-input v-model="userTaskForm.candidateGroupsName">
|
|
|
<template #append>
|
|
|
<el-button :icon="Search()" @click="roleGroupSelect" type="danger" />
|
|
|
</template>
|
|
|
</el-input>
|
|
|
</el-form-item>
|
|
|
- <!-- <el-form-item label="候选分组" v-if="userTaskForm.type === 2">-->
|
|
|
- <!-- <el-select v-model="userTaskForm.candidateGroups" multiple collapse-tags @change="updateElementTask('candidateGroups')">-->
|
|
|
- <!-- <el-option v-for="gk in mockData" :key="'ass-' + gk" :label="`分组${gk}`" :value="`group${gk}`" />-->
|
|
|
- <!-- </el-select>-->
|
|
|
- <!-- </el-form-item>-->
|
|
|
-
|
|
|
+ <el-form-item label="选择岗位" v-if="userTaskForm.type === 'candidatePost'">
|
|
|
+ <el-input v-model="userTaskForm.candidateGroupsName">
|
|
|
+ <template #append>
|
|
|
+ <el-button :icon="Search()" @click="postGroupSelect" type="danger" />
|
|
|
+ </template>
|
|
|
+ </el-input>
|
|
|
+ </el-form-item>
|
|
|
+ <el-form-item label="选择部门" v-if="userTaskForm.type === 'candidateDept'">
|
|
|
+ <el-input v-model="userTaskForm.candidateGroupsName">
|
|
|
+ <template #append>
|
|
|
+ <el-button :icon="Search()" @click="deptGroupSelect" type="danger" />
|
|
|
+ </template>
|
|
|
+ </el-input>
|
|
|
+ </el-form-item>
|
|
|
+ <el-form-item label="变量" v-if="userTaskForm.type === 'variable'">
|
|
|
+ <el-input v-model="userTaskForm.variable" @blur="updateVariable"> </el-input>
|
|
|
+ </el-form-item>
|
|
|
<select-user v-if="visibleSelect" ref="selectUserRef"></select-user>
|
|
|
<select-role v-if="visibleRole" ref="selectRoleRef"></select-role>
|
|
|
+ <select-post v-if="visiblePost" ref="selectPostRef"></select-post>
|
|
|
+ <select-dept v-if="visibleDept" ref="selectDeptRef"></select-dept>
|
|
|
+
|
|
|
+ <el-form-item label="多人会签" v-if="userTaskForm.type === 'candidateUsers' || userTaskForm.type === 'candidatePost' || userTaskForm.type === 'candidateRole' || userTaskForm.type === 'candidateDept'">
|
|
|
+ <el-select v-model="loopCharacteristics" @change="changeMultiInstance">
|
|
|
+ <el-option label="非会签" value="" />
|
|
|
+ <el-option label="并行会签" value="ParallelMultiInstance" />
|
|
|
+ <el-option label="串行会签" value="SequentialMultiInstance" />
|
|
|
+ </el-select>
|
|
|
+ </el-form-item>
|
|
|
+ <el-form-item label="完成条件" v-if="loopCharacteristics">
|
|
|
+ <el-slider
|
|
|
+ v-model="multiCompleted"
|
|
|
+ @change="updateLoopCondition"
|
|
|
+ :min="1"
|
|
|
+ :max="100"
|
|
|
+ show-input
|
|
|
+ :format-tooltip="
|
|
|
+ (val) => {
|
|
|
+ return val + '%';
|
|
|
+ }
|
|
|
+ "
|
|
|
+ />
|
|
|
+ </el-form-item>
|
|
|
</div>
|
|
|
</template>
|
|
|
|
|
@@ -43,23 +82,33 @@
|
|
|
import { Search } from "@element-plus/icons-vue";
|
|
|
import SelectUser from "@/components/my-process-running/src/select-user.vue";
|
|
|
import SelectRole from "@/components/my-process-running/src/select-role.vue";
|
|
|
-import baseService from "@/service/baseService";
|
|
|
+import SelectPost from "@/components/my-process-running/src/select-post.vue";
|
|
|
+import SelectDept from "@/components/my-process-running/src/select-dept.vue";
|
|
|
import { nextTick } from "vue";
|
|
|
+import lodash from "lodash";
|
|
|
export default {
|
|
|
name: "UserTask",
|
|
|
props: {
|
|
|
id: String,
|
|
|
- type: String
|
|
|
+ type: String,
|
|
|
+ businessObject: Object
|
|
|
},
|
|
|
components: {
|
|
|
SelectUser,
|
|
|
- SelectRole
|
|
|
+ SelectRole,
|
|
|
+ SelectPost,
|
|
|
+ SelectDept
|
|
|
},
|
|
|
data() {
|
|
|
return {
|
|
|
visibleSelect: false,
|
|
|
visibleRole: false,
|
|
|
+ visiblePost: false,
|
|
|
+ visibleDept: false,
|
|
|
userQuery: {},
|
|
|
+ loopCharacteristics: "",
|
|
|
+ multiInstance: "",
|
|
|
+ multiCompleted: 100,
|
|
|
defaultTaskForm: {
|
|
|
assignee: "",
|
|
|
candidateUsers: [],
|
|
@@ -69,7 +118,8 @@ export default {
|
|
|
priority: ""
|
|
|
},
|
|
|
userTaskForm: {
|
|
|
- type: 0
|
|
|
+ type: "assignee",
|
|
|
+ variable: ""
|
|
|
}
|
|
|
};
|
|
|
},
|
|
@@ -80,54 +130,149 @@ export default {
|
|
|
this.bpmnElement = window.bpmnInstances.bpmnElement;
|
|
|
this.$nextTick(() => this.resetTaskForm());
|
|
|
}
|
|
|
+ },
|
|
|
+ businessObject: {
|
|
|
+ immediate: true,
|
|
|
+ handler(val) {
|
|
|
+ this.bpmnElement = window.bpmnInstances.bpmnElement;
|
|
|
+ this.getElementLoop(val);
|
|
|
+ }
|
|
|
}
|
|
|
},
|
|
|
methods: {
|
|
|
+ getElementLoop(businessObject) {
|
|
|
+ if (!businessObject.loopCharacteristics) {
|
|
|
+ return;
|
|
|
+ }
|
|
|
+
|
|
|
+ const completionCondition = lodash.get(businessObject.loopCharacteristics, "completionCondition.body", "");
|
|
|
+ if (completionCondition) {
|
|
|
+ const rateMatch = completionCondition.match(/\d+\.\d+/g);
|
|
|
+ if (rateMatch) {
|
|
|
+ this.multiCompleted = lodash.round(lodash.multiply(100, rateMatch[0]));
|
|
|
+ } else {
|
|
|
+ this.multiCompleted = 100;
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ if (businessObject.loopCharacteristics.isSequential) {
|
|
|
+ this.loopCharacteristics = "SequentialMultiInstance";
|
|
|
+ } else {
|
|
|
+ this.loopCharacteristics = "ParallelMultiInstance";
|
|
|
+ }
|
|
|
+
|
|
|
+ this.multiLoopInstance = window.bpmnInstances.bpmnElement.businessObject.loopCharacteristics;
|
|
|
+ },
|
|
|
Search() {
|
|
|
return Search;
|
|
|
},
|
|
|
+ changeMultiInstance() {
|
|
|
+ console.log("loopCharacteristics00------====", this.loopCharacteristics);
|
|
|
+ if (!this.loopCharacteristics) {
|
|
|
+ window.bpmnInstances.modeling.updateProperties(this.bpmnElement, { loopCharacteristics: null });
|
|
|
+ return;
|
|
|
+ }
|
|
|
+
|
|
|
+ const completionCondition = window.bpmnInstances.moddle.create("bpmn:FormalExpression", { body: "${nrOfCompletedInstances/nrOfInstances >= 1 }" });
|
|
|
+
|
|
|
+ if (this.loopCharacteristics === "ParallelMultiInstance") {
|
|
|
+ this.multiLoopInstance = window.bpmnInstances.moddle.create("bpmn:MultiInstanceLoopCharacteristics", {
|
|
|
+ completionCondition: completionCondition,
|
|
|
+ collection: "${multiInstanceHandler.getList(execution)}",
|
|
|
+ elementVariable: "assignee"
|
|
|
+ });
|
|
|
+ } else {
|
|
|
+ this.multiLoopInstance = window.bpmnInstances.moddle.create("bpmn:MultiInstanceLoopCharacteristics", {
|
|
|
+ isSequential: true,
|
|
|
+ completionCondition: completionCondition,
|
|
|
+ collection: "${multiInstanceHandler.getList(execution)}",
|
|
|
+ elementVariable: "assignee"
|
|
|
+ });
|
|
|
+ }
|
|
|
+
|
|
|
+ window.bpmnInstances.modeling.updateProperties(this.bpmnElement, {
|
|
|
+ loopCharacteristics: this.multiLoopInstance
|
|
|
+ });
|
|
|
+
|
|
|
+ const taskAttr = Object.create(null);
|
|
|
+ taskAttr["assignee"] = "${assignee}";
|
|
|
+ window.bpmnInstances.modeling.updateProperties(this.bpmnElement, taskAttr);
|
|
|
+ },
|
|
|
+ updateLoopCondition() {
|
|
|
+ const completionCondition = window.bpmnInstances.moddle.create("bpmn:FormalExpression", { body: "${nrOfCompletedInstances/nrOfInstances >= " + lodash.multiply(this.multiCompleted, 0.01) + " }" });
|
|
|
+ window.bpmnInstances.modeling.updateModdleProperties(this.bpmnElement, this.multiLoopInstance, {
|
|
|
+ completionCondition
|
|
|
+ });
|
|
|
+ },
|
|
|
userSelect() {
|
|
|
this.visibleSelect = true;
|
|
|
nextTick(() => {
|
|
|
- this.$refs.selectUserRef.init(this.setUserInfo, false);
|
|
|
+ this.$refs.selectUserRef.init((userInfo) => {
|
|
|
+ this.userTaskForm.assigneeName = userInfo.realName;
|
|
|
+ this.userTaskForm.assignee = userInfo.id;
|
|
|
+ this.updateAssignee("assignee");
|
|
|
+ }, false);
|
|
|
});
|
|
|
},
|
|
|
- setUserInfo(userInfo) {
|
|
|
- this.userTaskForm.assigneeName = userInfo.realName;
|
|
|
- this.userTaskForm.assignee = userInfo.id;
|
|
|
- this.updateAssignee("assignee");
|
|
|
- },
|
|
|
userGroupSelect() {
|
|
|
this.visibleSelect = true;
|
|
|
nextTick(() => {
|
|
|
- this.$refs.selectUserRef.init(this.setUserGroupInfo, true);
|
|
|
+ this.$refs.selectUserRef.init((users) => {
|
|
|
+ const candidateUsersName = [];
|
|
|
+ this.userTaskForm.candidateUsers = [];
|
|
|
+ for (const user of users) {
|
|
|
+ candidateUsersName.push(user.realName);
|
|
|
+ this.userTaskForm.candidateUsers.push(user.id);
|
|
|
+ }
|
|
|
+ this.userTaskForm.candidateUsersName = candidateUsersName.join(",");
|
|
|
+ this.updateCandidateUsers("candidateUsers");
|
|
|
+ }, true);
|
|
|
});
|
|
|
},
|
|
|
- setUserGroupInfo(users) {
|
|
|
- const candidateUsersName = [];
|
|
|
- this.userTaskForm.candidateUsers = [];
|
|
|
- for (const user of users) {
|
|
|
- candidateUsersName.push(user.realName);
|
|
|
- this.userTaskForm.candidateUsers.push(user.id);
|
|
|
- }
|
|
|
- this.userTaskForm.candidateUsersName = candidateUsersName.join(",");
|
|
|
- this.updateCandidateUsers("candidateUsers");
|
|
|
- },
|
|
|
roleGroupSelect() {
|
|
|
this.visibleRole = true;
|
|
|
nextTick(() => {
|
|
|
- this.$refs.selectRoleRef.init(this.setRoleGroupInfo);
|
|
|
+ this.$refs.selectRoleRef.init((roles) => {
|
|
|
+ const candidateGroupsName = [];
|
|
|
+ this.userTaskForm.candidateGroups = [];
|
|
|
+ for (const role of roles) {
|
|
|
+ candidateGroupsName.push(role.name);
|
|
|
+ this.userTaskForm.candidateGroups.push(role.id);
|
|
|
+ }
|
|
|
+ this.userTaskForm.candidateGroupsName = candidateGroupsName.join(",");
|
|
|
+ this.updateCandidateRole("candidateGroups");
|
|
|
+ });
|
|
|
});
|
|
|
},
|
|
|
- setRoleGroupInfo(roles) {
|
|
|
- const candidateGroupsName = [];
|
|
|
- this.userTaskForm.candidateGroups = [];
|
|
|
- for (const role of roles) {
|
|
|
- candidateGroupsName.push(role.name);
|
|
|
- this.userTaskForm.candidateGroups.push(role.id);
|
|
|
- }
|
|
|
- this.userTaskForm.candidateGroupsName = candidateGroupsName.join(",");
|
|
|
- this.updateCandidateRole("candidateGroups");
|
|
|
+ postGroupSelect() {
|
|
|
+ this.visiblePost = true;
|
|
|
+ nextTick(() => {
|
|
|
+ this.$refs.selectPostRef.init((posts) => {
|
|
|
+ const candidateGroupsName = [];
|
|
|
+ this.userTaskForm.candidateGroups = [];
|
|
|
+ for (const post of posts) {
|
|
|
+ candidateGroupsName.push(post.postName);
|
|
|
+ this.userTaskForm.candidateGroups.push(post.id);
|
|
|
+ }
|
|
|
+ this.userTaskForm.candidateGroupsName = candidateGroupsName.join(",");
|
|
|
+ this.updateCandidateRole("candidateGroups");
|
|
|
+ });
|
|
|
+ });
|
|
|
+ },
|
|
|
+ deptGroupSelect() {
|
|
|
+ this.visibleDept = true;
|
|
|
+ nextTick(() => {
|
|
|
+ this.$refs.selectDeptRef.init((depts) => {
|
|
|
+ const candidateGroupsName = [];
|
|
|
+ this.userTaskForm.candidateGroups = [];
|
|
|
+ for (const dept of depts) {
|
|
|
+ candidateGroupsName.push(dept.name);
|
|
|
+ this.userTaskForm.candidateGroups.push(dept.id);
|
|
|
+ }
|
|
|
+ this.userTaskForm.candidateGroupsName = candidateGroupsName.join(",");
|
|
|
+ this.updateCandidateRole("candidateGroups");
|
|
|
+ });
|
|
|
+ });
|
|
|
},
|
|
|
cancelHandle() {
|
|
|
console.log(22);
|
|
@@ -135,61 +280,58 @@ export default {
|
|
|
submitHandle() {
|
|
|
console.log(22);
|
|
|
},
|
|
|
- async getUserName(ids) {
|
|
|
- const { data } = await baseService.post("/flow/sys/user/list", ids);
|
|
|
- return data.join(",");
|
|
|
- },
|
|
|
- async getRoleName(ids) {
|
|
|
- const { data } = await baseService.post("/flow/sys/role/list", ids);
|
|
|
- return data.join(",");
|
|
|
- },
|
|
|
async resetTaskForm() {
|
|
|
const assignee = this.bpmnElement?.businessObject["assignee"];
|
|
|
const candidateUsers = this.bpmnElement?.businessObject["candidateUsers"];
|
|
|
const candidateGroups = this.bpmnElement?.businessObject["candidateGroups"];
|
|
|
|
|
|
+ const dataType = this.bpmnElement?.businessObject.$attrs["flowable:dataType"];
|
|
|
+ const text = this.bpmnElement?.businessObject.$attrs["flowable:text"];
|
|
|
+
|
|
|
this.userTaskForm["assignee"] = "";
|
|
|
this.userTaskForm["candidateUsers"] = [];
|
|
|
this.userTaskForm["candidateGroups"] = [];
|
|
|
|
|
|
- if (assignee) {
|
|
|
- this.userTaskForm["assignee"] = assignee;
|
|
|
- this.userTaskForm.assigneeName = await this.getUserName([assignee]);
|
|
|
+ this.userTaskForm.type = dataType;
|
|
|
|
|
|
+ if (dataType === "assignee") {
|
|
|
+ this.userTaskForm.assignee = assignee;
|
|
|
+ this.userTaskForm.assigneeName = text;
|
|
|
return;
|
|
|
}
|
|
|
|
|
|
- if (candidateUsers) {
|
|
|
- this.userTaskForm["candidateUsers"] = candidateUsers.split(",");
|
|
|
- this.userTaskForm.candidateUsersName = await this.getUserName(candidateUsers.split(","));
|
|
|
-
|
|
|
- this.userTaskForm.type = 1;
|
|
|
-
|
|
|
+ if (dataType === "variable") {
|
|
|
+ this.userTaskForm.variable = assignee;
|
|
|
return;
|
|
|
}
|
|
|
|
|
|
- if (candidateGroups) {
|
|
|
- this.userTaskForm["candidateGroups"] = candidateGroups.split(",");
|
|
|
- this.userTaskForm.candidateGroupsName = await this.getRoleName(candidateGroups.split(","));
|
|
|
+ if (dataType === "candidateUsers") {
|
|
|
+ this.userTaskForm.candidateUsers = candidateUsers?.split(",") || null;
|
|
|
+ this.userTaskForm.candidateUsersName = text;
|
|
|
|
|
|
- this.userTaskForm.type = 2;
|
|
|
+ return;
|
|
|
}
|
|
|
|
|
|
- // for (let key in this.defaultTaskForm) {
|
|
|
- // let value;
|
|
|
- // if (key === "candidateUsers" || key === "candidateGroups") {
|
|
|
- // value = this.bpmnElement?.businessObject[key] ? this.bpmnElement.businessObject[key].split(",") : [];
|
|
|
- // } else {
|
|
|
- // value = this.bpmnElement?.businessObject[key] || this.defaultTaskForm[key];
|
|
|
- // }
|
|
|
- // this.userTaskForm[key] = value;
|
|
|
- // }
|
|
|
+ if (dataType === "candidateRole" || dataType === "candidatePost" || dataType === "candidateDept") {
|
|
|
+ this.userTaskForm.candidateGroups = candidateGroups?.split(",") || null;
|
|
|
+ this.userTaskForm.candidateGroupsName = text;
|
|
|
+ }
|
|
|
},
|
|
|
updateAssignee(key) {
|
|
|
const taskAttr = Object.create(null);
|
|
|
taskAttr["candidateUsers"] = null;
|
|
|
taskAttr["candidateGroups"] = null;
|
|
|
taskAttr[key] = this.userTaskForm[key] || null;
|
|
|
+ taskAttr["flowable:dataType"] = "assignee";
|
|
|
+ taskAttr["flowable:text"] = this.userTaskForm["assigneeName"] || null;
|
|
|
+
|
|
|
+ window.bpmnInstances.modeling.updateProperties(this.bpmnElement, taskAttr);
|
|
|
+ },
|
|
|
+ updateVariable() {
|
|
|
+ const taskAttr = Object.create(null);
|
|
|
+ taskAttr["candidateUsers"] = null;
|
|
|
+ taskAttr["candidateGroups"] = null;
|
|
|
+ taskAttr["assignee"] = this.userTaskForm.variable;
|
|
|
|
|
|
window.bpmnInstances.modeling.updateProperties(this.bpmnElement, taskAttr);
|
|
|
},
|
|
@@ -198,6 +340,7 @@ export default {
|
|
|
taskAttr["assignee"] = null;
|
|
|
taskAttr["candidateGroups"] = null;
|
|
|
taskAttr[key] = this.userTaskForm[key] && this.userTaskForm[key].length ? this.userTaskForm[key].join(",") : null;
|
|
|
+ taskAttr["flowable:text"] = this.userTaskForm["candidateUsersName"] || null;
|
|
|
|
|
|
window.bpmnInstances.modeling.updateProperties(this.bpmnElement, taskAttr);
|
|
|
},
|
|
@@ -206,16 +349,36 @@ export default {
|
|
|
taskAttr["assignee"] = null;
|
|
|
taskAttr["candidateUsers"] = null;
|
|
|
taskAttr[key] = this.userTaskForm[key] && this.userTaskForm[key].length ? this.userTaskForm[key].join(",") : null;
|
|
|
+ taskAttr["flowable:text"] = this.userTaskForm["candidateGroupsName"] || null;
|
|
|
|
|
|
window.bpmnInstances.modeling.updateProperties(this.bpmnElement, taskAttr);
|
|
|
},
|
|
|
- updateElementTask(key) {
|
|
|
+ updateDataType() {
|
|
|
+ const type = this.userTaskForm.type;
|
|
|
const taskAttr = Object.create(null);
|
|
|
- if (key === "candidateUsers" || key === "candidateGroups") {
|
|
|
- taskAttr[key] = this.userTaskForm[key] && this.userTaskForm[key].length ? this.userTaskForm[key].join(",") : null;
|
|
|
- } else {
|
|
|
- taskAttr[key] = this.userTaskForm[key] || null;
|
|
|
+ taskAttr["candidateUsers"] = null;
|
|
|
+ taskAttr["candidateGroups"] = null;
|
|
|
+ taskAttr["assignee"] = null;
|
|
|
+ taskAttr["flowable:text"] = null;
|
|
|
+
|
|
|
+ if (type === "deptLeader" || type === "superDeptLeader") {
|
|
|
+ this.userTaskForm.assigneeName = null;
|
|
|
+ taskAttr["loopCharacteristics"] = null;
|
|
|
+ this.loopCharacteristics = "";
|
|
|
+ } else if (type === "startUserId") {
|
|
|
+ taskAttr["assignee"] = "${startUserId}";
|
|
|
+ taskAttr["loopCharacteristics"] = null;
|
|
|
+ this.loopCharacteristics = "";
|
|
|
+ } else if (type === "variable") {
|
|
|
+ taskAttr["assignee"] = this.userTaskForm.variable;
|
|
|
+ taskAttr["loopCharacteristics"] = null;
|
|
|
+ this.loopCharacteristics = "";
|
|
|
+ } else if (type === "assignee") {
|
|
|
+ taskAttr["loopCharacteristics"] = null;
|
|
|
+ this.loopCharacteristics = "";
|
|
|
}
|
|
|
+
|
|
|
+ taskAttr["flowable:dataType"] = type;
|
|
|
window.bpmnInstances.modeling.updateProperties(this.bpmnElement, taskAttr);
|
|
|
}
|
|
|
},
|