This commit is contained in:
gtz
2022-11-07 08:45:49 +08:00
commit 4d1231adc2
1222 changed files with 194552 additions and 0 deletions

View File

@@ -0,0 +1,421 @@
<template>
<div :class="$style.container">
<HeaderTitleBar />
<el-divider content-position="left">{{
$t("module.teamManager.HandoverAdd.FillInShift")
}}</el-divider>
<el-form
ref="team"
:model="team"
:rules="rules"
label-width="110px"
:class="$style.form"
>
<el-form-item
:label="$t('module.teamManager.Handover.LastTeamName')"
prop="preTeamId"
:class="$style['form-item']"
>
<el-select
v-model="team.preTeamId"
:class="$style.select"
filterable
clearable
:disabled="$route.query.disable === 'true' || $route.query.disable"
@change="preTeamChange"
>
<el-option
v-for="(item, index) in preTeamList"
:key="index"
:label="item.teamName"
:value="item.teamId"
/>
</el-select>
</el-form-item>
<el-form-item
:label="$t('module.teamManager.Handover.PreviousTeamLeader')"
prop="preTeamLeader"
:class="$style['form-item']"
>
<el-input v-model="team.preTeamLeader" :disabled="true" />
</el-form-item>
<el-form-item
:label="$t('module.teamManager.HandoverAdd.HandoverTeam')"
prop="teamId"
:class="$style['form-item']"
>
<el-select
v-model="team.teamId"
:class="$style.select"
filterable
clearable
:disabled="$route.query.disable === 'true' || $route.query.disable"
@change="teamChange"
>
<el-option
v-for="(item, index) in teamList"
:key="index"
:label="item.teamName"
:value="item.teamId"
/>
</el-select>
</el-form-item>
<el-form-item
:label="$t('module.teamManager.HandoverAdd.HandoverTeamLeader')"
prop="teamLeader"
:class="$style['form-item']"
>
<el-input v-model="team.teamLeader" :disabled="true" />
</el-form-item>
<el-form-item
:label="$t('module.teamManager.HandoverAdd.PlanTeam')"
prop="planTeamId"
:class="$style['form-item']"
>
<el-input
v-if="$route.query.disable === 'true' || $route.query.disable"
v-model="team.planTeamName"
:disabled="true"
/>
<el-select
v-else
v-model="team.planTeamId"
:class="$style.select"
filterable
clearable
:disabled="$route.query.disable === 'true' || $route.query.disable"
@change="planTeamChange"
>
<el-option
v-for="(item, index) in planTeamList"
:key="index"
:label="item.planTeamName"
:value="item.planTeamId"
/>
</el-select>
</el-form-item>
<el-form-item
:label="$t('module.teamManager.HandoverAdd.PlanTeamLeader')"
prop="planTeamLeader"
:class="$style['form-item']"
>
<el-input v-model="team.planTeamLeader" :disabled="true" />
</el-form-item>
<el-form-item
:label="$t('module.teamManager.Handover.PlanWorkingHours')"
prop="planOnlineTime"
:class="$style['form-item']"
>
<el-date-picker
v-model="team.planOnlineTime"
type="datetime"
:class="$style.select"
:clearable="false"
:disabled="true"
/>
</el-form-item>
<el-form-item
:label="$t('module.teamManager.Handover.PlannedHandoverTime')"
prop="planHandoverTime"
:class="$style['form-item']"
>
<el-date-picker
v-model="team.planHandoverTime"
type="datetime"
:clearable="false"
:class="$style.select"
:disabled="true"
/>
</el-form-item>
<el-form-item
:label="$t('module.teamManager.Handover.HandoverTme')"
prop="handoverTime"
:class="$style['form-item']"
>
<el-date-picker
v-model="team.handoverTime"
type="datetime"
:class="$style.select"
:clearable="false"
:disabled="$route.query.disable === 'true' || $route.query.disable"
/>
</el-form-item>
<el-form-item
:label="$t('module.teamManager.Handover.WorkingHours')"
prop="onlineTime"
:class="$style['form-item']"
>
<el-date-picker
v-model="team.onlineTime"
type="datetime"
:clearable="false"
:class="$style.select"
:disabled="$route.query.disable === 'true' || $route.query.disable"
/>
</el-form-item>
</el-form>
<el-divider v-if="false" content-position="left">{{
$t("module.teamManager.HandoverAdd.MajorSelection")
}}</el-divider>
<ProfessionPanel
v-if="false"
:id="team.id"
:class="$style.bom"
style="width:70%"
@on-change="professionChange"
/>
<el-divider content-position="left">{{
$t("module.teamManager.HandoverAdd.SelectionOfTeamMembers")
}}</el-divider>
<WorkerList
:id="team.id"
:team-id="team.teamId"
:plan-team-id="team.planTeamId"
:class="$style.bom"
style="width:70%"
@on-change="workerChange"
/>
<SubmitBar
v-if="$route.query.disable !== 'true' && !$route.query.disable"
@on-cancle="close()"
@on-submit="handleSubmit('team')"
/>
</div>
</template>
<script>
import { find } from 'lodash'
import {
add,
getInfo,
update,
teamSelectList
} from '@/api/team-manage/team.js'
import { planTeamSelectList } from '@/api/team-manage/team-plan.js'
import SubmitBar from '@/views/art/components/submit-bar'
import HeaderTitleBar from '@/views/material-manage/components/header-title-bar'
import WorkerList from '@/views/team-manage/components/change/worker-list'
import ProfessionPanel from '@/views/team-manage/components/change/profession-panel'
import { getInfo as getPlanInfo } from '@/api/team-manage/team-plan.js'
export default {
name: 'TeamAddPanel',
components: {
SubmitBar,
HeaderTitleBar,
WorkerList,
ProfessionPanel
},
props: {},
data() {
return {
team: {
id: null,
handoverTime: new Date(),
onlineTime: new Date(),
teamId: null,
teamLeader: '',
preTeamId: null,
preTeamLeader: '',
teamWorkStatus: 1,
planId: null,
planTeamId: null,
planTeamLeader: '',
planHandoverTime: '',
planOnlineTime: '',
professionIdList: [],
workerIdList: []
},
rules: {
teamId: [
{ required: true, message: '本次班组不能为空', trigger: 'change' }
],
planTeamId: [
{ required: false, message: '计划班组不能为空', trigger: 'change' }
],
preTeamId: [
{ required: false, message: '上一班组不能为空', trigger: 'change' }
],
onlineTime: [
{ required: true, message: '上班时间不能为空', trigger: 'blur' }
],
handoverTime: [
{ required: true, message: '交接时间不能为空', trigger: 'blur' }
]
},
id: null,
preTeamList: [],
teamList: [],
planTeamList: []
}
},
watch: {},
created() {
this.init()
},
methods: {
init() {
this.id = this.$route.query.id
const planId = this.$route.query.planId
console.log(this.id)
if (this.id) {
getInfo({ id: this.id }).then(res => {
console.log(res)
this.team = res.data
})
}
if (planId) {
this.team.planId = planId
getPlanInfo({ id: planId })
.then(res => {
console.log('planTeam====', res.data)
const planTeam = res.data
this.team.planTeamLeader = planTeam ? planTeam.planTeamLeader : ''
this.team.planOnlineTime = planTeam ? planTeam.planOnlineTime : ''
this.team.planHandoverTime = planTeam
? planTeam.planHandoverTime
: ''
this.team.planId = planTeam.id
this.team.planTeamId = planTeam.planTeamId
this.team.preTeamLeader = planTeam
? planTeam.planPreTeamLeader
: ''
this.team.preTeamId = planTeam ? planTeam.planPreTeamId : ''
// 本次
this.team.teamId = planTeam.planTeamId
this.team.teamLeader = planTeam ? planTeam.planPreTeamLeader : ''
//
this.team.onlineTime = planTeam ? planTeam.planOnlineTime : ''
this.team.handoverTime = planTeam ? planTeam.planHandoverTime : ''
//
this.team.id = planTeam.planTeamId
return this.team
})
.then(() => planTeamSelectList())
.then(res => {
this.planTeamList = res.data
return this.planTeamList
})
.then(() => teamSelectList())
.then(res => {
this.preTeamList = res.data
this.teamList = res.data
})
} else {
teamSelectList().then(res => {
this.preTeamList = res.data
this.teamList = res.data
})
planTeamSelectList().then(res => {
this.planTeamList = res.data
})
}
},
close() {
this.$router.push({ path: this.$route.query.redirect })
},
handleSubmit(formName) {
console.log('handleSubmit')
this.$refs[formName].validate(valid => {
if (!valid) {
return false
}
console.log(this.team)
// const { professionIdList, workerIdList } = this.team
const { workerIdList } = this.team
// if (professionIdList.length === 0) {
// this.$message({
// type: 'error',
// message: '专业不能为空!'
// })
// return false
// }
if (workerIdList.length === 0) {
this.$message({
type: 'error',
message: '员工不能为空!'
})
return false
}
if (this.id) {
update(this.team).then(res => {
this.$message({
type: 'success',
message: '更新成功!'
})
this.close()
})
} else {
this.team.id = null
add(this.team).then(res => {
this.$message({
type: 'success',
message: '保存成功!!'
})
this.close()
})
}
})
},
preTeamChange(val) {
const preTeam = find(this.preTeamList, f => f.teamId === val)
this.team.preTeamLeader = preTeam ? preTeam.teamLeader : ''
},
planTeamChange(val) {
const planTeam = find(this.planTeamList, f => f.planTeamId === val)
this.team.planTeamLeader = planTeam ? planTeam.planTeamLeader : ''
this.team.planOnlineTime = planTeam ? planTeam.planOnlineTime : ''
this.team.planHandoverTime = planTeam ? planTeam.planHandoverTime : ''
this.team.planId = planTeam.id
},
teamChange(val) {
console.log(val)
const team = find(this.teamList, f => f.teamId === val)
this.team.teamLeader = team ? team.teamLeader : ''
console.log(this.team)
this.team.id = team.teamId
},
professionChange(val) {
this.team.professionIdList = val
},
workerChange(val) {
this.team.workerIdList = val.map(m => m.workerId)
}
}
}
</script>
<style lang="scss" module>
.container {
display: flex;
flex-direction: column;
align-items: center;
.form {
width: 70%;
margin-top: 10px;
display: flex;
flex-flow: wrap;
.form-item {
width: 50%;
}
.form-item-remark {
width: 100%;
}
}
.input {
display: flex;
margin: 8px 16px 8px 4px;
align-items: center;
.select {
width: 100%;
}
}
.select {
width: 100%;
}
.bom {
position: relative;
width: 98%;
}
}
</style>

