You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

546 lines
14 KiB

This file contains ambiguous Unicode characters!

This file contains ambiguous Unicode characters that may be confused with others in your current locale. If your use case is intentional and legitimate, you can safely ignore this warning. Use the Escape button to highlight these characters.

<template>
<view>
<u-navbar bgColor="#ffffff" :placeholder="true" titleStyle="font-weight:600" title="消防员排班" :autoBack="true">
</u-navbar>
<!-- 选择人员 -->
<view class="paibanCard">
<view class="title">
<view class="line"></view>
选择人员
</view>
<view style="background: #FFFFFF;border-radius: 20rpx;padding: 26rpx 41rpx;">
<view class="pickPerson">
<view class="picktitle">
<image src="../../../../static/images/fireman/fire.png"
style="width: 26rpx;height: 32rpx;margin-right: 10rpx;"></image>
消防员
</view>
<image src="../../../../static/images/fireman/add.png" style="width: 135rpx;height: 46rpx;"
@click="itemclick(true)"></image>
</view>
<uni-swipe-action>
<uni-swipe-action-item :threshold="0" :right-options="options2" v-for="(item, index) in checkList"
:key="index" @click="bindClick">
<view class="menu-item-box" style="display: flex;">
<text
style="background-color: #0087fc;padding: 22rpx 15rpx;color: white;border-radius: 10rpx;margin-right: 15rpx;">
{{item.label.slice(-2)}}
</text>
<view>
<view style="font-weight: 600;">{{ item.label }}</view>
<view style="font-size: 24rpx;color: gray;">
<span style="margin-right: 20rpx">{{item.secUnitName}}</span>
<span>{{item.plantName}}</span>
</view>
</view>
</view>
</uni-swipe-action-item>
</uni-swipe-action>
</view>
</view>
<!-- 选择日期 -->
<view class="paibanCard">
<view class="title">
<view class="line"></view>
设定日期范围
</view>
<view class="pickTime">
<view class="input1"><uni-datetime-picker type="date" :clear-icon="false" v-model="beginTime"
placeholder="请选择开始日期"></uni-datetime-picker></view>
<view class="input2"><uni-datetime-picker type="date" :clear-icon="false" v-model="endTime"
placeholder="请选择结束日期" /></view>
</view>
</view>
<!-- 排班添加按钮 -->
<view class="addPaiBan" @click="addPaiBan">生成排班</view>
<!-- 人员选择插件 -->
<next-tree :expandedKeys="['3','3-1']" :changeVerify="changeVerify" :title="getTitle" ref="nextTreeRef"
:checkStrictly="checkStrictly" :selectParent="selectParent" :multiple="multiple" :treeData="treeData"
@cancel="oncancel" @confirm="onconfirm"></next-tree>
</view>
</template>
<script>
import {
deptTreeSelect
} from '@/api/system/dept.js'
import {
listFiremen
} from "@/api/fireman/index.js"
import {
schedulyDutyLog
} from "@/api/fireman/dutylog.js"
let self = null;
export default {
data() {
return {
form: {
id: undefined,
dutyUserId: undefined,
dutyUserName: undefined,
dutyLogInfo: undefined,
dutyDate: undefined,
dutyYear: undefined,
dutyMonth: undefined,
dutyDay: undefined,
secUnitId: null,
secUnitName: null,
plantId: null,
plantName: null,
isHoliday: undefined,
status: undefined,
delFlag: undefined,
createBy: undefined,
createTime: undefined,
updateBy: undefined,
updateTime: undefined,
remark: undefined,
text1: undefined,
text2: undefined,
text3: undefined,
text4: undefined,
dutyUserIds: []
},
beginTime: "", //开始时间
endTime: "", //结束时间
multiple: false,
selectParent: false,
checkStrictly: false,
activeId: '',
personList: [], //人员列表
options2: [{
text: '删除',
style: {
backgroundColor: '#F56C6C'
}
}], //滑动删除
localData: {
'a1': [{
id: 'a1-1',
label: 'a1-1'
}, {
id: 'a1-2',
label: 'a1-2',
children: []
}, {
id: 'a1-3',
label: 'a1-3'
}],
'b1': [{
id: 'b1-1',
label: 'b1-1',
children: []
}, {
id: 'b1-2',
label: 'b1-2'
}, {
id: 'b1-3',
label: 'b1-3'
}],
'c1': [{
id: 'c1-1',
label: 'c1-1'
}, {
id: 'c1-2',
label: 'c1-2'
}, {
id: 'c1-3',
label: 'c1-3',
children: []
}],
'a1-2': [{
id: 'a1-2-1',
label: 'a1-2-1'
}, {
id: 'a1-2-2',
label: 'a1-2-2'
}],
'b1-1': [{
id: 'b1-1-1',
label: 'b1-1-1'
}, {
id: 'b1-1-2',
label: 'b1-1-2'
}],
'c1-3': [{
id: 'c1-3-1',
label: 'c1-3-1'
}, {
id: 'c1-3-2',
label: 'c1-3-2'
}]
},
asyncTreeData: [{
id: 'a1',
label: 'a1',
children: []
}, {
id: 'b1',
label: 'b1',
children: []
}, {
id: 'c1',
label: 'c1',
children: []
}],
treeData: [], //人员树列表
checkList: [], //选中的人员列表
};
},
created() {
self = this
},
mounted() {
this.getDept()
},
methods: {
// 滑动按钮点击功能
bindClick(e) {
console.log(e);
setTimeout(() => {
this.checkList.splice(e.index, 1);
uni.showToast({
title: "删除成功",
icon: 'success'
});
}, 200)
},
// 获取消防站人员
getDept() {
deptTreeSelect().then(res => {
console.log(res, "部门");
})
listFiremen().then(res => {
this.personList = res.rows;
this.treeData = this.arrConversion(this.personList);
console.log(this.treeData, "消防站");
})
},
// 添加排班
addPaiBan() {
console.log(this.checkList, "this.checkList");
this.checkList.map((item, index) => {
this.form.dutyUserIds.push(item.personid);
this.form.plantId = item.plantId;
this.form.plantName = item.plantName;
this.form.secUnitId = item.secUnitId;
this.form.secUnitName = item.secUnitName;
this.form.text1 = this.beginTime;
this.form.text2 = this.endTime;
})
schedulyDutyLog(this.form).then(res => {
this.$modal.msgSuccess("排班成功");
uni.navigateBack({
delta: 1,
});
})
console.log(this.form, "this.form");
},
// 一维数组变为三维数组
arrConversion(arr) {
let keys = Object.keys(arr[0])
let level1 = 'secUnitName' //获取一级属性名称
let level2 = 'plantName' //获取二级属性名称
let list = Array.from(new Set(
arr.map(item => {
return item[level1]
})))
let subList = []
list.forEach(res => {
arr.forEach((ele, index) => {
if (ele[level1] === res) {
let nameArr = subList.map(item => item.label)
// console.log(nameArr)
if (nameArr.indexOf(res) !== -1) {
let nameArr2 = subList[nameArr.indexOf(res)].children.map(item => item
.label)
if (nameArr2.indexOf(ele[level2]) !== -1) {
subList[nameArr.indexOf(res)].children[nameArr2.indexOf(ele[level2])]
.children.push({
...ele
})
} else {
subList[nameArr.indexOf(res)].children.push({
label: ele[level2],
checked: false,
// id: (nameArr.indexOf(res) + 2) + "-" + (nameArr.indexOf(
// res) + 2),
children: [{
...ele,
checked: false,
}]
})
}
} else {
subList.push({
label: res,
checked: false,
children: [{
label: ele[level2],
checked: false,
// id: (nameArr.indexOf(res) + 2) + "-" + (nameArr
// .indexOf(
// res) + 2),
children: [{
...ele,
checked: false,
}]
}]
})
}
}
})
})
subList.forEach((item, index) => {
this.$set(item, "id", index + 1)
item.children.forEach((item2, index2) => {
this.$set(item2, "id", (index + 1) + "-" + (index2 + 1))
item2.children.map((item3, index3) => {
this.$set(item3, "personid", item3.id)
this.$set(item3, "id", (index + 1) + "-" + (index2 + 1) + "-" + (
index3 +
1));
this.$set(item3, "label", item3.userName)
})
})
})
return subList
},
// 以下是插件方法
openTree: function() {
this.$refs.nextTreeAsyncRef.showTree = true
},
changeVerify: function(current, chooseList) {
// 注意:返回非空字符串会阻止原有行为,并提示返回的字符串
// 如果函数体不做return返回值即验证通过控件正常处理业务
console.log('当前变化的数据', current)
console.log('已选择的数据', chooseList)
// if (chooseList && chooseList.length > 4) {
// return '最多可以选择4个节点'
// }
},
checkedFunc: function(id) {
if (this.activeId === id) {
this.activeId = '';
this.$refs.nextTreeRef.checkedFunc(id, false)
} else {
this.activeId = id;
this.$refs.nextTreeRef.checkedFunc(id)
}
},
loadData(nodeItem) {
// 同步实现的代码处理方式 可以返回单个子节点的集合也可以返回子孙节点的集合
// 如果期望子集节点中还存在孙子节点可以打开,请在初始化数据的时候,初始化个空数组的子节点配置值{[this.childrenKey]: []}
// if(nodeItem && this.localData[nodeItem.id]) {
// return this.localData[nodeItem.id]
// } else {
// return []
// }
// 异步的代码实现方式 可以返回单个子节点的集合也可以返回子孙节点的集合
// 如果期望子集节点中还存在孙子节点可以打开,请在初始化数据的时候,初始化个空数组的子节点配置值{[this.childrenKey]: []}
return new Promise((resolve, reject) => {
setTimeout(() => {
if (nodeItem && self.localData[nodeItem.id]) {
return resolve(self.localData[nodeItem.id])
} else {
return resolve([])
}
}, 1000)
})
},
getTitle: function(checked) {
return `已选:${checked.length}项`
},
echoDefault: function() {
const selectIds = ['2-1', '3-3-35']
this.checkedTreeData(this.treeData, selectIds)
console.log('treeData的数据', this.treeData)
this.multiple = true
this.$refs.nextTreeRef.showTree = true
},
itemclick: function(_multiple, _selectParent, _checkStrictly = false) {
this.multiple = _multiple
this.selectParent = _selectParent
this.checkStrictly = _checkStrictly
this.$refs.nextTreeRef.showTree = true
},
checkedTreeData: function(treeData, selectIds) {
// 注意 vue2当数据深嵌套时如果没有在treeData里面初始化checked属性那在改变数据的时候直接将checked属性赋值为true这时候ui界面有可能不会更新
// 这时候建议使用this.$set去更新checked属性值或者在初始化this.treeData的时候初始化checked属性
(treeData || []).map(item => {
if (selectIds.indexOf(item.id) !== -1) {
item.checked = true
} else {
item.checked = false
}
if (item.children && item.children.length) {
this.checkedTreeData(item.children, selectIds)
}
})
},
onconfirm: function(list) {
console.log('选中项的数量列表list', list)
// this.checkList.push(list)
this.checkList = list
},
oncancel: function() {
// 清除treeData的选中状态
this.checkedTreeData(this.treeData, [])
}
}
}
</script>
<style lang="scss">
page {
box-sizing: border-box !important;
padding: 24rpx;
background-color: #eff0f4;
/deep/.uni-swipe {
background-color: #fff;
padding: 15rpx 0 15rpx 10rpx;
}
/deep/.uni-card {
border-radius: 10rpx;
}
/deep/.u-list {
height: 0 !important;
}
/deep/.u-row {
margin-bottom: 10rpx;
padding: 10rpx 30rpx;
border-radius: 10rpx;
display: flex;
justify-content: space-between !important;
background-color: #f9fbfc;
:first-child {
color: black;
}
}
/deep/.uni-date-x--border {
border: none;
padding: 15rpx;
border-radius: 0;
}
/deep/.uniui-calendar {
color: #454545;
font-weight: 500;
font-size: 28rpx;
}
/deep/.uniui-calendar:before {
content: none;
}
/deep/.input1 .uniui-calendar :before {
content: '';
font-weight: 500;
font-size: 30rpx;
color: #333333;
}
/deep/.input2 .uniui-calendar :before {
content: '';
}
/deep/.uni-icons {
color: #171819 !important;
font-size: 30rpx !important;
}
/deep/.uni-date__x-input {
padding-left: 50rpx;
}
/deep/.uni-date-x {
background: #F5F6FA;
border-radius: 20rpx;
padding: 10rpx 15rpx;
}
/deep/.uni-swipe_box {
background: #F5F6FA;
border-radius: 20rpx;
padding: 26rpx 22rpx;
}
.paibanCard {
margin-bottom: 15rpx;
.title {
margin-bottom: 15rpx;
font-family: Noto Sans S Chinese;
font-weight: bold;
font-size: 30rpx;
color: #333333;
display: flex;
align-items: center;
.line {
width: 4rpx;
height: 30rpx;
background: #358FFE;
border-radius: 2rpx;
margin-right: 20rpx;
}
}
.pickTime {
background-color: #fff;
border-radius: 10rpx;
padding: 43rpx 20rpx;
}
.pickPerson {
background-color: #fff;
border-radius: 20rpx;
display: flex;
align-items: center;
// padding: 15rpx;
justify-content: space-between;
// margin-bottom: 15rpx;
}
.picktitle {
font-family: Noto Sans S Chinese;
font-weight: 400;
font-size: 30rpx;
color: #333333;
display: flex;
align-items: center;
}
}
.addPaiBan {
width: 85%;
background: linear-gradient(0deg, #2A86FF, #8FBCFF);
font-weight: 400;
font-size: 36rpx;
color: #FFFFFF;
line-height: 38rpx;
text-align: center;
padding: 20rpx;
border-radius: 40rpx;
margin: 50rpx auto;
}
}
</style>