xy 1 year ago
parent 4fdd9fbaae
commit 0f9db0e0ab

@ -195,7 +195,7 @@ export function statistics(type, params, isLoading=true) {
}) })
} }
export function updateTime(params,isLoading=true) { export function updateNodeTime(params,isLoading=true) {
return request({ return request({
method: 'get', method: 'get',
url: '/api/oa/flow/update-time', url: '/api/oa/flow/update-time',
@ -203,3 +203,12 @@ export function updateTime(params,isLoading=true) {
isLoading isLoading
}) })
} }
export function updateFlowTime(params,isLoading=true) {
return request({
method: 'get',
url: '/api/oa/flow/update-flow-time',
params,
isLoading
})
}

@ -0,0 +1,181 @@
<template>
<div>
<div class="van-dropdown-menu">
<div class="van-dropdown-menu__bar van-dropdown-menu__bar--opened">
<div role="button" tabindex="0" class="van-dropdown-menu__item">
<div class="van-dropdown-menu__title" :class="[ showSelectMultiple ? 'van-dropdown-menu__title--active van-dropdown-menu__title--down' : '' ]" @click="selectActive()">
<div class="van-ellipsis">{{ selectName }}</div>
</div>
<div v-if="showSelectMultiple" class="btn_left">
<span v-if="!all" @click="toggleAll()"></span>
<span v-if="all" @click="toggleFalseAll()"></span>
</div>
<div v-if="showSelectMultiple" class="btn_true" @click="submitSelect()"></div>
</div>
</div>
</div>
<div v-if="showSelectMultiple" class="van-dropdown-item van-dropdown-item--down" style="top: 40.9531px;">
<div ref="content" class="van-popup van-popup--bottom van-dropdown-item__content">
<van-checkbox-group v-model="checked" res="checkboxGroup" @change="selectDataOptsChange">
<div v-for="(item,index) in selectDataOpts" :key="typeof item === 'object' ? item[options.value] : item" role="button" :tabindex="index" class="van-cell van-cell--clickable van-dropdown-item__option">
<div class="van-cell__title">
<span>
<van-checkbox :name="typeof item === 'object' ? item[options.value] : item" checked-color="var(--theme-color)">{{ index+1 }}.{{ typeof item === 'object' ? item[options.label] : item }}</van-checkbox></span>
</div>
</div>
</van-checkbox-group>
</div>
</div>
</div>
</template>
<script >
import { Checkbox, CheckboxGroup, DropdownMenu, DropdownItem } from 'vant'
import { PopupManager } from "element-ui/lib/utils/popup";
export default {
name: 'CopyCode',
components: {
VanCheckbox: Checkbox,
VanCheckboxGroup: CheckboxGroup,
// eslint-disable-next-line
VanDropdownMenu: DropdownMenu,
// eslint-disable-next-line
VanDropdownItem: DropdownItem
},
props: {
selectName: {
type: String,
default: '全部'
},
disabled: {
type: Boolean,
default: false
},
otherName: {
type: String,
default: '供应商'
},
checkedList: {
type: Array,
default: function() { return [] }
},
selectDataOpts: {
type: Array,
default: function() { return [] }
},
options: {
type: Object,
default: () => ({
label: 'name',
value: 'id'
})
},
multipleLimit: {
type: Number,
default: 50
}
// showSelectMultiple: {
// type: Boolean,
// default: false
// }
},
data() {
return {
zIndex: PopupManager.nextZIndex(),
showSelectMultiple: false,
checked: [],
all: false
}
},
mounted() {
this.checked = this.checkedList
},
methods: {
selectActive() {
if (this.disabled) {
return
}
this.showSelectMultiple = !this.showSelectMultiple
},
toggleAll() {
const data = []
for (let i = 0; i < this.selectDataOpts.length; i++) {
data.push(typeof this.selectDataOpts[i] === 'object' ? this.selectDataOpts[i][this.options.value] : this.selectDataOpts[i])
}
this.all = true
this.checked = data
},
toggleFalseAll() {
this.all = false
this.checked = []
},
submitSelect() {
this.showSelectMultiple = false
this.$emit('confirm', this.checked)
// this.selectNameData()
},
cancelSelect() {
this.showSelectMultiple = false
},
selectDataOptsChange(data) {
this.selectNameData()
},
selectNameData() {
if (!this.checked.length || this.selectDataOpts.length === this.checked.length) {
this.$emit('selectMutiple', { checked: this.checked, name: '全部' + this.otherName })
} else {
this.$emit('selectMutiple', { checked: this.checked, name: '已选中(' + this.checked.length + ')' + this.otherName })
}
},
onCopy() {
},
onError() {
}
}
}
</script>
<style lang="scss" scoped>
.copy{
font-size:14px;
}
.blank{
position: relative;
width:100%;
height:60px;
}
.btn_true{
width:60px;
height:30px;
border-radius: 5px;
background-color:var(--theme-color);
color:#fff;
position: absolute;
text-align:center;
line-height:30px;
right:10px;
font-size:14px;
top:10px;
}
.btn_left{
width:60px;
height:30px;
position: absolute;
text-align:center;
line-height:30px;
left:10px;
font-size:14px;
top:10px;
}
.block_content{
width:100%;
}
.flex_bottom{
position: absolute ;
bottom:-10px;
left:0;
}
</style>

@ -7,6 +7,7 @@ const getDefaultState = () => {
token: getToken(), token: getToken(),
name: '', name: '',
avatar: '', avatar: '',
username: '',
adminId: '', adminId: '',
department: {}, department: {},
role: [], role: [],
@ -36,6 +37,9 @@ const mutations = {
}, },
SET_DEPARTMENT: (state, department) => { SET_DEPARTMENT: (state, department) => {
state.department = department state.department = department
},
SET_USERNAME: (state, username) => {
state.username = username
} }
} }
@ -61,13 +65,14 @@ const actions = {
return new Promise((resolve, reject) => { return new Promise((resolve, reject) => {
getInfo(state.token).then(response => { getInfo(state.token).then(response => {
const { name, avatar, id, role, department } = response const { name, avatar, id, role, department, username } = response
commit('SET_DEPARTMENT',department) commit('SET_DEPARTMENT',department)
commit('SET_NAME', name) commit('SET_NAME', name)
commit('SET_AVATAR', avatar) commit('SET_AVATAR', avatar)
commit('SET_ADMIN_ID', id) commit('SET_ADMIN_ID', id)
commit('SET_ROLE', role) commit('SET_ROLE', role)
commit('SET_USERNAME', username)
resolve(response) resolve(response)
}).catch(error => { }).catch(error => {
reject(error) reject(error)

@ -508,6 +508,40 @@ export default function formBuilder(device, info, h, row, pWrite = false,pReadab
) )
); );
break; break;
case "relation-flow":
formItem = h(
formBuilderMap(device).get(info.type),
{
props: {
value: row ? row[info.name] : this.form[info.name],
clearable: true,
placeholder: info.help_text,
multiple: true,
},
attrs: {
placeholder: info.help_text,
},
style: {
width: '100%'
},
on: {
input: (e) => {
row
? this.$set(row, info.name, e)
: this.$set(this.form, info.name, e);
},
},
},
options.map((option) =>
h("el-option", {
props: {
label: option,
value: option,
},
})
)
);
break;
case "relation": case "relation":
formItem = h( formItem = h(
"vxe-table", "vxe-table",
@ -665,7 +699,7 @@ export default function formBuilder(device, info, h, row, pWrite = false,pReadab
case "select": case "select":
let findValue = options.find((i) => let findValue = options.find((i) =>
typeof i === "object" typeof i === "object"
? i.id === this.form[info.name] ? i.id == this.form[info.name]
: i === this.form[info.name] : i === this.form[info.name]
); );
formItem = h( formItem = h(
@ -675,7 +709,48 @@ export default function formBuilder(device, info, h, row, pWrite = false,pReadab
color: "#333", color: "#333",
}, },
}, },
typeof findValue === "object" ? findValue.name : findValue info.multiple ? this.form[info.name]?.split('|').map(j => {
return options.find((i) =>
typeof i === "object"
? i.id == j
: i === j
)?.name;
})?.toString() : typeof findValue === "object" ? findValue.name : findValue
);
break;
case "choice":
formItem = h(
"span",
{
style: {
color: "#333",
},
},
this.form[info.name]?.split('|').map(j => {
return options.find((i) => i.id == j)?.name;
})?.toString()
);
break;
case "choices":
let findChoicesValue = options.find((i) =>
typeof i === "object"
? i.id == this.form[info.name]
: i === this.form[info.name]
);
formItem = h(
"span",
{
style: {
color: "#333",
},
},
info.multiple ? this.form[info.name]?.split('|').map(j => {
return options.find((i) =>
typeof i === "object"
? i.id == j
: i === j
)?.name;
})?.toString() : typeof findChoicesValue === "object" ? findChoicesValue.name : findChoicesValue
); );
break; break;
case "file": case "file":
@ -757,7 +832,8 @@ export default function formBuilder(device, info, h, row, pWrite = false,pReadab
{ {
props: { props: {
prop: info.name, prop: info.name,
label: info.label, label: info.label_show ? info.label : '',
'label-width': !info.label_show ? '0': ''
}, },
style: { style: {
"grid-column-start": info.gs_x + 1, "grid-column-start": info.gs_x + 1,
@ -771,6 +847,11 @@ export default function formBuilder(device, info, h, row, pWrite = false,pReadab
} }
} }
if (device === "mobile") { if (device === "mobile") {
let findValue = options?.find((i) =>
typeof i === "object"
? i.id === (row ? row[info.name] : this.form[info.name])
: i === (row ? row[info.name] : this.form[info.name])
);
if (info._writeable || pWrite) { if (info._writeable || pWrite) {
switch (info.type) { switch (info.type) {
case "text": case "text":
@ -860,11 +941,6 @@ export default function formBuilder(device, info, h, row, pWrite = false,pReadab
}); });
break; break;
case "select": case "select":
let findValue = options.find((i) =>
typeof i === "object"
? i.id === (row ? row[info.name] : this.form[info.name])
: i === (row ? row[info.name] : this.form[info.name])
);
formItem = h("van-field", { formItem = h("van-field", {
props: { props: {
readonly: true, readonly: true,
@ -885,6 +961,28 @@ export default function formBuilder(device, info, h, row, pWrite = false,pReadab
}, },
}); });
break; break;
case "choice":
formItem = h("van-field", {
props: {
readonly: true,
clickable: true,
name: info.name,
label: info.label,
value: typeof findValue === "object" ? findValue.name : findValue,
clearable: true,
placeholder: info.help_text,
},
on: {
click: (_) => {
this.multipleSelectOption.forFormName = info.name;
this.multipleSelectOption.originalObj = row;
this.$set(this.multipleSelectOption, "columns", options);
this.$set(this.multipleSelectOption, "multipleLimit", info.multiple);
this.$set(this.multipleSelectOption, "isShow", true);
},
},
});
break;
case "file": case "file":
formItem = h('van-cell',{ formItem = h('van-cell',{
props: { props: {

@ -8,12 +8,13 @@ export default function (device) {
['select', 'el-select'], ['select', 'el-select'],
['radio', 'el-radio-group'], ['radio', 'el-radio-group'],
['file', 'el-upload'], ['file', 'el-upload'],
['label', 'el-tag'], ['label', 'div'],
['static', 'el-link'], ['static', 'el-link'],
['hr', 'el-divider'], ['hr', 'el-divider'],
['choice', 'el-select'], ['choice', 'el-select'],
['choices', 'el-select'], ['choices', 'el-select'],
['sign', 'el-image'] ['sign', 'el-image'],
['relation-flow','el-select']
]) : ]) :
new Map([ new Map([
['text', 'van-field'], ['text', 'van-field'],

@ -102,7 +102,7 @@ export default {
render(h) { render(h) {
const authFields = this.fields.map(field => ({ const authFields = this.fields.map(field => ({
...field, ...field,
_readable: this.readable.indexOf(field.id) !== -1, _readable: this.readable.indexOf(field.id) !== -1 || field.type === 'label',
_writeable: this.writeable.indexOf(field.id) !== -1, _writeable: this.writeable.indexOf(field.id) !== -1,
})) }))
authFields.unshift({ authFields.unshift({
@ -113,6 +113,7 @@ export default {
gs_y: 0, gs_y: 0,
gs_width: 12, gs_width: 12,
gs_height: 1, gs_height: 1,
label_show: 1,
_readable: !this.isFirstNode, _readable: !this.isFirstNode,
_writeable: this.isFirstNode _writeable: this.isFirstNode
}) })

@ -1,9 +1,13 @@
<script> <script>
import formBuilder from '@/utils/formBuilder' import formBuilder from '@/utils/formBuilder'
import moment from "moment/moment"; import moment from "moment/moment";
import MobileMultipleSelect from "@/components/MobileMultipleSelect/index.vue";
import {deepCopy} from "@/utils"; import {deepCopy} from "@/utils";
import {PopupManager} from "element-ui/lib/utils/popup"; import {PopupManager} from "element-ui/lib/utils/popup";
export default { export default {
components: {
MobileMultipleSelect
},
props: { props: {
isFirstNode: { isFirstNode: {
type: Boolean, type: Boolean,
@ -72,6 +76,13 @@ export default {
forFormName: "", forFormName: "",
columns: [], columns: [],
originalObj: "" originalObj: ""
},
multipleSelectOption: {
isShow: false,
forFormName: "",
columns: [],
originalObj: "",
multipleLimit: 50
} }
} }
}, },
@ -208,6 +219,40 @@ export default {
} }
}) })
]) : '', ]) : '',
//
authFields.findIndex(i => ['relation-flow','choice','choices'].indexOf(i.type) !== -1) !== -1 ?
h('van-popup',{
props: {
value: this.multipleSelectOption.isShow,
position: 'bottom',
},
on: {
input: e => {
this.$set(this.multipleSelectOption,'isShow',e)
},
}
},[
h(MobileMultipleSelect,{
props: {
selectDataOpts: this.multipleSelectOption.columns,
multipleLimit: this.multipleSelectOption.multipleLimit,
},
on: {
confirm: value => {
if(typeof this.multipleSelectOption.originalObj === 'object') {
console.log(this.multipleSelectOption.originalObj)
this.$set(this.multipleSelectOption.originalObj,this.multipleSelectOption.forFormName,value)
} else {
this.$set(this.form,this.multipleSelectOption.forFormName,value)
}
this.$set(this.multipleSelectOption,'isShow',false)
},
cancel: _ => {
this.$set(this.multipleSelectOption,'isShow',false)
}
}
})
]) : '',
// //
h('vxe-modal',{ h('vxe-modal',{

@ -90,6 +90,7 @@
:custom-config="{ mode: 'popup' }" :custom-config="{ mode: 'popup' }"
:footer-data="footerData" :footer-data="footerData"
:data="config.logs || []" :data="config.logs || []"
@cell-dblclick="cellDblclickEvent"
> >
<vxe-column <vxe-column
type="seq" type="seq"
@ -257,6 +258,7 @@ import {
fieldConfig, fieldConfig,
preConfig, preConfig,
preDeal, preDeal,
updateNodeTime,
view, view,
} from "@/api/flow"; } from "@/api/flow";
import { deepCopy } from "@/utils"; import { deepCopy } from "@/utils";
@ -601,6 +603,27 @@ export default {
console.error(err); console.error(err);
} }
}, },
async cellDblclickEvent({ row, column }) {
// if(this.$store.state.user.username !== 'admin') return
if(column.field === 'created_at' || column.field === 'updated_at') {
this.$prompt('请输入时间', '提示', {
confirmButtonText: '确定',
cancelButtonText: '取消',
inputPattern: /^(?:19|20)[0-9][0-9]-(?:(?:0[1-9])|(?:1[0-2]))-(?:(?:[0-2][1-9])|(?:[1-3][0-1])) (?:(?:[0-2][0-3])|(?:[0-1][0-9])):[0-5][0-9]:[0-5][0-9]$/,
inputErrorMessage: '时间格式不正确'
}).then(({ value }) => {
updateNodeTime({
id: row.id,
date: value,
date_type: column.field
}).then(_ => {
this.$message.success('更新成功')
this.getConfig()
})
})
}
},
}, },
computed: { computed: {
device() { device() {

@ -312,7 +312,7 @@
</template> </template>
<script> <script>
import { flowList, toggleFav, destroy, recall } from "@/api/flow"; import { flowList, toggleFav, destroy, recall, updateFlowTime } from "@/api/flow";
import moment from "moment/moment"; import moment from "moment/moment";
import share from "./components/share.vue"; import share from "./components/share.vue";
export default { export default {
@ -478,34 +478,21 @@ export default {
}, },
async cellDblclickEvent({ row, column }) { async cellDblclickEvent({ row, column }) {
console.log(row, column) if(this.$store.state.user.username !== 'admin') return
const h = this.$createElement;
if(column.field === 'created_at' || column.field === 'updated_at') { if(column.field === 'created_at' || column.field === 'updated_at') {
this.$msgbox({ this.$prompt('请输入时间', '提示', {
title: '时间更新',
message: h('el-date-picker'),
showCancelButton: true,
confirmButtonText: '确定', confirmButtonText: '确定',
cancelButtonText: '取消', cancelButtonText: '取消',
beforeClose: (action, instance, done) => { inputPattern: /^(?:19|20)[0-9][0-9]-(?:(?:0[1-9])|(?:1[0-2]))-(?:(?:[0-2][1-9])|(?:[1-3][0-1])) (?:(?:[0-2][0-3])|(?:[0-1][0-9])):[0-5][0-9]:[0-5][0-9]$/,
if (action === 'confirm') { inputErrorMessage: '时间格式不正确'
instance.confirmButtonLoading = true; }).then(({ value }) => {
instance.confirmButtonText = '执行中...'; updateFlowTime({
setTimeout(() => { id: row.id,
done(); date: value
setTimeout(() => { }).then(_ => {
instance.confirmButtonLoading = false; this.$message.success('更新成功')
}, 300); this.getList()
}, 3000); })
} else {
done();
}
}
}).then(action => {
this.$message({
type: 'info',
message: 'action: ' + action
});
}) })
} }
}, },

Loading…
Cancel
Save