View File

@@ -0,0 +1,107 @@
<!--
* @Author: zwq
* @Date: 2021-03-05 16:34:46
* @LastEditors: zwq
* @LastEditTime: 2021-03-08 11:03:18
* @Description:
-->
<template>
<div :class="$style.container">
<el-checkbox
v-model="checkAll"
:indeterminate="isIndeterminate"
:disabled="$route.query.disable === 'true' || $route.query.disable"
@change="handleCheckAllChange"
>{{ $t('module.teamManager.HandoverAdd.SelectAll') }}</el-checkbox>
<div style="margin: 15px 0;" />
<el-checkbox-group
v-model="checkedCities"
:disabled="$route.query.disable === 'true' || $route.query.disable"
@change="handleCheckedCitiesChange"
>
<el-checkbox v-for="city in cities" :key="city.id" :label="city.id">{{
city.name
}}</el-checkbox>
</el-checkbox-group>
</div>
</template>
<script>
import { professionVoList } from '@/api/team-manage/team.js'
export default {
name: 'ProfessionPanel',
components: {},
props: {
id: {
type: String,
default: undefined
}
},
data() {
return {
checkAll: false,
isIndeterminate: false,
checkedCities: [],
cities: [],
params: {
current: 1,
size: 100
}
}
},
watch: {
id: {
handler(val) {
this.init(val)
},
deep: true
}
},
created() {
},
methods: {
async init(id) {
console.log('id', id)
const citiesRes = await professionVoList({ ...this.params, id: id || this.$route.query.id })
this.cities = citiesRes.data
if (id || this.$route.query.id) {
this.checkedCities = this.cities.filter(f => f.checked).map(m => m.id)
this.checkAll = this.checkedCities.length === this.cities.length
console.log(this.checkedCities)
}
},
handleCheckAllChange(val) {
console.log(val)
this.checkedCities = val ? this.cities.map(m => m.id) : []
this.isIndeterminate = false
this.$emit('on-change', this.checkedCities)
},
handleCheckedCitiesChange(value) {
console.log(value)
const checkedCount = value.length
this.checkAll = checkedCount === this.cities.length
this.isIndeterminate = checkedCount > 0 && checkedCount < this.cities.length
this.$emit('on-change', this.checkedCities)
}
}
}
</script>
<style lang="scss" module>
.container {
display: flex;
flex-direction: column;
align-items: flex-start;
.input {
display: flex;
margin: 8px 16px 8px 4px;
align-items: center;
.select {
width: 100%;
}
}
.select {
width: 100%;
}
}
</style>

