master
lion 12 months ago
parent 1baa5529bf
commit 5f8d8b43cc

@ -2,7 +2,7 @@
ENV = 'production'
# base api
VUE_APP_DOMIAN=http://192.168.60.99:9003/
VUE_APP_DOMIAN=''
VUE_APP_BASE_API = ''
VUE_APP_OUT_URL = http://192.168.60.18:2021
VUE_APP_UPLOAD=http://192.168.60.99:9003/api/admin/upload-file

@ -4,7 +4,7 @@ NODE_ENV = production
ENV = 'staging'
# base api
VUE_APP_DOMIAN=http://hdcontract.ali251.langye.net/
VUE_APP_DOMIAN=''
VUE_APP_BASE_API = ''
VUE_APP_UPLOAD=http://hdcontract.ali251.langye.net/api/admin/upload-file

@ -21,6 +21,7 @@
"docx-parser": "^0.2.1",
"docx2html": "^1.3.2",
"docxtemplater": "^3.61.1",
"echarts": "^5.0.0",
"element-ui": "2.13.2",
"file-saver": "^2.0.5",
"html2canvas": "^1.4.1",

@ -0,0 +1,60 @@
import request from "@/utils/request";
function customParamsSerializer(params) {
let result = '';
for (let key in params) {
if (params.hasOwnProperty(key)) {
if (Array.isArray(params[key])) {
params[key].forEach((item,index) => {
if(item.key){
result += `${key}[${index}][key]=${item.key}&${key}[${index}][op]=${item.op}&${key}[${index}][value]=${item.value}&`;
}else{
result +=`${key}[${index}]=${item}&`
}
});
} else {
result += `${key}=${params[key]}&`;
}
}
}
return result.slice(0, -1);
}
export function index(params,isLoading = false) {
return request({
method: "get",
url: "/api/admin/plan-type/index",
params,
paramsSerializer: customParamsSerializer,
isLoading
})
}
export function show(params, isLoading = true) {
return request({
method: "get",
url: "/api/admin/plan-type/show",
params,
isLoading
})
}
export function save(data) {
return request({
method: "post",
url: "/api/admin/plan-type/save",
data
})
}
export function destroy(params) {
return request({
method: "get",
url: "/api/admin/plan-type/destroy",
params
})
}

@ -0,0 +1,179 @@
<template>
<div :class="className" :style="{height:height,width:width}" />
</template>
<script>
import * as echarts from 'echarts'
require('echarts/theme/macarons') // echarts theme
import resize from '@/mixins/resize'
export default {
mixins: [resize],
props: {
className: {
type: String,
default: ''
},
height: {
type: String,
default: '100px'
},
width: {
type: String,
default: '100px'
},
percent: {
type: [Number, String],
default: ''
},
chartData: {
type: Array,
default: () => []
},
title: {
type: String,
default: '标题'
}
},
data() {
return {
flag: true,
chart: null
}
},
computed: {
options() {
return {
legend: {
show: true,
bottom: 0,
left: 'center',
orient: 'horizontal',
itemWidth: 8,
itemHeight: 5
},
color: ['#446df6','#ccc','#f2a93f', '#56b7f9'],
series: [
{
type: 'pie',
radius: ['50%', '70%'],
center: ['50%', '36%'],
padAngle: 4,
itemStyle: {
borderRadius: 10,
padding: 10
},
label: {
show: true,
position: 'center',
formatter: `{b}\n{d}%`
},
avoidLabelOverlap: true, //
emphasis: { //
scale: true // item
},
labelLine: {
show: false
},
data: (() => {
if (this.percent || this.percent === 0) {
return [
{ value: parseFloat(this.percent), name: `${this.title}` },
{ value: 100 - parseFloat(this.percent), name: `${this.title}` }
]
} else {
return this.chartData
}
})()
}
],
graphic: {
elements: []
}
}
}
},
watch: {
chartData() {
this.setOptions()
}
},
mounted() {
this.$nextTick(() => {
this.initChart()
})
},
methods: {
initChart() {
this.chart = echarts.init(this.$el, 'macarons')
this.setOptions()
},
setOptions() {
this.chart?.setOption(this.options)
// this.setGraphics()
},
setGraphics() {
const getPointOnCircle = (angle, radiusPercent) => {
const radian = (angle - 90 - 12) * Math.PI / 180
const radius = this.chart.getWidth() / 2 * radiusPercent / 100
const x = this.chart.getWidth() / 2 + Math.cos(radian) * radius
const y = this.chart.getHeight() / 2 + Math.sin(radian) * radius - this.chart.getHeight() * 0.1
return { x: x, y: y }
}
const graphicElements = []
let total = 0
if (!this.options?.series[0]?.data) return
this.options?.series[0]?.data.forEach(function(item) {
total += item.value
})
let startAngle = 0
this.options?.series[0]?.data.forEach(function(item) {
const angle = (item.value / total) * 360
const endAngle = startAngle + angle
const middleAngle = (startAngle + endAngle) / 2
//
const pointStart = getPointOnCircle(middleAngle - angle / 2, 60)
const pointEnd = getPointOnCircle(middleAngle + angle / 2, 60)
//
graphicElements.push({
type: 'circle',
shape: {
cx: pointStart.x,
cy: pointStart.y,
r: 3
},
style: {
fill: '#fff'
},
z: 100
})
graphicElements.push({
type: 'circle',
shape: {
cx: pointEnd.x,
cy: pointEnd.y,
r: 3
},
style: {
fill: '#fff'
},
z: 100
})
startAngle += angle
})
this.chart.setOption({
graphic: {
elements: graphicElements
}
})
}
}
}
</script>
<style scoped lang="scss">
</style>

