重新生成这个页面使用Composition API重构要求用vue2编写且只要写 setup() {后面的代码要求方法全部都要重构主体代码template内的代码不用写
时间: 2024-11-09 07:22:23 浏览: 25
使用Vue Composition API写出清晰、可扩展的表单实现
好的,以下是使用 Composition API 重构后的 `setup()` 函数部分的代码。由于 Vue 2 不支持 Composition API,我们需要借助 `@vue/composition-api` 插件来实现这一点。以下是重构后的代码:
```javascript
import { reactive, ref, computed, onMounted, watch } from '@vue/composition-api';
import { getAction, postAction } from '@/api/manage';
import MyFastDatePicker from '@/components/date/MyFastDatePicker';
export default {
name: 'ProjectMaterialDetails',
components: { MyFastDatePicker },
setup(props, context) {
const state = reactive({
nowFirst: 'projectCode',
columnsKey: 0,
projectNameList: [],
projectName_Code: '',
projectBudgetMarginWarning: 0,
expandedRowKeys: [],
workorderProjectList: [],
description: '营业报表管理页面',
fastTime: ['本月', '上月', '近半年'],
noCreate: true,
hasUpdateTime: true,
configOrderSubTypeList: [],
configOrderSubTypeTemp: undefined,
allDepartList: [],
hallCodeDataList: [],
spinning: false,
checkFlag: true,
updateTime: '',
url: {
list: "/web/materialVoucherDetails/getProjectMaterialStatistic",
exportXlsxUrl: "/web/materialVoucherDetails/exportProjectMaterialStatisticExcel",
exportPdfUrl: "/web/bizBusinessRecord/exportpdf",
exportDetailUrl: "/web/bizBusinessRecord/exportDetailExcel"
},
keyList: ['saleNum', 'saleName', 'terminalTypeName', 'userTypeName', 'configOrderMainTypeName', 'configOrderSubTypeName'],
ipagination: {
current: 1,
pageSize: 20,
pageSizeOptions: ['20', '50', '80'],
showTotal: (total, range) => `${range[0]}-${range[1]} 共${total}条`,
showQuickJumper: true,
showSizeChanger: true,
total: 0
},
originColums: [],
columns: [
{ title: '项目编号', align: "center", dataIndex: 'projectCode', customRender: (text, row, index) => renderMergedCells(text, row, index, 'projectCode') },
{ title: '项目名称', align: "center", dataIndex: 'projectCode_dictText', customRender: (text, row, index) => renderMergedCells(text, row, index, 'projectCode_dictText') },
{ title: '(子)项目名称', align: "center", dataIndex: 'subProjectCode_dictText', customRender: (text, row, index) => renderMergedCells(text, row, index, 'subProjectCode_dictText') },
{ title: '部门名称', align: "center", dataIndex: 'orgCode_dictText', customRender: (text, row, index) => renderMergedCells(text, row, index, 'orgCode_dictText') },
{ title: '物资编号', align: "center", dataIndex: 'materialCode', scopedSlots: { customRender: 'publicText' } },
{ title: '物资名称', align: "center", dataIndex: 'materialName', scopedSlots: { customRender: 'publicText' } },
{ title: '厂商', align: "center", dataIndex: 'producerId_dictText', scopedSlots: { customRender: 'publicText' } },
{ title: '规格型号', align: "center", dataIndex: 'specification', scopedSlots: { customRender: 'publicText' } },
{ title: '单位', align: "center", dataIndex: 'unit', scopedSlots: { customRender: 'publicText' } },
{ title: '成本价(元)', align: "center", dataIndex: 'originPrice', scopedSlots: { customRender: 'publicText' } },
{ title: '领用总数', align: "center", dataIndex: 'requisitionNum', slots: { title: 'requisitionNum_title' }, scopedSlots: { customRender: 'publicText' } },
{ title: '施工用料', align: "center", dataIndex: 'constructionNum', scopedSlots: { customRender: 'publicText' } },
{ title: '验收用料', align: "center", dataIndex: 'acceptanceNum', scopedSlots: { customRender: 'publicText' } },
{ title: '结算用料', align: "center", dataIndex: 'settlementNum', scopedSlots: { customRender: 'publicText' } },
{ title: '结算余料', align: "center", dataIndex: 'settlementRemainNum', scopedSlots: { customRender: 'settlementRemainNum' } },
{ title: '盘点余料', align: "center", dataIndex: 'inventoryRemainNum', scopedSlots: { customRender: 'publicText' } },
{ title: '盘点损益', align: "center", dataIndex: 'inventoryProfitAndLossNum', slots: { title: 'inventoryProfitAndLossNum_title' }, scopedSlots: { customRender: 'inventoryProfitAndLossNum' } }
],
queryParam: {
type: '',
projectCode: '',
projectName: '',
subProjectName: '',
departId: '',
material: '',
producerId: '',
specification: '',
materialInventoryResult: '',
projectDateBegin: '',
projectDateEnd: ''
},
dataSource: [],
loading: false,
toggleSearchStatus: false
});
const renderMergedCells = (value, row, index, dataIndex) => {
const obj = { children: value, attrs: {} };
const dataSource = state.dataSource;
if (dataIndex === 'projectCode') {
if (index === 0 || row.projectCode_dictText !== dataSource[index - 1].projectCode_dictText) {
let rowSpan = 1;
for (let i = index + 1; i < dataSource.length; i++) {
if (dataSource[i].projectCode_dictText === row.projectCode_dictText) {
rowSpan++;
} else {
break;
}
}
obj.attrs.rowSpan = rowSpan;
} else {
obj.attrs.rowSpan = 0;
}
} else if (dataIndex === 'orgCode_dictText') {
if (index === 0 || row.orgCode_dictText !== dataSource[index - 1].orgCode_dictText || row.projectCode_dictText !== dataSource[index - 1].projectCode_dictText) {
let rowSpan = 1;
for (let i = index + 1; i < dataSource.length; i++) {
if (dataSource[i].orgCode_dictText === row.orgCode_dictText && dataSource[i].projectCode_dictText === row.projectCode_dictText) {
rowSpan++;
} else {
break;
}
}
obj.attrs.rowSpan = rowSpan;
} else {
obj.attrs.rowSpan = 0;
}
} else {
if (index === 0 || row.subProjectCode_dictText !== dataSource[index - 1].subProjectCode_dictText) {
let rowSpan = 1;
for (let i = index + 1; i < dataSource.length; i++) {
if (dataSource[i].subProjectCode_dictText === row.subProjectCode_dictText) {
rowSpan++;
} else {
break;
}
}
obj.attrs.rowSpan = rowSpan;
} else {
obj.attrs.rowSpan = 0;
}
}
return obj;
};
const materialInventoryResultChange = (val) => {
state.queryParam.materialInventoryResult = val;
context.root.$forceUpdate();
};
const beforeSearchQuery = () => {
searchQuery();
departChange(state.queryParam.type);
};
const beforeSearchReset = () => {
searchReset();
departChange();
};
const deepClone = (input, hash = new WeakMap()) => {
if (input === null || typeof input !== 'object') {
return input;
}
if (hash.has(input)) {
return hash.get(input);
}
let output = Array.isArray(input) ? [] : {};
hash.set(input, output);
if (Array.isArray(input)) {
output = input.map(item => deepClone(item, hash));
} else {
for (let key in input) {
if (input.hasOwnProperty(key)) {
if (typeof input[key] === 'function') {
output[key] = input[key].bind(output);
} else {
output[key] = deepClone(input[key], hash);
}
}
}
}
return output;
};
const departChange = (val) => {
if (val == 2) {
state.nowFirst = 'orgCode_dictText';
let objectArray = deepClone(state.originColums);
let movedElement = objectArray.splice(3, 1)[0];
objectArray.unshift(movedElement);
state.columns = objectArray;
} else {
state.nowFirst = 'projectCode';
state.columns = deepClone(state.originColums);
}
state.columnsKey += 1;
};
const subProjectCodeChange = (val, options) => {
console.log('subProjectCodeChange', val, options, state.queryParam.subProjectName);
};
const projectCodeSearch = (value) => {
getAction('/web/projectRecord/searchMainProject', { order: 'desc', pageNo: 1, pageSize: 100, keyword: value })
.then(res => {
const data = [];
res.result.forEach(item => {
data.push({ id: item.id, value: item.projectCode, text: item.projectName });
});
state.projectNameList = data;
});
};
const projectCodeChange = (value) => {
state.queryParam.projectName_Code = value;
const obj = state.projectNameList.filter(item => item.id === value);
console.log('projectCodeChange', value, obj);
if (obj.length > 0) {
state.exportParams.projectName = obj[0].text;
state.queryParam.projectName = obj[0].text;
} else {
state.exportParams.projectName = '';
state.queryParam.projectName = '';
}
};
const change = (val1, val2, val3) => {
console.log('改变', val3);
state.exportParams.dateTpye = val3 === 2 ? 1 : 2;
state.queryParam.projectDateBegin = val1;
state.queryParam.projectDateEnd = val2;
state.queryParam.hiddenZeroTotalAmountFlag = state.checkFlag ? 1 : 0;
};
const handelChange = () => {
state.configOrderSubTypeTemp = undefined;
state.queryParam.configOrderSubType = undefined;
state.queryParam.incomeExpenseType = '';
getConfigOrderSubTypeList();
};
const getConfigOrderSubTypeList = () => {
if (state.queryParam.configOrderMainType) {
getAction('/web/bizTransactionOrder/getOrderSubType', { configOrderMainType: state.queryParam.configOrderMainType })
.then(res => {
if (res.code == 200) {
switch (state.queryParam.configOrderMainType) {
case '1':
let arr = [];
for (let i = 0; i < res.result.length; i++) {
arr.push(res.result.slice(i, i + 1));
}
arr.forEach(v => {
v.push({ value: v[0].value, label: v[0].label + '(退)' });
});
let result = [].concat.apply([], arr).filter(v => {
return v.value != 96 && v.value != 98;
});
state.configOrderSubTypeList = result;
break;
case '2':
state.configOrderSubTypeList = res.result.filter(v => {
return Number(v.value) <= 7 || Number(v.value) == 15 || Number(v.value) == 16 || Number(v.value) == 20 || Number(v.value) == 21;
});
break;
case '3':
state.configOrderSubTypeList = res.result.filter(v => {
return Number(v.value) !== 7 && Number(v.value) !== 8 && Number(v.value) !== 12 && Number(v.value) !== 14 && Number(v.value) !== 10 && Number(v.value) !== 16;
});
break;
default:
state.configOrderSubTypeList = res.result;
break;
}
}
});
} else {
context.root.$message.warning('请选择业务类型!');
}
};
const handleChange = (val) => {
state.configOrderSubTypeList = [];
state.queryParam.configOrderSubType = '';
state.configOrderSubTypeTemp = undefined;
state.queryParam.incomeExpenseType = '';
};
const handleConfigOrderSubTypeChange = (val) => {
state.configOrderSubTypeTemp = val;
if (state.queryParam.configOrderMainType == 1) {
state.queryParam.incomeExpenseType = val.key.substr(val.key.length - 1, 1);
} else {
state.queryParam.incomeExpenseType = '';
}
};
const handleOpen = (record) => {
};
const filterOption = (input, option) => {
return option.componentOptions.children[0].text.toLowerCase().indexOf(input.toLowerCase()) >= 0;
};
const searchQuery = () => {
let val = state.configOrderSubTypeTemp;
if (val) {
if (state.queryParam.configOrderMainType == 1) {
if (val.key.length == 2) {
state.queryParam.configOrderSubType = val.key.substr(0, 1);
} else {
state.queryParam.configOrderSubType = val.key.substr(0, 2);
}
} else {
state.queryParam.configOrderSubType = val.key;
}
}
loadData(1);
};
const searchReset = () => {
state.queryParam.type = '';
state.queryParam.projectName = '';
state.queryParam.subProjectName = '';
state.queryParam.departId = '';
state.queryParam.material = '';
state.queryParam.producerId = '';
state.queryParam.specification = '';
state.queryParam.materialInventoryResult = '';
阅读全文