View File

@@ -0,0 +1,161 @@
<template>
<div :class="$style.container">
<SearchBar
v-if="false"
:placeholder="$t('module.teamManager.HandoverAdd.Placeholder')"
@on-search="handleSearch"
/>
<el-table
ref="mainTable"
:data="tableDataList"
:class="$style.table"
:stripe="true"
:header-cell-style="{background:'#eef1f6',color:'#606266',height: '56px', textAlign: 'center'}"
:cell-style="{ textAlign: 'center' }"
size="mini"
:selectable="isDisabled"
@selection-change="handleSelectionChange"
>
<el-table-column type="selection" width="55" />
<el-table-column
prop="index"
:label="$t('module.teamManager.Handover.index')"
width="80"
fixed="left"
/>
<el-table-column
prop="workerName"
:label="$t('module.teamManager.HandoverAdd.planWorkerName')"
width="180"
fixed="left"
/>
<el-table-column
prop="professionName"
:label="$t('module.teamManager.HandoverAdd.planProfessionName')"
width="180"
/>
<el-table-column
prop="telephone"
:label="$t('module.teamManager.HandoverAdd.telephone')"
width="180"
/>
<el-table-column
prop="workshop"
:label="$t('module.teamManager.HandoverAdd.workshop')"
width="180"
/>
<el-table-column
prop="onDuty"
:label="$t('module.teamManager.HandoverAdd.onDuty')"
width="80"
>
<template slot-scope="scope">
<el-tag v-if="scope.row.onDuty === 1" type="success">
在岗
</el-tag>
<el-tag v-else type="info">
离岗
</el-tag>
</template>
</el-table-column>
</el-table>
</div>
</template>
<script>
import moment from 'moment'
import { workerVoList } from '@/api/team-manage/team.js'
import SearchBar from '@/views/art/components/search-bar'
export default {
components: { SearchBar },
props: {
id: {
type: String,
default: undefined
},
teamId: {
type: String,
default: undefined
},
planTeamId: {
type: String,
default: undefined
}
},
data() {
return {
moment,
isEdit: false,
tableDataList: [],
page: {
current: 1,
size: 2
},
addDialogVisible: false,
param: {},
multipleSelection: [],
disable: false
}
},
watch: {
id: {
handler(val) {
this.handleSearch()
},
deep: true
}
},
created() {
this.disable = this.$route.query.disable === 'true'
this.handleSearch()
},
methods: {
isDisabled() {
return this.$route.query.disable === 'true'
},
handleSearch(param) {
this.param = param
console.log(param)
const params = {
id: this.id,
teamId: this.teamId,
planTeamId: this.planTeamId,
...param,
...this.page
}
workerVoList(params).then(res => {
console.log(res)
if (!res.data) {
this.tableDataList = []
return
}
this.tableDataList = res.data.map((m, index) => ({
...m,
index: this.page.size * (this.page.current - 1) + index + 1
}))
const multipleSelection = this.tableDataList.filter(f => f.checked)
console.log(multipleSelection)
if (!this.id) {
return
}
this.$nextTick(() => {
multipleSelection.forEach(e =>
this.$refs.mainTable.toggleRowSelection(e)
)
})
})
},
handleSelectionChange(val) {
console.log(val)
this.multipleSelection = val
this.$emit('on-change', this.multipleSelection)
}
}
}
</script>
<style lang="scss" module>
.container {
.table {
margin: 16px;
}
}
</style>

