You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

680 lines
22 KiB

7 months ago
<template>
<div style="display: flex" v-bind="$attrs">
<!-- {{ $attrs.value }} -->
<!-- {{simpleDayOptions}} -->
<!-- <div v-if="columsType == 'complexTable'" style="color: red; display: block; width: 100%">
服务频次对应每天每周每月每年均需要设置起止时间
</div>
<br /> -->
<div v-if="columsType == 'complexTable'">
<div v-if="columsType == 'complexTable'" style="color: red; display: block; width: 100%">
&nbsp;&nbsp;&nbsp; 服务频次对应每天每周每月每年均需要设置起止时间
<br />
<br />
</div>
<a-table :columns="colums" :data-source="$attrs.value" bordered :pagination="false">
<template
v-for="(item, index) in colums"
:key="index"
#[item.dataIndex]="text, record, index"
>
<!-- {{ text }} -->
<a-input
v-if="
item.otherConditions
? item.otherConditions && item.inputType == 'input'
: item.inputType == 'input'
"
style="margin: -5px 0"
:value="text.text"
@change="(e) => handleChangeIndex(e, text.index, item.dataIndex, item)"
/>
<div v-else-if="item.inputType == 'select'">
<div v-if="text.record[item.otherConditions] === 3 && item.dataIndex == 'day'">
<div style="display: inline-block">
<a-select
style="margin: -5px 0"
:value="text.text"
@change="(e) => handleChangeIndex(e, text.index, item.dataIndex)"
>
<a-select-option
v-for="(i, index) in simpleDayOptions"
:key="index"
:value="i.value"
>
{{ i.label }}
</a-select-option>
</a-select>
</div>
<div style="display: inline-block"> </div>
</div>
<div v-else-if="text.record[item.otherConditions] === 4 && item.dataIndex == 'month'">
<div style="display: inline-block">
<a-select
style="margin: -5px 0; display: inline-block"
:value="text.text"
@change="(e) => handleChangeIndex(e, text.index, item.dataIndex)"
>
<a-select-option
v-for="(i, index) in item.componentProps.options"
:key="index"
:value="i.value"
>
{{ i.label }}
</a-select-option>
</a-select>
</div>
<div style="display: inline-block"></div>
</div>
<div v-else-if="text.record[item.otherConditions] === 4 && item.dataIndex == 'day'">
<div style="display: inline-block">
<a-select
style="margin: -5px 0"
:value="text.text"
@change="(e) => handleChangeIndex(e, text.index, item.dataIndex)"
>
<a-select-option
v-for="(i, index) in item.componentProps.options"
:key="index"
:value="i.value"
>
{{ i.label }}
</a-select-option>
</a-select>
</div>
<div style="display: inline-block"></div>
</div>
<div v-else-if="text.record[item.otherConditions] === 2 && item.dataIndex == 'week'">
<a-select
style="margin: -5px 0"
:value="text.text"
@change="(e) => handleChangeIndex(e, text.index, item.dataIndex)"
>
<a-select-option
v-for="(i, index) in item.componentProps.options"
:key="index"
:value="i.value"
>
{{ i.label }}
</a-select-option>
</a-select>
</div>
</div>
<!-- <a-select
v-else-if="
text.record[item.otherConditions] == item.otherValue && item.inputType == 'select'
"
style="margin: -5px 0"
:value="text.text"
@change="(e) => handleChangeIndex(e.target.value, index, 'name')"
>
<a-select-option v-for="(i, index) in item.componentProps.options" :key="index">
{{ i.label }}
</a-select-option>
</a-select> -->
<a-time-picker
v-else-if="
item.otherConditions
? item.otherConditions && item.inputType == 'date'
: item.inputType == 'date'
"
style="width: 100px"
size="small"
:defaultValue="text.text ? moment(text.text, 'HH:mm:ss') : ''"
@change="(val, dateStrings) => changeTime(val, dateStrings, text.index, 'startTime')"
format="HH:mm:ss"
/>
<template
v-else-if="
item.otherConditions
? item.otherConditions && item.inputType == 'modal'
: item.inputType == 'modal'
"
>请选择</template
>
<template
v-else-if="
otherConditions
? otherConditions && item.inputType == 'input'
: item.inputType == 'operation'
"
>删除</template
>
<template v-else>{{ text.text }}</template>
</template>
</a-table>
</div>
<div v-else-if="columsType == 'normalTable'">
<!-- {{ $attrs.value }}--900099 -->
<a-table :columns="colums" :data-source="$attrs.value" bordered :pagination="false">
<template
v-for="(item, index) in colums"
:key="index"
#[item.dataIndex]="text, record, index"
>
<!-- {{ item }} -->
<a-input
v-if="item.inputType == 'input'"
style="margin: -5px 0"
:value="text.text"
@change="(e) => handleChangeIndex(e, text.index, item.dataIndex, item)"
/>
<div v-else-if="item.inputType == 'select'">
<a-select
style="margin: -5px 0; display: inline-block"
:value="text.text"
@change="(e) => handleChangeIndex(e, text.index, item.dataIndex)"
>
<a-select-option
v-for="(i, index) in item.componentProps.options"
:key="index"
:value="i.value"
>
{{ i.label }}
</a-select-option>
</a-select>
</div>
<div v-else-if="item.inputType == 'selectElse'">
<!-- {{ item.componentProps }} -->
<a-select
style="margin: -5px 0; display: inline-block"
:value="text.text"
@change="(e) => handleChangeIndex(e, text.index, item.dataIndex, item)"
>
<a-select-option
v-for="(i, index) in item.componentProps.options"
:key="index"
:value="i.value"
>
{{ i.label }}
</a-select-option>
</a-select>
</div>
<div v-else-if="item.inputType == 'selectApi'">
<NsSelectApi
v-bind="item.componentProps"
:value="text.text"
@change="(e) => handleChangeIndex(e, text.index, item.dataIndex)"
/>
</div>
<div v-else-if="item.inputType == 'upload'">
<NvUpload v-bind="item.componentProps" :value="text.text" />
</div>
<div v-else-if="item.inputType == 'date'">
<a-time-picker
style="width: 100px"
size="small"
:value="text.text ? moment(text.text, 'HH:mm:ss') : ''"
:defaultValue="text.text ? moment(text.text, 'HH:mm:ss') : ''"
@change="
(val, dateStrings) => changeTime(val, dateStrings, text.index, item.dataIndex)
"
format="HH:mm:ss"
/></div>
<template v-else-if="item.inputType == 'modal'">
<!-- 请选择 -->
<NsModalTable
v-bind="{
...item.componentProps,
record: text.record,
valueP: text.text,
dataIndex: item.dataIndex,
}"
@changeTable="changeTable"
:value="text.text"
/>
</template>
<template v-else-if="item.inputType == 'operation'">
<span v-for="(it, indexs) in item.componentProps.actionOptions" :key="indexs">
<span
:style="{ color: it.color }"
style="margin-left: 5px"
@click="optionA(it.value, text.record, text.index)"
>{{ it.name }}</span
>
</span>
</template>
<template v-else>{{ text.text }}</template>
</template>
<template #footer="currentPageData">
<!-- {{ currentPageData }} -->
<span style="font-size: 22px; margin-left: 50%" @click="add(currentPageData)">+</span>
</template>
</a-table>
</div>
<div v-else>
<a-row>
<a-col :span="12">
<div>未选择</div>
<br />
<a-row>
<a-col :span="12">护理类别</a-col>
<a-col :span="12"
><ns-select :options="optionSlect" @change="handleChangeViewList"
/></a-col>
</a-row>
<br />
<div>
<a-table
:columns="viewColums"
:data-source="careItems"
:row-selection="rowSelection"
:pagination="false"
bordered
/>
</div>
</a-col>
<a-col :span="12">
<div>已选择</div>
<!-- <br /> -->
<div style="height: 8px"></div>
<br />
<br />
<br />
<a-table :columns="colums" :data-source="$attrs.value" :pagination="false" bordered>
<template
v-for="(item, index) in colums"
:key="index"
#[item.dataIndex]="text, record, index"
>
<!-- {{ text }} -->
<a-input
v-if="item.inputType == 'input'"
style="margin: -5px 0"
:value="text.text"
@change="(e) => handleChangeIndex(e, text.index, item.dataIndex, item)"
/>
<a-select
v-else-if="item.inputType == 'select'"
style="margin: -5px 0"
:value="text.text"
@change="(e) => handleChangeIndex(e, text.index, item.dataIndex, item)"
>
<a-select-option v-for="(i, index) in item.componentProps.options" :key="index">
{{ i.label }}
</a-select-option>
</a-select>
<template v-else-if="item.inputType == 'modal'">请选择</template>
<template v-else-if="item.inputType == 'operation'"
><span @click="handleDelete(text.index)" style="cursor: pointer">
删除
</span></template
>
<template v-else>{{ text.text }}</template>
</template>
</a-table>
</a-col>
</a-row>
</div>
</div>
</template>
<script lang="ts">
import moment from 'moment';
import { defineComponent, ref, watch } from 'vue';
import { NsMessage } from '../../message';
import { http } from '/nerv-lib/util/http';
import NsModalTable from './modal-table.vue';
import NvUpload from './uplods.vue';
export default defineComponent({
name: 'NsEtable',
components: {
NsModalTable,
NvUpload,
},
props: {
colums: {
type: Array,
},
viewColums: {
type: Array,
},
tableData: {
type: Array,
},
attribute: {
type: String,
},
onchange: {
type: Function,
},
columsType: {
type: String,
},
getChildrenOptions: {
type: Function,
},
addlist: {
type: Object,
},
},
emits: ['change', 'updata:longLat', 'validate', 'getChildrenOptions'],
setup(props, context) {
let data = [];
let propsData = ref();
let ids = ref(9);
const dependency = ref();
const selectElseOption = ref([]);
const rowSelection = {
type: 'checkbox',
onChange: (selectedRowKeys: [], selectedRows: []) => {
let dpData = context.attrs.value ? JSON.parse(JSON.stringify(context.attrs)) : [];
const newData = [...dpData.value];
selectedRows.forEach((item) => {
newData.push({
nursingItemUuid: item['uuid'],
nursingItemName: item['itemName'],
frequency: 1,
times: 1,
});
});
context.emit('change', newData);
},
};
const optionSlect = [
{
label: '全部',
value: 'all',
},
{
label: '生活护理',
value: 1,
},
{
label: '医疗护理',
value: 2,
},
{
label: '康复护理',
value: 3,
},
];
propsData = context.attrs.value ? JSON.parse(JSON.stringify(context.attrs.value)) : [];
console.log(propsData, '98777');
let simpleDayOptions = ref([]);
for (let i = 0; i < 28; i++) {
let item = {
label: '' + (i + 1),
value: i + 1,
};
simpleDayOptions.value.push(item);
}
let careItems = ref([]);
const handleChangeViewList = (value) => {
let api = '/api/pension/pension/objs/NursingItem';
http
.get(api, {
itemType: value == 'all' ? '' : value,
enable: true,
pageSize: 10,
})
.then((res) => {
if (res && res.success) {
careItems.value = res.data.data;
// NsMessage.success('操作成功');
}
})
.catch(() => {
NsMessage.error('列表获取失败');
});
};
handleChangeViewList('all');
const add = (e) => {
console.log(props.addlist, 'opopop');
// let data = {
// regionUuid: null,
// inspectionTime: null,
// personList: null,
// relation: null,
// // uuid:
// };
let list = JSON.parse(JSON.stringify(props.addlist));
let data = { ...list };
let edList = context.attrs.value ? JSON.parse(JSON.stringify(context.attrs.value)) : [];
ids.value += 1;
edList.push({ ...data, uuid: ids.value + 'uuid' });
context.emit('change', edList);
// console.log(e, JSON.parse(JSON.stringify(context.attrs.value)), 'add');
};
const changeTable = (item) => {
let currentList = JSON.parse(JSON.stringify(context.attrs.value));
currentList &&
currentList instanceof Array &&
currentList.length > 0 &&
currentList.forEach((its) => {
if (its.uuid == item.uuid) {
its = Object.assign(its, item);
}
});
context.emit('change', currentList);
};
// 表格列操作方法
const optionA = (name, actionInfo, ind) => {
let edList = context.attrs.value ? JSON.parse(JSON.stringify(context.attrs.value)) : [];
if (name == 'delete') {
edList.splice(ind, 1);
// console.log(edList, 'edlist');
} else if (name == 'copy') {
// console.log('00000');
ids.value += 1;
edList.push({ ...actionInfo, uuid: ids.value + 'uuid' });
}
context.emit('change', edList);
};
const getElseOptins = (name, value, fieldName, index) => {
console.log(name, value, fieldName, index, 'zhougg');
let acinfo = props && props.colums && props.colums[index];
console.log(acinfo, 'acinfo');
let api = acinfo.componentProps.api;
let params = {
...acinfo.componentProps.params,
[name]: value,
};
console.log(params, 'acparams');
// let api = '/api/pension/pension/objs/NursingItem';
http
.get(api, { ...params })
.then((res) => {
if (res && res.success) {
console.log(acinfo.componentProps.selectElseOption, 'acinfo.componentProps');
res.data &&
res.data.forEach((item) => {
if (item.dictValue == value) {
let arr = [];
item.subList &&
item.subList.forEach((it) => {
arr.push({
label: it.dictName,
value: it.dictValue,
});
});
selectElseOption.value = arr;
console.log(item.subList, 'sublist');
}
});
// careItems.value = res.data.data;
// NsMessage.success('操作成功');
}
})
.catch(() => {
NsMessage.error('列表获取失败');
});
};
// dependency
watch(dependency, (newValue, oldValue) => {
console.log('old', oldValue);
console.log('new', newValue);
});
return {
data,
simpleDayOptions,
rowSelection,
optionSlect,
handleChangeViewList,
careItems,
add,
changeTable,
optionA,
getElseOptins,
selectElseOption,
};
},
data() {
return {
editingKey: '',
propsList: [],
Month2Day: {
1: 31,
2: 28,
3: 31,
4: 30,
5: 31,
6: 30,
7: 31,
8: 31,
9: 30,
10: 31,
11: 30,
12: 31,
},
};
},
created() {
this.propsList = this.$attrs.value ? JSON.parse(JSON.stringify(this.$attrs.value)) : [];
},
methods: {
moment,
changeTime(val, dateStrings, key, type) {
let datapro = this.$attrs.value ? JSON.parse(JSON.stringify(this.$attrs.value)) : [];
const newData = [...datapro];
const target = newData.filter((item, index) => key === index)[0];
if (type == 'startTime' && target['endTime']) {
if (this.timeCompare(dateStrings, target['endTime'])) {
NsMessage.error('开始时间不能大于结束时间');
}
} else if (type == 'endTime') {
if (this.timeCompare(target['startTime'], dateStrings)) {
NsMessage.error('开始时间不能大于结束时间');
}
}
if (target) {
target[type] = dateStrings;
this.$emit('change', newData);
// this.$emit('validate', false);
// this.propsList = newData;
}
},
timeCompare(start, end) {
let flag = true;
if (!start || !end) return true;
let startH = +start.split(':')[0];
let startM = +start.split(':')[1];
let endH = +end.split(':')[0];
let endM = +end.split(':')[1];
// 开始小时大于结束小时
if (startH > endH) {
flag = false;
} else if (startH == endH) {
// 小时相等时,开始分钟大于结束分钟
if (startM >= endM) {
flag = false;
}
}
return flag;
},
handleChangeIndex(value, key, type, item) {
console.log(value, key, type, 'zhouhaha');
let propsInfo = this.$attrs.value ? JSON.parse(JSON.stringify(this.$attrs.value)) : [];
const newData = [...propsInfo];
console.log(newData, 'newData');
console.log([...this.propsList], 'newData');
console.log(this.propsList, 'newData');
const target = newData.filter((item, index) => key === index)[0];
if (type == 'month') {
this.colums &&
this.colums.forEach((item: any) => {
if (item.dataIndex == 'day') {
item.componentProps.options = this.setOptions(this.Month2Day[value], 'dayOptions');
}
});
}
console.log(target, 'target');
if (target) {
target[type] = value;
console.log(newData, 'newData');
this.$emit('change', newData);
// this.propsList = newData;
}
this.colums &&
this.colums.forEach((item, index) => {
console.log(item, item.dependency, '564');
if (item.dependency == type) {
// console.log('lopppp');
this.$emit('getChildrenOptions', item.dependency, value, item.dataIndex);
this.getElseOptins(item.dependency, value, item.dataIndex, index);
}
});
},
handleDelete(e) {
let data = this.$attrs.value ? JSON.parse(JSON.stringify(this.$attrs.value)) : [];
let newData = data.filter((item, index) => e !== index);
// console.log(newData);
this.$emit('change', newData);
},
setOptions(number: number, type: string) {
let arr = [];
for (let i = 0; i < number; i++) {
let item = {
label: '' + (i + 1),
value: i + 1,
};
arr.push(item);
}
return arr;
},
},
});
</script>
<style lang="less" scoped>
input::-webkit-outer-spin-button,
input::-webkit-inner-spin-button {
-webkit-appearance: none;
}
#map-container {
width: 600px;
height: 400px;
}
.leftBox,
.rightBox {
flex: 1;
}
.inputArea {
display: flex;
line-height: 30px;
}
.inputSearch {
.inputAdress {
width: 300px;
margin-right: 10px;
}
}
</style>