<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%"> 注:服务频次对应每天、每周、每月、每年,均需要设置起止时间 <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>