View File

@@ -0,0 +1,59 @@
<template>
<el-drawer
:title="$t('module.teamManager.HandoverDrawer.title')"
size="85%"
:append-to-body="true"
:visible.sync="visible"
:wrapper-closable="false"
:before-close="() => $emit('on-close')"
>
<OfflineEdit :team="team" />
<el-divider content-position="left">【{{ team ? team.teamName :'' }}】{{ $t('module.teamManager.HandoverDrawer.TeamCommutingRecord') }}</el-divider>
<TeamList
:class="$style['team-list']"
:team-id="team ? team.teamId : null"
/>
</el-drawer>
</template>
<script>
import TeamList from './team-list.vue'
import OfflineEdit from './offline-edit.vue'
export default {
name: 'OfflineDrawer',
components: { TeamList, OfflineEdit },
props: {
team: {
type: Object,
default: () => {}
},
visible: {
type: Boolean,
default: false
}
},
data() {
return {
isEdit: false
}
},
methods: {
editSuccess() {
this.innerDrawer = true
},
handleSubmit() {
this.isEdit = false
}
}
}
</script>
<style lang="scss" module>
.team-list {
display: flex;
flex-direction: column;
align-items: center;
justify-content: center;
padding: 0 30px;
}
</style>

View File

@@ -0,0 +1,110 @@
<template>
<div :class="$style.container">
<el-form
ref="teamUpdate"
:class="$style.form"
:model="teamUpdate"
:rules="rules"
label-width="100px"
>
<el-form-item :label="$t('module.teamManager.Handover.TeamName')" prop="teamName">
<span :class="$style.label">{{ team.teamName || '-' }}</span>
</el-form-item>
<el-form-item :label="$t('module.teamManager.Handover.TeamLeader')" prop="teamLeader">
<span :class="$style.label">{{ team.teamLeader || '-' }}</span>
</el-form-item>
<el-form-item :label="$t('module.teamManager.Handover.WorkingHours')" prop="onlineTime">
<el-date-picker
v-model="teamUpdate.onlineTime"
style="width:210px"
value-format="yyyy-MM-dd HH:mm:ss"
type="datetime"
/>
</el-form-item>
<el-form-item :label="$t('module.teamManager.Handover.OffWorkTime')" prop="offlineTime">
<el-date-picker
v-model="teamUpdate.offlineTime"
value-format="yyyy-MM-dd HH:mm:ss"
style="width:210px"
type="datetime"
/>
</el-form-item>
<el-form-item label="" prop="">
<el-button
type="primary"
size="mini"
icon="el-icon-success"
@click="handleSubmit()"
>
{{ 'btn.save' | i18nFilter }}
</el-button>
</el-form-item>
</el-form>
</div>
</template>
<script>
import moment from 'moment'
import { offlineUpdate } from '@/api/team-manage/team.js'
export default {
name: 'OfflineEdit',
components: {},
props: {
team: {
type: Object,
default: () => {}
}
},
data() {
return {
teamUpdate: {
offlineTime: moment(this.team.offlineTime).format('YYYY-MM-DD HH:mm:ss'),
onlineTime: moment(this.team.onlineTime).format('YYYY-MM-DD HH:mm:ss')
},
rules: {
onlineTime: [
{ required: true, message: '上班时间不能为空', trigger: 'blur' }
],
offlineTime: [
{ required: true, message: '下班时间不能为空', trigger: 'blur' }
]
}
}
},
methods: {
handleSubmit() {
this.$refs['teamUpdate'].validate((valid) => {
if (!valid) {
return false
}
const param = {
id: this.team.id,
teamId: this.team.teamId,
offlineTime: moment.utc(this.teamUpdate.offlineTime),
onlineTime: moment.utc(this.teamUpdate.onlineTime)
}
console.log(param)
offlineUpdate(param).then(res => {
console.log(res)
this.$message.success('保存成功!')
this.$bus.emit('on-offline-edit-success')
})
})
}
}
}
</script>
<style lang="scss" module>
.container {
margin-bottom: 30px;
.form {
display: flex;
.label {
display: inline-block;
min-width: 100px;
background-color: #eee;
}
}
}
</style>

View File

