分包统计接口调试

This commit is contained in:
BianLzhaoMin 2025-10-10 17:22:16 +08:00
parent 5d4eede169
commit bc829a0037
6 changed files with 359 additions and 404 deletions

View File

@ -17,3 +17,30 @@ export const getSubCountDetailCardStatisticsAPI = (data) => {
params: data, params: data,
}) })
} }
// 综合查询 获取分包统计详情 获取分包工程信息
export const getSubCountDetailSubProjectInfoAPI = (data) => {
return request({
url: '/bmw/subStatistics/getSubProMsg',
method: 'GET',
params: data,
})
}
// 综合查询 获取分包统计详情 获取班组信息
export const getSubCountDetailTeamInfoAPI = (data) => {
return request({
url: '/bmw/subStatistics/getSubTeamMsg',
method: 'GET',
params: data,
})
}
// 综合查询 获取分包统计详情 获取考勤机列表
export const getSubCountDetailAttMachineListAPI = (data) => {
return request({
url: '/bmw/subStatistics/getSubDeviceMsg',
method: 'GET',
params: data,
})
}

View File

@ -16,57 +16,46 @@
<div class="table-container"> <div class="table-container">
<el-table <el-table
:data="subcontractorData"
style="width: 100%"
:header-cell-style="tableHeaderStyle"
:cell-style="tableCellStyle"
stripe stripe
border border
style="width: 100%"
:data="attMachineData"
:cell-style="tableCellStyle"
:header-cell-style="tableHeaderStyle"
> >
<el-table-column <el-table-column
prop="subcontractorName" align="center"
prop="deviceCode"
label="考勤机编号" label="考勤机编号"
show-overflow-tooltip show-overflow-tooltip
/> />
<el-table-column <el-table-column
prop="contractCode" align="center"
prop="deviceName"
label="考勤机名称" label="考勤机名称"
/> />
<el-table-column <el-table-column
prop="contractCode" align="center"
prop="proName"
label="考勤机工程" label="考勤机工程"
/> />
<el-table-column <el-table-column label="状态" align="center">
prop="entryExitStatus" <template>
label="状态"
width="120"
align="center"
>
<template slot-scope="scope">
<div class="status-cell"> <div class="status-cell">
<span <span class="status-dot status-online" />
class="status-dot" 在用
:class="
scope.row.entryExitStatus === '在场'
? 'status-online'
: 'status-offline'
"
></span>
{{ scope.row.entryExitStatus }}
</div> </div>
</template> </template>
</el-table-column> </el-table-column>
<el-table-column <el-table-column
prop="totalEntryCount" prop="updateUser"
label="绑定人" label="绑定人"
width="120"
align="center" align="center"
/> />
<el-table-column <el-table-column
prop="currentOnsiteCount" prop="updateTime"
label="绑定时间" label="绑定时间"
width="120"
align="center" align="center"
/> />
</el-table> </el-table>
@ -77,63 +66,19 @@
</template> </template>
<script> <script>
import { getSubCountDetailAttMachineListAPI } from '@/api/synthesize-query/sub-count'
export default { export default {
name: 'SubTeamCard', name: 'SubTeamCard',
props: {
subId: {
type: [String, Number],
default: null,
},
},
data() { data() {
return { return {
// //
subcontractorData: [ attMachineData: [],
{
subcontractorName: '重庆市万州水电建筑工程有限公司',
contractCode: 'SXFGS-YH-001',
contractName: '220kV永和(云纺)变电站建筑工程专业分包合同1',
entryExitStatus: '在场',
totalEntryCount: 80,
currentOnsiteCount: 56,
entryTime: '2025-04-06',
authorizationLetter: '已上传',
exitTime: '/',
wageCommitment: '/',
},
{
subcontractorName: '深圳市铁越电气有限公司',
contractCode: 'SXFGS-YH-005',
contractName:
'220kV 永和(云纺)输变电工程架线施工劳务分包框架子合同',
entryExitStatus: '离场',
totalEntryCount: 45,
currentOnsiteCount: 0,
entryTime: '2025-04-06',
authorizationLetter: '已上传',
exitTime: '2025-10-06',
wageCommitment: '已上传',
},
],
//
teamData: [
{
teamName: '组塔一班',
teamLeader: '颜静宁 13875286111',
subcontractorName: '重庆市万州水电建筑工程有限公司',
entryExitStatus: '在场',
totalEntryCount: 80,
currentOnsiteCount: 56,
entryTime: '2025-04-06',
exitTime: '/',
commitmentLetter: '/',
},
{
teamName: '架线三班',
teamLeader: '颜静宁 13875286111',
subcontractorName: '重庆市万州水电建筑工程有限公司',
entryExitStatus: '离场',
totalEntryCount: 45,
currentOnsiteCount: 0,
entryTime: '2025-04-06',
exitTime: '2025-12-06',
commitmentLetter: '已上传',
},
],
} }
}, },
methods: { methods: {
@ -152,9 +97,22 @@ export default {
return { return {
fontSize: '14px', fontSize: '14px',
color: '#606266', color: '#606266',
padding: '12px 8px', padding: '12px 0',
} }
}, },
//
async getSubCountDetailAttMachineList() {
const res = await getSubCountDetailAttMachineListAPI({
subId: this.subId,
})
this.attMachineData = res.rows
this.$emit('initAttMachineCount', res.total)
},
},
created() {
this.getSubCountDetailAttMachineList()
}, },
} }
</script> </script>

