v1.9 优化办公和合同测试 部分页面优化

This commit is contained in:
wuxw 2025-11-10 05:53:27 +08:00
parent 27918d403d
commit 32722b0a47
12 changed files with 267 additions and 146 deletions

View File

@ -35,7 +35,7 @@ export function listWorkflowImage(params) {
}
}).then(response => {
const res = response.data
if (res.code !== '0') {
if (res.code != 0) {
reject(new Error(res.msg))
return
}

View File

@ -1,6 +1,6 @@
<template>
<el-card class="box-card">
<div slot="header" class="clearfix">
<div slot="header" class="flex justify-between">
<span>{{ $t('contractChangeMainBody.title') }}</span>
</div>
<el-form label-width="120px">

View File

@ -14,6 +14,7 @@ import { messages as contractApplyAuditOrdersMessages } from '../views/contract/
import { messages as contractChangeAuditOrdersMessages } from '../views/contract/contractChangeAuditOrdersLang.js'
import { messages as contractApplyAuditHistoryOrdersMessages } from '../views/contract/contractApplyAuditHistoryOrdersLang'
import { messages as contractChangeAuditHistoryOrdersMessages } from '../views/contract/contractChangeAuditHistoryOrdersLang'
import { messages as contractDetailChangeMessages } from '../views/contract/contractDetailChangeLang'
export const messages ={
en:{
@ -33,6 +34,7 @@ export const messages ={
...contractChangeAuditOrdersMessages.en,
...contractApplyAuditHistoryOrdersMessages.en,
...contractChangeAuditHistoryOrdersMessages.en,
...contractDetailChangeMessages.en,
},
zh:{
...contractTypeManageMessages.zh,
@ -51,5 +53,6 @@ export const messages ={
...contractChangeAuditOrdersMessages.zh,
...contractApplyAuditHistoryOrdersMessages.zh,
...contractChangeAuditHistoryOrdersMessages.zh,
...contractDetailChangeMessages.zh,
}
}

View File

@ -243,7 +243,7 @@ export default {
},
_printContract() {
const contract = this.contractDetailInfo
window.open(`/#/pages/admin/printContract?contractTypeId=${contract.contractType}&contractId=${contract.contractId}`)
window.open(`/#/views/contract/printContract?contractTypeId=${contract.contractType}&contractId=${contract.contractId}`)
}
}
}

View File

@ -4,13 +4,19 @@ export const messages = {
contractName: 'Contract Name',
contractCode: 'Contract Code',
contractType: 'Contract Type',
contractTypeName: 'Contract Type',
partyA: 'Party A',
partyB: 'Party B',
changeType: 'Change Type',
planTypeName: 'Change Type',
changePerson: 'Change Person',
changePersonName: 'Change Person',
applyTime: 'Apply Time',
createTime: 'Create Time',
description: 'Description',
remark: 'Description',
status: 'Status',
stateName: 'Status',
operation: 'Operation',
detail: 'Detail'
}
@ -20,13 +26,19 @@ export const messages = {
contractName: '合同名称',
contractCode: '合同编号',
contractType: '合同类型',
contractTypeName: '合同类型',
partyA: '甲方',
partyB: '乙方',
changeType: '变更类型',
planTypeName: '变更类型',
changePerson: '变更人',
changePersonName: '变更人',
applyTime: '申请时间',
createTime: '申请时间',
description: '说明',
remark: '说明',
status: '状态',
stateName: '状态',
operation: '操作',
detail: '明细'
}

View File

@ -156,7 +156,7 @@ export default {
},
handleRenew(row) {
this.$router.push({
path: '/pages/admin/addContract',
path: '/views/contract/addContract',
query: {
contractId: row.contractId,
contractCode: row.contractCode,

View File

@ -171,10 +171,11 @@ export default {
this.editExamineStaffInfo.projectIds = data[0].projects.map(item => item.projectId)
if (this.editExamineStaffInfo.headerImg) {
this.$refs.uploadImage.open([this.editExamineStaffInfo.headerImg])
this.$refs.uploadImage.setImages([this.editExamineStaffInfo.headerImg])
}
}
} catch (error) {
console.error('请求失败:', error)
this.$message.error(this.$t('editExamineStaff.fetchStaffError'))
}
},

View File

@ -1,103 +1,105 @@
<template>
<div class="print-owner-voting-container">
<el-row>
<el-col :span="24">
<div class="text-center">
<h1>{{ printOwnerVotingInfo.qaName }}</h1>
</div>
</el-col>
</el-row>
<div class="text-center">
<h1>{{ printOwnerVotingInfo.qaName }}</h1>
</div>
<el-row>
<el-col :span="24">
<div v-html="printOwnerVotingInfo.content"></div>
</el-col>
</el-row>
<div class="text-left">
<div v-html="printOwnerVotingInfo.content"></div>
</div>
<el-row>
<el-col :span="24">
<table class="table vc-table-border margin-top" style="color:#000;font-size:14px">
<thead>
<tr>
<th class="text-center" width="200px">
<div style="max-width: 200px;">
{{ $t('printOwnerVoting.room') }}
</div>
</th>
<th v-for="(item, index) in printOwnerVotingInfo.titleValues" :key="index" scope="col"
class="text-center">
{{ item.qaValue }}
</th>
<th width="200px" class="text-center">
<div style="max-width: 200px;">
{{ $t('printOwnerVoting.room') }}
</div>
</th>
<th v-for="(item, index) in printOwnerVotingInfo.titleValues" :key="index" scope="col"
class="text-center">
{{ item.qaValue }}
</th>
</tr>
</thead>
<tbody>
<template v-for="(vote, index) in printOwnerVotingInfo.userVotes">
<tr :key="index" class="vc-table-border" v-if="index % 2 == 0">
<td class="text-center">
<div style="max-width: 200px;">{{ vote.roomName }}</div>
</td>
<td v-for="(item, tIndex) in printOwnerVotingInfo.titleValues" :key="tIndex" class="text-center">
{{ vote[item.qaValue] }}
</td>
<td class="text-center">
<div style="max-width: 200px;" v-if="printOwnerVotingInfo.userVotes.length > index">
{{ printOwnerVotingInfo.userVotes[index + 1].roomName }}
</div>
</td>
<td v-for="(item, tIndex) in printOwnerVotingInfo.titleValues" :key="tIndex" class="text-center">
<div v-if="printOwnerVotingInfo.userVotes.length > index">
{{ printOwnerVotingInfo.userVotes[index + 1][item.qaValue] }}
</div>
</td>
</tr>
</template>
</tbody>
</table>
</el-col>
</el-row>
<div>
<table class="table vc-table-border margin-top" style="color:#000;font-size:14px;width: 100%;">
<thead>
<tr>
<th class="text-center" >
<div class="text-left">
{{ $t('printOwnerVoting.room') }}
</div>
</th>
<th
v-for="(item, index) in printOwnerVotingInfo.titleValues"
:key="'head-left-' + index"
scope="col"
class="text-center"
>
{{ item.qaValue }}
</th>
<th class="text-center ">
<div class="text-left">
{{ $t('printOwnerVoting.room') }}
</div>
</th>
<th
v-for="(item, index) in printOwnerVotingInfo.titleValues"
:key="'head-right-' + index"
scope="col"
class="text-center"
>
{{ item.qaValue }}
</th>
</tr>
</thead>
<tbody>
<tr
v-for="(pair, index) in pairedVotes"
:key="'row-' + index"
class="vc-table-border"
>
<td class="text-center">
<div style="max-width: 200px;">{{ pair.left ? pair.left.roomName : '' }}</div>
</td>
<td
v-for="(item, tIndex) in printOwnerVotingInfo.titleValues"
:key="'left-' + index + '-' + tIndex"
class="text-center"
>
{{ pair.left ? pair.left[item.qaValue] : '' }}
</td>
<td class="text-center">
<div style="max-width: 200px;">
{{ pair.right ? pair.right.roomName : '' }}
</div>
</td>
<td
v-for="(item, tIndex) in printOwnerVotingInfo.titleValues"
:key="'right-' + index + '-' + tIndex"
class="text-center"
>
<div v-if="pair.right">
{{ pair.right[item.qaValue] }}
</div>
</td>
</tr>
</tbody>
</table>
</div>
<el-row>
<el-col :span="24">
<span>{{ $t('printOwnerVoting.totalVotes') }}{{ printOwnerVotingInfo.voteCount }}</span>
<span>{{ $t('printOwnerVoting.votedCount') }}{{ printOwnerVotingInfo.votedCount }}</span>
<span v-for="(item, tIndex) in printOwnerVotingInfo.titleValues" :key="tIndex">
{{ item.qaValue }}: {{ item.personCount }}{{ $t('printOwnerVoting.person') }}
</span>
</el-col>
</el-row>
<div class="summary text-left">
<span>{{ $t('printOwnerVoting.totalVotes') }}{{ printOwnerVotingInfo.voteCount }}</span>
<span>{{ $t('printOwnerVoting.votedCount') }}{{ printOwnerVotingInfo.votedCount }}</span>
<span v-for="(item, tIndex) in printOwnerVotingInfo.titleValues" :key="'summary-' + tIndex">
{{ item.qaValue }}: {{ item.personCount }}{{ $t('printOwnerVoting.person') }}
</span>
</div>
<el-row>
<el-col :span="24" class="text-right margin-top margin-right">
{{ currentCommunity.name }}
</el-col>
</el-row>
<div class="text-right margin-top margin-right">
{{ currentCommunity.name }}
</div>
<el-row>
<el-col :span="24" class="text-right margin-top-sm margin-right">
{{ formatDate(new Date()) }}
</el-col>
</el-row>
<el-row id="print-btn">
<el-col :span="24" class="text-right">
<el-button type="primary" @click="_printPurchaseApplyDiv">
<i class="el-icon-printer"></i>&nbsp;{{ $t('common.print') }}
</el-button>
<el-button type="warning" style="margin-right:20px;" @click="_closePage">
{{ $t('common.cancel') }}
</el-button>
</el-col>
</el-row>
<div class="text-right margin-top-sm margin-right">
{{ formatDate(new Date()) }}
</div>
<div id="print-btn" class="actions text-right">
<button type="button" class="btn btn-warning float-right" style="margin-right:20px;" @click="_closePage">
{{ $t('common.cancel') }}
</button>
<button class="btn btn-primary float-right" type="button" @click="_printPurchaseApplyDiv">
<i class="fa fa-check"></i>&nbsp;{{ $t('common.print') }}
</button>
</div>
</div>
</template>
@ -124,6 +126,19 @@ export default {
}
}
},
computed: {
pairedVotes() {
const votes = this.printOwnerVotingInfo.userVotes || []
const result = []
for (let i = 0; i < votes.length; i += 2) {
result.push({
left: votes[i] || null,
right: votes[i + 1] || null
})
}
return result
}
},
created() {
this.printOwnerVotingInfo.qaId = this.$route.query.qaId
this.currentCommunity.communityId = getCommunityId()
@ -139,7 +154,8 @@ export default {
qaId: this.printOwnerVotingInfo.qaId
}
const { data } = await listOwnerVote(params)
this.printOwnerVotingInfo = data[0]
//this.printOwnerVotingInfo = data[0]
Object.assign(this.printOwnerVotingInfo, data[0])
this._listValues()
} catch (error) {
console.error('请求失败:', error)
@ -155,6 +171,7 @@ export default {
}
const { data } = await listUserQuestionAnswer(params)
const _titleValues = this.printOwnerVotingInfo.titleValues
console.log(data, '_titleValues', _titleValues)
data.forEach(_value => {
_titleValues.forEach(_title => {
_value[_title.qaValue] = ''
@ -196,6 +213,35 @@ export default {
.print-owner-voting-container {
padding: 20px;
.btn {
display: inline-flex;
align-items: center;
justify-content: center;
padding: 6px 15px;
border-radius: 4px;
border: 1px solid transparent;
cursor: pointer;
font-size: 14px;
line-height: 1.5;
transition: all 0.2s;
}
.btn-primary {
background-color: #409eff;
border-color: #409eff;
color: #fff;
}
.btn-warning {
background-color: #e6a23c;
border-color: #e6a23c;
color: #fff;
}
.btn:hover {
opacity: 0.85;
}
.margin-top {
margin-top: 20px;
}
@ -217,12 +263,12 @@ export default {
}
.vc-table-border {
border: 1px solid #ebeef5;
border: 1px solid #000000;
border-collapse: collapse;
th,
td {
border: 1px solid #ebeef5;
border: 1px solid #000000;
padding: 8px;
}
}

View File

@ -242,7 +242,7 @@ export default {
row: 100,
communityId: this.communityId
})
this.visitTypeList = [{ name: this.$t('visitManage.visitType'), typeId: '' }, ...data]
this.visitTypeList = [{ name: this.$t('common.all'), typeId: '' }, ...data]
} catch (error) {
console.error('获取访客类型失败:', error)
}
@ -305,7 +305,6 @@ export default {
padding: 10px;
cursor: pointer;
text-align: center;
border-bottom: 1px solid #eee;
transition: all 0.3s;
&:hover {

View File

@ -69,20 +69,7 @@ export const messages = {
modifyOld: 'modify(old)'
},
contractDetailChange: {
contractName: 'contract name',
contractCode: 'contract code',
contractTypeName: 'contract type',
partyA: 'party A',
partyB: 'party B',
planTypeName: 'change type',
changePersonName: 'change person',
createTime: 'create time',
remark: 'remark',
stateName: 'state',
operation: 'operation',
detail: 'detail'
}
},
zh: {
operateDataLog: {
@ -154,19 +141,6 @@ export const messages = {
modifyOld: '修改(旧)'
},
contractDetailChange: {
contractName: '合同名称',
contractCode: '合同编号',
contractTypeName: '合同类型',
partyA: '甲方',
partyB: '乙方',
planTypeName: '变更类型',
changePersonName: '变更人',
createTime: '申请时间',
remark: '说明',
stateName: '状态',
operation: '操作',
detail: '明细'
}
},
}

View File

@ -162,6 +162,7 @@ export default {
url: 'data:image/png;base64,' + data
})
} catch (error) {
console.error('获取流程图片失败:', error)
this.$message.error(this.$t('workflowManage.imageError'))
}
},

View File

@ -26,7 +26,7 @@
</el-form-item>
<el-form-item :label="$t('workflowSettingManage.flowSteps')">
<div class="step-actions">
<div class="step-actions margin-bottom">
<el-button type="primary" @click="addWorkflowStep">
{{ $t('workflowSettingManage.addStep') }}
</el-button>
@ -40,12 +40,28 @@
{{ item.staffId ? item.staffName : $t('workflowSettingManage.selectStaff') }}
</el-button>
<el-radio-group v-model="item.type" @change="chooseType(item)">
<el-radio :label="2">{{ $t('workflowSettingManage.normalFlow') }}</el-radio>
<el-radio v-if="index !== 0" :label="1">
{{ $t('workflowSettingManage.countersign') }}
</el-radio>
</el-radio-group>
<div class="radio-group">
<label class="radio-item">
<input
type="radio"
:name="`step-type-${index}`"
value="2"
v-model="item.type"
@change="chooseType(item)"
/>
<span>{{ $t('workflowSettingManage.normalFlow') }}</span>
</label>
<label class="radio-item" v-if="index !== 0">
<input
type="radio"
:name="`step-type-${index}`"
value="1"
v-model="item.type"
@change="chooseType(item)"
/>
<span>{{ $t('workflowSettingManage.countersign') }}</span>
</label>
</div>
<el-button type="text" @click="deleteStep(item)">
{{ $t('workflowSettingManage.deleteStep') }}
@ -98,7 +114,7 @@
</el-col>
</el-row>
<select-staff ref="selectStaff" @selectStaffs="handleStaffSelected"/>
<select-staff ref="selectStaff" @selectStaff="handleStaffSelected"/>
</div>
</template>
@ -125,7 +141,8 @@ export default {
describle: '',
startNodeFinish: 'Y',
steps: []
}
},
currentSelectTarget: null
}
},
created() {
@ -133,6 +150,10 @@ export default {
this._initWorkflowSettingInfo()
},
methods: {
generateId() {
return `id-${Date.now()}-${Math.random().toString(36).substr(2, 6)}`
},
async _initWorkflowSettingInfo() {
const flowId = this.$route.query.flowId
@ -159,8 +180,39 @@ export default {
},
_freshResStep(data) {
//
console.log(data)
if (!data) {
this.workflowSettingInfo.steps = []
return
}
this.workflowSettingInfo.describle = data.describle || ''
if (data.startNodeFinish) {
this.workflowSettingInfo.startNodeFinish = data.startNodeFinish
}
const workflowSteps = Array.isArray(data.workflowSteps) ? data.workflowSteps : []
const steps = workflowSteps.map((step, index) => {
const staffList = Array.isArray(step.workflowStepStaffs) ? step.workflowStepStaffs : []
const mainStaff = staffList[0] || {}
const subStaff = staffList.slice(1).map(staff => ({
id: staff.id || this.generateId(),
staffId: staff.staffId || staff.userId || '',
staffName: staff.staffName || staff.userName || staff.name || '',
staffRole: staff.staffRole || ''
}))
return {
seq: index,
staffId: mainStaff.staffId || mainStaff.userId || '',
staffName: mainStaff.staffName || mainStaff.userName || mainStaff.name || '',
staffRole: mainStaff.staffRole || '',
type: String(step.type || '2'),
subStaff
}
})
this.workflowSettingInfo.steps = steps
},
addWorkflowStep() {
@ -176,11 +228,19 @@ export default {
chooseStaff(item) {
item.from = this._getStaffFromType()
this.$refs.selectStaff.open(item)
this.currentSelectTarget = item
this.$refs.selectStaff.open()
},
_getStaffFromType() {
// flowTypefrom
const type = this.workflowSettingInfo.flowType
if (['30003', '40004', '70007', '80008'].includes(type)) {
return 'purchase'
}
if (['50005', '60006'].includes(type)) {
return 'contract'
}
return ''
},
_goBack() {
@ -195,7 +255,7 @@ export default {
addStaff(step) {
step.subStaff.push({
id: this.$uuid(),
id: this.generateId(),
staffId: '',
staffName: '',
staffRole: '1001'
@ -212,8 +272,17 @@ export default {
}
},
handleStaffSelected(staffs) {
console.log(staffs)
handleStaffSelected(staff) {
if (!this.currentSelectTarget) {
return
}
const target = this.currentSelectTarget
this.$set(target, 'staffId', staff.staffId || staff.userId || '')
this.$set(target, 'staffName', staff.staffName || staff.userName || staff.name || '')
if (staff.staffRole) {
this.$set(target, 'staffRole', staff.staffRole)
}
this.currentSelectTarget = null
},
async saveWorkflowSettingInfo() {
@ -250,6 +319,22 @@ export default {
>* {
margin-right: 15px;
}
.radio-group {
display: inline-flex;
align-items: center;
margin-right: 15px;
.radio-item {
display: inline-flex;
align-items: center;
margin-right: 12px;
input {
margin-right: 4px;
}
}
}
}
.sub-staff-item {