中航光电热表web
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.
 
 
 
 

863 lines
24 KiB

<template>
<basic-container>
<avue-crud
:option="option"
:table-loading="loading"
:data="data"
v-model:page="page"
v-model="form"
ref="crud"
@row-update="rowUpdate"
@row-save="rowSave"
@row-del="rowDel"
@search-change="searchChange"
@search-reset="searchReset"
@selection-change="selectionChange"
@current-change="currentChange"
@size-change="sizeChange"
@refresh-change="refreshChange"
:before-open="beforeOpen"
@on-load="onLoad"
>
<template #menu-left>
<el-button type="danger" icon="el-icon-delete" @click="handleDelete"
>删 除
</el-button>
<el-button type="success" icon="el-icon-upload" @click="handleImport"
>导入
</el-button>
</template>
<template #menu="scope">
<el-button type="text" @click="setCrew(scope.row)">设置班组人员</el-button>
<el-button type="text" @click="changeTime(scope.row, 0)">日分派时间</el-button>
<el-button type="text" @click="changeTime(scope.row, 1)"
>特殊日分派时间</el-button
>
<el-button type="text" @click="changeTime(scope.row, 2)">轮换时间</el-button>
</template>
<template #teamLeader="{ row }">
{{ row.teamLeaderRealName }}
</template>
<template #planner="{ row }">
{{ row.plannerRealName }}
</template>
<template #dispatcher="{ row }">
{{ row.dispatcherRealName }}
</template>
<!-- <template #csId="{ row }">
{{ row.bsClassesSet.csName }}
</template> -->
<!-- <template #csId-form="{ type }">
<span v-show="type == 'edit' || type == 'add'">
<el-select v-model="form.bsClassesSet.csId" placeholder="请选择班次">
<el-option
v-for="item in csData"
:key="item.csId"
:value="item.csId"
:label="item.csName"
></el-option>
</el-select>
</span>
</template> -->
<template #teamLeader-form="{ type }">
<span v-show="type == 'edit' || type == 'add'">
<el-select v-model="form.teamLeader" placeholder="请选择班组长"
filterable remote :remote-method="getTeamUser">
<el-option
v-for="item in userData"
:key="item.id"
:value="item.id"
:label="item.realName"
></el-option>
</el-select>
</span>
</template>
<template #planner-form="{ type }">
<span v-show="type == 'edit' || type == 'add'">
<el-select v-model="form.planner" placeholder="请选择计划员"
filterable remote :remote-method="getPlanner">
<el-option
v-for="item in plannerData"
:key="item.id"
:value="item.id"
:label="item.realName"
></el-option>
</el-select>
</span>
</template>
<template #dispatcher-form="{ type }">
<span v-show="type == 'edit' || type == 'add'">
<el-select v-model="form.dispatcher" placeholder="请选择调度员"
filterable remote :remote-method="getDispatcher">
<el-option
v-for="item in dispatcherData"
:key="item.id"
:value="item.id"
:label="item.realName"
></el-option>
</el-select>
</span>
</template>
</avue-crud>
<el-dialog class="setCrewBox" title="设置人员" append-to-body v-model="crewDialog" width="60%">
<tree-transfer
class="trans_ware"
style="margin-top: 10px;"
ref="transferRef"
:titleList="['未选择', '已选择']"
v-model:fromData="noChooseUser"
v-model:toData="chooseUser"
:defaultProps="{
id: 'id', // 节点id
parentId: 'parentId', // 父节点id
label: 'label',
children: 'children',
disabled: 'disabled',
}"
rootPid="0"
/>
<template #footer>
<span class="dialog-footer">
<el-button @click="crewDialog = false">取 消</el-button>
<el-button type="primary" @click="submitPeople">确 定</el-button>
</span>
</template>
</el-dialog>
<el-dialog title="时间" append-to-body v-model="timeDialog" width="60%">
<div>
<el-button type="primary" icon="el-icon-plus" @click="insertEvent()"
>插入一行</el-button
>
<el-button plain type="danger" @click="remove">删除选择行</el-button>
<!-- <el-button type="primary" @click="handleSave">保存</el-button> -->
</div>
<div style="margin-top: 20px">
<el-table
:data="timeList"
@select="selectChange"
>
<el-table-column type="selection" width="55px"></el-table-column>
<el-table-column align="center" label="开始时间">
<template #default="scope">
<el-time-select
v-model="scope.row.startTime"
start="00:00"
step="00:15"
end="24:00"
placeholder="选择时间"
>
</el-time-select>
</template>
</el-table-column>
<el-table-column align="center" label="结束时间">
<template #default="scope">
<el-time-select
v-model="scope.row.endTime"
start="00:00"
step="00:15"
end="24:00"
placeholder="选择时间"
>
</el-time-select>
</template>
</el-table-column>
</el-table>
</div>
<template #footer>
<span class="dialog-footer">
<el-button @click="timeDialog = false">取 消</el-button>
<el-button type="primary" @click="submitTime">确 定</el-button>
</span>
</template>
</el-dialog>
<!-- 导入 -->
<basic-import v-if="isShowImport" title="导入" :isShow="isShowImport"
templateUrl="/blade-desk/BA/TeamSet/downloadExcelTemplate"
templateName="班组模板.xls"
importUrl="/blade-desk/BA/TeamSet/importExcel"
@closeDialog="closeDialog"></basic-import>
</basic-container>
</template>
<script>
import {getList,addTeam,updateTeam,getAllUser,deleteTeam,getNotSelectUser,getSelectUser,getDeptUser,saveUser,getDispatchTime,saveDispatchTime} from "@/api/basicData/teamManagement.js"
import basicImport from '@/components/basic-import/main.vue'
import treeTransfer from 'tree-transfer-vue3' // 引入
export default {
components: {
basicImport,
treeTransfer
},
data() {
return {
isShowImport:false,
data: [],
page: {
pageSize: 10,
currentPage: 1,
total: 0,
},
peopleValue:[],
peopleData:[],
timeList: [],
deleteTidArr: [], //删除数据
form: {},
crewDialog: false,
timeDialog: false,
noChooseUser:[], //未选人员
chooseUser:[], //已选人员
csData: [
{
csId: 18,
csName: "白班",
keyValue: 18,
},
{
csId: 19,
csName: "晚班",
keyValue: 19,
},
],
crewData: [], //班组人员数据
userData: [],
plannerData:[],
dispatcherData:[],
query: {},
loading: true,
excelBox: false,
option: {
tip: false,
height: "auto",
calcHeight: 32,
simplePage: false,
searchShow: true,
searchMenuSpan: 6,
searchIcon: true,
searchIndex: 3,
tree: false,
border: true,
index: true,
selection: true,
viewBtn: false,
delBtn: false,
editBtnText: "修改",
viewBtnText: "详情",
labelWidth: 120,
menuWidth: 440,
dialogWidth: 600,
dialogClickModal: false,
searchEnter: true,
filterBtn: true,
searchShowBtn: false,
excelBtn: true,
showOverflowTooltip: true,
searchLabelPosition: "left",
searchGutter: 24,
searchSpan: 6,
menuAlign: "center",
gridBtn: false,
searchMenuPosition: "right",
addBtnIcon: " ",
viewBtnIcon: " ",
delBtnIcon: " ",
editBtnIcon: " ",
align: "center",
column: [
{
label: "编码",
prop: "tsCode",
search: true,
sortable: true,
filter: true,
span: 24,
width: 150,
rules: [
{
required: true,
message: "请输入编码",
trigger: "blur",
},
],
},
{
label: "名称",
prop: "tsName",
sortable: true,
filter: true,
span: 24,
width: 150,
search: true,
rules: [
{
required: true,
message: "请输入名称",
trigger: "blur",
},
],
},
{
label: "班组长",
prop: "teamLeader",
search: false,
type: "select",
sortable: true,
filter: true,
span: 24,
width: 150,
rules: [
{
required: true,
message: "请选择班组长",
trigger: "blur",
},
],
dicUrl:"/api/blade-system/user/page?current=1&size=9999",
props: {
label: "realName",
value: "id",
res:"data.records"
},
},
{
label: "计划员",
prop: "planner",
search: false,
sortable: true,
filter: true,
type: "select",
span: 24,
width: 150,
rules: [
{
required: true,
message: "请选择计划员",
trigger: "blur",
},
],
dicUrl:"/api/blade-system/user/page?current=1&size=9999",
props: {
label: "realName",
value: "id",
res:"data.records"
},
},
{
label: "调度员",
prop: "dispatcher",
search: true,
sortable: true,
filter: true,
remote: true,
type: "select",
span: 24,
width: 150,
rules: [
{
required: true,
message: "请选择调度员",
trigger: "blur",
},
],
dicUrl:"/api/blade-system/user/page?current=1&size=9999&realName={{key}}",
props: {
label: "realName",
value: "id",
res:"data.records"
},
},
{
label: "班组人员",
prop: "teamMember",
search: false,
sortable: true,
filter: true,
editDisplay: false,
addDisplay: false,
span: 24,
width: 150,
rules: [
{
required: true,
message: "请选择班组人员",
trigger: "blur",
},
],
},
{
label: "班次",
prop: "csId",
search: false,
type: "select",
sortable: true,
filter: true,
span: 24,
width: 150,
props: {
label: "name",
value: "id",
},
dicUrl:"/api/blade-desk/BA/Shifts/listForSelect"
},
{
label: "类型分类",
prop: "tsType",
search: false,
type: "select",
sortable: true,
filter: true,
span: 24,
width: 150,
dicData: [
{ value: 1,label: "针孔",},
{ value: 2,label: "壳体",},
{ value: 3,label: "烧结",},
{ value: 4,label: "园区",},
// { value: 5,label: "外协",},
],
},
{
label: "日分派时间",
prop: "dayPutDueTime",
search: false,
sortable: true,
editDisplay: false,
filter: true,
addDisplay: false,
span: 24,
width: 150,
rules: [
{
required: true,
message: "请输入日分派时间",
trigger: "blur",
},
],
},
{
label: "特殊日分派时间",
prop: "specDayPutDueTime",
search: false,
sortable: true,
editDisplay: false,
filter: true,
addDisplay: false,
span: 24,
width: 150,
rules: [
{
required: true,
message: "请输入特殊日分派时间",
trigger: "blur",
},
],
},
{
label: "轮换时间",
prop: "exChangeTime",
search: false,
sortable: true,
editDisplay: false,
filter: true,
addDisplay: false,
span: 24,
width: 150,
rules: [
{
required: true,
message: "请输入轮换时间",
trigger: "blur",
},
],
},
{
label: "特殊",
prop: "special",
search: false,
type: "select",
sortable: true,
filter: true,
span: 24,
width: 150,
dicData: [
{
value: '1',
label: "是",
},
{
value: '0',
label: "否",
},
],
},
],
},
selectionList: [],
checkId:'',
checkTimeType:0
};
},
mounted() {},
methods: {
// 点击导入按钮
handleImport() {
this.isShowImport = true
},
handleDelete(){
if(this.selectionList.length == 0){
this.$message.error('请至少选择一条数据')
return
}
deleteTeam({
ids: this.selectionList.map(item => item.id).join(',')
}).then(res =>{
if(res.data.code == 200){
this.$message.success('删除成功')
this.onLoad()
}
})
},
// 多选
selectionChange(list) {
this.selectionList = list;
},
selectionClear() {
this.selectionList = [];
this.$refs.crud.toggleSelection();
},
getTeamUser(query){
if(query == ''){
getAllUser({
current:1,
size:9999
}).then(res =>{
this.userData = res.data.data.records
})
}else{
getAllUser({
current:1,
size:9999,
realName:query
}).then(res =>{
this.userData = res.data.data.records
})
}
},
getPlanner(query){
if(query == ''){
getAllUser({
current:1,
size:9999
}).then(res =>{
this.plannerData = res.data.data.records
})
}else{
getAllUser({
current:1,
size:9999,
realName:query
}).then(res =>{
this.plannerData = res.data.data.records
})
}
},
getDispatcher(query){
if(query == ''){
getAllUser({
current:1,
size:9999
}).then(res =>{
this.dispatcherData = res.data.data.records
})
}else{
getAllUser({
current:1,
size:9999,
realName:query
}).then(res =>{
this.dispatcherData = res.data.data.records
})
}
},
rowUpdate(row, index, done, loading) {
updateTeam(row).then(res =>{
if(res.data.code == 200){
this.$message.success('修改成功')
this.onLoad()
done()
}
})
},
rowSave(row, done, loading) {
console.log('row-----------',row)
addTeam(row).then(res =>{
if(res.data.code == 200){
this.$message.success('添加成功')
this.onLoad()
done()
}
})
},
searchReset() {
this.query = {};
this.onLoad(this.page);
},
searchChange(params, done) {
this.query = params;
this.page.currentPage = 1;
this.onLoad(this.page, params);
done();
},
rowDel(row, index, done) {
this.$confirm("确定将选择数据删除?", {
confirmButtonText: "确定",
cancelButtonText: "取消",
type: "warning",
}).then(() => {});
},
// 设置时间
changeTime(row, val) {
this.checkId = row.id;
this.checkTimeType = val;
getDispatchTime({
id:row.id,
special:val
}).then(res =>{
console.log('res-----------',res)
res.data.data.map(item =>{
item._select = false
})
this.timeList = res.data.data;
this.timeDialog = true;
})
// this.timeList = [];
// // if(val == 1){
// this.timeList = [
// { startTime: "00:00", endTime: "00:15", _select: false },
// { startTime: "00:15", endTime: "00:20", _select: false },
// { startTime: "00:45", endTime: "01:00", _select: false },
// ];
// this.timeDialog = true;
// // }
},
submitTime(){
if(this.timeList.length == 0){
this.$message.error("请添加一条数据!");
return;
}
const timeData = []
this.timeList.map(item =>{
timeData.push({
startTime:item.startTime,
endTime:item.endTime,
special:this.checkTimeType
})
})
let params = {
id:this.checkId,
special:this.checkTimeType,
teamTimes:timeData
}
saveDispatchTime(params).then(res =>{
if(res.data.code === 200){
this.$message.success('设置成功');
this.timeDialog = false
this.onLoad()
}
})
},
selectChange(list, row){
row._select = !row._select;
},
// 插入一行
insertEvent() {
const record = { _select: false };
this.timeList.push(record);
},
//删除所选行
remove() {
let arr = this.timeList.filter((item) => item._select);
if (arr.length != 0) {
this.$confirm("确定将选择数据删除?", {
confirmButtonText: "确定",
cancelButtonText: "取消",
type: "warning",
}).then(() => {
if (this.rowId) {
let deleteData = this.timeList.filter((item) => item._select);
this.deleteTidArr = deleteData.filter((item) => item.tidId);
}
let deleteArr = this.timeList.filter((item) => !item._select);
this.timeList = deleteArr;
});
} else {
this.$message.error("请至少选择一条数据进行操作!");
}
},
// 点击保存按钮
handleSave() {
if (this.timeList.length == 0) {
this.$message.error("请至少填写一条数据");
} else {
let tmp = this.timeList.find((item) => item.startTime && item.endTime);
if (!tmp) {
this.$message.error("数据请填写完整!");
}
}
},
processTree(nodes, isRootLevel = true) {
return nodes.map(item => {
// 第一层:parentId = 0;其他层:parentId = item.pid
const parentId = isRootLevel ? 0 : item.pid;
const newItem = {
...item,
parentId // 添加 parentId 字段
// 注意:保留原有的 pid 字段,除非你不需要
};
// 递归处理 children,下一层不再是根层
if (Array.isArray(item.children)) {
newItem.children = this.processTree(item.children, false);
}
return newItem;
});
},
// 设置班组人员
async setCrew(row) {
this.checkId = row.id;
const users = await getDeptUser({teamSetId: row.id});
this.chooseUser = this.processTree(users.data.data.teamSelects)
this.noChooseUser = this.processTree(users.data.data.teamUnSelects)
this.crewDialog = true;
// const notUser = await getNotSelectUser({id: row.id});
// const user = await getSelectUser({id: row.id});
// console.log('notUser============', notUser);
// console.log('user============', user);
// this.peopleData = [...notUser.data.data,...user.data.data]
// this.peopleValue = user.data.data.map(item => item.id)
// this.crewDialog = true;
},
getLeafIds(nodes) {
const leafIds = [];
function traverse(items) {
if (!Array.isArray(items)) return;
items.forEach(item => {
// 判断是否为叶子节点
const hasChildren = Array.isArray(item.children) && item.children.length > 0;
if (!hasChildren) {
// 是叶子节点,收集 id
leafIds.push(item.id);
} else {
// 有子节点,继续递归
traverse(item.children);
}
});
}
traverse(nodes);
return leafIds;
},
submitPeople(){
let userArr = this.getLeafIds(this.chooseUser).map(item => item.replace('user-',""))
let params = {
id:this.checkId,
userIds:userArr
}
saveUser(params).then(res =>{
if(res.data.code === 200){
this.$message.success('人员设置成功')
this.crewDialog = false
this.onLoad()
}
})
},
// 打开前回调
async beforeOpen(done, type, loading) {
if(type == 'edit'){
this.form.csId = this.form.csId + ''
this.form.teamLeader = this.form.teamLeader + ''
this.form.planner = this.form.planner + ''
this.form.dispatcher = this.form.dispatcher + ''
const res = await getAllUser({current:1,size:9999 })
this.dispatcherData = res.data.data.records
this.userData = res.data.data.records
this.plannerData = res.data.data.records
const dispatcherRes = await getAllUser({realName:this.form.dispatcherRealName})
// 合并数据并根据 id 去重
const mergedData = [...this.dispatcherData, ...dispatcherRes.data.data.records];
const uniqueData = Array.from(
new Map(mergedData.map(item => [item.id, item])).values()
);
this.dispatcherData = uniqueData
const plannerRes = await getAllUser({realName:this.form.plannerRealName})
// 合并数据并根据 id 去重
const mergedPlannerData = [...this.plannerData, ...plannerRes.data.data.records];
const uniquePlannerData = Array.from(
new Map(mergedPlannerData.map(item => [item.id, item])).values()
);
this.plannerData = uniquePlannerData
const teamRes = await getAllUser({realName:this.form.teamLeaderRealName})
// 合并数据并根据 id 去重
const mergedTeamData = [...this.userData, ...teamRes.data.data.records];
const uniqueTeeanData = Array.from(
new Map(mergedTeamData.map(item => [item.id, item])).values()
);
this.userData = uniqueTeeanData
done()
}else {
done()
}
},
currentChange(currentPage) {
this.page.currentPage = currentPage;
},
sizeChange(pageSize) {
this.page.pageSize = pageSize;
},
refreshChange() {
this.onLoad(this.page, this.query);
},
onLoad() {
this.loading = true;
getList({
current:this.page.currentPage,
size:this.page.pageSize,
...this.query
}).then(res =>{
this.data = res.data.data.records
this.page.total = res.data.data.total
this.loading = false
})
},
},
};
</script>
<style></style>
<style lang="scss">
.setCrewBox{
.tree-transfer-vue3{
height: 450px !important;
.el-tree{
height: 335px !important;
}
}
}
</style>