master
cody 9 months ago
parent a7107b8568
commit 59bb0684da

Binary file not shown.

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

@ -98,20 +98,20 @@ export class CreateDialog {
if (info.edit_input === "checkbox" || info.edit_input === "radio") { if (info.edit_input === "checkbox" || info.edit_input === "radio") {
return info._params && info._params instanceof Array return info._params && info._params instanceof Array
? info._params.map((i) => ? info._params.map((i) =>
h("el-option", { h("el-option", {
props: { props: {
label: label:
i.name || i.name ||
i.mingcheng || i.mingcheng ||
i.label || i.label ||
i.key || i.key ||
i.value || i.value ||
i.id || i.id ||
i.no, i.no,
value: i.id || i.value, value: i.id || i.value,
}, },
}) })
) )
: []; : [];
} }
if (info.edit_input === "file" || info.edit_input === "files") { if (info.edit_input === "file" || info.edit_input === "files") {
@ -227,14 +227,28 @@ export class CreateDialog {
e e
) => { ) => {
if (i.field) { 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) { 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] = Object.assign(
{}, {},
that[this.options.fromData] that[this.options.fromData]
); );
} else { } else {
that.form[i.field] = e; that.form[i.field] = finalValue;
that.form = Object.assign( that.form = Object.assign(
{}, {},
that.form that.form
@ -245,7 +259,7 @@ export class CreateDialog {
}, },
scopedSlots: scopedSlots:
i.edit_input === "file" || i.edit_input === "file" ||
i.edit_input === "files" i.edit_input === "files"
? { ? {
file: (scope) => { file: (scope) => {
let { file } = scope; let { file } = scope;
@ -255,95 +269,95 @@ export class CreateDialog {
display: 'flex', display: 'flex',
'align-items': 'center' 'align-items': 'center'
} }
},[h("div", { }, [h("div", {
style: { style: {
'margin-right': "auto" '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: { class: {
"el-icon-circle-check": "uploaded-a":
file.status === file.status ===
"success", "success",
"el-icon-loading":
file.status ===
"uploading",
}, },
style: { style: {
color: padding: "0 4px",
file.status === 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 ===
"success" "success"
? "green" ? "green"
: "", : "",
},
}, },
file.original_name || file.name },
), file.original_name || file.name
]), ),
h("div",{ ]),
h("div", {
style: {
"margin-right": "32px",
'display': file.status === 'success' ? 'block' : 'none'
}
}, [
h("i", {
class: "el-icon-view",
style: { style: {
"margin-right": "32px", 'cursor': 'pointer',
'display': file.status === 'success' ? 'block' : 'none' 'margin-right': '12px'
} },
},[ on: {
h("i",{ ['click']: _ => {
class: "el-icon-view", that.$bus.$emit('online-file', file.url)
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)
}
} }
}) }
]), }),
h("i", { h("i", {
class: "el-icon-close", class: "el-icon-download",
style: { style: {
"display": this.options.disabled ? "none" : "inline" 'cursor': 'pointer'
}, },
on: { on: {
["click"]: () => ['click']: _ => {
this.fileRemoveHandler( download(file.url)
file, }
i.field }
), })
}, ]),
})]) 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); let info = that.formInfo.find((i) => i.field === replace.key);
if (!info) { if (!info) {
if (replace.label) { if (replace.label) {
dom.splice(replace.sort??dom.length,0, dom.splice(replace.sort ?? dom.length, 0,
h( h(
"el-form-item", "el-form-item",
{ {
@ -379,7 +393,7 @@ export class CreateDialog {
) )
) )
} else { } 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 title: that.title
? that.title ? that.title
: that.type === "add" : that.type === "add"
? "新增" ? "新增"
: "编辑", : "编辑",
visible: that.dialogVisible, visible: that.dialogVisible,
width: this.options?.width ? this.options.width : "800px", width: this.options?.width ? this.options.width : "800px",
"close-on-click-modal": false, "close-on-click-modal": false,
@ -466,9 +480,9 @@ export class CreateDialog {
), ),
]), ]),
] ]
) : h('div',[ ) : h('div', [
formRender, formRender,
h('div', { style: "display: flex;justify-content: center;" },[ h('div', { style: "display: flex;justify-content: center;" }, [
h( h(
"el-button", "el-button",
{ {

@ -288,7 +288,7 @@ import { op } from "@/const/op";
import { download } from "@/utils/downloadRequest"; import { download } from "@/utils/downloadRequest";
import { getparameter } from "@/api/system/dictionary"; import { getparameter } from "@/api/system/dictionary";
import { show } from "@/api/system/customForm"; import { show } from "@/api/system/customForm";
import * as XLSX from "xlsx"; import * as XLSX from "xlsx-js-style";
import { saveAs } from "file-saver"; import { saveAs } from "file-saver";
import { listdept } from "@/api/system/department" 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) { async exportExcel(sheetName) {
let filterTableColumns = this.$refs['xyTable']?.tableFormat || [] let filterTableColumns = this.$refs['xyTable']?.tableFormat || []
const res = await index( const res = await index(
Object.assign(this.select, { page: 1, page_size: 9999 }) Object.assign(this.select, { page: 1, page_size: 9999 })
); );
if (res.data) { 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 { return {
key: i.prop, key: i.prop,
title: i.label, title: i.label,
isNumber: this.isNumericField(fieldConfig, i.label)
}; };
}); });
// headers // headers
headers.push({ headers.push({
key: 'admin.name', key: 'admin.name',
title: '提交人' title: '提交人',
isNumber: false
}); });
headers.push({ headers.push({
key: 'department.name', key: 'department.name',
title: '提交单位' title: '提交单位',
isNumber: false
}); });
headers.push({ headers.push({
key: 'created_at', 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 data = []
let merges = [] let merges = []
let rowIndex = 0 let rowIndex = 0
res.data.forEach((row, rindex) => { res.data.forEach((row, rindex) => {
let myRow = headers.map((header) => { let myRow = headers.map((header) => {
let value;
// //
if (header.key === 'admin.name') { 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 assetType = '资产';
let { link_relation, foreign_key, link_with_name } = i._relations; if (myAssetLink.house_id) {
if (link_relation === "newHasOne" || link_relation === "hasOne") { assetType = '房产';
return row[link_with_name]?.original_name || row[link_with_name]?.name || } else if (myAssetLink.land_id) {
row[link_with_name]?.no || assetType = '土地';
row[link_with_name]?.value } 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) => ( let bencizhengshoumianji = 0;
o?.name || if (myAssetLink.bencizhengshoumianji !== null && myAssetLink.bencizhengshoumianji !== undefined && myAssetLink.bencizhengshoumianji !== '') {
o?.no || if (typeof myAssetLink.bencizhengshoumianji === 'string') {
o?.value || const cleaned = myAssetLink.bencizhengshoumianji.toString().replace(/[元万元m²㎡\s,/天]/g, '').trim();
o?.biaoti || bencizhengshoumianji = Number(cleaned) || 0;
o?.mingcheng } else {
)).toString() bencizhengshoumianji = Number(myAssetLink.bencizhengshoumianji) || 0;
} }
} }
if (this.table.find(i => i.prop === header.key)?.formatter) { let zichanshengyumianji = 0;
return this.table.find(i => i.prop === header.key).formatter(row, {}, row[header.key], rindex) 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]
}) return [
if (row['asset_handles_to_assets'].length > 0) { myAsset.name || myAssetLink.name || '',
for (let j = 0;j<row['asset_handles_to_assets'].length;j++) { assetType,
let myAssetLink = row['asset_handles_to_assets'][j] myAsset.zuoluo || myAssetLink.zuoluo || '',
let myAsset = {} myAsset.xiangxiweizhi || myAssetLink.xiangxiweizhi || '',
if (myAssetLink.land_id) { shijimianji,
myAsset = myAssetLink['lands'] bencizhengshoumianji,
} else if (myAssetLink.house_id) { zichanshengyumianji
myAsset = myAssetLink['house'] ];
};
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({ merges.push({
s: { s: { r: startRowIndex + 1, c: colIndex }, // +1
r: rowIndex + 1, e: { r: endRowIndex + 1, c: colIndex } // +1
c: q });
}, });
e: {
r: rowIndex + 1 + row['asset_handles_to_assets'].length - 1,
c: q
}
})
}
} }
rowIndex += row['asset_handles_to_assets'].length rowIndex += row['asset_handles_to_assets'].length
} else { } else {
//
const emptyAssetData = assetHeaders.map(() => '');
data.push([...myRow, ...emptyAssetData]);
rowIndex++ rowIndex++
data.push(myRow)
} }
}); });
headers.push({
title: '资产名称' headers.push(...assetHeaders)
})
headers.push({
title: '本次征收面积'
})
headers.push({
title: '资产剩余面积'
})
data.unshift(headers.map((header) => header.title)); data.unshift(headers.map((header) => header.title));
const wb = XLSX.utils.book_new(); const wb = XLSX.utils.book_new();
const ws = XLSX.utils.aoa_to_sheet(data); const ws = XLSX.utils.aoa_to_sheet(data);
ws['!merges'] = merges 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); XLSX.utils.book_append_sheet(wb, ws, sheetName);
const wbout = XLSX.write(wb, { const wbout = XLSX.write(wb, {
bookType: "xlsx", bookType: "xlsx",
@ -667,30 +855,136 @@ export default {
this.table.unshift( { this.table.unshift( {
label: "资产", label: "资产",
prop: 'assets', prop: 'assets',
width: 300, width: 320,
align: 'left', align: 'left',
customFn: row => { customFn: row => {
let tags = row.asset_handles_to_assets?.map(i => ( if (!row.asset_handles_to_assets || row.asset_handles_to_assets.length === 0) {
<Tag color="success" style="background: rgb(65, 100, 227) !important;">{(i.land_id ? '【土地】' : '【房产】')+(i.lands?.name || i.house?.name)}</Tag> 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 ( return (
<div> <div>
{ {
tags.slice(0, 1) tags
} }
<el-popover title="资产名称" width={200}> {row.asset_handles_to_assets.length > 1 && [
<el-link slot="reference" <br key="br"></br>,
type="primary" <el-popover key="popover" title="资产" width={1000}>
style={{ <el-link slot="reference"
"word-break": "keep-all", type="primary"
display: tags.length > 1 ? "inline" : "none", style={{
}}>更多</el-link> "font-size": "13px",
<div slot="default"> "word-break": "keep-all",
{ display: "inline",
tags }}>更多</el-link>
} <div slot="default">
</div> <Table size="small"
</el-popover> 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> </div>
) )
} }

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

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

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

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

@ -311,7 +311,7 @@
<template #export> <template #export>
<Button <Button
type="primary" type="primary"
@click="exportExcel(new Date().getTime().toString())" @click="handleExport"
>导出</Button >导出</Button
> >
</template> </template>
@ -380,7 +380,7 @@ import { op } from "@/const/op";
import { download } from "@/utils/downloadRequest"; import { download } from "@/utils/downloadRequest";
import { getparameter } from "@/api/system/dictionary"; import { getparameter } from "@/api/system/dictionary";
import { show } from "@/api/system/customForm"; import { show } from "@/api/system/customForm";
import * as XLSX from "xlsx"; import * as XLSX from "xlsx-js-style";
import { saveAs } from "file-saver"; import { saveAs } from "file-saver";
import { listdept } from "@/api/system/department" import { listdept } from "@/api/system/department"
@ -448,23 +448,304 @@ export default {
this.dateRangeEnd0 = null; 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) { async exportExcel(sheetName) {
let filterTableColumns = this.$refs['xyTable']?.tableFormat || []
const res = await index( const res = await index(
Object.assign(this.select, { page: 1, page_size: 9999 }) Object.assign(this.select, { page: 1, page_size: 9999 })
); );
if (res.data) { 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 { return {
key: i.field, key: i.prop,
title: i.name, 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)); data.unshift(headers.map((header) => header.title));
const wb = XLSX.utils.book_new(); const wb = XLSX.utils.book_new();
const ws = XLSX.utils.aoa_to_sheet(data); 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); XLSX.utils.book_append_sheet(wb, ws, sheetName);
const wbout = XLSX.write(wb, { const wbout = XLSX.write(wb, {
bookType: "xlsx", bookType: "xlsx",
@ -722,42 +1003,122 @@ export default {
label: "承租方", label: "承租方",
formatter: (row, column, cellValue) => row.lease_id_leases_id_relation?.chengzufang 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: "资产标的", label: "资产标的",
prop: 'assets', prop: 'assets',
width: 340, width: 340,
align: 'left', align: 'left',
customFn: row => { 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 = [ let tags = [
...row?.land?.map((i) => <Tag color="success" style="background: rgb(65, 100, 227) !important;">
( {assetType}{assetName}{detailLocation ? '-' + detailLocation : ''}
<Tag color="success" style="background: rgb(65, 100, 227) !important;">{i.name}</Tag> </Tag>
) ];
),
...row?.houses?.map((i) =>
(
<Tag color="success" style="">{i.name}</Tag>
)
),
]
return ( return (
<div> <div>
{ {
tags.slice(0, 1) tags
} }
<el-popover title="资产名称" width={200}> {allAssets.length > 1 && [
<el-link slot="reference" <br key="br"></br>,
type="primary" <el-popover key="popover" title="资产标的" width={1000}>
style={{ <el-link slot="reference"
"word-break": "keep-all", type="primary"
display: tags.length > 1 ? "inline" : "none", style={{
}}>更多</el-link> "font-size": "13px",
<div slot="default"> "word-break": "keep-all",
{ display: "inline",
tags }}>更多</el-link>
} <div slot="default">
</div> <Table size="small"
</el-popover> 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> </div>
) )
} }

Loading…
Cancel
Save