master
cody 5 months ago
parent a7107b8568
commit 59bb0684da

Binary file not shown.

@ -11,11 +11,11 @@ function customParamsSerializer(params) {
});
} else {
// 其他数组(如 filter假设是对象数组
params[key].forEach((item,index) => {
params[key].forEach((item,index) => {
if (item && typeof item === 'object' && item.key !== undefined) {
result += `${key}[${index}][key]=${item.key}&${key}[${index}][op]=${item.op}&${key}[${index}][value]=${item.value}&`;
result += `${key}[${index}][key]=${item.key}&${key}[${index}][op]=${item.op}&${key}[${index}][value]=${item.value}&`;
}
});
});
}
} else {
result += `${key}=${params[key]}&`;

@ -98,20 +98,20 @@ export class CreateDialog {
if (info.edit_input === "checkbox" || info.edit_input === "radio") {
return info._params && info._params instanceof Array
? info._params.map((i) =>
h("el-option", {
props: {
label:
i.name ||
i.mingcheng ||
i.label ||
i.key ||
i.value ||
i.id ||
i.no,
value: i.id || i.value,
},
})
)
h("el-option", {
props: {
label:
i.name ||
i.mingcheng ||
i.label ||
i.key ||
i.value ||
i.id ||
i.no,
value: i.id || i.value,
},
})
)
: [];
}
if (info.edit_input === "file" || info.edit_input === "files") {
@ -227,14 +227,28 @@ export class CreateDialog {
e
) => {
if (i.field) {
// 如果是金额字段,先进行数字过滤
let finalValue = e;
const amountKeywords = ['元'];
const isAmountField = amountKeywords.some(keyword => i.name && i.name.includes(keyword));
if (isAmountField && (i.edit_input === "text" || i.edit_input === "textarea")) {
// 只允许数字和小数点
const numericValue = String(e).replace(/[^\d.]/g, '');
// 确保只有一个小数点
const parts = numericValue.split('.');
finalValue = parts.length > 2
? parts[0] + '.' + parts.slice(1).join('')
: numericValue;
}
if (this.options.fromData) {
that[this.options.fromData][i.field] = e;
that[this.options.fromData][i.field] = finalValue;
that[this.options.fromData] = Object.assign(
{},
that[this.options.fromData]
);
} else {
that.form[i.field] = e;
that.form[i.field] = finalValue;
that.form = Object.assign(
{},
that.form
@ -245,7 +259,7 @@ export class CreateDialog {
},
scopedSlots:
i.edit_input === "file" ||
i.edit_input === "files"
i.edit_input === "files"
? {
file: (scope) => {
let { file } = scope;
@ -255,95 +269,95 @@ export class CreateDialog {
display: 'flex',
'align-items': 'center'
}
},[h("div", {
}, [h("div", {
style: {
'margin-right': "auto"
}
}, [
h("i", {
h("i", {
class: {
"el-icon-circle-check":
file.status ===
"success",
"el-icon-loading":
file.status ===
"uploading",
},
style: {
color:
file.status ===
"success"
? "green"
: "",
},
}),
h(
"a",
{
attrs: {
href: file.url,
download: file.name,
target: "_blank",
},
class: {
"el-icon-circle-check":
"uploaded-a":
file.status ===
"success",
"el-icon-loading":
file.status ===
"uploading",
},
style: {
color:
file.status ===
"success"
? "green"
: "",
},
}),
h(
"a",
{
attrs: {
href: file.url,
download: file.name,
target: "_blank",
},
class: {
"uploaded-a":
file.status ===
"success",
},
style: {
padding: "0 4px",
color: file.status ===
padding: "0 4px",
color: file.status ===
"success"
? "green"
: "",
},
? "green"
: "",
},
file.original_name || file.name
),
]),
h("div",{
},
file.original_name || file.name
),
]),
h("div", {
style: {
"margin-right": "32px",
'display': file.status === 'success' ? 'block' : 'none'
}
}, [
h("i", {
class: "el-icon-view",
style: {
"margin-right": "32px",
'display': file.status === 'success' ? 'block' : 'none'
}
},[
h("i",{
class: "el-icon-view",
style: {
'cursor': 'pointer',
'margin-right': '12px'
},
on: {
['click']: _ => {
that.$bus.$emit('online-file', file.url)
}
}
}),
h("i",{
class: "el-icon-download",
style: {
'cursor': 'pointer'
},
on: {
['click']: _ => {
download(file.url)
}
'cursor': 'pointer',
'margin-right': '12px'
},
on: {
['click']: _ => {
that.$bus.$emit('online-file', file.url)
}
})
]),
}
}),
h("i", {
class: "el-icon-close",
class: "el-icon-download",
style: {
"display": this.options.disabled ? "none" : "inline"
'cursor': 'pointer'
},
on: {
["click"]: () =>
this.fileRemoveHandler(
file,
i.field
),
},
})])
['click']: _ => {
download(file.url)
}
}
})
]),
h("i", {
class: "el-icon-close",
style: {
"display": this.options.disabled ? "none" : "inline"
},
on: {
["click"]: () =>
this.fileRemoveHandler(
file,
i.field
),
},
})])
];
},
}
@ -361,7 +375,7 @@ export class CreateDialog {
let info = that.formInfo.find((i) => i.field === replace.key);
if (!info) {
if (replace.label) {
dom.splice(replace.sort??dom.length,0,
dom.splice(replace.sort ?? dom.length, 0,
h(
"el-form-item",
{
@ -379,7 +393,7 @@ export class CreateDialog {
)
)
} else {
dom.splice(replace.sort??dom.length,0,replace.render)
dom.splice(replace.sort ?? dom.length, 0, replace.render)
}
}
});
@ -396,8 +410,8 @@ export class CreateDialog {
title: that.title
? that.title
: that.type === "add"
? "新增"
: "编辑",
? "新增"
: "编辑",
visible: that.dialogVisible,
width: this.options?.width ? this.options.width : "800px",
"close-on-click-modal": false,
@ -466,9 +480,9 @@ export class CreateDialog {
),
]),
]
) : h('div',[
) : h('div', [
formRender,
h('div', { style: "display: flex;justify-content: center;" },[
h('div', { style: "display: flex;justify-content: center;" }, [
h(
"el-button",
{

@ -288,7 +288,7 @@ import { op } from "@/const/op";
import { download } from "@/utils/downloadRequest";
import { getparameter } from "@/api/system/dictionary";
import { show } from "@/api/system/customForm";
import * as XLSX from "xlsx";
import * as XLSX from "xlsx-js-style";
import { saveAs } from "file-saver";
import { listdept } from "@/api/system/department"
@ -344,118 +344,306 @@ export default {
};
},
//
isNumericField(field, fieldName) {
if (!field) return false;
//
if (field.edit_input === 'number' ||
field.type === 'number' ||
field.type === 'integer' ||
field.type === 'decimal' ||
field.type === 'float') {
return true;
}
//
const numericKeywords = ['面积', '值', '金额', '价格', '费用', '成本', '数量', '元', '万元', '平方米', 'm²', '㎡', '单价', '缴税', '征收', '剩余', '评估'];
if (fieldName) {
for (let keyword of numericKeywords) {
if (fieldName.includes(keyword)) {
return true;
}
}
}
return false;
},
async exportExcel(sheetName) {
let filterTableColumns = this.$refs['xyTable']?.tableFormat || []
const res = await index(
Object.assign(this.select, { page: 1, page_size: 9999 })
);
if (res.data) {
let headers = filterTableColumns.filter(i => !!i.prop).map((i) => {
let headers = filterTableColumns.filter(i => !!i.prop && i.prop !== 'assets').map((i) => {
// form
const fieldConfig = this.form.find(f => f.field === i.prop);
return {
key: i.prop,
title: i.label,
isNumber: this.isNumericField(fieldConfig, i.label)
};
});
// headers
headers.push({
key: 'admin.name',
title: '提交人'
title: '提交人',
isNumber: false
});
headers.push({
key: 'department.name',
title: '提交单位'
title: '提交单位',
isNumber: false
});
headers.push({
key: 'created_at',
title: '创建时间'
title: '创建时间',
isNumber: false
});
//
const assetHeaders = [
{ title: '资产名称', isNumber: false },
{ title: '分类', isNumber: false },
{ title: '坐落', isNumber: false },
{ title: '详细位置', isNumber: false },
{ title: '实际面积', isNumber: true },
{ title: '本次调整面积', isNumber: true },
{ title: '调整后面积', isNumber: true }
];
let data = []
let merges = []
let rowIndex = 0
res.data.forEach((row, rindex) => {
let myRow = headers.map((header) => {
let value;
//
if (header.key === 'admin.name') {
return row['admin']?.name || '';
value = row['admin']?.name || '';
} else if (header.key === 'department.name') {
value = row['department']?.name || '';
} else if (header.key === 'created_at') {
value = row['created_at'] ? this.$moment(row['created_at']).format('YYYY-MM-DD HH:mm:ss') : '';
} else {
const i = this.form.find(i => i.field === header.key)
if (i && i._relations) {
let { link_relation, foreign_key, link_with_name } = i._relations;
if (link_relation === "newHasOne" || link_relation === "hasOne") {
value = row[link_with_name]?.original_name || row[link_with_name]?.name ||
row[link_with_name]?.no ||
row[link_with_name]?.value
} else if (link_relation === "hasMany" || link_relation === "newHasMany") {
value = row[link_with_name]?.map((o) => (
o?.name ||
o?.no ||
o?.value ||
o?.biaoti ||
o?.mingcheng
)).toString()
} else {
value = row[header.key]
}
} else {
if (this.table.find(i => i.prop === header.key)?.formatter) {
value = this.table.find(i => i.prop === header.key).formatter(row, {}, row[header.key], rindex)
} else {
value = row[header.key]
}
}
}
if (header.key === 'department.name') {
return row['department']?.name || '';
//
if (header.isNumber && value !== null && value !== undefined && value !== '') {
let numValue;
if (typeof value === 'string') {
const cleanedValue = value.toString().replace(/[元万元m²㎡\s,/天]/g, '').trim();
numValue = Number(cleanedValue);
} else {
numValue = Number(value);
}
if (!isNaN(numValue) && numValue !== '') {
return numValue;
}
}
if (header.key === 'created_at') {
return row['created_at'] ? this.$moment(row['created_at']).format('YYYY-MM-DD HH:mm:ss') : '';
return value;
})
//
const getAssetData = (myAssetLink) => {
let myAsset = {}
if (myAssetLink.land_id) {
myAsset = myAssetLink['lands'] || {}
} else if (myAssetLink.house_id) {
myAsset = myAssetLink['house'] || {}
}
const i = this.form.find(i => i.field === header.key)
if (i && i._relations) {
let { link_relation, foreign_key, link_with_name } = i._relations;
if (link_relation === "newHasOne" || link_relation === "hasOne") {
return row[link_with_name]?.original_name || row[link_with_name]?.name ||
row[link_with_name]?.no ||
row[link_with_name]?.value
//
let assetType = '资产';
if (myAssetLink.house_id) {
assetType = '房产';
} else if (myAssetLink.land_id) {
assetType = '土地';
} else if (myAssetLink.biaodileixing) {
assetType = myAssetLink.biaodileixing;
}
//
let shijimianji = 0;
if (myAsset.shijimianji !== null && myAsset.shijimianji !== undefined && myAsset.shijimianji !== '') {
if (typeof myAsset.shijimianji === 'string') {
const cleaned = myAsset.shijimianji.toString().replace(/[元万元m²㎡\s,/天]/g, '').trim();
shijimianji = Number(cleaned) || 0;
} else {
shijimianji = Number(myAsset.shijimianji) || 0;
}
if (link_relation === "hasMany" || link_relation === "newHasMany") {
return row[link_with_name]?.map((o) => (
o?.name ||
o?.no ||
o?.value ||
o?.biaoti ||
o?.mingcheng
)).toString()
}
let bencizhengshoumianji = 0;
if (myAssetLink.bencizhengshoumianji !== null && myAssetLink.bencizhengshoumianji !== undefined && myAssetLink.bencizhengshoumianji !== '') {
if (typeof myAssetLink.bencizhengshoumianji === 'string') {
const cleaned = myAssetLink.bencizhengshoumianji.toString().replace(/[元万元m²㎡\s,/天]/g, '').trim();
bencizhengshoumianji = Number(cleaned) || 0;
} else {
bencizhengshoumianji = Number(myAssetLink.bencizhengshoumianji) || 0;
}
}
if (this.table.find(i => i.prop === header.key)?.formatter) {
return this.table.find(i => i.prop === header.key).formatter(row, {}, row[header.key], rindex)
let zichanshengyumianji = 0;
if (myAssetLink.zichanshengyumianji !== null && myAssetLink.zichanshengyumianji !== undefined && myAssetLink.zichanshengyumianji !== '') {
if (typeof myAssetLink.zichanshengyumianji === 'string') {
const cleaned = myAssetLink.zichanshengyumianji.toString().replace(/[元万元m²㎡\s,/天]/g, '').trim();
zichanshengyumianji = Number(cleaned) || 0;
} else {
zichanshengyumianji = Number(myAssetLink.zichanshengyumianji) || 0;
}
}
return row[header.key]
})
if (row['asset_handles_to_assets'].length > 0) {
for (let j = 0;j<row['asset_handles_to_assets'].length;j++) {
let myAssetLink = row['asset_handles_to_assets'][j]
let myAsset = {}
if (myAssetLink.land_id) {
myAsset = myAssetLink['lands']
} else if (myAssetLink.house_id) {
myAsset = myAssetLink['house']
return [
myAsset.name || myAssetLink.name || '',
assetType,
myAsset.zuoluo || myAssetLink.zuoluo || '',
myAsset.xiangxiweizhi || myAssetLink.xiangxiweizhi || '',
shijimianji,
bencizhengshoumianji,
zichanshengyumianji
];
};
if (row['asset_handles_to_assets'] && row['asset_handles_to_assets'].length > 0) {
// 0
const startRowIndex = data.length;
//
let firstAssetData = getAssetData(row['asset_handles_to_assets'][0]);
const mainRowWithAssets = [...myRow, ...firstAssetData];
data.push(mainRowWithAssets);
//
if (row['asset_handles_to_assets'].length > 1) {
for (let j = 1; j < row['asset_handles_to_assets'].length; j++) {
const assetRow = headers.map(() => ''); //
const assetData = getAssetData(row['asset_handles_to_assets'][j]);
data.push([...assetRow, ...assetData]);
}
data.push([...myRow,myAsset.name,myAssetLink.bencizhengshoumianji,myAssetLink.zichanshengyumianji])
}
if (headers.length > 0) {
for (let q = 0;q < headers.length;q ++) {
// +
if (row['asset_handles_to_assets'].length > 1) {
const endRowIndex = data.length - 1; //
headers.forEach((header, colIndex) => {
merges.push({
s: {
r: rowIndex + 1,
c: q
},
e: {
r: rowIndex + 1 + row['asset_handles_to_assets'].length - 1,
c: q
}
})
}
s: { r: startRowIndex + 1, c: colIndex }, // +1
e: { r: endRowIndex + 1, c: colIndex } // +1
});
});
}
rowIndex += row['asset_handles_to_assets'].length
} else {
//
const emptyAssetData = assetHeaders.map(() => '');
data.push([...myRow, ...emptyAssetData]);
rowIndex++
data.push(myRow)
}
});
headers.push({
title: '资产名称'
})
headers.push({
title: '本次征收面积'
})
headers.push({
title: '资产剩余面积'
})
headers.push(...assetHeaders)
data.unshift(headers.map((header) => header.title));
const wb = XLSX.utils.book_new();
const ws = XLSX.utils.aoa_to_sheet(data);
ws['!merges'] = merges
//
const range = XLSX.utils.decode_range(ws['!ref']);
for (let R = 1; R <= range.e.r; R++) { // R=0
for (let C = 0; C <= range.e.c; C++) {
const cellAddress = XLSX.utils.encode_cell({ r: R, c: C });
if (!ws[cellAddress]) continue;
const header = headers[C];
// 使 headerStyle使 cellStyle
if (R === 0) {
//
ws[cellAddress].s = {
fill: { fgColor: { rgb: "E6E6FA" } },
font: { bold: true, sz: 12 },
alignment: { horizontal: "center", vertical: "center" },
border: {
top: { style: "thin" },
bottom: { style: "thin" },
left: { style: "thin" },
right: { style: "thin" }
}
};
} else {
//
ws[cellAddress].s = {
alignment: { horizontal: "center", vertical: "center" },
border: {
top: { style: "thin" },
bottom: { style: "thin" },
left: { style: "thin" },
right: { style: "thin" }
}
};
}
//
if (header && header.isNumber && R > 0) {
const cell = ws[cellAddress];
let numValue;
//
if (typeof cell.v === 'string') {
const cleanedValue = cell.v.toString().replace(/[元万元m²㎡\s,/天]/g, '').trim();
numValue = Number(cleanedValue);
} else {
numValue = Number(cell.v);
}
if (!isNaN(numValue) && cell.v !== null && cell.v !== undefined && cell.v !== '') {
cell.t = 'n'; //
cell.v = numValue; //
//
if (header.title && (header.title.includes('面积') || header.title.includes('m²') || header.title.includes('㎡'))) {
cell.z = '#,##0.00'; // 2
} else if (header.title && (header.title.includes('值') || header.title.includes('金额') || header.title.includes('元') || header.title.includes('单价') || header.title.includes('评估'))) {
cell.z = '#,##0.00'; // 2
} else {
cell.z = '#,##0'; //
}
}
}
}
}
//
ws['!cols'] = headers.map(() => ({ wch: 15 }));
XLSX.utils.book_append_sheet(wb, ws, sheetName);
const wbout = XLSX.write(wb, {
bookType: "xlsx",
@ -667,30 +855,136 @@ export default {
this.table.unshift( {
label: "资产",
prop: 'assets',
width: 300,
width: 320,
align: 'left',
customFn: row => {
let tags = row.asset_handles_to_assets?.map(i => (
<Tag color="success" style="background: rgb(65, 100, 227) !important;">{(i.land_id ? '【土地】' : '【房产】')+(i.lands?.name || i.house?.name)}</Tag>
))
if (!row.asset_handles_to_assets || row.asset_handles_to_assets.length === 0) {
return <span>-</span>
}
// house_id land_id biaodileixing
const getAssetType = (item) => {
if (item.house_id) return '房产'
if (item.land_id) return '土地'
if (item.biaodileixing) return item.biaodileixing
return '资产'
}
//
const getAssetInfo = (item) => {
let asset = {}
if (item.land_id) {
asset = item.lands || {}
} else if (item.house_id) {
asset = item.house || {}
}
return asset
}
let tags = row.asset_handles_to_assets.slice(0, 1).map(i => {
const assetType = getAssetType(i)
const asset = getAssetInfo(i)
const assetName = asset.name || i.name || " "
const detailLocation = asset.xiangxiweizhi || i.xiangxiweizhi || ""
return (
<Tag color="success" style="background: rgb(65, 100, 227) !important;">
{assetType}{assetName}{detailLocation ? '-' + detailLocation : ''}
</Tag>
)
})
return (
<div>
{
tags.slice(0, 1)
tags
}
<el-popover title="资产名称" width={200}>
<el-link slot="reference"
type="primary"
style={{
"word-break": "keep-all",
display: tags.length > 1 ? "inline" : "none",
}}>更多</el-link>
<div slot="default">
{
tags
}
</div>
</el-popover>
{row.asset_handles_to_assets.length > 1 && [
<br key="br"></br>,
<el-popover key="popover" title="资产" width={1000}>
<el-link slot="reference"
type="primary"
style={{
"font-size": "13px",
"word-break": "keep-all",
display: "inline",
}}>更多</el-link>
<div slot="default">
<Table size="small"
data={row.asset_handles_to_assets}
columns={[
{
title: '资产名称',
key: 'name',
width: 180,
render: (h, { row: myRow }) => {
const asset = getAssetInfo(myRow)
return h('span', asset.name || myRow.name || " ")
}
},
{
title: '分类',
key: 'type',
width: 100,
render: (h, { row: myRow }) => {
let type = '资产'
if (myRow.house_id) {
type = '房产'
} else if (myRow.land_id) {
type = '土地'
} else if (myRow.biaodileixing) {
type = myRow.biaodileixing
}
return h('span', type)
}
},
{
title: '坐落',
key: 'zuoluo',
minWidth: 200,
render: (h, { row: myRow }) => {
const asset = getAssetInfo(myRow)
return h('span', asset.zuoluo || myRow.zuoluo || " ")
}
},
{
title: '详细位置',
key: 'xiangxiweizhi',
minWidth: 200,
render: (h, { row: myRow }) => {
const asset = getAssetInfo(myRow)
return h('span', asset.xiangxiweizhi || myRow.xiangxiweizhi || " ")
}
},
{
title: '实际面积',
key: 'shijimianji',
width: 140,
render: (h, { row: myRow }) => {
const asset = getAssetInfo(myRow)
return h('span', asset.shijimianji || myRow.shijimianji || "0")
}
},
{
title: '本次调整面积',
key: 'bencizhengshoumianji',
width: 140,
render: (h, { row: myRow }) => {
return h('span', myRow.bencizhengshoumianji || "0")
}
},
{
title: '调整后面积',
key: 'zichanshengyumianji',
width: 140,
render: (h, { row: myRow }) => {
return h('span', myRow.zichanshengyumianji || "0")
}
},
]}>
</Table>
</div>
</el-popover>
]}
</div>
)
}

@ -553,7 +553,7 @@ export default {
return false;
},
async exportExcel(sheetName) {
let filterTableColumns = this.$refs['xyTable']?.tableFormat || []
const res = await index(
@ -596,39 +596,39 @@ export default {
} else if (header.key === 'created_at') {
value = row['created_at'] ? this.$moment(row['created_at']).format('YYYY-MM-DD HH:mm:ss') : '';
} else {
const i = this.form.find(i => i.field === header.key)
//if (i.edit_input === 'file' || i.edit_input === 'files') return ''
// if (
// i.select_item &&
// typeof i.select_item === "object" &&
// !(i.select_item instanceof Array)
// ) {
// let keys = Object.keys(i.select_item);
// let paramMap = new Map();
// keys.forEach((key) => {
// paramMap.set(i.select_item[key], key);
// });
// return paramMap.get(row[i.field]?.toString());
// }
const i = this.form.find(i => i.field === header.key)
//if (i.edit_input === 'file' || i.edit_input === 'files') return ''
// if (
// i.select_item &&
// typeof i.select_item === "object" &&
// !(i.select_item instanceof Array)
// ) {
// let keys = Object.keys(i.select_item);
// let paramMap = new Map();
// keys.forEach((key) => {
// paramMap.set(i.select_item[key], key);
// });
// return paramMap.get(row[i.field]?.toString());
// }
if (i && i._relations) {
let { link_relation, foreign_key, link_with_name } = i._relations;
if (link_relation === "newHasOne" || link_relation === "hasOne") {
let { link_relation, foreign_key, link_with_name } = i._relations;
if (link_relation === "newHasOne" || link_relation === "hasOne") {
value = row[link_with_name]?.original_name || row[link_with_name]?.name ||
row[link_with_name]?.no ||
row[link_with_name]?.value
row[link_with_name]?.no ||
row[link_with_name]?.value
} else if (link_relation === "hasMany" || link_relation === "newHasMany") {
value = row[link_with_name]?.map((o) => (
o?.name ||
o?.no ||
o?.value ||
o?.biaoti ||
o?.mingcheng
)).toString()
o?.name ||
o?.no ||
o?.value ||
o?.biaoti ||
o?.mingcheng
)).toString()
} else {
value = row[header.key]
}
}
} else {
if (this.table.find(i => i.prop === header.key)?.formatter) {
if (this.table.find(i => i.prop === header.key)?.formatter) {
value = this.table.find(i => i.prop === header.key).formatter(row, {}, row[header.key])
} else {
value = row[header.key]

@ -532,7 +532,7 @@ export default {
return false;
},
async exportExcel(sheetName) {
let filterTableColumns = this.$refs['xyTable']?.tableFormat || []
const res = await index(
@ -575,39 +575,39 @@ export default {
} else if (header.key === 'created_at') {
value = row['created_at'] ? this.$moment(row['created_at']).format('YYYY-MM-DD HH:mm:ss') : '';
} else {
const i = this.form.find(i => i.field === header.key)
//if (i.edit_input === 'file' || i.edit_input === 'files') return ''
// if (
// i.select_item &&
// typeof i.select_item === "object" &&
// !(i.select_item instanceof Array)
// ) {
// let keys = Object.keys(i.select_item);
// let paramMap = new Map();
// keys.forEach((key) => {
// paramMap.set(i.select_item[key], key);
// });
// return paramMap.get(row[i.field]?.toString());
// }
const i = this.form.find(i => i.field === header.key)
//if (i.edit_input === 'file' || i.edit_input === 'files') return ''
// if (
// i.select_item &&
// typeof i.select_item === "object" &&
// !(i.select_item instanceof Array)
// ) {
// let keys = Object.keys(i.select_item);
// let paramMap = new Map();
// keys.forEach((key) => {
// paramMap.set(i.select_item[key], key);
// });
// return paramMap.get(row[i.field]?.toString());
// }
if (i && i._relations) {
let { link_relation, foreign_key, link_with_name } = i._relations;
if (link_relation === "newHasOne" || link_relation === "hasOne") {
let { link_relation, foreign_key, link_with_name } = i._relations;
if (link_relation === "newHasOne" || link_relation === "hasOne") {
value = row[link_with_name]?.original_name || row[link_with_name]?.name ||
row[link_with_name]?.no ||
row[link_with_name]?.value
row[link_with_name]?.no ||
row[link_with_name]?.value
} else if (link_relation === "hasMany" || link_relation === "newHasMany") {
value = row[link_with_name]?.map((o) => (
o?.name ||
o?.no ||
o?.value ||
o?.biaoti ||
o?.mingcheng
)).toString()
o?.name ||
o?.no ||
o?.value ||
o?.biaoti ||
o?.mingcheng
)).toString()
} else {
value = row[header.key]
}
}
} else {
if (this.table.find(i => i.prop === header.key)?.formatter) {
if (this.table.find(i => i.prop === header.key)?.formatter) {
value = this.table.find(i => i.prop === header.key).formatter(row, {}, row[header.key])
} else {
value = row[header.key]

@ -972,7 +972,7 @@ export default {
tags.slice(0, 1)
}
<br></br>
<el-popover title="资产" width={600}>
<el-popover title="资产" width={1000}>
<el-link slot="reference"
type="primary"
style={{
@ -980,45 +980,73 @@ export default {
"word-break": "keep-all",
display: tags.length > 0 ? "inline" : "none",
}}>更多</el-link>
<div slot="default">
<Table size="small"
data={row.id_leases_to_assets_lease_id_relation}
columns={[
{
title: '资产名称',
key: 'name',
width: 180,
render: (h, { row: myRow }) => {
let asset = myRow.house_id ? row.houses.find(j => j.id === myRow.house_id) : row.land.find(j => j.id === myRow.land_id)
return h('span', (asset?.name || myRow.name || " "))
}
},
{
title: '坐落',
key: 'zuoluo',
minWidth: 200,
render: (h, { row: myRow }) => {
let asset = myRow.house_id ? row.houses.find(j => j.id === myRow.house_id) : row.land.find(j => j.id === myRow.land_id)
return h('span', (asset?.zuoluo || myRow.zuoluo || " "))
}
},
{
title: '详细位置',
key: 'xiangxiweizhi',
minWidth: 200
},
{
title: '出租面积',
key: 'chuzumianji',
width: 180,
render: (h, { row: myRow }) => {
let asset = myRow.house_id ? row.houses.find(j => j.id === myRow.house_id) : row.land.find(j => j.id === myRow.land_id)
return h('span', (asset?.chuzumianji || myRow.chuzumianji || " "))
}
},
]}>
</Table>
</div>
<div slot="default">
<Table size="small"
data={row.id_leases_to_assets_lease_id_relation}
columns={[
{
title: '资产名称',
key: 'name',
width: 180,
render: (h, { row: myRow }) => {
let asset = myRow.house_id ? row.houses.find(j => j.id === myRow.house_id) : row.land.find(j => j.id === myRow.land_id)
return h('span', (asset?.name || myRow.name || " "))
}
},
{
title: '分类',
key: 'type',
width: 100,
render: (h, { row: myRow }) => {
let type = '资产'
if (myRow.house_id) {
type = '房产'
} else if (myRow.land_id) {
type = '土地'
} else if (myRow.biaodileixing) {
type = myRow.biaodileixing
}
return h('span', type)
}
},
{
title: '坐落',
key: 'zuoluo',
minWidth: 200,
render: (h, { row: myRow }) => {
let asset = myRow.house_id ? row.houses.find(j => j.id === myRow.house_id) : row.land.find(j => j.id === myRow.land_id)
return h('span', (asset?.zuoluo || myRow.zuoluo || " "))
}
},
{
title: '详细位置',
key: 'xiangxiweizhi',
minWidth: 200,
render: (h, { row: myRow }) => {
return h('span', myRow.xiangxiweizhi || " ")
}
},
{
title: '实际面积',
key: 'shijimianji',
width: 140,
render: (h, { row: myRow }) => {
let asset = myRow.house_id ? row.houses.find(j => j.id === myRow.house_id) : row.land.find(j => j.id === myRow.land_id)
return h('span', (asset?.shijimianji || myRow.shijimianji || "0"))
}
},
{
title: '出租面积',
key: 'chuzumianji',
width: 140,
render: (h, { row: myRow }) => {
let asset = myRow.house_id ? row.houses.find(j => j.id === myRow.house_id) : row.land.find(j => j.id === myRow.land_id)
return h('span', (asset?.chuzumianji || myRow.chuzumianji || "0"))
}
},
]}>
</Table>
</div>
</el-popover>
</div>
)

@ -465,7 +465,7 @@ export default {
const fileName = '招租管理' + this.$moment().format('YYYY-MM-DD');
this.exportExcel(fileName);
},
async exportExcel(sheetName) {
let filterTableColumns = this.$refs['xyTable']?.tableFormat || []
const res = await index(

@ -311,7 +311,7 @@
<template #export>
<Button
type="primary"
@click="exportExcel(new Date().getTime().toString())"
@click="handleExport"
>导出</Button
>
</template>
@ -380,7 +380,7 @@ import { op } from "@/const/op";
import { download } from "@/utils/downloadRequest";
import { getparameter } from "@/api/system/dictionary";
import { show } from "@/api/system/customForm";
import * as XLSX from "xlsx";
import * as XLSX from "xlsx-js-style";
import { saveAs } from "file-saver";
import { listdept } from "@/api/system/department"
@ -448,23 +448,304 @@ export default {
this.dateRangeEnd0 = null;
},
handleExport() {
const fileName = '租赁计划' + this.$moment().format('YYYY-MM-DD');
this.exportExcel(fileName);
},
//
isNumericField(field, fieldName) {
if (!field) return false;
//
if (field.edit_input === 'number' ||
field.type === 'number' ||
field.type === 'integer' ||
field.type === 'decimal' ||
field.type === 'float') {
return true;
}
//
const numericKeywords = ['面积', '值', '金额', '价格', '费用', '成本', '数量', '元', '万元', '平方米', 'm²', '㎡', '单价', '缴税', '租金', '免租期', '天', '底价', '评估', '到账', '应收'];
if (fieldName) {
for (let keyword of numericKeywords) {
if (fieldName.includes(keyword)) {
return true;
}
}
}
return false;
},
async exportExcel(sheetName) {
let filterTableColumns = this.$refs['xyTable']?.tableFormat || []
const res = await index(
Object.assign(this.select, { page: 1, page_size: 9999 })
);
if (res.data) {
let headers = this.form.map((i) => {
//
let baseHeaders = filterTableColumns.filter(i => !!i.prop && i.prop !== 'assets').map((i) => {
// form
const fieldConfig = this.form.find(f => f.field === i.prop);
return {
key: i.field,
title: i.name,
key: i.prop,
title: i.label,
isNumber: this.isNumericField(fieldConfig, i.label)
};
});
const data = res.data.map((row) =>
headers.map((header) => row[header.key])
);
// headers
baseHeaders.push({
key: 'admin.name',
title: '提交人',
isNumber: false
});
baseHeaders.push({
key: 'department.name',
title: '提交单位',
isNumber: false
});
baseHeaders.push({
key: 'created_at',
title: '创建时间',
isNumber: false
});
//
const assetHeaders = [
{ key: 'asset_name', title: '资产名称', isNumber: false },
{ key: 'asset_type', title: '分类', isNumber: false },
{ key: 'asset_zuoluo', title: '坐落', isNumber: false },
{ key: 'asset_xiangxiweizhi', title: '详细位置', isNumber: false },
{ key: 'asset_shijimianji', title: '实际面积', isNumber: true },
{ key: 'asset_chuzumianji', title: '出租面积', isNumber: true }
];
// headers +
const headers = [...baseHeaders, ...assetHeaders];
//
const data = [];
const merges = []; //
res.data.forEach((row, rowIndex) => {
// land houses
const allAssets = [
...(row?.land || []).map(i => ({ ...i, assetType: '土地' })),
...(row?.houses || []).map(i => ({ ...i, assetType: '房产' }))
];
const assetCount = Math.max(1, allAssets.length); // 1
// 0
const startRowIndex = data.length;
//
const mainRow = baseHeaders.map((header) => {
let value;
//
if (header.key === 'admin.name') {
value = row['admin']?.name || '';
} else if (header.key === 'department.name') {
value = row['department']?.name || '';
} else if (header.key === 'created_at') {
value = row['created_at'] ? this.$moment(row['created_at']).format('YYYY-MM-DD HH:mm:ss') : '';
} else if (header.key === 'chengzufang') {
//
value = row.lease_id_leases_id_relation?.chengzufang || '';
} else if (header.key === 'chuzufang') {
//
value = row.lease_id_leases_id_relation?.chuzufang || '';
} else {
value = row[header.key];
}
//
if (header.isNumber && value !== null && value !== undefined && value !== '') {
let numValue;
if (typeof value === 'string') {
const cleanedValue = value.toString().replace(/[元万元m²㎡\s,/天]/g, '').trim();
numValue = Number(cleanedValue);
} else {
numValue = Number(value);
}
if (!isNaN(numValue) && numValue !== '') {
return numValue;
}
}
return value;
});
//
const getAssetData = (asset) => {
//
let assetType = '资产';
if (asset.assetType) {
assetType = asset.assetType;
} else if (asset.house_id) {
assetType = '房产';
} else if (asset.land_id) {
assetType = '土地';
} else if (asset.biaodileixing) {
assetType = asset.biaodileixing;
}
//
let shijimianji = 0;
if (asset.shijimianji !== null && asset.shijimianji !== undefined && asset.shijimianji !== '') {
if (typeof asset.shijimianji === 'string') {
const cleaned = asset.shijimianji.toString().replace(/[元万元m²㎡\s,/天]/g, '').trim();
shijimianji = Number(cleaned) || 0;
} else {
shijimianji = Number(asset.shijimianji) || 0;
}
}
let chuzumianji = 0;
if (asset.chuzumianji !== null && asset.chuzumianji !== undefined && asset.chuzumianji !== '') {
if (typeof asset.chuzumianji === 'string') {
const cleaned = asset.chuzumianji.toString().replace(/[元万元m²㎡\s,/天]/g, '').trim();
chuzumianji = Number(cleaned) || 0;
} else {
chuzumianji = Number(asset.chuzumianji) || 0;
}
}
//
return [
asset.name || '',
assetType,
asset.zuoluo || '',
asset.xiangxiweizhi || '',
shijimianji,
chuzumianji
];
};
//
let firstAssetData = allAssets.length > 0 ? getAssetData(allAssets[0]) : assetHeaders.map(() => '');
const mainRowWithAssets = [...mainRow, ...firstAssetData];
data.push(mainRowWithAssets);
//
if (allAssets.length > 1) {
for (let i = 1; i < allAssets.length; i++) {
const assetRow = baseHeaders.map(() => ''); //
const assetData = getAssetData(allAssets[i]);
data.push([...assetRow, ...assetData]);
}
} else if (allAssets.length === 0) {
//
const emptyAssetRow = baseHeaders.map(() => '');
const emptyAssetData = assetHeaders.map(() => '');
data.push([...emptyAssetRow, ...emptyAssetData]);
}
// +
if (assetCount > 1) {
const endRowIndex = data.length - 1; //
baseHeaders.forEach((header, colIndex) => {
merges.push({
s: { r: startRowIndex + 1, c: colIndex }, // +1
e: { r: endRowIndex + 1, c: colIndex } // +1
});
});
}
});
//
data.unshift(headers.map((header) => header.title));
const wb = XLSX.utils.book_new();
const ws = XLSX.utils.aoa_to_sheet(data);
//
if (merges.length > 0) {
ws['!merges'] = merges;
}
//
const headerStyle = {
font: { bold: true, color: { rgb: "FFFFFF" } },
fill: { fgColor: { rgb: "4472C4" } }, //
alignment: { horizontal: "center", vertical: "center" },
border: {
top: { style: "thin", color: { rgb: "000000" } },
bottom: { style: "thin", color: { rgb: "000000" } },
left: { style: "thin", color: { rgb: "000000" } },
right: { style: "thin", color: { rgb: "000000" } }
}
};
const cellStyle = {
alignment: { horizontal: "center", vertical: "center" },
border: {
top: { style: "thin", color: { rgb: "000000" } },
bottom: { style: "thin", color: { rgb: "000000" } },
left: { style: "thin", color: { rgb: "000000" } },
right: { style: "thin", color: { rgb: "000000" } }
}
};
//
const range = XLSX.utils.decode_range(ws['!ref']);
for (let R = 0; R <= range.e.r; R++) {
for (let C = 0; C <= range.e.c; C++) {
const cellAddress = XLSX.utils.encode_cell({ r: R, c: C });
if (!ws[cellAddress]) {
//
ws[cellAddress] = { v: '', t: 's' };
}
const cell = ws[cellAddress];
const header = headers[C];
// 使 headerStyle使 cellStyle
if (R === 0) {
//
cell.s = JSON.parse(JSON.stringify(headerStyle));
} else {
//
cell.s = JSON.parse(JSON.stringify(cellStyle));
}
//
if (header && header.isNumber && R > 0) {
let numValue;
//
if (typeof cell.v === 'string') {
const cleanedValue = cell.v.toString().replace(/[元万元m²㎡\s,/天]/g, '').trim();
numValue = Number(cleanedValue);
} else {
numValue = Number(cell.v);
}
if (!isNaN(numValue) && cell.v !== null && cell.v !== undefined && cell.v !== '') {
cell.t = 'n'; //
cell.v = numValue; //
//
if (header.title && (header.title.includes('面积') || header.title.includes('m²') || header.title.includes('㎡'))) {
cell.z = '#,##0.00'; // 2
} else if (header.title && (header.title.includes('值') || header.title.includes('金额') || header.title.includes('元') || header.title.includes('单价') || header.title.includes('租金') || header.title.includes('底价') || header.title.includes('评估') || header.title.includes('到账') || header.title.includes('应收'))) {
cell.z = '#,##0.00'; // 2
} else if (header.title && (header.title.includes('天') || header.title.includes('期'))) {
cell.z = '#,##0'; //
} else {
cell.z = '#,##0'; //
}
}
}
}
}
//
const colWidths = headers.map(() => ({ wch: 15 })); // 15
ws['!cols'] = colWidths;
XLSX.utils.book_append_sheet(wb, ws, sheetName);
const wbout = XLSX.write(wb, {
bookType: "xlsx",
@ -722,42 +1003,122 @@ export default {
label: "承租方",
formatter: (row, column, cellValue) => row.lease_id_leases_id_relation?.chengzufang
},
{
prop: "chuzufang",
width: 120,
label: "出租方",
formatter: (row, column, cellValue) => row.lease_id_leases_id_relation?.chuzufang
},
{
label: "资产标的",
prop: 'assets',
width: 340,
align: 'left',
customFn: row => {
// land houses
const allAssets = [
...(row?.land || []).map(i => ({ ...i, assetType: '土地' })),
...(row?.houses || []).map(i => ({ ...i, assetType: '房产' }))
];
if (!allAssets || allAssets.length === 0) {
return <span>-</span>
}
//
const getAssetType = (item) => {
if (item.assetType) return item.assetType;
if (item.house_id) return '房产';
if (item.land_id) return '土地';
if (item.biaodileixing) return item.biaodileixing;
return '资产';
}
//
const firstAsset = allAssets[0];
const assetType = getAssetType(firstAsset);
const assetName = firstAsset.name || " ";
const detailLocation = firstAsset.xiangxiweizhi || "";
let tags = [
...row?.land?.map((i) =>
(
<Tag color="success" style="background: rgb(65, 100, 227) !important;">{i.name}</Tag>
)
),
...row?.houses?.map((i) =>
(
<Tag color="success" style="">{i.name}</Tag>
)
),
]
<Tag color="success" style="background: rgb(65, 100, 227) !important;">
{assetType}{assetName}{detailLocation ? '-' + detailLocation : ''}
</Tag>
];
return (
<div>
{
tags.slice(0, 1)
tags
}
<el-popover title="资产名称" width={200}>
<el-link slot="reference"
type="primary"
style={{
"word-break": "keep-all",
display: tags.length > 1 ? "inline" : "none",
}}>更多</el-link>
<div slot="default">
{
tags
}
</div>
</el-popover>
{allAssets.length > 1 && [
<br key="br"></br>,
<el-popover key="popover" title="资产标的" width={1000}>
<el-link slot="reference"
type="primary"
style={{
"font-size": "13px",
"word-break": "keep-all",
display: "inline",
}}>更多</el-link>
<div slot="default">
<Table size="small"
data={allAssets}
columns={[
{
title: '资产名称',
key: 'name',
width: 180,
render: (h, { row: myRow }) => {
return h('span', myRow.name || " ")
}
},
{
title: '分类',
key: 'type',
width: 100,
render: (h, { row: myRow }) => {
let type = getAssetType(myRow);
return h('span', type)
}
},
{
title: '坐落',
key: 'zuoluo',
minWidth: 200,
render: (h, { row: myRow }) => {
return h('span', myRow.zuoluo || " ")
}
},
{
title: '详细位置',
key: 'xiangxiweizhi',
minWidth: 200,
render: (h, { row: myRow }) => {
return h('span', myRow.xiangxiweizhi || " ")
}
},
{
title: '实际面积',
key: 'shijimianji',
width: 140,
render: (h, { row: myRow }) => {
return h('span', myRow.shijimianji || "0")
}
},
{
title: '出租面积',
key: 'chuzumianji',
width: 140,
render: (h, { row: myRow }) => {
return h('span', myRow.chuzumianji || "0")
}
},
]}>
</Table>
</div>
</el-popover>
]}
</div>
)
}

Loading…
Cancel
Save