公共服务跳转,及结算审核合并

This commit is contained in:
bonus 2025-12-30 15:49:14 +08:00
parent 05598cd181
commit 1bf36a3555
7 changed files with 286 additions and 67 deletions

View File

@ -8,3 +8,5 @@ ENV = 'production'
# VUE_APP_BASE_API = '/prod-api'
# 智能机具管理系统/宏源环境
VUE_APP_BASE_API = '/iws/jiju-api'

View File

@ -2,16 +2,16 @@ import request from '@/utils/request'
// 登录方法 - 调试使用 - 产线环境需注释
export function login(data) {
return false
// return request({
// url: '/auth/login',
// headers: {
// isToken: false,
// repeatSubmit: false
// },
// method: 'post',
// data: data
// })
// return false
return request({
url: '/auth/login',
headers: {
isToken: false,
repeatSubmit: false
},
method: 'post',
data: data
})
}
export function isLogin(data) {

22
src/utils/aes.js Normal file
View File

@ -0,0 +1,22 @@
import * as CryptoJS from 'crypto-js'
/**
* @param {Object} word解密
*/
export function bnsCloudDecrypt(word) {
var key = CryptoJS.enc.Utf8.parse('bonus@cloud@2025')
var decrypt = CryptoJS.AES.decrypt(word, key, { mode: CryptoJS.mode.ECB, padding: CryptoJS.pad.Pkcs7 })
return CryptoJS.enc.Utf8.stringify(decrypt).toString()
}
/**
* @param {Object} word加密
*/
function bnsCloudEncrypt(word) {
var key = CryptoJS.enc.Utf8.parse('bonus@cloud@2025')
var srcs = CryptoJS.enc.Utf8.parse(word)
var encrypted = CryptoJS.AES.encrypt(srcs, key, { mode: CryptoJS.mode.ECB, padding: CryptoJS.pad.Pkcs7 })
return encrypted.toString()
}

View File

@ -1,8 +1,8 @@
import Cookies from 'js-cookie'
const TokenKey = 'Admin-Token'
const TokenKey = 'Admin-jVToken'
const ExpiresInKey = 'Admin-Expires-In'
const ExpiresInKey = 'Admin-Expires-In-jV'
export function getToken() {
return Cookies.get(TokenKey)

View File

@ -168,6 +168,7 @@ import dingding from '@/assets/images/dingding.svg'
import wx from '@/assets/images/wx.svg'
import qq from '@/assets/images/QQ.svg'
import { setToken, setExpiresIn } from '@/utils/auth'
import { bnsCloudDecrypt } from '@/utils/aes'
export default {
name: 'Login',
@ -330,6 +331,35 @@ export default {
} else {
this.isIws = false
this.getCookie()
const origin = window.location.href
if (origin.indexOf('params') !== -1) {
//
const url = new URL(origin)
const urlParam = new URLSearchParams(url.search)
console.log(url)
console.log(urlParam)
//
const params = urlParam.get('params')
console.log(params)
if (params) {
//
const jiemi = bnsCloudDecrypt(params)
//
const logingParam = new URLSearchParams(jiemi)
//
const username = logingParam.get('username')
const password = logingParam.get('password')
if (username && password) {
this.loginForm.username = username
this.loginForm.password = password
//
this.authLogin()
}
} else {
console.log('无自动登录参数')
}
}
}
},
methods: {
@ -343,13 +373,58 @@ export default {
})
},
getCookie() {
const username = Cookies.get('username')
const password = Cookies.get('password')
const rememberMe = Cookies.get('rememberMe')
const username = Cookies.get('jVusername')
const password = Cookies.get('jVpassword')
const rememberMe = Cookies.get('jVrememberMe')
this.loginForm.username = username || ''
this.loginForm.password = password ? decrypt(password) : ''
this.loginForm.rememberMe = rememberMe === 'true'
},
authLogin(){
this.loading = true
if (this.loginForm.rememberMe) {
Cookies.set('jVusername', this.loginForm.username, { expires: 30 })
Cookies.set('jVpassword', encrypt(this.loginForm.password), {
expires: 30
})
Cookies.set('jVrememberMe', this.loginForm.rememberMe, {
expires: 30
})
} else {
Cookies.remove('jVusername')
Cookies.remove('jVpassword')
Cookies.remove('jVrememberMe')
}
this.loginForm.loginMethod = this.loginMethod
this.$store
.dispatch('Login', this.loginForm)
.then(res => {
console.log(res)
if (res.code === 200) {
if (res.isLogin) {
this.$modal
.confirm('账号已在其他地方登录是否继续登录!!!!')
.then(function () {
// return this.$router.push({ path: this.redirect || '/' })
return this.$router.push({ path: '/' })
})
.then(() => {
this.loading = false
})
.catch(() => {
this.loading = false
})
} else {
// this.$router.push({ path: this.redirect || '/' })
this.$router.push({ path: '/' })
}
}
})
.catch(() => {
this.loading = false
if (this.captchaEnabled) this.getCode()
})
},
handleLogin() {
this.$refs.loginForm.validate(valid => {
if (valid) {

View File

@ -69,19 +69,20 @@
<el-tag v-if="scope.row.settlementType == null || scope.row.settlementType === 0" effect="plain">
总费用
</el-tag>
<el-tag type="danger" v-if="scope.row.settlementType === 3" effect="plain">全部</el-tag>
</template>
</el-table-column>
<el-table-column label="审批人" align="center" prop="auditor" :show-overflow-tooltip="true" />
<el-table-column label="审批时间" align="center" prop="auditTime" width="100" />
<el-table-column label="结算状态" align="center" prop="sltStatus" :show-overflow-tooltip="true">
<el-table-column label="结算状态" align="center" prop="sltStatus" :show-overflow-tooltip="true" width="165">
<!-- <template slot-scope="scope">-->
<!-- <dict-tag :options="dict.type.cost_status" :value="scope.row.sltStatus"/>-->
<!-- </template>-->
<template slot-scope="scope">
<el-tag v-if="scope.row.sltStatus == '1'">待审核</el-tag>
<el-tag type="success" v-if="scope.row.sltStatus == '2'">审核通过</el-tag>
<el-tag type="danger" v-if="scope.row.sltStatus == '3'">审核驳回</el-tag>
<el-tag v-if="scope.row.sltStatus == '1'">{{ scope.row.sltAuditor || '待审核' }}</el-tag>
<el-tag type="success" v-else-if="scope.row.sltStatus == '2'">审核通过</el-tag>
<el-tag type="danger" v-else-if="scope.row.sltStatus == '3'">审核驳回</el-tag>
</template>
</el-table-column>
<el-table-column label="操作" align="center" width="300" class-name="small-padding fixed-width">
@ -96,7 +97,7 @@
<!-- <el-button size="mini" type="danger" icon="el-icon-delete"
@click="handleDelete(scope.row)"
>撤销申请</el-button> -->
<el-button type="primary" plain size="mini" @click="openPrintDialog(scope.row)">协议书</el-button>
<el-button type="primary" plain size="mini" @click="openPrintDialog(scope.row)" v-if="scope.row.sltStatus == '2'">协议书</el-button>
</template>
</el-table-column>
</el-table>
@ -127,7 +128,7 @@
<div style="height: 600px; overflow-y: scroll">
<vue-easy-print tableShow ref="remarksPrintRef" class="print">
<div style="text-align: center; font-weight: 600; font-size: 16px">
{{ dialogTitle || '机具设备' }}有偿使用费结算协议书
{{ dialogTitle }}有偿使用费结算协议书
</div>
<div class="info" style="margin-top: 10px; display: flex; flex-wrap: wrap">
<div class="item" style="width: 65%; flex-shrink: 0; margin-bottom: 5px; font-size: 14px"></div>
@ -148,35 +149,64 @@
<div class="tabelColumn">
<div class="columnLabel" style="width: 100%">结算项目及金额()</div>
</div>
<div class="tabelColumn">
<div class="columnLabel" style="width: 60%">项目</div>
<div class="columnLabel" style="width: 20%; border-left: 1px solid #9c9c9c">施工机具</div>
<div class="columnLabel" style="width: 20%; border-left: 1px solid #9c9c9c">安全工器具</div>
</div>
<div class="tabelColumn">
<div class="columnLabel" style="width: 60%">施工机具有偿使用费</div>
<div class="columnContent" style="width: 40%">
<div class="columnContent" style="width: 20%">
{{ Number(agreementContent.leaseCost).toFixed(2) }}
</div>
<div class="columnContent" style="width: 20%">
{{ Number(agreementContent.aqLeaseCost).toFixed(2) }}
</div>
</div>
<div class="tabelColumn">
<div class="columnLabel" style="width: 60%">施工机具维修费</div>
<div class="columnContent" style="width: 40%">
<div class="columnContent" style="width: 20%">
{{ Number(agreementContent.repairCost).toFixed(2) }}
</div>
<div class="columnContent" style="width: 20%">
{{ Number(agreementContent.aqRepairCost).toFixed(2) }}
</div>
</div>
<div class="tabelColumn">
<div class="columnLabel" style="width: 60%">施工机具丢失费</div>
<div class="columnContent" style="width: 40%">
<div class="columnContent" style="width: 20%">
{{ Number(agreementContent.loseCost).toFixed(2) }}
</div>
<div class="columnContent" style="width: 20%">
{{ Number(agreementContent.aqLoseCost).toFixed(2) }}
</div>
</div>
<div class="tabelColumn">
<div class="columnLabel" style="width: 60%">施工机具损坏赔偿费</div>
<div class="columnContent" style="width: 40%">
<div class="columnContent" style="width: 20%">
{{ Number(agreementContent.scrapCost).toFixed(2) }}
</div>
<div class="columnContent" style="width: 20%">
{{ Number(agreementContent.aqScrapCost).toFixed(2) }}
</div>
</div>
<div class="tabelColumn">
<div class="columnLabel" style="width: 60%">施工机具租赁减免费</div>
<div class="columnContent" style="width: 40%">
<div class="columnContent" style="width: 20%">
{{ Number(agreementContent.reductionCost).toFixed(2) }}
</div>
<div class="columnContent" style="width: 20%">
{{ Number(agreementContent.aqReductionCost).toFixed(2) }}
</div>
</div>
<div class="tabelColumn">
<div class="columnLabel" style="width: 60%">小计</div>
<div class="columnContent" style="width: 20%">
{{ Number(agreementContent.addMoneySafety).toFixed(2) }}
</div>
<div class="columnContent" style="width: 20%">
{{ Number(agreementContent.addMoneyProject).toFixed(2) }}
</div>
</div>
<div class="tabelColumn">
<div class="columnLabel" style="width: 20%">费用合计金额大写</div>
@ -203,19 +233,23 @@
<span>部门负责人</span>
<img v-if="agreementContent.auditorSignUrl" :src="initImgPath(agreementContent.auditorSignUrl)"
style="width: 40px; height: 90px;margin-left: 20px; max-width: 100%;"
:style="{ transform: agreementContent.signType == 0 ? 'rotate(-90deg)' : '' }" alt="" />
<div style="display: flex;flex-direction: column">
<div v-for="(item, index) in agreementContent.signUrlList" :key="index" style="margin-top: -20px;">
<img v-if="item.auditorSignUrl" :src="initImgPath(item.auditorSignUrl)"
style="width: 40px; max-height: 90px;margin-left: 20px; max-width: 100%;"
:style="{ transform: item.signType == 0 ? 'rotate(-90deg)' : '' }" alt="" />
</div>
</div>
</div>
<div class="item-new" style="width: 33%">
<span>承租负责人</span>
<img :src="agreementContent.managerSignUrl"
<img :src="agreementContent.signUrlList[0].managerSignUrl"
style="width: 40px; height: 90px; max-width: 100%;margin-left: 20px;"
:style="{ transform: agreementContent.signType == 0 ? 'rotate(-90deg)' : '' }" alt=""
onerror="this.style.display='none'" v-if="agreementContent.managerSignUrl" />
:style="{ transform: agreementContent.signUrlList && agreementContent.signUrlList[0].signType == 0 ? 'rotate(-90deg)' : '' }" alt=""
onerror="this.style.display='none'" v-if="agreementContent.signUrlList && agreementContent.signUrlList[0].managerSignUrl" />
</div>
@ -224,10 +258,10 @@
<span>核算员</span>
<img :src="initImgPath(agreementContent.sltSignUrl)"
<img :src="initImgPath(agreementContent.signUrlList && agreementContent.signUrlList[0].sltSignUrl)"
style="width: 40px; height: 90px; max-width: 100%; margin-left: 20px;"
:style="{ transform: agreementContent.signType == 0 ? 'rotate(-90deg)' : '' }" alt=""
onerror="this.style.display='none'" v-if="agreementContent.sltSignUrl" />
:style="{ transform: agreementContent.signUrlList && agreementContent.signUrlList[0].signType == 0 ? 'rotate(-90deg)' : '' }" alt=""
onerror="this.style.display='none'" v-if="agreementContent.signUrlList && agreementContent.signUrlList[0].sltSignUrl" />
</div>
</div>
@ -246,7 +280,7 @@
<script>
import { getProjectList, getUnitList, getAgreementInfoById, getUnitListFilterTeam } from '@/api/back/index.js'
import { getSltList, costExamine, getSltInfo } from '@/api/cost/cost'
import { getSltList, costExamine, getSltAgreementBookApi } from '@/api/cost/cost'
import { toChineseAmount } from '@/utils/bonus.js'
import vueEasyPrint from 'vue-easy-print'
import Treeselect from '@riophae/vue-treeselect'
@ -320,7 +354,7 @@ export default {
},
openPrint: false,
//
aform: { status: '2' },
aform: { status: '2', remark: '' },
//
applyVisible: false,
id: '',
@ -335,10 +369,18 @@ export default {
loseCost: '', //
scrapCost: '', //
reductionCost: '', //
aqLeaseCost: '', //
aqRepairCost: '', //
aqLoseCost: '', //
aqScrapCost: '', //
aqReductionCost: '', //
addMoneySafety: '',//
addMoneyProject: '',//
costAll: '', //
costAllUpper: '' //
},
dialogTitle: ''
dialogTitle: '',
currentRow: {},
}
},
created() {
@ -464,8 +506,10 @@ export default {
},
//
handleExame(row) {
this.currentRow = row
this.id = row.id
this.agreementIdTemp = row.agreementId
this.aform.remark = ''
this.applyVisible = true
},
//
@ -474,7 +518,9 @@ export default {
id: this.id,
status: this.aform.status,
remark: this.aform.remark,
agreementId: this.agreementIdTemp
agreementId: this.agreementIdTemp,
settlementType: this.currentRow.settlementType,
sltTask: this.currentRow.sltTask
}
costExamine(param)
.then(res => {
@ -496,21 +542,47 @@ export default {
},
async openPrintDialog(row) {
this.dialogTitle = row.settlementType == 2 ? '安全工器具' : '机具设备'
// this.dialogTitle = row.settlementType == 2 ? '' : ''
if (row.settlementType == 1) {
this.dialogTitle = '机具设备'
} else if (row.settlementType == 2) {
this.dialogTitle = '安全工器具'
} else {
this.dialogTitle = ''
}
row.enableQuerySltData = true
this.openPrint = true
try {
const res = await getSltInfo([row])
const res = await getSltAgreementBookApi(row)
console.log('🚀 ~ openPrintDialog ~ res:', res)
if (!res.data) return
this.agreementContent = res.data
this.agreementContent.agreementCode = row.agreementCode
this.agreementContent.costAll =
this.agreementContent.addMoneySafety =
Number(res.data.leaseCost) +
Number(res.data.repairCost) +
Number(res.data.scrapCost) +
Number(res.data.loseCost) -
Number(res.data.reductionCost)
this.agreementContent.addMoneyProject =
Number(res.data.aqLeaseCost) +
Number(res.data.aqRepairCost) +
Number(res.data.aqScrapCost) +
Number(res.data.aqLoseCost) -
Number(res.data.aqReductionCost)
this.agreementContent.costAll =
Number(res.data.leaseCost) +
Number(res.data.repairCost) +
Number(res.data.scrapCost) +
Number(res.data.loseCost) -
Number(res.data.reductionCost) +
Number(res.data.aqLeaseCost) +
Number(res.data.aqRepairCost) +
Number(res.data.aqScrapCost) +
Number(res.data.aqLoseCost) -
Number(res.data.aqReductionCost)
// costAllUpper
this.agreementContent.costAllUpper = toChineseAmount(this.agreementContent.costAll.toFixed(2))
} catch (error) {
@ -749,7 +821,8 @@ export default {
children: [
new TableCell({
...cellOpts,
width: { size: 25, type: WidthType.PERCENTAGE },
columnSpan: 1,
width: { size: 40, type: WidthType.PERCENTAGE },
children: [
new Paragraph({
alignment: AlignmentType.CENTER,
@ -759,7 +832,7 @@ export default {
}),
new TableCell({
...cellOpts,
width: { size: 75, type: WidthType.PERCENTAGE },
width: { size: 60, type: WidthType.PERCENTAGE },
columnSpan: 3,
children: [
new Paragraph({
@ -776,7 +849,8 @@ export default {
children: [
new TableCell({
...cellOpts,
width: { size: 25, type: WidthType.PERCENTAGE },
// columnSpan: 1,
width: { size: 20, type: WidthType.PERCENTAGE },
children: [
new Paragraph({
alignment: AlignmentType.CENTER,
@ -786,7 +860,7 @@ export default {
}),
new TableCell({
...cellOpts,
width: { size: 40, type: WidthType.PERCENTAGE },
width: { size: 20, type: WidthType.PERCENTAGE },
children: [
new Paragraph({
alignment: AlignmentType.CENTER,
@ -796,21 +870,15 @@ export default {
}),
new TableCell({
...cellOpts,
width: { size: 10, type: WidthType.PERCENTAGE },
children: [
new Paragraph({ alignment: AlignmentType.CENTER, text: '日期:' })
]
}),
new TableCell({
...cellOpts,
width: { size: 25, type: WidthType.PERCENTAGE },
width: { size: 60, type: WidthType.PERCENTAGE },
children: [
new Paragraph({
alignment: AlignmentType.CENTER,
text: data.applyTime
text: `日期:` + data.applyTime
})
]
})
]
}),
@ -831,20 +899,58 @@ export default {
]
}),
//
new TableRow({
children: [
new TableCell({
...cellOpts,
width: { size: 40, type: WidthType.PERCENTAGE },
children: [
new Paragraph({
alignment: AlignmentType.CENTER,
text: '项目'
})
]
}),
new TableCell({
...cellOpts,
width: { size: 30, type: WidthType.PERCENTAGE },
children: [
new Paragraph({
alignment: AlignmentType.CENTER,
text: '工机具'
})
]
}),
new TableCell({
...cellOpts,
width: { size: 30, type: WidthType.PERCENTAGE },
children: [
new Paragraph({
alignment: AlignmentType.CENTER,
text: '安全工器具'
})
]
}),
]
}),
//
...[
['一、施工机具有偿使用费:', `${Number(data.leaseCost).toFixed(2)}`],
['二、施工机具维修费:', `${Number(data.repairCost).toFixed(2)}`],
['三、施工机具丢失费:', `${Number(data.loseCost).toFixed(2)}`],
['四、施工机具损坏赔偿费:', `${Number(data.scrapCost).toFixed(2)}`],
['五、施工机具租赁减免费:', `${Number(data.reductionCost).toFixed(2)}`]
['一、施工机具有偿使用费:', `${Number(data.leaseCost).toFixed(2)}`, `${Number(data.leaseCost).toFixed(2)}`],
['二、施工机具维修费:', `${Number(data.repairCost).toFixed(2)}`, `${Number(data.leaseCost).toFixed(2)}`],
['三、施工机具丢失费:', `${Number(data.loseCost).toFixed(2)}`, `${Number(data.leaseCost).toFixed(2)}`],
['四、施工机具损坏赔偿费:', `${Number(data.scrapCost).toFixed(2)}`, `${Number(data.leaseCost).toFixed(2)}`],
['五、施工机具租赁减免费:', `${Number(data.reductionCost).toFixed(2)}`, `${Number(data.leaseCost).toFixed(2)}`],
['小计:', `${Number(data.addMoneySafety).toFixed(2)}`, `${Number(data.addMoneyProject).toFixed(2)}`]
].map(
([label, value]) =>
([label, toolValue, safeValue]) =>
new TableRow({
children: [
//
new TableCell({
...cellOpts,
columnSpan: 2,
width: { size: 40, type: WidthType.PERCENTAGE },
children: [
new Paragraph({
alignment: AlignmentType.CENTER,
@ -852,13 +958,27 @@ export default {
})
]
}),
//
new TableCell({
...cellOpts,
columnSpan: 2,
width: { size: 30, type: WidthType.PERCENTAGE },
children: [
new Paragraph({
alignment: AlignmentType.CENTER,
text: value
text: toolValue
})
]
}),
//
new TableCell({
...cellOpts,
width: { size: 30, type: WidthType.PERCENTAGE },
children: [
new Paragraph({
alignment: AlignmentType.CENTER,
text: safeValue
})
]
})

View File

@ -18,7 +18,7 @@ module.exports = {
// 部署生产环境和开发环境下的URL。
// 默认情况下Vue CLI 会假设你的应用是被部署在一个域名的根路径上
// 例如 https://www.bonus.vip/。如果应用被部署在一个子路径上,你就需要用这个选项指定这个子路径。例如,如果你的应用被部署在 https://www.bonus.vip/admin/,则设置 baseUrl 为 /admin/。
publicPath: process.env.NODE_ENV === 'production' ? process.env.VUE_APP_BASE_API == '/iws/jiju-api' ? './' : '/' : '/', // 宏源
publicPath: process.env.NODE_ENV === 'production' ? process.env.VUE_APP_BASE_API == '/iws/jiju-api' ? '/iws/mea-web' : '/' : '/', // 宏源
// 在npm run build 或 yarn build 时 生成文件的目录名称要和baseUrl的生产环境路径一致默认dist
outputDir: 'dist',
// 用于放置生成的静态资源 (js、css、img、fonts) 的;(项目打包之后,静态资源会放在这个文件夹下)
@ -35,7 +35,7 @@ module.exports = {
proxy: {
// detail: https://cli.vuejs.org/config/#devserver-proxy
[process.env.VUE_APP_BASE_API]: {
// target: `http://sgwpdm.ah.sgcc.com.cn/iws/jiju-api`, // 产线
//target: `http://sgwpdm.ah.sgcc.com.cn/iws/jiju-api`, // 产线
// target: `http://192.168.0.96:18080`,//马
// target: `http://192.168.0.244:18580`,//测试
// target: `http://192.168.2.223:18080`,//山
@ -43,7 +43,7 @@ module.exports = {
// target: `http://192.168.0.234:18080`, //阮
// target: `http://192.168.137.1:18080`,//
// target: `http://172.20.10.9:18080`, // 韩傲宇
target: `http://192.168.1.115:18080`, // 韩傲宇
target: `http://127.0.0.1:18080`, // 韩傲宇
// target: `http://192.168.0.60:18080`, // 赵福海
changeOrigin: true,
pathRewrite: {