Files
tnb.server/apihost/Tnb.API.Entry/wwwroot/Template/appWorkflowIndex.vue.vm
2023-03-13 15:00:34 +08:00

698 lines
24 KiB
Plaintext

<template>
<view class="dynamicModel-list-v">
<view class="head-warp com-dropdown">
<u-dropdown class="u-dropdown" ref="uDropdown">
<u-dropdown-item title="排序">
<view class="dropdown-slot-content">
<view class="dropdown-slot-content-main">
<u-cell-group>
<u-cell-item @@click="cellClick(item)" :arrow="false" :title="item.label" v-for="(item, index) in sortOptions" :key="index" :title-style="{ color: sortValue == item.value ? '#2979ff' : '#606266' }">
<u-icon v-if="sortValue == item.value" name="checkbox-mark" color="#2979ff" size="32"></u-icon>
</u-cell-item>
</u-cell-group>
</view>
<view class="dropdown-slot-bg" @@click="$refs.uDropdown.close()"></view>
</view>
</u-dropdown-item>
<u-dropdown-item title="筛选">
<view class="dropdown-slot-content">
<view class="dropdown-slot-content-main search-main">
<view class="u-p-l-32 u-p-r-32 search-form">
<u-form :model="searchForm" ref="searchForm" :errorType="['toast']" label-position="left" label-width="150">
@*循环查询条件*@
@foreach(var search in Model.SearchColumnDesign)
{
@switch(search.QueryControlsKey)
{
case "input":
<u-form-item label="@(@search.Label)" prop="@(@search.Name)">
<u-input v-model="searchForm.@(@search.Name)" placeholder="请输入@(@search.Label)" />
</u-form-item>
break;
case "numRange":
<u-form-item label="@(@search.Label)" prop="@(@search.Name)">
<jnpf-num-range v-model="searchForm.@(@search.Name)" />
</u-form-item>
break;
case "switch":
<u-form-item label="@(@search.Label)" prop="@(@search.Name)">
<view class="u-flex u-form-item-switch">
<jnpf-switch v-model="searchForm.@(@search.Name)" />
</view>
</u-form-item>
break;
case "select":
<u-form-item label="@(@search.Label)" prop="@(@search.Name)">
<jnpf-select v-model="searchForm.@(@search.Name)" placeholder="请选择@(@search.Label)" :options=" @(@search.OriginalName)Options" :props="@(@search.OriginalName)Props" />
</u-form-item>
break;
case "cascader":
<u-form-item label="@(@search.Label)" prop="@(@search.Name)">
<jnpf-cascader v-model="searchForm.@(@search.Name)" placeholder="请选择@(@search.Label)" :options="@(@search.OriginalName)Options" :props="@(@search.OriginalName)Props" />
</u-form-item>
break;
case "time":
<u-form-item label="@(@search.Label)" prop="@(@search.Name)">
<jnpf-time-range v-model="searchForm.@(@search.Name)" />
</u-form-item>
break;
case "date":
<u-form-item label="@(@search.Label)" prop="@(@search.Name)">
<jnpf-date-range v-model="searchForm.@(@search.Name)" />
</u-form-item>
break;
case "comSelect":
<u-form-item label="@(@search.Label)" prop="@(@search.Name)">
<jnpf-com-select type="organize" v-model="searchForm.@(@search.Name)" placeholder="请选择@(@search.Label)" />
</u-form-item>
break;
case "depSelect":
<u-form-item label="@(@search.Label)" prop="@(@search.Name)">
<jnpf-postordep-select type="department" v-model="searchForm.@(@search.Name)" placeholder="请选择@(@search.Label)" @(@search.SelectType)@(@search.IsCustomSelect ? @search.AbleDepIds + @search.AblePosIds + @search.AbleUserIds + @search.AbleRoleIds + @search.AbleGroupIds : "")/>
</u-form-item>
break;
case "posSelect":
<u-form-item label="@(@search.Label)" prop="@(@search.Name)">
<jnpf-postordep-select type="position" v-model="searchForm.@(@search.Name)" placeholder="请选择@(@search.Label)" @(@search.SelectType)@(@search.IsCustomSelect ? @search.AbleDepIds + @search.AblePosIds + @search.AbleUserIds + @search.AbleRoleIds + @search.AbleGroupIds : "")/>
</u-form-item>
break;
case "userSelect":
<u-form-item label="@(@search.Label)" prop="@(@search.Name)">
<jnpf-user-select v-model="searchForm.@(@search.Name)" placeholder="请选择@(@search.Label)" @(@search.SelectType)@(@search.IsCustomSelect ? @search.AbleDepIds + @search.AblePosIds + @search.AbleUserIds + @search.AbleRoleIds + @search.AbleGroupIds : "")/>
</u-form-item>
break;
case "usersSelect":
<u-form-item label="@(@search.Label)" prop="@(@search.Name)">
<jnpf-user-choice v-model="searchForm.@(@search.Name)" placeholder="请选择@(@search.Label)" @(@search.SelectType)@(@search.IsCustomSelect ? @search.AbleDepIds + @search.AblePosIds + @search.AbleUserIds + @search.AbleRoleIds + @search.AbleGroupIds + search.AbleIds : "")/>
</u-form-item>
break;
case "treeSelect":
<u-form-item label="@(@search.Label)" prop="@(@search.Name)">
<jnpf-tree-select v-model="searchForm.@(@search.Name)" :options="@(@search.OriginalName)Options" :props="@(@search.OriginalName)Props" placeholder="请选择@(@search.Label)" />
</u-form-item>
break;
case "address":
<u-form-item label="@(@search.Label)" prop="@(@search.Name)">
<jnpf-city-select v-model="searchForm.@(@search.Name)" placeholder="请选择@(@search.Label)" :level="@(@search.Level)" />
</u-form-item>
break;
case "groupSelect":
<u-form-item label="@(@search.Label)" prop="@(@search.LowerName)">
<jnpf-group-select v-model="searchForm.@(@search.LowerName)" placeholder="请选择@(@search.Label)" />
</u-form-item>
break;
case "roleSelect":
<u-form-item label="@(@search.Label)" prop="@(@search.LowerName)">
<jnpf-role-select v-model="search.@(@search.LowerName)" placeholder="请选择@(@search.Label)" />
</u-form-item>
break;
}
}
</u-form>
</view>
<view class="buttom-actions">
<u-button class="buttom-btn" @@click="reset">重置</u-button>
<u-button class="buttom-btn" type="primary" @@click="closeDropdown">检索</u-button>
</view>
</view>
<view class="dropdown-slot-bg" @@click="$refs.uDropdown.close()"></view>
</view>
</u-dropdown-item>
</u-dropdown>
</view>
<view class="list-warp">
<mescroll-uni ref="mescrollRef" @@init="mescrollInit" @@down="downCallback" @@up="upCallback" :fixed="false" :down="downOption" :up="upOption">
<view class="list">
<view class="list-box">
<uni-swipe-action ref="swipeAction">
<uni-swipe-action-item v-for="(item, index) in list" :key="item.@(@Model.PrimaryKey)" :threshold="0" :right-options="options">
<view class="item" @@click="goDetail(item.@(@Model.PrimaryKeyPolicy == 1 ? @Model.PrimaryKey : "flowTaskId"), item.flowState)">
<view class="u-line-1 item-cell" v-for="(column,i) in columnList" :key="i">
<view v-if="column.jnpfKey != 'table'">
<text class="listTit u-line-1">{{column.label}}:</text>
<text class="listContent">{{item[column.prop] | dynamicTreeText(column.option)}}</text>
</view>
<view class="collapse-box u-flex" v-else="">
<tableCell :label="column.label" :childList="item[column.prop]"
:children="column.children" ref="tableCell" :pageLen="3"></tableCell>
</view>
</view>
<view class="item-cell">
<text class="listTit">审批状态:</text>
<text :class="getFlowStatus(item.flowState).statusCss">
{{getFlowStatus(item.flowState).text}}
</text>
</view>
</view>
<template v-slot:right>
<view class="right-option-box">
<view class="right-option" v-for="(it,i) in options" @@click="handleClick(index)" :key="i">
<text>{{it.text}}</text>
</view>
</view>
</template>
</uni-swipe-action-item>
</uni-swipe-action>
</view>
</view>
</mescroll-uni>
</view>
@if(Model.IsAdd)
{
@if(Model.UseBtnPermission)
{
@:<view class="com-addBtn" @@click="addPage()" v-if="$setPermission.hasBtnP('btn_add',menuIds)">
}else{
@:<view class="com-addBtn" @@click="addPage()">
}
<u-icon name="plus" size="60" color="#fff" />
</view>
}
</view>
</template>
<script>
import {getFormById} from '@@/api/workFlow/workFlowForm'
import {getDictionaryDataSelector,getDataInterfaceRes} from '@@/api/common'
import resources from '@@/libs/resources.js'
import MescrollMixin from "@@/uni_modules/mescroll-uni/components/mescroll-uni/mescroll-mixins.js";
import request from '@@/utils/request'
import columnList from './columnList'
@if(Model.IsChildTableShow)
{
@:import tableCell from '../dynamicModel/components/tableCell.vue'
}
export default {
mixins: [MescrollMixin],
components:{@(@Model.IsChildTableShow ? "tableCell" : "")},
data() {
return {
sortValue: '',
enCode: '@(Model.EnCode)',
formId: '@(Model.FormId)',
flowId: '',
searchForm: {
@foreach(var search in Model.SearchColumnDesign)
{
@:@(@search.Name):undefined,
}
},
downOption: {
use: true,
auto: false
},
dataOptions: {
@foreach (var item in Model.ColumnDesign)
{
@if(item.IsChildTable)
{
@:@(@item.Name): {},
}
}
},
upOption: {
page: {
num: 0,
size: 20,
time: null
},
empty: {
use: true,
icon: resources.message.nodata,
tip: "暂无数据",
fixed: true,
top: "300rpx",
zIndex: 5
},
textNoMore: '没有更多数据',
toTop: {
bottom: 250
}
},
list: [],
appColumnList: columnList,
listQuery: {
sort: 'desc',
sidx: '@(@Model.DefaultSidx)',
keyword: '',
json: ''
},
options: [
@if(@Model.IsRemoveDel){
@foreach (var item in @Model.ColumnButtonDesign)
{
@if(item.Value == "remove")
{
@:{
@:text: '@(@item.Label)',
@:style: {
@:backgroundColor: '#dd524d'
@:}
@:}
}
}
}
],
sortOptions: [
@foreach(var sort in Model.SearchColumnDesign)
{
@:{
@:label: '@(@sort.Label)降序',
@:sidx: '@(@sort.Name)',
@:value: '@(@sort.Name)desc',
@:sort: 'desc'
@:},
}
],
@if(Model.UseColumnPermission || Model.UseBtnPermission)
{
@:menuIds:'',
}
columnList: [],
isTree: false,
@foreach(var item in @Model.OptionsList)
{
@if(item.IsIndex)
{
@:@item.Content
}
@if(item.IsProps)
{
@:@(@item.LowerName)Props:@(@item.Props),
}
@switch(item.jnpfKey)
{
case "posSelect":
case "userSelect":
case "depSelect":
@:@item.Content
break;
}
}
}
},
onLoad(e) {
this.menuIds = e.menuId
this.getFormById()
uni.$on('refresh', () => {
this.list = [];
this.mescroll.resetUpScroll();
})
this.getColumnList()
@foreach(var item in @Model.OptionsList)
{
@if(!item.IsStatic && item.IsIndex)
{
@:this.get@(@item.LowerName)Options();
}
}
},
onUnload() {
uni.$off('refresh')
},
methods: {
getFormById() {
getFormById(this.formId).then(res => {
this.flowId = res.data && res.data.id
this.enCode = res.data && res.data.enCode
})
},
@foreach(var item in @Model.OptionsList)
{
@if(!item.IsStatic && item.IsIndex)
{
@:get@(@item.LowerName)Options(){
switch(@item.DataType)
{
case "dictionary":
@:getDictionaryDataSelector('@(@item.DictionaryType)').then(res => {
@:this.@(@item.LowerName)Options = res.data.list
break;
case "dynamic":
@:getDataInterfaceRes('@(@item.DictionaryType)').then(res => {
@:let data = res.data
@:this.@(@item.LowerName)Options = data
break;
}
@:});
@:},
}
}
upCallback(page) {
let query = {
currentPage: page.num,
pageSize: page.size,
...this.listQuery,
...this.searchForm,
menuId:this.menuIds
}
@foreach(var search in Model.SearchColumnDesign)
{
@switch(search.QueryControlsKey)
{
case "cascader":
case "numRange":
case "date":
case "time":
case "comSelect":
case "address":
case "createTime":
case "modifyTime":
@:query.@(@search.Name) = query.@(@search.Name) ? query.@(@search.Name).join() : null;
break;
}
}
request({
url: '/api/@(@Model.NameSpace)/@(@Model.ClassName)/List',
method: 'post',
data: query,
}).then(res => {
if (page.num == 1) this.list = [];
@if(Model.HasPage)
{
@:const list = res.data.list.map(o => {
}else{
@:const list = res.data.map(o => {
}
return {
show: false,
...o
}
});
@if(Model.HasPage)
{
@:this.mescroll.endSuccess(res.data.list.length);
}
else
{
@:this.mescroll.endSuccess(res.data.length, false);
}
this.list = this.list.concat(list);
}).catch(() => {
this.mescroll.endErr();
})
},
handleClick(index, index1) {
const item = this.list[index]
if ([1, 2, 5].includes(item.flowState)) {
this.$u.toast("流程正在审核,请勿删除")
this.list[index].show = false
return
}
request({
url: '/api/@(@Model.NameSpace)/@(@Model.ClassName)/' + item.@(@Model.PrimaryKey),
method: 'delete'
}).then(res => {
uni.showToast({
title: res.msg,
complete: () => {
this.$u.toast(res.msg)
this.list.splice(index, 1)
}
})
})
},
open(index) {
this.list[index].show = true;
this.list.map((val, idx) => {
if (index != idx) this.list[idx].show = false;
})
},
addPage() {
this.jumPage()
},
jumPage(id,status,btnType){
if (!id && !status) btnType = 'btn_add'
let _title = ""
@if(Model.IsAdd)
{
@:if(btnType =='btn_add'){
@:_title = "@(@Model.AddTitleName)"
@:}
}
@if(Model.IsEdit)
{
@:if(btnType =='btn_edit'){
@:_title = "@(@Model.EditTitleName)"
@:}
}
@if(Model.IsEdit)
{
@:if(btnType =='btn_detail'){
@:_title = "@(@Model.DetailTitleName)"
@:}
}
let opType = '-1'
if ([1, 2, 3, 4, 5].includes(status)) opType = 0
const config = {
id: id || '',
enCode: this.enCode,
flowId: this.flowId,
formType: 1,
type: 1,
opType,
status: status || '',
fullName: _title,
jurisdictionType: btnType || ''
}
uni.navigateTo({
url:'/pages/workFlow/flowBefore/index?config=' + this.base64.encode(
JSON.stringify(config), "UTF-8")
})
},
search() {
this.searchTimer && clearTimeout(this.searchTimer)
this.searchTimer = setTimeout(() => {
this.list = [];
this.mescroll.resetUpScroll();
}, 300)
},
goDetail(id, status) {
let btnType = '';
@if(Model.IsEdit && Model.IsDetail){
@:let s = ["btn_detail",'btn_edit']
@:if(s.includes('btn_detail')){
@:btnType = "btn_detail"
@:}
@:if(s.includes('btn_edit')){
@:btnType = "btn_edit"
@:}
}else if(Model.IsEdit && !Model.IsDetail)
{
@:let s = ['btn_edit']
@:if(s.includes('btn_edit')){
@:btnType = "btn_edit"
@:}
}else if(!Model.IsEdit && Model.IsDetail){
@:let s = ["btn_detail"]
@:if(s.includes('btn_detail')){
@:btnType = "btn_detail"
@:}
}else{
@:let s = []
}
if(!btnType) return
@if(Model.UseBtnPermission){
@if(Model.IsEdit && Model.IsDetail){
@:if (!this.$setPermission.hasBtnP('btn_edit', this.menuIds) && !this.$setPermission.hasBtnP('btn_detail', this.menuIds)) return
@:if (this.$setPermission.hasBtnP('btn_edit', this.menuIds)) btnType = 'btn_edit'
}else if(Model.IsEdit && !Model.IsDetail)
{
@:if (!this.$setPermission.hasBtnP('btn_edit', this.menuIds) && !this.$setPermission.hasBtnP('', this.menuIds)) return
@:if (this.$setPermission.hasBtnP('btn_edit', this.menuIds)) btnType = 'btn_edit'
}
else if(!Model.IsEdit && Model.IsDetail){
@:if (!this.$setPermission.hasBtnP('btn_detail', this.menuIds) && !this.$setPermission.hasBtnP('', this.menuIds)) return
@:if (this.$setPermission.hasBtnP('', this.menuIds)) btnType = 'btn_edit'
}
}
this.jumPage(id,status,btnType)
},
getFlowStatus(val) {
let status
switch (val) {
case 0:
status = {
text: '等待提交',
statusCss: 'u-type-info'
}
break;
case 1:
status = {
text: '等待审核',
statusCss: 'u-type-primary'
}
break;
case 2:
status = {
text: '审核通过',
statusCss: 'u-type-success'
}
break;
case 3:
status = {
text: '审核驳回',
statusCss: 'u-type-error'
}
break;
case 4:
status = {
text: '流程撤回',
statusCss: 'u-type-warning'
}
break;
case 5:
status = {
text: '审核终止',
statusCss: 'u-type-info'
}
break;
default:
status = {
text: '等待提交',
statusCss: 'u-type-info'
}
break;
}
return status
},
getColumnList() {
let columnPermissionList = []
let _appColumnList = this.appColumnList
@if(Model.UseColumnPermission)
{
@:let permissionList = uni.getStorageSync('permissionList')
@:let list = permissionList.filter(o => o.modelId === this.menuIds)
@:let _columnList = list[0] && list[0].column ? list[0].column : []
@:for (let i = 0; i < _appColumnList.length; i++) {
@:let _app = _appColumnList[i].prop
@:inner: for (let j = 0; j < _columnList.length; j++) {
@:let _encode = _columnList[j].enCode
@:if (_app == _encode) {
@:columnPermissionList.push(this.appColumnList[i])
@:break inner
@:}
@:}
@:}
@:this.columnList = this.transformColumnList(columnPermissionList, this.dataOptions)
}else{
@:this.columnList = this.transformColumnList(_appColumnList, this.dataOptions)
}
},
transformColumnList(columnList, dataOptions) {
let list = []
for (let i = 0; i < columnList.length; i++) {
let e = columnList[i]
let columProp = e.prop
let label = e.label
let option = null
let options = columProp + "Options"
if (!columProp.includes('-')) {
if (dataOptions[options]) {
option = dataOptions[options]
} else {
@if(Model.IsInlineEditor)
{
@:columProp = columProp + "_name"
}else{
@:columProp = columProp
}
}
if (label.length > 4) {
label = label.substring(0, 4)
}
e.label = label
e.prop = columProp
e.option = option
list.push(e)
} else {
e.vModel = columProp.split('-')[1]
e.childLabel = e.label.split('-')[1]
options = e.vModel + "Options"
let prop = columProp.split('-')[0]
let label = e.label.split('-')[0]
let newItem = {
align: "center",
jnpfKey: "table",
prop,
label,
children: []
}
if (!list.some(o => o.prop === prop)) list.push(newItem)
for (let i = 0; i < list.length; i++) {
if (list[i].prop === prop) {
if (dataOptions[prop][options]) {
option = dataOptions[prop][options]
}
e.option = option
list[i].children.push(e)
break
}
}
}
}
return list
},
cellClick(item) {
if (this.sortValue === item.value) return
this.listQuery.sort = item.sort
this.listQuery.sidx = item.sidx
this.sortValue = item.value
this.$refs.uDropdown.close();
this.$nextTick(() => {
this.list = [];
this.mescroll.resetUpScroll();
})
},
reset() {
this.$refs.searchForm.resetFields()
},
closeDropdown() {
this.$refs.uDropdown.close();
this.$nextTick(() => {
this.list = [];
this.mescroll.resetUpScroll();
})
}
}
}
</script>
<style lang="scss">
page {
background-color: #f0f2f6;
height: 100%;
/* #ifdef MP-ALIPAY */
position: absolute;
top: 0;
left: 0;
width: 100%;
/* #endif */
}
.right-option-box {
display: flex;
width: max-content;
.right-option {
width: 144rpx;
height: 100%;
font-size: 16px;
color: #fff;
background-color: #dd524d;
display: flex;
align-items: center;
justify-content: center;
}
.more-option {
background-color: #1890ff;
}
}
.item{
padding: 0 !important;
}
.list-warp{
padding: 20rpx 0 !important;
}
</style>