View File

@ -76,6 +76,10 @@ export default {
type: [String, Number], type: [String, Number],
default: null, default: null,
}, },
attMachineCount: {
type: [String, Number],
default: 0,
},
}, },
data() { data() {
return { return {
@ -84,7 +88,6 @@ export default {
{ {
type: 'subcontractor', type: 'subcontractor',
label: '标段工程/分包合同', label: '标段工程/分包合同',
color: '#EF4444', color: '#EF4444',
dotColor: '#EF4444', dotColor: '#EF4444',
dataKey: 'proNum', dataKey: 'proNum',
@ -92,7 +95,6 @@ export default {
{ {
type: 'team', type: 'team',
label: '施工班组', label: '施工班组',
color: '#3B82F6', color: '#3B82F6',
dotColor: '#3B82F6', dotColor: '#3B82F6',
dataKey: 'teamNum', dataKey: 'teamNum',
@ -100,7 +102,6 @@ export default {
{ {
type: 'entry', type: 'entry',
label: '累计入场', label: '累计入场',
color: '#8B5CF6', color: '#8B5CF6',
dotColor: '#8B5CF6', dotColor: '#8B5CF6',
dataKey: 'einNumHis', dataKey: 'einNumHis',
@ -109,7 +110,6 @@ export default {
{ {
type: 'attendance', type: 'attendance',
label: '累计考勤', label: '累计考勤',
color: '#06B6D4', color: '#06B6D4',
dotColor: '#06B6D4', dotColor: '#06B6D4',
dataKey: 'attNumHis', dataKey: 'attNumHis',
@ -117,7 +117,6 @@ export default {
{ {
type: 'wage', type: 'wage',
label: '累计工资', label: '累计工资',
color: '#EC4899', color: '#EC4899',
dotColor: '#EC4899', // 绿 dotColor: '#EC4899', // 绿
dataKey: 'salaryMoneyNum', dataKey: 'salaryMoneyNum',
@ -125,10 +124,9 @@ export default {
{ {
type: 'machine', type: 'machine',
label: '考勤机', label: '考勤机',
color: '#10B981', color: '#10B981',
dotColor: '#10B981', dotColor: '#10B981',
dataKey: 'salaryMoneyNum', value: 0,
}, },
], ],
} }
@ -141,6 +139,13 @@ export default {
}, },
immediate: true, immediate: true,
}, },
attMachineCount: {
handler(newVal) {
this.cardList[5].value = newVal
},
immediate: true,
},
}, },
methods: { methods: {
/** /**
@ -162,9 +167,25 @@ export default {
einNumHis, einNumHis,
attNumHis, attNumHis,
salaryMoneyNum, salaryMoneyNum,
} = res.data
console.log(res, '卡片统计') exitNum,
einNum,
exitUploadFile,
noExitUploadFile,
einTime,
exitTime,
yellowNum,
greenNum,
yellowThanSevenDayNum,
proRepairNum,
repairPersonNum,
repairNumHis,
payrollNum,
workerSalaryNum,
payrollWorkerTime,
} = res.data
// // API // // API
const mockData = { const mockData = {
@ -175,8 +196,44 @@ export default {
salaryMoneyNum, salaryMoneyNum,
} }
//
const entryData = {
einNumHis,
einNum,
exitNum,
exitUploadFile,
noExitUploadFile,
einTime,
exitTime,
yellowNum,
greenNum,
yellowThanSevenDayNum,
}
//
const attendanceData = {
attNumHis,
proRepairNum,
repairPersonNum,
repairNumHis,
}
//
const wageData = {
salaryMoneyNum,
payrollNum,
workerSalaryNum,
payrollWorkerTime,
}
// //
this.updateCardData(mockData) this.updateCardData(mockData)
this.$emit(
'initPersonData',
entryData,
attendanceData,
wageData,
)
// this.$emit('data-loaded', mockData) // this.$emit('data-loaded', mockData)
} catch (error) { } catch (error) {
@ -192,7 +249,7 @@ export default {
updateCardData(data) { updateCardData(data) {
this.cardList.forEach((card) => { this.cardList.forEach((card) => {
if (data.hasOwnProperty(card.dataKey)) { if (data.hasOwnProperty(card.dataKey)) {
card.value = data[card.dataKey] || 0 card.value = data[card.dataKey]
} }
}) })
}, },

View File

@ -19,15 +19,13 @@
<div class="data-grid"> <div class="data-grid">
<div class="data-item"> <div class="data-item">
<div class="data-label">累计入场人数</div> <div class="data-label">累计入场人数</div>
<div class="data-value">{{ <div class="data-value">
personData.entry.totalEntryCount {{ entryData.einNumHis }}
}}</div> </div>
</div> </div>
<div class="data-item"> <div class="data-item">
<div class="data-label">累计出场人数</div> <div class="data-label">累计出场人数</div>
<div class="data-value">{{ <div class="data-value">{{ entryData.exitNum }}</div>
personData.entry.totalExitCount
}}</div>
</div> </div>
<div class="data-item"> <div class="data-item">
<div class="data-label">离场人员工资结算确认单</div> <div class="data-label">离场人员工资结算确认单</div>
@ -36,68 +34,48 @@
<span class="status-dot uploaded"></span> <span class="status-dot uploaded"></span>
<span <span
>已上传: >已上传:
{{ {{ entryData.exitUploadFile }}</span
personData.entry
.salaryConfirmationUploaded
}}</span
> >
</div> </div>
<div class="status-item"> <div class="status-item">
<span class="status-dot not-uploaded"></span> <span class="status-dot not-uploaded"></span>
<span <span
>未上传: >未上传:
{{ {{ entryData.noExitUploadFile }}</span
personData.entry
.salaryConfirmationNotUploaded
}}</span
> >
</div> </div>
</div> </div>
</div> </div>
<div class="data-item"> <div class="data-item">
<div class="data-label">首次人员入场时间</div> <div class="data-label">首次人员入场时间</div>
<div class="data-value">{{ <div class="data-value">{{ entryData.einTime }}</div>
personData.entry.firstEntryTime
}}</div>
</div> </div>
<div class="data-item"> <div class="data-item">
<div class="data-label">当前在场人数</div> <div class="data-label">当前在场人数</div>
<div class="data-value">{{ <div class="data-value">{{ entryData.einNum }}</div>
personData.entry.currentOnsiteCount
}}</div>
</div> </div>
<div class="data-item"> <div class="data-item">
<div class="data-label">在场人数状态</div> <div class="data-label">在场人数状态</div>
<div class="data-value"> <div class="data-value">
<div class="status-item"> <div class="status-item">
<span class="status-dot yellow"></span> <span class="status-dot yellow"></span>
<span <span>黄灯: {{ entryData.yellowNum }}</span>
>黄灯:
{{
personData.entry.yellowLightCount
}}</span
>
</div> </div>
<div class="status-item"> <div class="status-item">
<span class="status-dot green"></span> <span class="status-dot green"></span>
<span <span>绿灯: {{ entryData.greenNum }}</span>
>绿灯:
{{ personData.entry.greenLightCount }}</span
>
</div> </div>
</div> </div>
</div> </div>
<div class="data-item"> <div class="data-item">
<div class="data-label">黄灯7天人数</div> <div class="data-label">黄灯7天人数</div>
<div class="data-value">{{ <div class="data-value">{{
personData.entry.yellowLight7DaysCount entryData.yellowThanSevenDayNum
}}</div> }}</div>
</div> </div>
<div class="data-item"> <div class="data-item">
<div class="data-label">末次人员出场时间</div> <div class="data-label">末次人员出场时间</div>
<div class="data-value">{{ <div class="data-value">{{ entryData.exitTime }}</div>
personData.entry.lastExitTime
}}</div>
</div> </div>
</div> </div>
</div> </div>
@ -117,33 +95,25 @@
<div class="data-item"> <div class="data-item">
<div class="data-label">累计考勤天数(人次)</div> <div class="data-label">累计考勤天数(人次)</div>
<div class="data-value">{{ <div class="data-value">{{
personData.attendance.totalAttendanceDays attendanceData.attNumHis
}}</div> }}</div>
</div> </div>
<div class="data-item"> <div class="data-item">
<div class="data-label">累计补卡申请次数()</div> <div class="data-label">累计补卡申请次数()</div>
<div class="data-value"> <div class="data-value">
{{ {{ attendanceData.repairNumHis }}
personData.attendance
.totalCardReplacementApplications
}}
<span
class="view-link"
@click="handleViewCardReplacement"
>查看</span
>
</div> </div>
</div> </div>
<div class="data-item"> <div class="data-item">
<div class="data-label">累计补卡人数()</div> <div class="data-label">累计补卡人数()</div>
<div class="data-value">{{ <div class="data-value">
personData.attendance.totalCardReplacementPersons {{ attendanceData.repairPersonNum }}
}}</div> </div>
</div> </div>
<div class="data-item"> <div class="data-item">
<div class="data-label">累计补卡天数(人次)</div> <div class="data-label">累计补卡天数(人次)</div>
<div class="data-value">{{ <div class="data-value">{{
personData.attendance.totalCardReplacementDays attendanceData.proRepairNum
}}</div> }}</div>
</div> </div>
</div> </div>
@ -163,27 +133,26 @@
<div class="data-grid"> <div class="data-grid">
<div class="data-item"> <div class="data-item">
<div class="data-label">累计发放工资()</div> <div class="data-label">累计发放工资()</div>
<div class="data-value salary-amount">{{ <div class="data-value salary-amount">
formatCurrency(personData.salary.totalSalaryIssued) ¥
}}</div> {{ wageData.salaryMoneyNum }}
</div>
</div> </div>
<div class="data-item"> <div class="data-item">
<div class="data-label">工资册数量()</div> <div class="data-label">工资册数量()</div>
<div class="data-value">{{ <div class="data-value">{{ wageData.payrollNum }}</div>
personData.salary.payrollBookCount
}}</div>
</div> </div>
<div class="data-item"> <div class="data-item">
<div class="data-label">累计发放人数</div> <div class="data-label">累计发放人数</div>
<div class="data-value">{{ <div class="data-value">
personData.salary.totalIssuedPersons {{ wageData.workerSalaryNum }}
}}</div> </div>
</div> </div>
<div class="data-item"> <div class="data-item">
<div class="data-label">累计发放人次</div> <div class="data-label">累计发放人次</div>
<div class="data-value">{{ <div class="data-value">
personData.salary.totalIssuedPersonTimes {{ wageData.payrollWorkerTime }}
}}</div> </div>
</div> </div>
</div> </div>
</div> </div>
@ -195,132 +164,21 @@
export default { export default {
name: 'PersonInfoCard', name: 'PersonInfoCard',
props: { props: {
// ID entryData: {
projectId: { type: Object,
type: [String, Number], default: () => {},
default: null,
}, },
// attendanceData: {
autoLoad: { type: Object,
type: Boolean, default: () => {},
default: true, },
}, wageData: {
}, type: Object,
data() { default: () => {},
return {
loading: false,
personData: {
entry: {
totalEntryCount: 1200,
totalExitCount: 800,
salaryConfirmationUploaded: 390,
salaryConfirmationNotUploaded: 10,
firstEntryTime: '2025-09-02 10:12:13',
currentOnsiteCount: 400,
yellowLightCount: 10,
greenLightCount: 390,
yellowLight7DaysCount: 2,
lastExitTime: '2025-10-02 19:12:13',
},
attendance: {
totalAttendanceDays: 9600,
totalCardReplacementApplications: 10,
totalCardReplacementPersons: 35,
totalCardReplacementDays: 156,
},
salary: {
totalSalaryIssued: 745635,
payrollBookCount: 10,
totalIssuedPersons: 253,
totalIssuedPersonTimes: 1352,
},
},
}
},
created() {
if (this.autoLoad) {
this.loadData()
}
},
watch: {
projectId: {
handler() {
if (this.autoLoad) {
this.loadData()
}
},
immediate: false,
}, },
}, },
methods: { methods: {
/**
* 加载人员信息数据
*/
async loadData() {
if (this.loading) return
this.loading = true
try {
// API
// const response = await getPersonInfoAPI({
// projectId: this.projectId
// })
// API
const mockData = {
entry: {
totalEntryCount: 1200,
totalExitCount: 800,
salaryConfirmationUploaded: 390,
salaryConfirmationNotUploaded: 10,
firstEntryTime: '2025-09-02 10:12:13',
currentOnsiteCount: 400,
yellowLightCount: 10,
greenLightCount: 390,
yellowLight7DaysCount: 2,
lastExitTime: '2025-10-02 19:12:13',
},
attendance: {
totalAttendanceDays: 9600,
totalCardReplacementApplications: 10,
totalCardReplacementPersons: 35,
totalCardReplacementDays: 156,
},
salary: {
totalSalaryIssued: 745635,
payrollBookCount: 10,
totalIssuedPersons: 253,
totalIssuedPersonTimes: 1352,
},
}
this.personData = mockData
this.$emit('data-loaded', mockData)
} catch (error) {
console.error('加载人员信息失败:', error)
this.$message.error('加载人员信息失败')
this.$emit('data-error', error)
} finally {
this.loading = false
}
},
/**
* 刷新数据
*/
refresh() {
this.loadData()
},
/**
* 格式化货币显示
* @param {Number} value 金额
* @returns {String} 格式化后的货币字符串
*/
formatCurrency(value) {
return `¥${value.toLocaleString()}`
},
/** /**
* 处理查看补卡申请点击事件 * 处理查看补卡申请点击事件
*/ */

View File

@ -24,58 +24,66 @@
border border
> >
<el-table-column <el-table-column
prop="subcontractorName" prop="proName"
label="工程名称" label="工程名称"
min-width="200"
show-overflow-tooltip show-overflow-tooltip
/>
<el-table-column
prop="contractCode"
label="分包合同编码"
width="150"
/>
<el-table-column
prop="contractName"
label="分包合同名称"
min-width="250"
show-overflow-tooltip
/>
<el-table-column
prop="entryExitStatus"
label="出入场状态"
width="120"
align="center" align="center"
/>
<el-table-column
prop="subContractCode"
label="分包合同编码"
show-overflow-tooltip
align="center"
/>
<el-table-column
prop="subContractName"
label="分包合同名称"
show-overflow-tooltip
align="center"
/>
<el-table-column
prop="subEinStatus"
label="出入场状态"
align="center"
width="120"
> >
<template slot-scope="scope"> <template slot-scope="scope">
<div class="status-cell"> <div class="status-cell">
<span <span
class="status-dot" class="status-dot"
:class=" :class="
scope.row.entryExitStatus === '在场' scope.row.subEinStatus === 1
? 'status-online' ? 'status-online'
: 'status-offline' : 'status-offline'
" "
></span> ></span>
{{ scope.row.entryExitStatus }} {{
scope.row.subEinStatus === 1
? '在场'
: '出场'
}}
</div> </div>
</template> </template>
</el-table-column> </el-table-column>
<el-table-column <el-table-column
prop="totalEntryCount" prop="einNumHis"
label="累计入场人数" label="累计入场人数"
width="120"
align="center" align="center"
width="120"
show-overflow-tooltip
/> />
<el-table-column <el-table-column
prop="currentOnsiteCount" prop="einNum"
label="当前在场人数" label="当前在场人数"
width="120" width="120"
align="center" align="center"
show-overflow-tooltip
/> />
<el-table-column <el-table-column
prop="entryTime" prop="subEinTime"
label="分包入场时间" label="分包入场时间"
width="130" show-overflow-tooltip
align="center"
/> />
<el-table-column <el-table-column
prop="authorizationLetter" prop="authorizationLetter"
@ -85,26 +93,22 @@
> >
<template slot-scope="scope"> <template slot-scope="scope">
<span <span
v-if=" v-if="isUpload(1, scope.row.contractFile)"
scope.row.authorizationLetter ===
'已上传'
"
class="upload-status uploaded" class="upload-status uploaded"
@click=" @click="
onHandleOpenPreviewFile(scope.row, 1) onHandleOpenPreviewFile(scope.row, 1)
" "
> >
{{ scope.row.authorizationLetter }} 已上传
</span> </span>
<span v-else class="upload-status not-uploaded"> <span v-else class="upload-status not-uploaded">
{{ scope.row.authorizationLetter }} /
</span> </span>
</template> </template>
</el-table-column> </el-table-column>
<el-table-column <el-table-column
prop="exitTime" prop="subExitTime"
label="分包出场时间" label="分包出场时间"
width="130"
/> />
<el-table-column <el-table-column
prop="wageCommitment" prop="wageCommitment"
@ -114,16 +118,16 @@
> >
<template slot-scope="scope"> <template slot-scope="scope">
<span <span
v-if="scope.row.wageCommitment === '已上传'" v-if="isUpload(2, scope.row.contractFile)"
class="upload-status uploaded" class="upload-status uploaded"
@click=" @click="
onHandleOpenPreviewFile(scope.row, 2) onHandleOpenPreviewFile(scope.row, 2)
" "
> >
{{ scope.row.wageCommitment }} 已上传
</span> </span>
<span v-else class="upload-status not-uploaded"> <span v-else class="upload-status not-uploaded">
{{ scope.row.wageCommitment }} /
</span> </span>
</template> </template>
</el-table-column> </el-table-column>
@ -152,72 +156,82 @@
<el-table-column <el-table-column
prop="teamName" prop="teamName"
label="班组名称" label="班组名称"
width="150"
/>
<el-table-column
prop="teamLeader"
label="班组长及联系方式"
width="180"
show-overflow-tooltip
/>
<el-table-column
prop="subcontractorName"
label="工程名称"
min-width="200"
show-overflow-tooltip
/>
<el-table-column
prop="entryExitStatus"
label="出入场状态"
width="120"
align="center" align="center"
show-overflow-tooltip
/>
<el-table-column
prop="phone"
label="班组长及联系方式"
align="center"
show-overflow-tooltip
/>
<el-table-column
prop="proName"
label="工程名称"
align="center"
show-overflow-tooltip
/>
<el-table-column
label="出入场状态"
align="center"
show-overflow-tooltip
width="120"
> >
<template slot-scope="scope"> <template slot-scope="scope">
<div class="status-cell"> <div class="status-cell">
<span <span
class="status-dot" class="status-dot"
:class=" :class="
scope.row.entryExitStatus === '在场' scope.row.teamEinStatus === 1
? 'status-online' ? 'status-online'
: 'status-offline' : 'status-offline'
" "
></span> ></span>
{{ scope.row.entryExitStatus }} {{
scope.row.teamEinStatus === 1
? '在场'
: '出场'
}}
</div> </div>
</template> </template>
</el-table-column> </el-table-column>
<el-table-column <el-table-column
prop="totalEntryCount" prop="einNumHis"
label="累计入场人数" label="累计入场人数"
width="120"
align="center" align="center"
width="120"
show-overflow-tooltip
/> />
<el-table-column <el-table-column
prop="currentOnsiteCount" prop="einNum"
label="当前在场人数" label="当前在场人数"
width="120"
align="center" align="center"
width="120"
show-overflow-tooltip
/> />
<el-table-column <el-table-column
prop="entryTime" align="center"
prop="teamEinTime"
label="入场时间" label="入场时间"
width="120" show-overflow-tooltip
/> />
<el-table-column <el-table-column
prop="exitTime" show-overflow-tooltip
prop="teamExitTime"
label="出场时间" label="出场时间"
width="120" align="center"
/> />
<el-table-column <el-table-column
prop="commitmentLetter" prop="contractFile"
label="施工班组承诺书" label="施工班组承诺书"
width="150"
align="center" align="center"
show-overflow-tooltip
> >
<template slot-scope="scope"> <template slot-scope="scope">
<span <span
v-if=" v-if="
scope.row.commitmentLetter === '已上传' scope.row.contractFile &&
scope.row.contractFile.length > 0
" "
class="upload-status uploaded" class="upload-status uploaded"
@click=" @click="
@ -227,7 +241,7 @@
{{ scope.row.commitmentLetter }} {{ scope.row.commitmentLetter }}
</span> </span>
<span v-else class="upload-status not-uploaded"> <span v-else class="upload-status not-uploaded">
{{ scope.row.commitmentLetter }} /
</span> </span>
</template> </template>
</el-table-column> </el-table-column>
@ -241,11 +255,25 @@
@closeDialogOuter="handleCloseDialogOuter" @closeDialogOuter="handleCloseDialogOuter"
> >
<template slot="outerContent"> <template slot="outerContent">
<div> <el-table :data="fileList" stripe border>
<h1> <el-table-column
{{ dialogConfig.outerTitle }} align="center"
</h1> show-overflow-tooltip
</div> prop="originFileName"
label="文件名称"
/>
<el-table-column align="center" label="操作">
<template slot-scope="scope">
<el-button
type="text"
icon="el-icon-download"
@click="onHandleDownloadFile(scope.row)"
>
下载
</el-button>
</template>
</el-table-column>
</el-table>
</template> </template>
</DialogModel> </DialogModel>
</div> </div>
@ -253,72 +281,35 @@
<script> <script>
import DialogModel from '@/components/DialogModel/index.vue' import DialogModel from '@/components/DialogModel/index.vue'
import {
getSubCountDetailSubProjectInfoAPI,
getSubCountDetailTeamInfoAPI,
} from '@/api/synthesize-query/sub-count'
export default { export default {
name: 'SubTeamCard', name: 'SubTeamCard',
components: { components: {
DialogModel, DialogModel,
}, },
props: {
subId: {
type: [String, Number],
default: null,
},
},
data() { data() {
return { return {
// //
subcontractorData: [ subcontractorData: [],
{
subcontractorName: '重庆市万州水电建筑工程有限公司',
contractCode: 'SXFGS-YH-001',
contractName: '220kV永和(云纺)变电站建筑工程专业分包合同1',
entryExitStatus: '在场',
totalEntryCount: 80,
currentOnsiteCount: 56,
entryTime: '2025-04-06',
authorizationLetter: '已上传',
exitTime: '/',
wageCommitment: '/',
},
{
subcontractorName: '深圳市铁越电气有限公司',
contractCode: 'SXFGS-YH-005',
contractName:
'220kV 永和(云纺)输变电工程架线施工劳务分包框架子合同',
entryExitStatus: '离场',
totalEntryCount: 45,
currentOnsiteCount: 0,
entryTime: '2025-04-06',
authorizationLetter: '已上传',
exitTime: '2025-10-06',
wageCommitment: '已上传',
},
],
// //
teamData: [ teamData: [],
{ //
teamName: '组塔一班', fileList: [],
teamLeader: '颜静宁 13875286111',
subcontractorName: '重庆市万州水电建筑工程有限公司',
entryExitStatus: '在场',
totalEntryCount: 80,
currentOnsiteCount: 56,
entryTime: '2025-04-06',
exitTime: '/',
commitmentLetter: '/',
},
{
teamName: '架线三班',
teamLeader: '颜静宁 13875286111',
subcontractorName: '重庆市万州水电建筑工程有限公司',
entryExitStatus: '离场',
totalEntryCount: 45,
currentOnsiteCount: 0,
entryTime: '2025-04-06',
exitTime: '2025-12-06',
commitmentLetter: '已上传',
},
],
dialogConfig: { dialogConfig: {
outerTitle: '授权委托书', outerTitle: '授权委托书',
outerWidth: '80%', outerWidth: '40%',
outerVisible: false, outerVisible: false,
minHeight: '90vh', minHeight: '40vh',
maxHeight: '90vh', maxHeight: '90vh',
}, },
} }
@ -339,7 +330,7 @@ export default {
return { return {
fontSize: '14px', fontSize: '14px',
color: '#606266', color: '#606266',
padding: '12px 8px', padding: '12px 0 ',
} }
}, },
@ -350,12 +341,19 @@ export default {
switch (type) { switch (type) {
case 1: case 1:
this.dialogConfig.outerTitle = '授权委托书' this.dialogConfig.outerTitle = '授权委托书'
this.fileList = row.contractFile.filter(
(item) => item.sourceType == 1,
)
break break
case 2: case 2:
this.dialogConfig.outerTitle = '工资已支付完成承诺书' this.dialogConfig.outerTitle = '工资已支付完成承诺书'
this.fileList = row.contractFile.filter(
(item) => item.sourceType == 2,
)
break break
case 3: case 3:
this.dialogConfig.outerTitle = '施工班组承诺书' this.dialogConfig.outerTitle = '施工班组承诺书'
this.fileList = row.contractFile
break break
} }
this.dialogConfig.outerVisible = true this.dialogConfig.outerVisible = true
@ -365,6 +363,38 @@ export default {
handleCloseDialogOuter() { handleCloseDialogOuter() {
this.dialogConfig.outerVisible = false this.dialogConfig.outerVisible = false
}, },
//
async getSubCountDetailSubProjectInfo() {
const res = await getSubCountDetailSubProjectInfoAPI({
subId: this.subId,
})
console.log(res, '分包工程信息')
this.subcontractorData = res.rows
},
//
async getSubCountDetailTeamInfo() {
const res = await getSubCountDetailTeamInfoAPI({
subId: this.subId,
})
this.teamData = res.rows
console.log(res, '班组信息')
},
//
isUpload(type, contractFile) {
return contractFile.some((item) => item.sourceType == type)
},
//
onHandleDownloadFile(row) {
window.open(row.lsUrl, '_blank')
},
},
created() {
this.getSubCountDetailSubProjectInfo()
this.getSubCountDetailTeamInfo()
}, },
} }
</script> </script>

View File

@ -8,10 +8,22 @@
:contractFile="contractFile" :contractFile="contractFile"
:legalPersonPhone="legalPersonPhone" :legalPersonPhone="legalPersonPhone"
/> />
<CardCount :sub-id="subId" @cardClick="handleCardClick" /> <CardCount
<SubTeamCard /> :sub-id="subId"
<PersonInfoCard /> :attMachineCount="attMachineCount"
<AttMachineCard /> @cardClick="handleCardClick"
@initPersonData="initPersonData"
/>
<SubTeamCard :sub-id="subId" />
<PersonInfoCard
:entryData="entryData"
:attendanceData="attendanceData"
:wageData="wageData"
/>
<AttMachineCard
:sub-id="subId"
@initAttMachineCount="initAttMachineCount"
/>
</div> </div>
</template> </template>
@ -39,6 +51,10 @@ export default {
subAddress: null, // subAddress: null, //
contractFile: [], // contractFile: [], //
subId: null, // ID subId: null, // ID
attMachineCount: 0, //
entryData: {}, //
attendanceData: {}, //
wageData: {}, //
} }
}, },
created() { created() {
@ -64,6 +80,15 @@ export default {
this.scrollToTarget(card.type) this.scrollToTarget(card.type)
// const attMachineCard_1 = document.getElementById('attMachineCard_1') // const attMachineCard_1 = document.getElementById('attMachineCard_1')
}, },
initAttMachineCount(count) {
this.attMachineCount = count
},
//
initPersonData(entryData, attendanceData, wageData) {
this.entryData = entryData
this.attendanceData = attendanceData
this.wageData = wageData
},
// //
scrollToTarget(cardType) { scrollToTarget(cardType) {