@ -111,7 +111,8 @@ export default {
Object.keys(form).map((key)=>{
formItems.push(
<el-form-item
prop={key}>
prop={key}
class={key}>
{eval(`{$scopedSlots.${key} ? $scopedSlots.${key}() : ''}`)}
</el-form-item>
)
@ -194,7 +195,7 @@ export default {
align-items: center;
margin-right: 80px;
&-label{
min-width: 120px;
padding: 0 20px;
}
&-content{

@ -0,0 +1 @@
<svg t="1718777251258" class="icon" viewBox="0 0 1024 1024" version="1.1" xmlns="http://www.w3.org/2000/svg" p-id="8538" width="200" height="200"><path d="M749.952 528.16l189.344 107.136c11.2 6.272 18.176 18.112 18.208 30.944v214.176a35.616 35.616 0 0 1-18.24 30.944l-189.312 107.04a37.184 37.184 0 0 1-36.448 0l-189.312-107.136a35.616 35.616 0 0 1-18.24-30.944v-214.176c0-12.8 6.88-24.64 18.24-30.944l189.312-107.2a37.184 37.184 0 0 1 36.48 0.064v0.096zM792.736 0.384c50.4 0 91.296 40 91.296 89.44V480a17.856 17.856 0 0 1-9.184 15.424c-5.664 3.2-12.576 3.2-18.24 0l-65.536-36.992a120.704 120.704 0 0 0-118.656 0l-189.12 107.008a115.968 115.968 0 0 0-59.36 100.8v268.16a18.144 18.144 0 0 1-18.24 17.888h-286.72a92.256 92.256 0 0 1-64.64-26.24 88.512 88.512 0 0 1-26.688-63.136V89.824C27.648 40.448 68.544 0.384 118.944 0.384h673.792z m-60.992 716.544a51.968 51.968 0 0 0-52.544 51.424c0 28.48 23.52 51.52 52.544 51.52a51.968 51.968 0 0 0 52.448-51.52 51.968 51.968 0 0 0-52.48-51.424z m-322.88-344.96H204.352a37.184 37.184 0 0 0 0 74.368h204.576a37.184 37.184 0 0 0 0-74.4z m278.976-185.984H204.32a37.184 37.184 0 1 0 0 74.368h483.52a37.184 37.184 0 0 0 0-74.368z" fill="currentColor" p-id="8539"></path></svg>

After

Width:  |  Height:  |  Size: 1.2 KiB

@ -0,0 +1 @@
<svg t="1718608395605" class="icon" viewBox="0 0 1024 1024" version="1.1" xmlns="http://www.w3.org/2000/svg" p-id="6321" width="200" height="200"><path d="M699.733333 529.066667L640 469.333333l-149.333333 149.333334-72.533334-72.533334-64 59.733334 136.533334 136.533333z" fill="currentColor" p-id="6322"></path><path d="M896 128h-170.666667V42.666667h-85.333333v85.333333H384V42.666667H298.666667v85.333333H128c-25.6 0-42.666667 17.066667-42.666667 42.666667v682.666666c0 25.6 17.066667 42.666667 42.666667 42.666667h768c25.6 0 42.666667-17.066667 42.666667-42.666667V170.666667c0-25.6-17.066667-42.666667-42.666667-42.666667z m-42.666667 682.666667H170.666667v-384h682.666666v384z m0-469.333334H170.666667V213.333333h128v42.666667h85.333333V213.333333h256v42.666667h85.333333V213.333333h128v128z" fill="currentColor" p-id="6323"></path></svg>

After

Width:  |  Height:  |  Size: 845 B

@ -0,0 +1 @@
<svg t="1718609821828" class="icon" viewBox="0 0 1024 1024" version="1.1" xmlns="http://www.w3.org/2000/svg" p-id="11800" width="200" height="200"><path d="M550.64576 211.34848H478.85824V81.92h71.78752v129.42848zM204.2368 345.1392L112.64 248.07936l52.07552-49.664 91.5968 97.06496z m613.05856 4.87936l-51.42016-50.37056 94.06464-97.06496L911.36 252.9536z m34.93888 519.86944v-263.808c0-189.3888-153.24672-343.46496-341.61152-343.46496s-341.6064 154.08128-341.6064 343.47008V869.888H116.0448V942.08h786.944v-72.192h-50.74432zM485.67808 469.26336a0.19968 0.19968 0 0 0 0 0.0256A137.472 137.472 0 0 0 376.832 576.04608v0.16896c-0.30208 1.42848-0.47104 2.90304-0.72192 4.352-2.01728 8.0128-9.59488 23.88992-38.03136 23.88992-22.2976 0-29.29664-14.74048-31.27808-26.94144a55.69024 55.69024 0 0 1 0.99328-21.70368 209.9712 209.9712 0 0 1 144.44544-152.6272 57.40032 57.40032 0 0 1 13.28128-2.24768c14.336-0.71168 42.37824 1.43872 45.12768 28.7744 0.83968 33.39776-23.56224 39.28064-24.97024 39.552z" fill="currentColor" p-id="11801"></path></svg>

After

Width:  |  Height:  |  Size: 1.0 KiB

@ -0,0 +1 @@
<svg t="1718088373209" class="icon" viewBox="0 0 1024 1024" version="1.1" xmlns="http://www.w3.org/2000/svg" p-id="42775" width="200" height="200"><path d="M855.334 95.325L659.052 431.266c-8.024 13.733 1.881 30.993 17.787 30.993h108.338c11.377 0 20.6 9.223 20.6 20.6v78.519c0 11.377-9.223 20.6-20.6 20.6h-162.39c-11.377 0-20.6 9.223-20.6 20.6v49.61c0 11.377 9.223 20.6 20.6 20.6h162.39c11.377 0 20.6 9.223 20.6 20.6v79.686c0 11.377-9.223 20.6-20.6 20.6h-162.39c-11.377 0-20.6 9.223-20.6 20.6v124.79c0 11.377-9.223 20.6-20.6 20.6H438.862c-11.377 0-20.6-9.223-20.6-20.6v-124.79c0-11.377-9.223-20.6-20.6-20.6h-169.33c-11.377 0-20.6-9.223-20.6-20.6v-79.686c0-11.377 9.223-20.6 20.6-20.6h169.33c11.377 0 20.6-9.223 20.6-20.6v-49.61c0-11.377-9.223-20.6-20.6-20.6h-169.33c-11.377 0-20.6-9.223-20.6-20.6V482.86c0-11.377 9.223-20.6 20.6-20.6H341.8c15.796 0 25.715-17.046 17.91-30.779L168.542 95.112c-7.805-13.733 2.114-30.779 17.91-30.779h148.316c7.906 0 15.158 4.607 18.595 11.727 85.797 177.752 140.199 295.303 163.224 352.653h4.054c3.078-8.48 6.739-19.082 10.984-31.816 6.941-20.429 34.703-80.581 83.287-180.455l66.714-140.353a20.601 20.601 0 0 1 18.606-11.757h137.316c15.905 0.001 25.81 17.26 17.786 30.993z" p-id="42776" class="custom-cursor-on-hover" fill="currentColor"></path></svg>

After

Width:  |  Height:  |  Size: 1.3 KiB

@ -0,0 +1 @@
<svg t="1718596167767" class="icon" viewBox="0 0 1024 1024" version="1.1" xmlns="http://www.w3.org/2000/svg" p-id="5129" width="200" height="200"><path d="M512 896a42.666667 42.666667 0 0 1-42.666667 42.666667H170.666667a42.666667 42.666667 0 0 1-42.666667-42.666667V170.666667a42.666667 42.666667 0 0 1 42.666667-42.666667h682.666666a42.666667 42.666667 0 0 1 42.666667 42.666667v213.333333a42.666667 42.666667 0 0 1-85.333333 0V213.333333H213.333333v640h256a42.666667 42.666667 0 0 1 42.666667 42.666667zM341.333333 341.333333h213.333334a42.666667 42.666667 0 0 1 0 85.333334H341.333333a42.666667 42.666667 0 1 1 0-85.333334z m0 170.666667h85.333334a42.666667 42.666667 0 0 1 0 85.333333H341.333333a42.666667 42.666667 0 0 1 0-85.333333z m640 188.970667a231.594667 231.594667 0 0 1-231.68 231.594666 231.594667 231.594667 0 1 1 0-463.232c128 0 231.68 103.68 231.68 231.637334z m-137.642666 25.002666a67.712 67.712 0 0 0-15.317334-19.797333 98.986667 98.986667 0 0 0-21.546666-14.464 264.746667 264.746667 0 0 0-24.746667-10.752 1068.8 1068.8 0 0 0-24.704-9.002667 178.474667 178.474667 0 0 1-21.674667-9.088 52.778667 52.778667 0 0 1-15.274666-11.093333 21.205333 21.205333 0 0 1-5.717334-14.72 23.125333 23.125333 0 0 1 10.282667-19.626667 40.362667 40.362667 0 0 1 13.013333-5.717333c5.162667-1.408 11.178667-2.090667 18.176-2.090667 8.874667 0 17.066667 0.938667 24.448 2.645334a161.024 161.024 0 0 1 33.962667 11.946666c3.84 1.792 6.656 2.688 8.490667 2.688a6.613333 6.613333 0 0 0 4.266666-1.194666 7.296 7.296 0 0 0 2.389334-3.754667 28.672 28.672 0 0 0 1.194666-6.528 134.826667 134.826667 0 0 0 0.128-18.346667 32.341333 32.341333 0 0 0-0.853333-5.76 14.122667 14.122667 0 0 0-1.450667-3.712 17.28 17.28 0 0 0-3.242666-3.328 43.861333 43.861333 0 0 0-9.941334-4.906666 133.674667 133.674667 0 0 0-17.194666-5.248c-6.528-1.621333-10.282667-2.56-17.706667-3.498667-1.536-0.170667-3.029333-0.128-4.565333-0.256v-17.322667a25.514667 25.514667 0 1 0-51.072 0v17.322667c-4.608 1.365333-4.053333 1.621333-10.666667 3.157333-12.8 2.986667-23.978667 7.637333-33.450667 13.781334a70.229333 70.229333 0 0 0-22.528 23.125333c-5.546667 9.258667-8.362667 20.053333-8.362666 32.341333 0 10.666667 1.962667 19.84 5.845333 27.52 3.84 7.637333 8.96 14.250667 15.146667 19.84 6.186667 5.632 13.226667 10.453333 21.205333 14.464 7.893333 4.053333 16.042667 7.594667 24.448 10.794667 8.405333 3.114667 16.554667 6.144 24.490667 9.002667 7.893333 2.816 14.933333 5.845333 21.162666 9.088 6.229333 3.242667 11.264 6.912 15.146667 11.093333a20.992 20.992 0 0 1 5.802667 14.933333 27.690667 27.690667 0 0 1-13.184 23.978667 50.602667 50.602667 0 0 1-15.616 6.442667 85.418667 85.418667 0 0 1-20.864 2.304c-11.776 0-22.186667-1.109333-31.146667-3.285334a160.341333 160.341333 0 0 1-38.997333-14.421333 23.125333 23.125333 0 0 0-9.6-3.285333 7.936 7.936 0 0 0-4.266667 1.109333 7.338667 7.338667 0 0 0-2.858667 3.712 22.869333 22.869333 0 0 0-1.578666 6.741333 95.104 95.104 0 0 0-0.469334 10.282667c0 6.144 0.426667 10.752 1.28 13.994667a13.909333 13.909333 0 0 0 4.522667 7.424c2.133333 1.706667 5.546667 3.626667 10.282667 5.888 4.778667 2.218667 10.666667 4.352 17.792 6.357333 7.125333 2.048 15.36 3.754667 24.618666 5.205333 9.301333 1.408 9.557333 2.133333 20.394667 2.133334l1.450667-0.042667 0.341333 9.301333a26.538667 26.538667 0 0 0 26.538667 25.514667 24.661333 24.661333 0 0 0 24.661333-25.514667l-0.469333-13.397333c1.792-0.426667 3.754667-0.554667 5.546666-0.981333 14.08-3.456 23.168-8.533333 33.664-15.36 10.496-6.784 18.816-15.274667 24.96-25.429334 6.144-10.112 9.216-21.930667 9.216-35.413333 0-10.24-1.962667-19.2-5.802666-26.794667z" p-id="5130"></path></svg>

After

Width:  |  Height:  |  Size: 3.6 KiB

@ -0,0 +1 @@
<svg t="1718600533873" class="icon" viewBox="0 0 1024 1024" version="1.1" xmlns="http://www.w3.org/2000/svg" p-id="2830" width="200" height="200"><path d="M353.91239 792.98785h28.047802v7.649401c-2.5498 5.0996-2.5498 12.749001-2.5498 17.848601v40.796803h-25.498002c-165.737011 0-298.326619-76.494005-298.326619-168.286811v-66.294804c-2.5498 91.792806 132.589608 168.286811 298.326619 168.28681z m0-117.290807h28.047802v7.6494c-2.5498 5.0996-2.5498 12.749001-2.5498 17.848602v40.796802h-25.498002c-165.737011 0-298.326619-76.494005-298.326619-168.286811v-66.294804c-2.5498 91.792806 132.589608 168.286811 298.326619 168.286811z m0-237.131415c165.737011 0 298.326619-76.494005 298.326619-168.286811v66.294804c0 40.796803-25.498002 76.494005-66.294804 104.541807-40.796803 12.749001-79.043805 28.047802-109.641407 48.446203-38.247002 10.199201-81.593605 15.298801-124.940208 15.298801-165.737011 0-298.326619-76.494005-298.326619-168.286811v-66.294804c0 94.342606 135.139409 168.286811 300.876419 168.286811z m0 117.290807c20.398401 0 40.796803 0 58.645404-2.5498-15.298801 20.398401-25.498002 45.896403-30.597602 68.844605h-28.047802c-165.737011 0-298.326619-76.494005-298.326619-168.286811v-66.294804c-2.5498 94.342606 132.589608 168.286811 298.326619 168.28681z m0-504.860432c165.737011 0 298.326619 76.494005 298.326619 168.286811 0 94.342606-135.139409 168.286811-298.326619 168.286811-165.737011 0-298.326619-76.494005-298.326619-168.286811C53.035971 127.490008 188.175379 50.996003 353.91239 50.996003z m627.25084 688.446044c-17.848601 0-112.191207-53.545803-114.741007-56.095604-7.6494-7.6494-5.0996-15.298801 2.5498-15.298801 7.6494 0 48.446203-5.0996 48.446203-5.0996-25.498002-63.745004-79.043805-117.290807-152.98801-132.589608-114.741007-28.047802-234.581615 48.446203-262.629417 165.73701 0 0-2.5498 12.749001-10.1992 12.749001-7.6494 0-28.047802-7.6494-35.697203-12.749001-7.6494-5.0996-10.199201-2.5498-7.6494-15.298801 30.597602-147.888409 183.585612-247.330616 331.474021-214.183213 122.390408 28.047802 209.083613 132.589608 216.733014 252.430216 2.5498 15.298801-7.6494 20.398401-15.298801 20.398401z m-415.617427 63.745004c10.199201 5.0996 7.6494 17.848601-2.5498 20.398401-10.199201 0-43.346603 5.0996-43.346603 5.099601 25.498002 61.195204 79.043805 107.091607 147.88841 124.940208 114.741007 28.047802 234.581615-45.896403 260.079616-160.637411 0-2.5498 0-2.5498 2.549801-7.6494 0-5.0996 2.5498-12.749001 12.749-10.199201 10.199201 2.5498 35.697202 10.199201 43.346603 12.749001 7.6494 2.5498 7.6494 5.0996 5.0996 12.749001v5.0996c-35.697202 150.43821-186.135412 244.780816-336.573621 211.633414-122.390408-28.047802-209.083613-132.589608-216.733014-252.430216-2.5498-20.398401 12.749001-25.498002 28.047802-17.848602 10.199201 2.5498 89.243006 48.446203 99.442206 56.095604z m45.896403-181.035811c-5.0996-12.749001 0-20.398401 10.199201-28.047802s22.948201-5.0996 30.597602 7.6494l58.645404 94.342606 61.195204-94.342606c7.6494-12.749001 17.848601-15.298801 28.047801-10.1992 12.749001 5.0996 15.298801 15.298801 10.199201 28.047801l-61.195204 91.792806h50.996003c5.0996 5.0996 7.6494 10.199201 7.649401 15.298801 0 7.6494-2.5498 12.749001-7.649401 15.298801h-66.294804v25.498002h66.294804c5.0996 5.0996 7.6494 10.199201 7.649401 15.298801 0 7.6494-2.5498 12.749001-7.649401 15.298801h-66.294804v66.294804c0 20.398401-7.6494 28.047802-22.948201 30.597602s-25.498002-10.199201-25.498002-30.597602v-66.294804h-63.745004c-7.6494-2.5498-10.199201-7.6494-10.199201-15.298801s2.5498-12.749001 10.199201-15.298801h63.745004V739.442047h-63.745004c-7.6494-5.0996-10.199201-10.199201-10.199201-15.298801 0-7.6494 2.5498-12.749001 10.199201-15.298801h50.996003l-61.195204-86.693205z" fill="currentColor" p-id="2831"></path></svg>

After

Width:  |  Height:  |  Size: 3.7 KiB

@ -0,0 +1,55 @@
import { debounce } from '@/utils'
export default {
data() {
return {
$_sidebarElm: null,
$_resizeHandler: null
}
},
mounted() {
this.$_resizeHandler = debounce(() => {
if (this.chart) {
this.chart.resize()
}
}, 100)
this.$_initResizeEvent()
this.$_initSidebarResizeEvent()
},
beforeDestroy() {
this.$_destroyResizeEvent()
this.$_destroySidebarResizeEvent()
},
// to fixed bug when cached by keep-alive
// https://github.com/PanJiaChen/vue-element-admin/issues/2116
activated() {
this.$_initResizeEvent()
this.$_initSidebarResizeEvent()
},
deactivated() {
this.$_destroyResizeEvent()
this.$_destroySidebarResizeEvent()
},
methods: {
// use $_ for mixins properties
// https://vuejs.org/v2/style-guide/index.html#Private-property-names-essential
$_initResizeEvent() {
window.addEventListener('resize', this.$_resizeHandler)
},
$_destroyResizeEvent() {
window.removeEventListener('resize', this.$_resizeHandler)
},
$_sidebarResizeHandler(e) {
if (e.propertyName === 'width') {
this.$_resizeHandler()
}
},
$_initSidebarResizeEvent() {
this.$_sidebarElm = document.getElementsByClassName('sidebar-container')[0]
this.$_sidebarElm && this.$_sidebarElm.addEventListener('transitionend', this.$_sidebarResizeHandler)
},
$_destroySidebarResizeEvent() {
this.$_sidebarElm && this.$_sidebarElm.removeEventListener('transitionend', this.$_sidebarResizeHandler)
}
}
}

@ -1,179 +1,226 @@
/**
* Created by PanJiaChen on 16/11/18.
*/
/**
* Parse the time to string
* @param {(Object|string|number)} time
* @param {string} cFormat
* @returns {string | null}
*/
export function parseTime(time, cFormat) {
if (arguments.length === 0 || !time) {
return null
}
const format = cFormat || '{y}-{m}-{d} {h}:{i}:{s}'
let date
if (typeof time === 'object') {
date = time
} else {
if ((typeof time === 'string')) {
if ((/^[0-9]+$/.test(time))) {
// support "1548221490638"
time = parseInt(time)
} else {
// support safari
// https://stackoverflow.com/questions/4310953/invalid-date-in-safari
time = time.replace(new RegExp(/-/gm), '/')
}
}
if ((typeof time === 'number') && (time.toString().length === 10)) {
time = time * 1000
}
date = new Date(time)
}
const formatObj = {
y: date.getFullYear(),
m: date.getMonth() + 1,
d: date.getDate(),
h: date.getHours(),
i: date.getMinutes(),
s: date.getSeconds(),
a: date.getDay()
}
const time_str = format.replace(/{([ymdhisa])+}/g, (result, key) => {
const value = formatObj[key]
// Note: getDay() returns 0 on Sunday
if (key === 'a') { return ['日', '一', '二', '三', '四', '五', '六'][value ] }
return value.toString().padStart(2, '0')
})
return time_str
}
/**
* @param {number} time
* @param {string} option
* @returns {string}
*/
export function formatTime(time, option) {
if (('' + time).length === 10) {
time = parseInt(time) * 1000
} else {
time = +time
}
const d = new Date(time)
const now = Date.now()
const diff = (now - d) / 1000
if (diff < 30) {
return '刚刚'
} else if (diff < 3600) {
// less 1 hour
return Math.ceil(diff / 60) + '分钟前'
} else if (diff < 3600 * 24) {
return Math.ceil(diff / 3600) + '小时前'
} else if (diff < 3600 * 24 * 2) {
return '1天前'
}
if (option) {
return parseTime(time, option)
} else {
return (
d.getMonth() +
1 +
'月' +
d.getDate() +
'日' +
d.getHours() +
'时' +
d.getMinutes() +
'分'
)
}
}
/**
* @param {string} url
* @returns {Object}
*/
export function param2Obj(url) {
const search = decodeURIComponent(url.split('?')[1]).replace(/\+/g, ' ')
if (!search) {
return {}
}
const obj = {}
const searchArr = search.split('&')
searchArr.forEach(v => {
const index = v.indexOf('=')
if (index !== -1) {
const name = v.substring(0, index)
const val = v.substring(index + 1, v.length)
obj[name] = val
}
})
return obj
}
//防抖
export function debounce(fn,delay=500){
let timer = null
return function _debounce() {
if (timer) clearTimeout(timer)
timer = setTimeout(() => {
fn()
}, delay)
}
}
//金额分隔
export function moneyFormatter(money,precision=2){
return Number(money).toFixed(precision).replace(/(\d)(?=(\d{3})+\.)/g, '$1,')
}
//金额分隔复原
export function moneyRecovery(money){
return parseFloat(money.replace(/[^\d\.-]/g, ""));
}
export function deepCopy(data) {
//string,number,bool,null,undefined,symbol
//object,array,date
if (data && typeof data === "object") {
//针对函数的拷贝
if (typeof data === "function") {
let tempFunc = data.bind(null);
tempFunc.prototype = deepCopy(data.prototype);
return tempFunc;
}
switch (Object.prototype.toString.call(data)) {
case "[object String]":
return data.toString();
case "[object Number]":
return Number(data.toString());
case "[object Boolean]":
return Boolean(data.toString());
case "[object Date]":
return new Date(data.getTime());
case "[object Array]":
let arr = [];
for (let i = 0; i < data.length; i++) {
arr[i] = deepCopy(data[i]);
}
return arr;
//js自带对象或用户自定义类实例
case "[object Object]":
let obj = {};
for (let key in data) {
//会遍历原型链上的属性方法可以用hasOwnProperty来控制 obj.hasOwnProperty(prop)
obj[key] = deepCopy(data[key]);
}
return obj;
}
} else {
//string,number,bool,null,undefined,symbol
return data;
}
/**
* Created by PanJiaChen on 16/11/18.
*/
/**
* Parse the time to string
* @param {(Object|string|number)} time
* @param {string} cFormat
* @returns {string | null}
*/
export function parseTime(time, cFormat) {
if (arguments.length === 0 || !time) {
return null
}
const format = cFormat || '{y}-{m}-{d} {h}:{i}:{s}'
let date
if (typeof time === 'object') {
date = time
} else {
if ((typeof time === 'string')) {
if ((/^[0-9]+$/.test(time))) {
// support "1548221490638"
time = parseInt(time)
} else {
// support safari
// https://stackoverflow.com/questions/4310953/invalid-date-in-safari
time = time.replace(new RegExp(/-/gm), '/')
}
}
if ((typeof time === 'number') && (time.toString().length === 10)) {
time = time * 1000
}
date = new Date(time)
}
const formatObj = {
y: date.getFullYear(),
m: date.getMonth() + 1,
d: date.getDate(),
h: date.getHours(),
i: date.getMinutes(),
s: date.getSeconds(),
a: date.getDay()
}
const time_str = format.replace(/{([ymdhisa])+}/g, (result, key) => {
const value = formatObj[key]
// Note: getDay() returns 0 on Sunday
if (key === 'a') {
return ['日', '一', '二', '三', '四', '五', '六'][value]
}
return value.toString().padStart(2, '0')
})
return time_str
}
/**
* @param {number} time
* @param {string} option
* @returns {string}
*/
export function formatTime(time, option) {
if (('' + time).length === 10) {
time = parseInt(time) * 1000
} else {
time = +time
}
const d = new Date(time)
const now = Date.now()
const diff = (now - d) / 1000
if (diff < 30) {
return '刚刚'
} else if (diff < 3600) {
// less 1 hour
return Math.ceil(diff / 60) + '分钟前'
} else if (diff < 3600 * 24) {
return Math.ceil(diff / 3600) + '小时前'
} else if (diff < 3600 * 24 * 2) {
return '1天前'
}
if (option) {
return parseTime(time, option)
} else {
return (
d.getMonth() +
1 +
'月' +
d.getDate() +
'日' +
d.getHours() +
'时' +
d.getMinutes() +
'分'
)
}
}
/**
* @param {string} url
* @returns {Object}
*/
export function param2Obj(url) {
const search = decodeURIComponent(url.split('?')[1]).replace(/\+/g, ' ')
if (!search) {
return {}
}
const obj = {}
const searchArr = search.split('&')
searchArr.forEach(v => {
const index = v.indexOf('=')
if (index !== -1) {
const name = v.substring(0, index)
const val = v.substring(index + 1, v.length)
obj[name] = val
}
})
return obj
}
//防抖
export function debounce(fn, delay = 500) {
let timer = null
return function _debounce() {
if (timer) clearTimeout(timer)
timer = setTimeout(() => {
fn()
}, delay)
}
}
//金额分隔
export function moneyFormatter(money, precision = 2) {
if(Number(money)===0){
return 0
}
return Number(money).toFixed(precision).replace(/(\d)(?=(\d{3})+\.)/g, '$1,')
}
//金额分隔复原
export function moneyRecovery(money) {
return parseFloat(money.replace(/[^\d\.-]/g, ""));
}
export function deepCopy(data) {
//string,number,bool,null,undefined,symbol
//object,array,date
if (data && typeof data === "object") {
//针对函数的拷贝
if (typeof data === "function") {
let tempFunc = data.bind(null);
tempFunc.prototype = deepCopy(data.prototype);
return tempFunc;
}
switch (Object.prototype.toString.call(data)) {
case "[object String]":
return data.toString();
case "[object Number]":
return Number(data.toString());
case "[object Boolean]":
return Boolean(data.toString());
case "[object Date]":
return new Date(data.getTime());
case "[object Array]":
let arr = [];
for (let i = 0; i < data.length; i++) {
arr[i] = deepCopy(data[i]);
}
return arr;
//js自带对象或用户自定义类实例
case "[object Object]":
let obj = {};
for (let key in data) {
//会遍历原型链上的属性方法可以用hasOwnProperty来控制 obj.hasOwnProperty(prop)
obj[key] = deepCopy(data[key]);
}
return obj;
}
} else {
//string,number,bool,null,undefined,symbol
return data;
}
}
export function requestToForm(requestObj, form) {
// 获取a对象中属性的顺序和值
let aKeys = Object.keys(form);
let aValues = aKeys.map(key => form[key]);
// 遍历b对象将属性等于a中属性值的对象深拷贝给a中的相应属性
for (let i = 0; i < aKeys.length; i++) {
let key = aKeys[i];
let value = aValues[i];
if (requestObj[key] === value) {
// 深拷贝对象
Object.assign(form, {
[key]: deepCopy(requestObj[key])
});
}
}
// 遍历b对象将b中独有的属性按照a的顺序插入到a中
for (let key in requestObj) {
if (!form[key]) {
// 深拷贝属性值
Object.assign(form, {
[key]: deepCopy(requestObj[key])
});
}
}
return form
}
export function buildTree(data, pid = 0) {
const tree = [];
for (const item of data) {
if (item.pid === pid) {
const children = buildTree(data, item.id);
if (children.length > 0) {
item.children = children;
}
tree.push(item);
}
}
return tree;
}

@ -16,22 +16,28 @@
placement="bottom"
style="width: 130px"
type="year"
@on-change="(e) => (select.year = e)"
@on-change="(e) => (select.year = e,changeYear(e),getBudgets())"
></DatePicker>
</span>
<span style="padding: 0 6px"> 预算类型 </span>
<span>
<Select
v-model="select.type"
<el-select
v-model="select.typeName"
clearable
@change="changeType"
placeholder="选择预算类型"
style="width: 130px"
>
<Option v-for="item in types" :key="item.id" :value="item.id">{{
item.value
}}</Option>
</Select>
<el-option disabled value="" style="height:150px;overflow: scroll;">
<el-tree style="width:300px" default-expand-all :default-checked-keys="checkArr" :check-strictly="true"
@check="(data, node)=>{return getSelectedNodes(data,node,'tree1')}"
:data="types" show-checkbox node-key="id" ref="tree1" highlight-current :props="defaultProps">
</el-tree>
</el-option>
</el-select>
</span>
<span style="padding: 0 6px"> 科室 </span>
@ -280,49 +286,55 @@
</div>
</div>
</template>
<template v-slot:type>
<template v-slot:year>
<div class="xy-table-item">
<div class="xy-table-item-label">
<span style="color: red; font-weight: 600; padding-right: 4px"
>*</span
>预算类型
>项目所属年份
</div>
<div class="xy-table-item-content">
<el-select
v-model="form.type"
<el-datePicker
v-model="form.year"
clearable
placeholder="请选择预算类型"
placeholder="请选择所属年份"
placement="bottom"
style="width: 300px"
>
<el-option
v-for="item in types"
:label="item.value"
:value="item.id"
></el-option>
</el-select>
type="year"
value-format="yyyy"
@change="changeYear"
></el-datePicker>
</div>
</div>
</template>
<template v-slot:year>
<template v-slot:type>
<div class="xy-table-item">
<div class="xy-table-item-label">
<span style="color: red; font-weight: 600; padding-right: 4px"
>*</span
>项目所属年份
>预算类型
</div>
<div class="xy-table-item-content">
<el-datePicker
v-model="form.year"
<div class="xy-table-item-content" style="height:150px;overflow: scroll;">
<el-tree style="width:300px" default-expand-all :default-checked-keys="checkArr" :check-strictly="true"
@check="(data, node)=>{return getSelectedNodes(data,node,'tree2')}"
:data="types" show-checkbox node-key="id" ref="tree2" highlight-current :props="defaultProps">
</el-tree>
<!-- <el-select
v-model="form.type"
clearable
placeholder="请选择所属年份"
placement="bottom"
placeholder="请选择预算类型"
style="width: 300px"
type="year"
value-format="yyyy"
></el-datePicker>
>
<el-option
v-for="item in types"
:label="item.value"
:value="item.id"
></el-option>
</el-select> -->
</div>
</div>
</template>
<template v-slot:department>
<div class="xy-table-item">
<div class="xy-table-item-label">
@ -448,46 +460,51 @@
</div>
</div>
</template>
<template v-slot:type>
<template v-slot:year>
<div class="xy-table-item">
<div class="xy-table-item-label">
<span style="color: red; font-weight: 600; padding-right: 4px"
>*</span
>预算类型
>项目所属年份
</div>
<div class="xy-table-item-content">
<el-select
v-model="editorForm.type"
<el-datePicker
v-model="editorForm.year"
clearable
placeholder="请选择预算类型"
placeholder="请选择所属年份"
placement="bottom"
style="width: 300px"
>
<el-option
v-for="item in types"
:label="item.value"
:value="item.id"
></el-option>
</el-select>
type="year"
value-format="yyyy"
@change="changeYear"
></el-datePicker>
</div>
</div>
</template>
<template v-slot:year>
<template v-slot:type>
<div class="xy-table-item">
<div class="xy-table-item-label">
<span style="color: red; font-weight: 600; padding-right: 4px"
>*</span
>项目所属年份
>预算类型
</div>
<div class="xy-table-item-content">
<el-datePicker
v-model="editorForm.year"
<div class="xy-table-item-content" style="height:150px;overflow: scroll;">
<el-tree style="width:300px" default-expand-all :default-checked-keys="checkArr" :check-strictly="true"
@check="(data, node)=>{return getSelectedNodes(data,node,'tree3')}"
:data="types" show-checkbox node-key="id" ref="tree3" highlight-current :props="defaultProps">
</el-tree>
<!-- <el-select
v-model="editorForm.type"
clearable
placeholder="请选择所属年份"
placement="bottom"
placeholder="请选择预算类型"
style="width: 300px"
type="year"
value-format="yyyy"
></el-datePicker>
>
<el-option
v-for="item in types"
:label="item.value"
:value="item.id"
></el-option>
</el-select> -->
</div>
</div>
</template>
@ -623,22 +640,33 @@ import { listdeptNoAuth } from "@/api/system/department";
import { Message } from "element-ui";
import { parseTime, moneyFormatter, moneyRecovery } from "@/utils";
import { getparameter } from "@/api/system/dictionary";
import {
index as getPlanType
} from "@/api/budget/plantype.js"
import { mergeTableRow } from "@/utils/mergeTableRow";
import {
buildTree
} from '@/utils'
export default {
data() {
return {
tableHeight: 0,
isShowAdd: false,
types: [],
typesbefore:[],
checkArr: [],
defaultProps: {
children: 'children',
label: 'name'
},
treeData: [],
isTree: true,
typeYear: this.$moment().format("YYYY"),
form: {
pid: "0",
name: "",
year: this.$moment().format("YYYY"),
type: "",
year: "",
department: "",
money: "",
content: "",
@ -711,10 +739,10 @@ export default {
prop: "type",
width: 115,
formatter: (cell, data, value) => {
let res = this.types.filter((item) => {
let res = this.typesbefore.filter((item) => {
return item.id === value;
});
return res[0]?.value || "未知";
return res[0]?.name || "未知";
},
},
{
@ -767,6 +795,7 @@ export default {
year: "",
type: "",
department: "",
typeName:'',
},
departments: [], //
@ -815,7 +844,10 @@ export default {
showAdd(row) {
this.form.pid = "0";
this.form.pid_info = null;
this.checkArr = []
this.$refs.tree1.setCheckedKeys([]);
this.isShowAdd = true;
this.getTypes()
this.getDepartment();
if (row != "") {
this.form.pid = row.id;
@ -825,11 +857,70 @@ export default {
changeDepartments(v) {
console.log(v);
},
//
changeYear(e){
if(e){
console.log("e",e)
this.typeYear = e
if(this.isShowAdd){
this.form.year = e
}
if(this.isShowEditor){
this.editorForm.year = e
}
this.getTypes()
}
},
changeType(e){
if(!e){
this.select.type = ''
this.select.typeName = ''
}
},
getSelectedNodes(data, node, ref) {
let ref_data = ref?ref:'tree'
this.$refs[ref_data].setCheckedKeys([]);
this.checkArr = []
if (data.children && data.children.length > 0) {
this.$Message.warning('当前节点不可选择')
this.form.type = ''
this.select.type = ''
this.editorForm.type = ''
this.$refs[ref_data].setCheckedKeys([]);
return
}
this.$refs[ref_data].setCheckedKeys([]); //
this.$refs[ref_data].setCheckedNodes([data]); //
if(this.isShowAdd){
this.form.type = data.id
}else if(this.isShowEditor){
this.editorForm.type = data.id
}else{
this.select.type = data.id
this.select.typeName = data.name
}
console.log("checkarr",this.select.typeName,this.$refs[ref_data].getCheckedNodes())
this.$forceUpdate()
},
async getTypes() {
const res = await getparameter({
number: "money_way",
// const res = await getparameter({
// number: "money_way",
// });
const res = await getPlanType({
page_size: 999,
page: 1,
sort_name: 'sort',
sort_type: 'asc',
filter: [{
key: 'year',
op: 'eq',
value: this.typeYear
}]
});
this.types = res.detail;
this.typesbefore = res.data
this.types = buildTree(res.data);
},
moneyRecoverEditor(key) {
@ -960,6 +1051,7 @@ export default {
type: "success",
});
this.isShowAdd = false;
this.$refs["addBudget"].reset();
this.getBudgets();
});
@ -1023,6 +1115,8 @@ export default {
});
},
showEditor(row) {
this.checkArr = []
this.$refs.tree2.setCheckedKeys([]);
this.getDepartment();
detailBudget({
id: row.id,
@ -1046,7 +1140,9 @@ export default {
});
//this.editorForm.plan_department_link_id = ids;
this.$set(this.editorForm, "plan_department_link_id", ids);
this.checkArr = [res.type]
this.typeYear = res.year
this.getTypes()
this.isShowEditor = true;
console.log(this.editorForm);
});
@ -1088,4 +1184,7 @@ export default {
z-index: 2;
}
}
::v-deep .el-checkbox__input .el-checkbox__inner {
border-radius: 50%;
}
</style>

@ -0,0 +1,227 @@
<template>
<div>
<xy-dialog ref="dialog" :width="50" :is-show.sync="isShow" :type="'form'" :title="$route.meta.title" :form="form"
:rules='rules' @submit="submit">
<template v-slot:year>
<div class="xy-table-item">
<div class="xy-table-item-label" style="font-weight: bold">
<span style="color: red;font-weight: bold;padding-right: 4px;">*</span>年份
</div>
<div class="xy-table-item-content">
<el-date-picker style="width:300px" v-model="form.year" @change="changeYear" format="yyyy" value-format="yyyy" type="year"
placeholder="选择年份">
</el-date-picker>
</div>
</div>
</template>
<template v-slot:pid>
<div class="xy-table-item">
<div class="xy-table-item-label" style="font-weight: bold">
<span style="color: red;font-weight: bold;padding-right: 4px;">*</span>上级
</div>
<div class="xy-table-item-content" style="height:150px;overflow: scroll;">
<el-tree style="width:300px" default-expand-all :default-checked-keys="checkArr" :check-strictly="true" @check="getSelectedNodes"
:data="list" show-checkbox node-key="id" ref="tree" highlight-current :props="defaultProps">
</el-tree>
<!-- <el-input v-else disabled v-model="pName" placeholder="选择上级" clearable style="width: 100%;"></el-input> -->
</div>
</div>
</template>
<template v-slot:name>
<div class="xy-table-item">
<div class="xy-table-item-label" style="font-weight: bold">
<span style="color: red;font-weight: bold;padding-right: 4px;">*</span>名称
</div>
<div class="xy-table-item-content">
<el-input style="width:300px" v-model="form.name" placeholder="填写名称" clearable></el-input>
</div>
</div>
</template>
<template v-slot:sort>
<div class="xy-table-item">
<div class="xy-table-item-label" style="font-weight: bold">
<span style="color: red;font-weight: bold;padding-right: 4px;"></span>排序
</div>
<div class="xy-table-item-content">
<el-input style="width:300px" v-model="form.sort" placeholder="填写排序" type="number" clearable></el-input>
</div>
</div>
</template>
</xy-dialog>
</div>
</template>
<script>
import {
save,
show,
index
} from "@/api/budget/plantype.js"
import {
requestToForm
} from '@/utils'
export default {
components: {
},
data() {
return {
isShow: false,
type: 'add',
id: '',
isSub: false,
list: [],
checkArr: [],
defaultProps: {
children: 'children',
label: 'name'
},
pName: '根目录',
form: {
year: '',
pid: 0,
name: '',
sort: 0
},
rules: {
year: [{
required: true,
message: '请选择年份'
}],
pid: [{
required: true,
message: '请选择上级'
}],
name: [{
required: true,
message: '请输入名称'
}]
}
}
},
created() {},
methods: {
getSelectedNodes(data, node) {
this.$refs.tree.setCheckedKeys([]); //
this.$refs.tree.setCheckedNodes([data]); //
this.form.pid = data.id
this.$forceUpdate()
},
changeYear(e){
if(e){
this.form.year = e
this.getList()
}
},
async getList() {
const res = await index({
page_size: 999,
page: 1,
sort_name: 'sort',
sort_type: 'asc',
filter:[{
key:'year',
op:'eq',
value:this.form.year
}]
})
this.list = this.buildTree(res.data)
this.list.unshift({
id:0,
name:'根目录'
})
this.$forceUpdate()
},
buildTree(data, pid = 0) {
const tree = [];
for (const item of data) {
if (item.pid === pid) {
const children = this.buildTree(data, item.id);
if (children.length > 0) {
item.children = children;
}
tree.push(item);
}
}
return tree;
},
submit() {
if (this.id) {
this.form.id = this.id
}
if (this.type == 'add' || this.type == 'sub') {
this.form.id = ''
}
console.log("this.form", this.form)
// return
save({
...this.form
}).then(res => {
this.$message({
type: 'success',
message: '操作成功'
})
this.isShow = false
this.$emit('refresh')
})
},
getDetail() {
show({
id: this.id
}).then(res => {
if (this.type === 'sub') {
this.form.pid = res.id
this.checkArr = [res.id]
} else {
this.form = requestToForm(res, this.form)
this.checkArr = res.pid ? [res.pid] : [0]
}
this.form.year = res.year + ''
})
}
},
watch: {
isShow(newVal) {
if (newVal) {
if (this.type === 'editor' || this.type === 'sub') {
this.getDetail()
} else {
this.form.year = this.$moment().format('YYYY')
this.checkArr = [0]
}
} else {
this.id = ''
this.type = "add"
this.isSub = false
this.pName = '根目录'
this.checkArr = []
this.form = {
year: '',
pid: 0,
name: '',
sort: 0
}
this.$refs['dialog'].reset()
}
},
}
}
</script>
<style scoped lang="scss">
::v-deep .name,
::v-deep .sort,
::v-deep .year,
::v-deep .pid {
flex-basis: 100%;
}
::v-deep .el-checkbox__input .el-checkbox__inner {
border-radius: 50%;
}
</style>

@ -0,0 +1,167 @@
<template>
<div style="padding: 0 20px">
<div>
<div ref="lxHeader">
<lx-header icon="md-apps" :text="$route.meta.title" style="margin-bottom: 10px; border: 0px; margin-top: 15px">
<div slot="content">
<div class="searchwrap" style="display: flex;align-items: center;">
<div>
<el-date-picker v-model="select.year" style="width:100%" format="yyyy" value-format="yyyy" type="year"
placeholder="选择年份">
</el-date-picker>
</div>
<div>
<el-input v-model="select.name" placeholder="类型名称"></el-input>
</div>
<div>
<el-button type="primary" size="small" @click="select.page=1,getList()"></el-button>
</div>
<div>
<el-button type="primary" size="small" @click="editType('add')"></el-button>
</div>
</div>
</div>
</lx-header>
</div>
</div>
<div>
<xy-table :list="list" :total="total" :table-item="table_item">
<template v-slot:btns>
<el-table-column align='center' label="操作" width="280" header-align="center">
<template slot-scope="scope">
<Button class="slot-btns-item" size="small" type="primary" @click="editType('sub',scope.row.id)">
子类型
</Button>
<Button style="margin-left: 10px" @click="editType('editor',scope.row.id)""
class="slot-btns-item" size="small" type="primary">
编辑
</Button>
<Poptip :transfer="true" style="margin-left: 10px" confirm placement="bottom" title="确认要删除吗"
@on-ok="() => deleteList(scope.row.id)">
<i-button class="slot-btns-item" size="small" type="error">删除
</i-button>
</Poptip>
</template>
</el-table-column>
</template>
</xy-table>
</div>
<add-plan-type ref="addPlanType" @refresh="getList"></add-plan-type>
</div>
</template>
<script>
import addPlanType from './component/addPlanType.vue';
import {
index,
destroy
} from "@/api/budget/plantype.js"
import {
buildTree
} from '@/utils'
export default {
components: {
addPlanType
},
data() {
return {
select: {
name: '',
year: this.$moment().format('YYYY'),
page: 1,
page_size: 999,
},
list: [],
total: 0,
table_item: [{
prop: 'name',
label: '名称',
align: 'left',
}, {
prop: 'sort',
label: '排序',
align: 'center',
width: 180,
}]
}
},
created() {
this.getList()
},
methods: {
editType(type, id, pName) {
if (type == 'editor') {
this.$refs.addPlanType.id = id
}
if (type == 'sub') {
this.$refs.addPlanType.id = id
}
let arr = [{
id: 0,
name: '根目录'
}]
arr.push(...this.list)
this.$refs.addPlanType.list = arr
this.$refs.addPlanType.type = type
this.$refs.addPlanType.isShow = true
},
async getList() {
const res = await index({
page_size: this.select.page_size,
page: this.select.page,
sort_name: 'sort',
sort_type: 'asc',
filter: [{
key: 'year',
op: 'eq',
value: this.select.year?this.select.year:''
}, {
key: 'name',
op: 'like',
value: this.select.name
}]
})
this.list = buildTree(res.data)
console.log("this.list", this.list)
this.total = res.total
},
deleteList(id) {
console.log("123")
var that = this;
destroy({
id: id
}).then(response => {
this.$Message.success('操作成功');
this.getList()
}).catch(error => {
console.log(error)
reject(error)
})
},
}
}
</script>
<style lang="scss" scoped>
.searchwrap {
display: flex;
align-items: center;
&>div {
display: flex;
align-items: center;
margin-right: 10px;
span {
min-width: 70px;
}
}
}
</style>

@ -1,280 +1,596 @@
<template>
<div v-if="registration">
<xy-dialog title="打印预览" :is-show.sync="isShow" :width="70" @on-ok="print" ok-text="">
<template v-slot:normalContent>
<div class="print-table1" id="printtable1" ref="printtable">
<div class="print-table1-title">苏州市河道管理处资金划拨审批单</div>
<div class="print-table1-grid">
<div style="grid-area: tb1-1" class="print-table1-grid-top">项目名称<span
style="font-weight: 600">{{registration.contract.name}}</span></div>
<div style="grid-area: tb1-2;justify-content: center;align-items: center;flex-direction: column;">
<div>本次为第 <span style="font-weight: 600;padding: 0 1vw;">{{payIndex}}</span> 次付款</div>
<div>{{registration.remark}}</div>
</div>
<div style="grid-area: tb2-1" class="print-table1-grid-top">承包商/供货商<span
style="font-weight: 600">{{registration.contract.supply}}</span></div>
<div style="grid-area: tb2-2" class="print-table1-grid-top">合同服务时间<span
style="font-weight: 600">{{registration.contract.start_date}} -
{{registration.contract.end_date}}</span></div>
<div style="grid-area: tb3-1" class="print-table1-grid-title1">付款情形</div>
<div style="grid-area: tb3-2" class="print-table1-grid-title1">金额单位</div>
<div style="grid-area: tb3-3" class="print-table1-grid-title1">备注</div>
<div style="grid-area: tb4-1" class="print-table1-grid-center">A</div>
<div style="grid-area: tb4-2" class="print-table1-grid-center">合同金额</div>
<div style="grid-area: tb4-3" class="print-table1-grid-center">{{priceFormat(registration.contract.money)}}
</div>
<div style="grid-area: tb4-4"></div>
<div style="grid-area: tb5-1" class="print-table1-grid-center">B</div>
<div style="grid-area: tb5-2" class="print-table1-grid-center">审计金额</div>
<div style="grid-area: tb5-3" class="print-table1-grid-center">{{priceFormat(registration.contract.audit_money)}}</div>
<div style="grid-area: tb5-4"></div>
<div style="grid-area: tb6-1" class="print-table1-grid-center">C</div>
<div style="grid-area: tb6-2" class="print-table1-grid-center">前期累计已付款</div>
<div style="grid-area: tb6-3" class="print-table1-grid-center">{{priceFormat(registration.total_act_money)}}
</div>
<div style="grid-area: tb6-4"></div>
<div style="grid-area: tb7-1" class="print-table1-grid-center">D</div>
<div style="grid-area: tb7-2" class="print-table1-grid-center">本期扣款</div>
<div style="grid-area: tb7-3" class="print-table1-grid-center">{{priceFormat(registration.discount_money)}}
</div>
<div style="grid-area: tb7-4"></div>
<div style="grid-area: tb8-1" class="print-table1-grid-center">E</div>
<div style="grid-area: tb8-2;font-weight: 600" class="print-table1-grid-center">本期应付款</div>
<div style="grid-area: tb8-3;font-weight: 600" class="print-table1-grid-center">
{{priceFormat(registration.apply_money)}}</div>
<div style="grid-area: tb8-4;padding-left: 0.6vw;display: block;">
<div style="display: flex;align-items: center;">
<div><span v-if="registration.type == '预付款'"></span></div>
<div style="padding-left: 1.6vw"><span v-if="registration.type == '进度款'"></span></div>
<div style="padding-left: 1.6vw"><span v-if="registration.type == '结算款'"></span></div>
</div>
<div style="display: flex;align-items: center;">
<div><span v-if="registration.type == '质保金'"></span></div>
<div
style="height: 1.8vw;min-width: 6vw;border-bottom: 2px #000 solid;margin-left: 2vw;font-size: 15px;">
<span v-if="registration.type!='进度款'&&registration.type!='质保金'&&registration.type!='结算款'">
{{registration.type}} </span>
</div>
<div>其他</div>
</div>
</div>
<div style="grid-area: tb9-1" class="print-table1-grid-center">F</div>
<div style="grid-area: tb9-2" class="print-table1-grid-center">累计支付</div>
<div style="grid-area: tb9-3" class="print-table1-grid-center">
{{priceFormat(Number(registration.total_act_money)+Number(registration.apply_money))}}</div>
<div style="grid-area: tb9-4"></div>
<div style="grid-area: tb10-1" class="print-table1-grid-center">G</div>
<div style="grid-area: tb10-2" class="print-table1-grid-center">累计扣款</div>
<div style="grid-area: tb10-3" class="print-table1-grid-center">
{{priceFormat(Number(registration.total_discount_money)+Number(registration.discount_money))}}</div>
<div style="grid-area: tb10-4"></div>
<div style="grid-area: tb11-1" class="print-table1-grid-center">H</div>
<div style="grid-area: tb11-2" class="print-table1-grid-center">质保金</div>
<div style="grid-area: tb11-3;align-items: center;">
{{guaranteeRate(registration.contract.guarantee_money,registration.contract.money,registration.contract.audit_money)}}%质保期{{registration.contract.guarantee_year}}需审计的以审计价为计费依据
</div>
<div style="grid-area: tb12" class="print-table1-grid-bottom1">
资金列支渠道{{moneyWayFormat(registration.money_way_detail)}}
</div>
<div style="grid-area: tb13-1;" class="print-table1-grid-bottom2">
<div>
<div>业务科室</div>
<div style="padding-top: 1vw;"> 经办人</div>
</div>
</div>
<div style="grid-area: tb13-2" class="print-table1-grid-bottom2">业务科室负责人</div>
<div style="grid-area: tb13-3" class="print-table1-grid-bottom2">业务科室分管领导</div>
<div style="grid-area: tb14-1;" class="print-table1-grid-bottom3">财务审计科</div>
<div style="grid-area: tb14-2;" class="print-table1-grid-bottom3">财务审计科分管领导</div>
<div style="grid-area: tb14-3;" class="print-table1-grid-bottom3">单位负责人</div>
</div>
<div style="text-align: right;padding-top: 0.3vw;font-size: 1.5vw;">
打印时间{{new Date().getFullYear()}}.{{new Date().getMonth()+1}}.{{new Date().getDate()}}</div>
</div>
</template>
</xy-dialog>
</div>
</template>
<script>
import {
detailFundLog,
getFundLog
} from "@/api/paymentRegistration/fundLog"
import html2canvas from 'html2canvas'
import * as printJS from "print-js";
import {
parseTime,
moneyRecovery
} from "@/utils";
export default {
data() {
return {
isShow: false,
registration: null,
beforeTotalMoney: 0,
payIndex: 1,
}
},
methods: {
moneyWayFormat(arr) {
let res = arr.map(item => {
return item.value
})
return res.toString()
},
guaranteeRate(gua, money, auditmoney) {
let _money = money;
if(auditmoney&&auditmoney>0) _money=auditmoney;
if (gua && _money) return ((moneyRecovery(gua) / _money) * 100).toFixed(2)
},
async getDetailFundLog(id) {
let res = await detailFundLog({
id
})
this.registration = res
let res1 = await getFundLog({
page_size: 999,
contract_id: this.registration.contract.id
})
if (res1.data.length > 0) {
res1.data.map(item => {
this.beforeTotalMoney += Number(item.act_money)
})
this.beforeTotalMoney -= Number(this.registration.act_money)
} else {
this.beforeTotalMoney = 0
}
let nowIndex = res?.id
let idList = res1.data.map(item => {
return item.id
})
//
idList.sort((a, b) => {
return a - b;
})
console.log("nowIndex", nowIndex)
console.log("idList", idList)
this.payIndex = idList.indexOf(nowIndex) + 1
},
async print() {
let canvas = await html2canvas(this.$refs['printtable'], {
backgroundColor: null,
useCORS: true,
})
printJS({
printable: canvas.toDataURL(),
type: 'image',
documentTitle: '苏州市河道管理处资金划拨审批单',
style: '@page{margin:auto;}'
})
}
},
computed: {
dateFormat() {
return function(date) {
return parseTime(new Date(date))
}
},
priceFormat() {
return function(price) {
return Number(price).toFixed(2).replace(/(\d)(?=(\d{3})+\.)/g, '$1,')
}
}
}
}
</script>
<style scoped lang="scss">
.print-table1 {
box-sizing: border-box;
&-title {
font-size: 2vw;
letter-spacing: 2px;
text-align: center;
font-weight: 600;
border: none;
padding: 1.6vw 0;
}
&-grid {
font-size: 1.75vw;
border: 1px #000 solid;
display: grid;
grid-template-rows: repeat(14, auto);
grid-template-columns: repeat(6, 1fr);
grid-template-areas:
"tb1-1 tb1-1 tb1-1 tb1-2 tb1-2 tb1-2"
"tb2-1 tb2-1 tb2-1 tb2-2 tb2-2 tb2-2"
"tb3-1 tb3-1 tb3-2 tb3-2 tb3-3 tb3-3"
"tb4-1 tb4-2 tb4-3 tb4-3 tb4-4 tb4-4"
"tb5-1 tb5-2 tb5-3 tb5-3 tb5-4 tb5-4"
"tb6-1 tb6-2 tb6-3 tb6-3 tb6-4 tb6-4"
"tb7-1 tb7-2 tb7-3 tb7-3 tb7-4 tb7-4"
"tb8-1 tb8-2 tb8-3 tb8-3 tb8-4 tb8-4"
"tb9-1 tb9-2 tb9-3 tb9-3 tb9-4 tb9-4"
"tb10-1 tb10-2 tb10-3 tb10-3 tb10-4 tb10-4"
"tb11-1 tb11-2 tb11-3 tb11-3 tb11-3 tb11-3"
"tb12 tb12 tb12 tb12 tb12 tb12"
"tb13-1 tb13-1 tb13-2 tb13-2 tb13-3 tb13-3"
"tb14-1 tb14-1 tb14-2 tb14-2 tb14-3 tb14-3";
&>div {
border: 1px #000 solid;
display: flex;
}
&-top {
padding: 0.4vw 0 3.6vw 0.4vw;
}
&-title1 {
text-align: center;
justify-content: center;
padding: 0.2vw 0;
}
&-center {
text-align: center;
justify-content: center;
align-items: center;
padding: 1vw 0;
}
&-bottom1 {
padding: 0.4vw 0 4vw 0.4vw;
}
&-bottom2 {
padding: 0.4vw 0 4vw 0.4vw;
}
&-bottom3 {
padding: 0.4vw 0 6vw 0.4vw;
}
}
}
</style>
<template>
<div v-if="registration">
<xy-dialog title="打印预览" :is-show.sync="isShow" :width="70" @on-ok="print" ok-text="">
<template v-slot:normalContent>
<div class="print-table1" id="printtable1" ref="printtable">
<!-- 苏州市河道管理处报销贴单 -->
<div class="print-table1-title">苏州市河道管理处报销贴单</div>
<div class="print-table1-subtitle">
<div>科室</div>
<div><span></span><span></span><span></span></div>
</div>
<div class="print-table2-grid">
<div class="purpose">用途说明</div>
<div class="amount">金额</div>
<div class="claimant bmnone">报销(领款)</div>
<div class="sign bmnone"></div>
<div class="purpose2"></div>
<div class="amount2"></div>
<div class="claimant2 btnone"></div>
<div class="sign2 btnone"></div>
<div class="purpose3"></div>
<div class="amount3"></div>
<div class="section-head bmnone">科室负责人</div>
<div class="sign3 bmnone"></div>
<div class="purpose3-1"></div>
<div class="amount3-1"></div>
<div class="section-head-1 btnone"></div>
<div class="sign3-1 btnone"></div>
<div class="purpose4"></div>
<div class="amount4"></div>
<div class="audit bmnone">财审科审核</div>
<div class="sign4 bmnone"></div>
<div class="purpose4-1"></div>
<div class="amount4-1"></div>
<div class="audit-1 btnone"></div>
<div class="sign4-1 btnone"></div>
<div class="purpose5"></div>
<div class="amount5"></div>
<div class="sub-lead bmnone">分管领导审核</div>
<div class="sign5 bmnone"></div>
<div class="purpose5-1"></div>
<div class="amount5-1"></div>
<div class="sub-lead-1 btnone"></div>
<div class="sign5-1 btnone"></div>
<div class="purpose6"></div>
<div class="amount6"></div>
<div class="fin-sub-lead bmnone">财务分管领导审核</div>
<div class="sign6 bmnone"></div>
<div class="purpose6-1"></div>
<div class="amount6-1"></div>
<div class="fin-sub-lead-1 btnone"></div>
<div class="sign6-1 btnone"></div>
<div class="total">合计</div>
<div class="total1"></div>
<div class="approver bmnone">单位负责人审批</div>
<div class="sign7 bmnone"></div>
<div class="total-capital">报销金额(大写)</div>
<div class="total-capital1"> </div>
<div class="approver-1 btnone"></div>
<div class="sign7-1 btnone"></div>
</div>
<div style="text-align: right;padding-top: 0.3vw;font-size: 1.5vw;">
打印时间{{new Date().getFullYear()}}.{{new Date().getMonth()+1}}.{{new Date().getDate()}}</div>
</div>
<!-- 苏州市河道管理处资金划拨审批单 -->
<div class="print-table1" id="printtable1" ref="printtable">
<div class="print-table1-title">苏州市河道管理处资金划拨审批单</div>
<div class="print-table1-grid">
<div style="grid-area: tb1-1" class="print-table1-grid-top">项目名称<span
style="font-weight: 600">{{registration.contract.name}}</span></div>
<div style="grid-area: tb1-2;justify-content: center;align-items: center;flex-direction: column;">
<div>本次为第 <span style="font-weight: 600;padding: 0 1vw;">{{payIndex}}</span> 次付款</div>
<div>{{registration.remark}}</div>
</div>
<div style="grid-area: tb2-1" class="print-table1-grid-top">承包商/供货商<span
style="font-weight: 600">{{registration.contract.supply}}</span></div>
<div style="grid-area: tb2-2" class="print-table1-grid-top">合同服务时间<span
style="font-weight: 600">{{registration.contract.start_date}} -
{{registration.contract.end_date}}</span></div>
<div style="grid-area: tb3-1" class="print-table1-grid-title1">付款情形</div>
<div style="grid-area: tb3-2" class="print-table1-grid-title1">金额单位</div>
<div style="grid-area: tb3-3" class="print-table1-grid-title1">备注</div>
<div style="grid-area: tb4-1" class="print-table1-grid-center">A</div>
<div style="grid-area: tb4-2" class="print-table1-grid-center">合同金额</div>
<div style="grid-area: tb4-3" class="print-table1-grid-center">{{priceFormat(registration.contract.money)}}
</div>
<div style="grid-area: tb4-4"></div>
<div style="grid-area: tb5-1" class="print-table1-grid-center">B</div>
<div style="grid-area: tb5-2" class="print-table1-grid-center">审计金额</div>
<div style="grid-area: tb5-3" class="print-table1-grid-center">
{{priceFormat(registration.contract.audit_money)}}
</div>
<div style="grid-area: tb5-4"></div>
<div style="grid-area: tb6-1" class="print-table1-grid-center">C</div>
<div style="grid-area: tb6-2" class="print-table1-grid-center">前期累计已付款</div>
<div style="grid-area: tb6-3" class="print-table1-grid-center">{{priceFormat(registration.total_act_money)}}
</div>
<div style="grid-area: tb6-4"></div>
<div style="grid-area: tb7-1" class="print-table1-grid-center">D</div>
<div style="grid-area: tb7-2" class="print-table1-grid-center">本期扣款</div>
<div style="grid-area: tb7-3" class="print-table1-grid-center">{{priceFormat(registration.discount_money)}}
</div>
<div style="grid-area: tb7-4"></div>
<div style="grid-area: tb8-1" class="print-table1-grid-center">E</div>
<div style="grid-area: tb8-2;font-weight: 600" class="print-table1-grid-center">本期应付款</div>
<div style="grid-area: tb8-3;font-weight: 600" class="print-table1-grid-center">
{{priceFormat(registration.apply_money)}}
</div>
<div style="grid-area: tb8-4;padding-left: 0.6vw;display: block;">
<div style="display: flex;align-items: center;">
<div><span v-if="registration.type == '预付款'"></span></div>
<div style="padding-left: 1.6vw"><span v-if="registration.type == '进度款'"></span></div>
<div style="padding-left: 1.6vw"><span v-if="registration.type == '结算款'"></span></div>
</div>
<div style="display: flex;align-items: center;">
<div><span v-if="registration.type == '质保金'"></span></div>
<div
style="height: 1.8vw;min-width: 6vw;border-bottom: 2px #000 solid;margin-left: 2vw;font-size: 15px;">
<span v-if="registration.type!='进度款'&&registration.type!='质保金'&&registration.type!='结算款'">
{{registration.type}} </span>
</div>
<div>其他</div>
</div>
</div>
<div style="grid-area: tb9-1" class="print-table1-grid-center">F</div>
<div style="grid-area: tb9-2" class="print-table1-grid-center">累计支付</div>
<div style="grid-area: tb9-3" class="print-table1-grid-center">
{{priceFormat(Number(registration.total_act_money)+Number(registration.apply_money))}}
</div>
<div style="grid-area: tb9-4"></div>
<div style="grid-area: tb10-1" class="print-table1-grid-center">G</div>
<div style="grid-area: tb10-2" class="print-table1-grid-center">累计扣款</div>
<div style="grid-area: tb10-3" class="print-table1-grid-center">
{{priceFormat(Number(registration.total_discount_money)+Number(registration.discount_money))}}
</div>
<div style="grid-area: tb10-4"></div>
<div style="grid-area: tb11-1" class="print-table1-grid-center">H</div>
<div style="grid-area: tb11-2" class="print-table1-grid-center">质保金</div>
<div style="grid-area: tb11-3;align-items: center;">
{{guaranteeRate(registration.contract.guarantee_money,registration.contract.money,registration.contract.audit_money)}}%质保期{{registration.contract.guarantee_year}}需审计的以审计价为计费依据
</div>
<div style="grid-area: tb12" class="print-table1-grid-bottom1">
资金列支渠道{{moneyWayFormat(registration.money_way_detail)}}
</div>
<div style="grid-area: tb13-1;" class="print-table1-grid-bottom2">
<div>
<div>业务科室</div>
<div style="padding-top: 1vw;"> 经办人</div>
</div>
</div>
<div style="grid-area: tb13-2" class="print-table1-grid-bottom2">业务科室负责人</div>
<div style="grid-area: tb13-3" class="print-table1-grid-bottom2">业务科室分管领导</div>
<div style="grid-area: tb14-1;" class="print-table1-grid-bottom3">财务审计科</div>
<div style="grid-area: tb14-2;" class="print-table1-grid-bottom3">财务审计科分管领导</div>
<div style="grid-area: tb14-3;" class="print-table1-grid-bottom3">单位负责人</div>
</div>
<div style="text-align: right;padding-top: 0.3vw;font-size: 1.5vw;">
打印时间{{new Date().getFullYear()}}.{{new Date().getMonth()+1}}.{{new Date().getDate()}}</div>
</div>
</template>
</xy-dialog>
</div>
</template>
<script>
import {
detailFundLog,
getFundLog
} from "@/api/paymentRegistration/fundLog"
import html2canvas from 'html2canvas'
import * as printJS from "print-js";
import {
parseTime,
moneyRecovery
} from "@/utils";
export default {
data() {
return {
isShow: false,
registration: null,
beforeTotalMoney: 0,
payIndex: 1,
}
},
methods: {
moneyWayFormat(arr) {
let res = arr.map(item => {
return item.value
})
return res.toString()
},
guaranteeRate(gua, money, auditmoney) {
let _money = money;
if (auditmoney && auditmoney > 0) _money = auditmoney;
if (gua && _money) return ((moneyRecovery(gua) / _money) * 100).toFixed(2)
},
async getDetailFundLog(id) {
let res = await detailFundLog({
id
})
this.registration = res
let res1 = await getFundLog({
page_size: 999,
contract_id: this.registration.contract.id
})
if (res1.data.length > 0) {
res1.data.map(item => {
this.beforeTotalMoney += Number(item.act_money)
})
this.beforeTotalMoney -= Number(this.registration.act_money)
} else {
this.beforeTotalMoney = 0
}
let nowIndex = res?.id
let idList = res1.data.map(item => {
return item.id
})
//
idList.sort((a, b) => {
return a - b;
})
console.log("nowIndex", nowIndex)
console.log("idList", idList)
this.payIndex = idList.indexOf(nowIndex) + 1
},
async print() {
let canvas = await html2canvas(this.$refs['printtable'], {
backgroundColor: null,
useCORS: true,
})
printJS({
printable: canvas.toDataURL(),
type: 'image',
documentTitle: '苏州市河道管理处资金划拨审批单',
style: '@page{margin:auto;}'
})
}
},
computed: {
dateFormat() {
return function(date) {
return parseTime(new Date(date))
}
},
priceFormat() {
return function(price) {
return Number(price).toFixed(2).replace(/(\d)(?=(\d{3})+\.)/g, '$1,')
}
}
}
}
</script>
<style scoped lang="scss">
.print-table1 {
box-sizing: border-box;
&-title {
font-size: 2vw;
letter-spacing: 2px;
text-align: center;
font-weight: 600;
border: none;
padding: 1.6vw 0;
}
&-subtitle {
display: flex;
align-items: center;
justify-content: space-between;
font-size: 2vw;
font-weight: 600;
span {
margin-left: 20px;
}
}
&-grid {
font-size: 1.75vw;
border: 1px #000 solid;
display: grid;
grid-template-rows: repeat(14, auto);
grid-template-columns: repeat(6, 1fr);
grid-template-areas:
"tb1-1 tb1-1 tb1-1 tb1-2 tb1-2 tb1-2"
"tb2-1 tb2-1 tb2-1 tb2-2 tb2-2 tb2-2"
"tb3-1 tb3-1 tb3-2 tb3-2 tb3-3 tb3-3"
"tb4-1 tb4-2 tb4-3 tb4-3 tb4-4 tb4-4"
"tb5-1 tb5-2 tb5-3 tb5-3 tb5-4 tb5-4"
"tb6-1 tb6-2 tb6-3 tb6-3 tb6-4 tb6-4"
"tb7-1 tb7-2 tb7-3 tb7-3 tb7-4 tb7-4"
"tb8-1 tb8-2 tb8-3 tb8-3 tb8-4 tb8-4"
"tb9-1 tb9-2 tb9-3 tb9-3 tb9-4 tb9-4"
"tb10-1 tb10-2 tb10-3 tb10-3 tb10-4 tb10-4"
"tb11-1 tb11-2 tb11-3 tb11-3 tb11-3 tb11-3"
"tb12 tb12 tb12 tb12 tb12 tb12"
"tb13-1 tb13-1 tb13-2 tb13-2 tb13-3 tb13-3"
"tb14-1 tb14-1 tb14-2 tb14-2 tb14-3 tb14-3";
&>div {
border: 1px #000 solid;
display: flex;
}
&-top {
padding: 0.4vw 0 3.6vw 0.4vw;
}
&-title1 {
text-align: center;
justify-content: center;
padding: 0.2vw 0;
}
&-center {
text-align: center;
justify-content: center;
align-items: center;
padding: 1vw 0;
}
&-bottom1 {
padding: 0.4vw 0 4vw 0.4vw;
}
&-bottom2 {
padding: 0.4vw 0 4vw 0.4vw;
}
&-bottom3 {
padding: 0.4vw 0 6vw 0.4vw;
}
}
}
.print-table2-grid {
font-size: 1.75vw;
border: 1px #000 solid;
display: grid;
// grid-template-rows: repeat(14, auto);
grid-auto-rows: minmax(min-content, max-content);
grid-template-columns: repeat(4, 1fr);
grid-template-areas:
"purpose amount claimant sign"
"purpose2 amount2 claimant2 sign2"
"purpose3 amount3 section-head sign3"
"purpose3-1 amount3-1 section-head-1 sign3-1"
"purpose4 amount4 audit sign4"
"purpose4-1 amount4-1 audit-1 sign4-1"
"purpose5 amount5 sub-lead sign5"
"purpose5-1 amount5-1 sub-lead-1 sign5-1"
"purpose6 amount6 fin-sub-lead sign6"
"purpose6-1 amount6-1 fin-sub-lead-1 sign6-1"
"total total1 approver sign7"
"total-capital total-capital1 approver-1 sign7-1";
&>div {
border: 1px #000 solid;
display: flex;
height: 45px;
}
.bmnone{
border-bottom:none
}
.btnone{
border-top:none
}
/* 用途说明 */
/* 用途说明 */
.purpose {
grid-area: purpose;
}
.purpose2 {
grid-area: purpose2;
}
.purpose3 {
grid-area: purpose3;
}
.purpose4 {
grid-area: purpose4;
}
.purpose5 {
grid-area: purpose5;
}
.purpose6 {
grid-area: purpose6;
}
.purpose3-1 {
grid-area: purpose3-1;
}
.purpose4-1 {
grid-area: purpose4-1;
}
.purpose5-1 {
grid-area: purpose5-1;
}
.purpose6-1 {
grid-area: purpose6-1;
}
/* 金额 */
.amount {
grid-area: amount;
}
.amount2 {
grid-area: amount2;
}
.amount3 {
grid-area: amount3;
}
.amount4 {
grid-area: amount4;
}
.amount5 {
grid-area: amount5;
}
.amount6 {
grid-area: amount6;
}
.amount3-1 {
grid-area: amount3-1;
}
.amount4 {
grid-area: amount4-1;
}
.amount5 {
grid-area: amount5-1;
}
.amount6 {
grid-area: amount6-1;
}
/* 报销(领款)人 */
.claimant {
grid-area: claimant;
}
.claimant2 {
grid-area: claimant2;
}
.sign {
grid-area: sign;
}
.sign2 {
grid-area: sign2;
}
.sign3 {
grid-area: sign3;
}
.sign4 {
grid-area: sign4;
}
.sign5 {
grid-area: sign5;
}
.sign6 {
grid-area: sign6;
}
.sign7 {
grid-area: sign7;
}
.sign3-1 {
grid-area: sign3-1;
}
.sign4-1 {
grid-area: sign4-1;
}
.sign5-1 {
grid-area: sign5-1;
}
.sign6-1 {
grid-area: sign6-1;
}
.sign7-1 {
grid-area: sign7-1;
}
/* 科室负责人 */
.section-head {
grid-area: section-head;
}
.section-head-1 {
grid-area: section-head-1;
}
/* 财审科审核 */
.audit {
grid-area: audit;
}
.audit-1 {
grid-area: audit-1;
}
/* 分管领导审核 */
.sub-lead {
grid-area: sub-lead;
}
.sub-lead-1 {
grid-area: sub-lead-1;
}
/* 财务分管领导审核 */
.fin-sub-lead {
grid-area: fin-sub-lead;
}
.fin-sub-lead-1 {
grid-area: fin-sub-lead-1;
}
/* 合计 */
.total {
grid-area: total;
}
.total1 {
grid-area: total1;
}
/* 报销金额(大写) */
.total-capital {
grid-area: total-capital;
}
.total-capital-1 {
grid-area: total-capital-1;
}
/* 单位负责人审批 */
.approver {
grid-area: approver;
}
.approver-1 {
grid-area: approver-1;
}
}
</style>

@ -688,7 +688,8 @@ export default {
plan_id: "",
plan_name: "请选择预算计划",
start_plan_price: undefined,
end_plan_price: undefined
end_plan_price: undefined,
},
type: [{
label: '服务',

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

@ -26,7 +26,7 @@ module.exports = {
* Detail: https://cli.vuejs.org/config/#publicpath
*/
publicPath: process.env.ENV === 'staging' ? '/admin_test' : '/admin',
outputDir: './dist',
outputDir: '/Users/mac/Documents/朗业/2025/h-苏州河道处/h-河道合同/contract-business-service/public/admin',
assetsDir: 'static',
lintOnSave: process.env.NODE_ENV === 'development',
productionSourceMap: false,

Loading…
Cancel
Save