@@ -0,0 +1,100 @@
<template>
<div :class="$style.container">
<span :class="$style['label-name']">{{ $t('module.teamManager.HandoverDrawer.OffHours') }}</span>
<el-date-picker
v-model="dts"
type="datetimerange"
style="margin-right:16px;"
align="right"
value-format="yyyy-MM-dd HH:mm:ss"
unlink-panels
:start-placeholder="$t('module.basicData.ScrapInfo.StartTime')"
:end-placeholder="$t('module.basicData.ScrapInfo.EndTime')"
:range-separator="$t('module.basicData.ScrapInfo.To')"
:picker-options="pickerOptions"
/>
<el-button type="primary" icon="el-icon-search" @click="handleSearch()">
{{ 'btn.search' | i18nFilter }}
</el-button>
<slot />
</div>
</template>
<script>
import moment from 'moment'
export default {
props: {
lableName: {
type: String,
default: '关键字'
},
placeholder: {
type: String,
default: '请输入'
}
},
data() {
return {
keywords: '',
dts: ['', ''],
pickerOptions: {
shortcuts: [{
text: '最近一周',
onClick(picker) {
const end = new Date()
const start = new Date()
start.setTime(start.getTime() - 3600 * 1000 * 24 * 7)
picker.$emit('pick', [start, end])
}
}, {
text: '最近一个月',
onClick(picker) {
const end = new Date()
const start = new Date()
start.setTime(start.getTime() - 3600 * 1000 * 24 * 30)
picker.$emit('pick', [start, end])
}
}, {
text: '最近三个月',
onClick(picker) {
const end = new Date()
const start = new Date()
start.setTime(start.getTime() - 3600 * 1000 * 24 * 90)
picker.$emit('pick', [start, end])
}
}]
}
}
},
created() {
this.$bus.on('on-offline-edit-success', this.handleSearch)
this.handleSearch()
},
beforeDestroy() {
this.$bus.off('on-offline-edit-success', this.handleSearch)
},
methods: {
handleSearch() {
const param = {
offlineBegTime: moment.utc(this.dts[0]),
offlineEndTime: moment.utc(this.dts[1])
}
this.$emit('on-search', param)
}
}
}
</script>
<style lang="scss" module>
.container {
display: flex;
align-items: center;
width: 100%;
height: 50px;
padding: 4px 40px;
background-color: #eee;
.label-name {
margin-right: 8px;
font-size: 14px;
}
}
</style>

View File

@@ -0,0 +1,108 @@
<template>
<div :class="$style.container">
<OfflineSearchBar :placeholder="'班组名称或班组长'" @on-search="handleSearch" />
<el-table
:data="workList"
:class="$style.table"
:stripe="true"
:header-cell-style="{background:'#eef1f6',color:'#606266',height: '56px', textAlign: 'center'}"
:cell-style="{ textAlign: 'center' }"
size="medium"
>
<el-table-column prop="index" :label="$t('module.teamManager.Handover.index')" width="80" fixed />
<el-table-column prop="teamName" :label="$t('module.teamManager.Handover.TeamName')" width="180" fixed />
<el-table-column prop="handoverTime" :label="$t('module.teamManager.Handover.HandoverTme')" width="180">
<template slot-scope="scope">
{{ scope.row.handoverTime && moment(scope.row.handoverTime).format('YYYY-MM-DD HH:mm:ss') }}
</template>
</el-table-column>
<el-table-column prop="teamLeader" :label="$t('module.teamManager.Handover.TeamLeader')" width="180" />
<el-table-column prop="onlineTime" :label="$t('module.teamManager.Handover.WorkingHours')" width="180">
<template slot-scope="scope">
{{ scope.row.onlineTime && moment(scope.row.onlineTime).format('YYYY-MM-DD HH:mm:ss') }}
</template>
</el-table-column>
<el-table-column prop="offlineTime" :label="$t('module.teamManager.Handover.OffWorkTime')" width="180">
<template slot-scope="scope">
{{ scope.row.offlineTime && moment(scope.row.offlineTime).format('YYYY-MM-DD HH:mm:ss') }}
</template>
</el-table-column>
<el-table-column prop="preTeamName" :label="$t('module.teamManager.Handover.LastTeamName')" width="180" />
<el-table-column prop="preTeamLeader" :label="$t('module.teamManager.Handover.PreviousTeamLeader')" width="180" />
</el-table>
<el-pagination
v-show="page.total > page.size"
:class="$style.table"
:current-page="page.current"
:page-sizes="[10, 20, 30, 40]"
:page-size="page.size"
layout="total, sizes, prev, pager, next, jumper"
:total="page.total"
@size-change="handleSizeChange"
@current-change="handleCurrentChange"
/>
</div>
</template>
<script>
import moment from 'moment'
import { list } from '@/api/team-manage/team.js'
import OfflineSearchBar from './offline-search-bar'
export default {
components: { OfflineSearchBar },
props: {
teamId: {
type: String,
default: null
}
},
data() {
return {
moment,
isEdit: false,
workList: [],
page: {
total: 40,
current: 1,
size: 10
},
param: {}
}
},
created() {},
methods: {
handleSearch(param) {
this.param = param
console.log(param)
list({ ...param, ...this.page, teamId: Number(this.teamId), teamWorkStatus: 0 }).then(res => {
console.log(res)
this.page.total = res.data.total
if (!res.data.records) {
this.workList = []
return
}
this.workList = res.data.records.map((m, index) => ({
...m,
index: this.page.size * (this.page.current - 1) + index + 1
}))
})
},
handleSizeChange(val) {
console.log(`每页 ${val}`)
this.page.size = val
this.handleSearch(this.param)
},
handleCurrentChange(val) {
console.log(`当前页: ${val}`)
this.page.current = val
this.handleSearch(this.param)
}
}
}
</script>
<style lang="scss" module>
.container {
.table {
margin: 16px;
}
}
</style>

View File

@@ -0,0 +1,339 @@
<template>
<div :class="$style.container">
<HeaderTitleBar />
<el-divider content-position="left">{{
$t("module.teamManager.HandoverAdd.TeamPlanFill")
}}</el-divider>
<el-form
ref="team"
:model="team"
:rules="rules"
label-width="110px"
:class="$style.form"
>
<el-form-item
:label="$t('module.teamManager.Handover.LastTeamName')"
prop="planPreTeamId"
:class="$style['form-item']"
>
<el-select
v-model="team.planPreTeamId"
:class="$style.select"
filterable
clearable
:disabled="$route.query.disable === 'true' || $route.query.disable"
@change="preTeamChange"
>
<el-option
v-for="(item, index) in preTeamList"
:key="index"
:label="item.planTeamName"
:value="item.planTeamId"
/>
</el-select>
</el-form-item>
<el-form-item
:label="$t('module.teamManager.Handover.PreviousTeamLeader')"
prop="planPreTeamLeader"
:class="$style['form-item']"
>
<el-input v-model="team.planPreTeamLeader" :disabled="true" />
</el-form-item>
<el-form-item
:label="$t('module.teamManager.Handover.TeamName')"
prop="planTeamId"
:class="$style['form-item']"
>
<el-select
v-model="team.planTeamId"
:class="$style.select"
filterable
clearable
:disabled="$route.query.disable === 'true' || $route.query.disable"
@change="teamChange"
>
<el-option
v-for="(item, index) in teamList"
:key="index"
:label="item.planTeamName"
:value="item.planTeamId"
/>
</el-select>
</el-form-item>
<el-form-item
:label="$t('module.teamManager.Handover.TeamLeader')"
prop="planTeamLeader"
:class="$style['form-item']"
>
<el-input v-model="team.planTeamLeader" :disabled="true" />
</el-form-item>
<el-form-item
:label="$t('module.teamManager.Handover.PlanWorkingHours')"
prop="planOnlineTime"
:class="$style['form-item']"
>
<el-date-picker
v-model="team.planOnlineTime"
type="datetime"
:class="$style.select"
:clearable="false"
:disabled="$route.query.disable === 'true' || $route.query.disable"
/>
</el-form-item>
<el-form-item
:label="$t('module.teamManager.Handover.PlannedHandoverTime')"
prop="planHandoverTime"
:class="$style['form-item']"
>
<el-date-picker
v-model="team.planHandoverTime"
type="datetime"
:clearable="false"
:class="$style.select"
:disabled="$route.query.disable === 'true' || $route.query.disable"
/>
</el-form-item>
<el-form-item
:label="$t('module.teamManager.Handover.Remark')"
prop="remark"
:class="$style['form-item-remark']"
>
<el-input
v-model="team.remark"
:disabled="$route.query.disable === 'true' || $route.query.disable"
/>
</el-form-item>
</el-form>
<el-divider v-if="false" content-position="left">{{
$t("module.teamManager.HandoverAdd.MajorSelection")
}}</el-divider>
<ProfessionPanel
v-if="false"
:id="team.planId"
:class="$style.bom"
style="width:70%"
@on-change="professionChange"
/>
<el-divider content-position="left">{{
$t("module.teamManager.HandoverAdd.SelectionOfTeamMembers")
}}</el-divider>
<WorkerList
:id="team.planTeamId"
:class="$style.bom"
style="width:70%"
@on-change="workerChange"
/>
<SubmitBar
v-if="$route.query.disable !== 'true' && !$route.query.disable"
@on-cancle="close()"
@on-submit="handleSubmit('team')"
/>
</div>
</template>
<script>
import { find } from 'lodash'
import {
add,
getInfo,
update,
planTeamSelectListNew
} from '@/api/team-manage/team-plan.js'
import SubmitBar from '@/views/art/components/submit-bar'
import HeaderTitleBar from '@/views/material-manage/components/header-title-bar'
import WorkerList from '@/views/team-manage/components/plan/worker-list'
import ProfessionPanel from '@/views/team-manage/components/plan/profession-panel'
export default {
name: 'Team',
components: {
SubmitBar,
HeaderTitleBar,
WorkerList,
ProfessionPanel
},
props: {},
data() {
return {
team: {
planPreTeamId: null,
planTeamId: null,
planWorkerIdList: [],
planProfessionIdList: [],
id: null,
planId: null,
remark: '',
name: '',
planOnlineTime: new Date(),
planHandoverTime: new Date(),
planTeamLeader: '',
planPreTeamLeader: ''
},
rules: {
planTeamId: [
{
required: true,
message: this.$i18nForm([
'placeholder.input',
this.$t('module.teamManager.Handover.TeamName')
]),
trigger: 'change'
}
],
planPreTeamId: [
{
required: true,
message: this.$i18nForm([
'placeholder.input',
this.$t('module.teamManager.Handover.LastTeamName')
]),
trigger: 'change'
}
],
planOnlineTime: [
{
required: true,
message: this.$i18nForm([
'placeholder.input',
this.$t('module.teamManager.Handover.PlanWorkingHours')
]),
trigger: 'blur'
}
],
planHandoverTime: [
{
required: true,
message: this.$i18nForm([
'placeholder.input',
this.$t('module.teamManager.Handover.PlannedHandoverTime')
]),
trigger: 'blur'
}
]
},
id: null,
preTeamList: [],
teamList: []
}
},
watch: {},
created() {
this.init()
},
methods: {
init() {
this.id = this.$route.query.id
console.log(this.id)
if (this.id) {
getInfo({ id: this.id }).then(res => {
console.log(res)
this.team = res.data
})
}
planTeamSelectListNew().then(res => {
this.preTeamList = res.data
this.teamList = res.data
})
},
close() {
this.$router.push({ path: this.$route.query.redirect })
},
handleSubmit(formName) {
console.log('handleSubmit')
this.$refs[formName].validate(valid => {
if (!valid) {
return false
}
console.log(this.team)
// const { planProfessionIdList, planWorkerIdList } = this.team
const { planWorkerIdList } = this.team
// if (planProfessionIdList.length === 0) {
// this.$message({
// type: 'error',
// message: '专业不能为空!'
// })
// return false
// }
if (planWorkerIdList.length === 0) {
this.$message({
type: 'error',
message: '员工不能为空!'
})
return false
}
if (this.id) {
update(this.team).then(res => {
this.$message({
type: 'success',
message: '更新成功!'
})
this.close()
})
} else {
this.team.id = null
add(this.team).then(res => {
this.$message({
type: 'success',
message: '保存成功!!'
})
this.close()
})
}
})
},
preTeamChange(val) {
const preTeam = find(this.preTeamList, f => f.planTeamId === val)
this.team.planPreTeamLeader = preTeam ? preTeam.planTeamLeader : ''
},
teamChange(val) {
console.log(val)
const team = find(this.teamList, f => f.planTeamId === val)
this.team.planTeamLeader = team ? team.planTeamLeader : ''
console.log(' team.planTeamId', team.planTeamId)
this.team.planTeamId = team.planTeamId
this.team.planId = val
},
professionChange(val) {
this.team.planProfessionIdList = val
},
workerChange(val) {
this.team.planWorkerIdList = val.map(m => m.planWorkerId)
}
}
}
</script>
<style lang="scss" module>
.container {
display: flex;
flex-direction: column;
align-items: center;
.form {
width: 70%;
margin-top: 10px;
display: flex;
flex-flow: wrap;
.form-item {
width: 50%;
}
.form-item-remark {
width: 100%;
}
}
.input {
display: flex;
margin: 8px 16px 8px 4px;
align-items: center;
.select {
width: 100%;
}
}
.select {
width: 100%;
}
.bom {
position: relative;
width: 98%;
}
}
</style>

View File

@@ -0,0 +1,105 @@
<!--
* @Author: zwq
* @Date: 2021-03-05 16:34:46
* @LastEditors: zwq
* @LastEditTime: 2021-03-08 11:03:41
* @Description:
-->
<template>
<div :class="$style.container">
<el-checkbox
v-model="checkAll"
:indeterminate="isIndeterminate"
:disabled="$route.query.disable === 'true' || $route.query.disable"
@change="handleCheckAllChange"
>{{ $t('module.teamManager.HandoverAdd.SelectAll') }}</el-checkbox>
<div style="margin: 15px 0;" />
<el-checkbox-group
v-model="checkedCities"
:disabled="$route.query.disable === 'true' || $route.query.disable"
@change="handleCheckedCitiesChange"
>
<el-checkbox v-for="city in cities" :key="city.id" :label="city.id">{{
city.name
}}</el-checkbox>
</el-checkbox-group>
</div>
</template>
<script>
import { planProfessionVoList } from '@/api/team-manage/team-plan.js'
export default {
name: 'ProfessionPanel',
components: {},
props: {
id: {
type: String,
default: undefined
}
},
data() {
return {
disable: false,
checkAll: false,
isIndeterminate: false,
checkedCities: [],
cities: [],
params: {
planId: 1
}
}
},
watch: {
id(val) {
this.init(val)
}
},
methods: {
async init(val) {
const citiesRes = await planProfessionVoList({
planId: val || this.$route.query.id
})
console.log(citiesRes)
this.cities = citiesRes.data
if (val || this.$route.query.id) {
this.checkedCities = this.cities.filter(f => f.checked).map(m => m.id)
this.checkAll = this.checkedCities.length === this.cities.length
console.log('this.checkedCities', this.checkedCities)
this.$emit('on-change', this.checkedCities)
}
},
handleCheckAllChange(val) {
console.log(val)
this.checkedCities = val ? this.cities.map(m => m.id) : []
this.isIndeterminate = false
this.$emit('on-change', this.checkedCities)
},
handleCheckedCitiesChange(value) {
console.log(value)
const checkedCount = value.length
this.checkAll = checkedCount === this.cities.length
this.isIndeterminate = checkedCount > 0 && checkedCount < this.cities.length
this.$emit('on-change', this.checkedCities)
}
}
}
</script>
<style lang="scss" module>
.container {
display: flex;
flex-direction: column;
align-items: flex-start;
.input {
display: flex;
margin: 8px 16px 8px 4px;
align-items: center;
.select {
width: 100%;
}
}
.select {
width: 100%;
}
}
</style>

View File

@@ -0,0 +1,126 @@
<template>
<div :class="$style.container">
<SearchBar v-if="false" :placeholder="$t('module.teamManager.HandoverAdd.Placeholder')" @on-search="handleSearch" />
<el-table
ref="mainTable"
:data="tableDataList"
:class="$style.table"
:stripe="true"
:header-cell-style="{background:'#eef1f6',color:'#606266',height: '56px', textAlign: 'center'}"
:cell-style="{ textAlign: 'center' }"
size="mini"
:selectable="isDisabled"
@selection-change="handleSelectionChange"
>
<el-table-column type="selection" width="55" />
<el-table-column prop="index" :label="$t('module.teamManager.Handover.index')" width="80" fixed="left" />
<el-table-column prop="planWorkerName" :label="$t('module.teamManager.HandoverAdd.planWorkerName')" width="180" fixed="left" />
<el-table-column prop="planProfessionName" :label="$t('module.teamManager.HandoverAdd.planProfessionName')" width="180" />
<el-table-column prop="telephone" :label="$t('module.teamManager.HandoverAdd.telephone')" width="180" />
<el-table-column prop="workshop" :label="$t('module.teamManager.HandoverAdd.workshop')" width="180" />
<el-table-column prop="onDuty" :label="$t('module.teamManager.HandoverAdd.onDuty')" width="80">
<template slot-scope="scope">
<el-tag v-if="scope.row.onDuty === 1" type="success">
在岗
</el-tag>
<el-tag v-else type="info">
离岗
</el-tag>
</template>
</el-table-column>
</el-table>
</div>
</template>
<script>
import moment from 'moment'
import { planWorkerVoList } from '@/api/team-manage/team-plan.js'
import SearchBar from '@/views/art/components/search-bar'
export default {
components: { SearchBar },
props: {
id: {
type: String,
default: undefined
}
},
data() {
return {
moment,
isEdit: false,
tableDataList: [],
page: {
current: 1,
size: 2
},
addDialogVisible: false,
param: {},
multipleSelection: [],
disable: false
}
},
watch: {
id(val) {
this.handleSearch()
}
},
created() {
this.disable = this.$route.query.disable === 'true' || this.$route.query.disable
},
methods: {
isDisabled(row, rowIndex) {
if (row.status === 1) {
return true // 不禁用
} else {
return false // 不禁用
}
},
handleSearch(param) {
this.param = param
console.log(param)
const params = {
enabled: 1,
planId: this.$route.query.id,
planTeamId: this.id,
...param,
...this.page
}
planWorkerVoList(params).then(res => {
console.log(res)
if (!res.data) {
this.tableDataList = []
return
}
this.tableDataList = res.data.map((m, index) => ({
...m,
index: this.page.size * (this.page.current - 1) + index + 1
}))
const multipleSelection = this.tableDataList.filter(f => f.checked)
console.log(multipleSelection)
if (!this.id) {
return
}
this.$emit('on-change', this.multipleSelection)
this.$nextTick(() => {
multipleSelection.forEach(e =>
this.$refs.mainTable.toggleRowSelection(e)
)
})
})
},
handleSelectionChange(val) {
if (this.$route.query.disable) { return }
console.log(val)
this.multipleSelection = val
this.$emit('on-change', this.multipleSelection)
}
}
}
</script>
<style lang="scss" module>
.container {
.table {
margin: 16px;
}
}
</style>

View File

@@ -0,0 +1,139 @@
<template>
<div :class="$style.container">
<span :class="$style['label-name']">{{ $t('module.teamManager.Handover.Keyword') }}</span>
<el-input
v-model="keywords"
:placeholder="placeholder"
:clearable="true"
style="width:150px;max-width:100%;margin-right:16px;"
/>
<span :class="$style['label-name']">{{ $t('module.teamManager.Handover.'+handoverTme) }}</span>
<el-date-picker
v-model="dts"
type="datetimerange"
style="margin-right:16px;"
align="right"
unlink-panels
value-format="yyyy-MM-dd HH:mm:ss"
:start-placeholder="$t('module.basicData.ScrapInfo.StartTime')"
:end-placeholder="$t('module.basicData.ScrapInfo.EndTime')"
:range-separator="$t('module.basicData.ScrapInfo.To')"
:picker-options="pickerOptions"
/>
<span :class="$style['label-name']">{{ $t('module.teamManager.Handover.HandoverStatus') }}</span>
<el-select
v-model="handoverStatus"
style="margin-right:16px;"
filterable
clearable
>
<el-option
v-for="item in workStatusOptions"
:key="item.value"
:label="item.label"
:value="item.value"
/>
</el-select>
<el-button type="primary" icon="el-icon-search" @click="handleSearch()">
{{ 'btn.search' | i18nFilter }}
</el-button>
<slot />
</div>
</template>
<script>
import moment from 'moment'
export default {
props: {
lableName: {
type: String,
default: '关键字'
},
placeholder: {
type: String,
default: '请输入'
},
handoverTme: {
type: String,
default: 'HandoverTme'
}
},
data() {
return {
keywords: '',
dts: ['', ''],
pickerOptions: {
shortcuts: [{
text: '最近一周',
onClick(picker) {
const end = new Date()
const start = new Date()
start.setTime(start.getTime() - 3600 * 1000 * 24 * 7)
picker.$emit('pick', [start, end])
}
}, {
text: '最近一个月',
onClick(picker) {
const end = new Date()
const start = new Date()
start.setTime(start.getTime() - 3600 * 1000 * 24 * 30)
picker.$emit('pick', [start, end])
}
}, {
text: '最近三个月',
onClick(picker) {
const end = new Date()
const start = new Date()
start.setTime(start.getTime() - 3600 * 1000 * 24 * 90)
picker.$emit('pick', [start, end])
}
}]
},
handoverStatus: null,
workStatusOptions: [{
value: null,
label: '全部'
},
{
value: 0,
label: '已下班'
},
{
value: 1,
label: '工作中'
}
]
}
},
methods: {
handleSearch() {
console.log(this.dts)
const param = {
keyWords: this.keywords,
keywords: this.keywords,
handoverBegTime: this.dts ? moment.utc(this.dts[0]) : null,
handoverEndTime: this.dts ? moment.utc(this.dts[1]) : null,
planHandoverBegTime: this.dts ? moment.utc(this.dts[0]) : null,
planHandoverEndTime: this.dts ? moment.utc(this.dts[1]) : null,
handoverStatus: this.handoverStatus,
teamWorkStatus: this.handoverStatus
}
this.$emit('on-search', param)
}
}
}
</script>
<style lang="scss" module>
.container {
display: flex;
align-items: center;
width: 100%;
height: 50px;
padding: 4px 40px;
background-color: #eee;
.label-name {
margin-right: 8px;
font-size: 14px;
}
}
</style>