Commit 9de9fa56 authored by songrui's avatar songrui

Merge branch 'chronic-dev' of http://gitlab.yiboshi.com/nightkis1995/frontend-h5 into chronic-dev

parents 2fd993b3 783617c3
<template>
<!-- 弹出层 -->
<van-popup v-model:show="data.isPicker" position="bottom" round @close="confirmOn">
<van-picker ref="picker" title="请选择时间" :columns="data.columns" @cancel="cancelOn"
@confirm="onConfirm" v-model="data.selectedValues" />
</van-popup>
</template>
<script setup>
import { reactive, watch, getCurrentInstance } from "vue";
const customFieldName = {
text: "value",
value: "values",
children: ""
};
const data = reactive({
isPicker: false, //是否显示弹出层
columns: [], //所有时间列
selectedValues: [], //控件选择的时间值
showType: [] //控制显示时间格式 年月日时分秒
});
const props = defineProps({
// 传入的显影状态
showPicker: {
type: Boolean
},
// 传入的值
values: {
type: String
},
showType: {
type: Array,
default:() => {
return ['year', 'month', 'day', 'hour', 'minute', 'second']
}
}
});
//定义要向父组件传递的事件
const emit = defineEmits(["changeValue", "confirm"]);
watch(
() => props.showPicker,
val => {
data.isPicker = val;
data.showType = props.showType
data.columns = [];
getcolumns();
},
{
immediate: true//立即监听--进入就会执行一次 监听显影状态
}
);
function getcolumns() {
let strtime = props.values; //传入的时间
//console.log(strtime); 2023-09-05 19:28:00
let date = new Date(strtime.replace(/-/g, "/"));
// console.log(date); Wed Aug 09 2023 14:53:15 GMT+0800 (中国标准时间)
let timeVaules = date.getTime();
let dateVaules;
if (props.values != "") {
dateVaules = new Date(timeVaules);
} else {
dateVaules = new Date(); //没有传入时间则默认当前时刻
}
let Y = dateVaules.getFullYear();
let M = dateVaules.getMonth();
let D = dateVaules.getDate();
let h = dateVaules.getHours();
let m = dateVaules.getMinutes();
let s = dateVaules.getSeconds();
if(data.showType.includes('year')) {
let year = []; //获取前后十年数组
year.values = [];
let Currentday = new Date().getFullYear();
for (let i = Currentday - 10; i < Currentday + 10; i++) {
year.push({ text: i.toString(), value: i });
}
year.defaultIndex = year.values.indexOf(Y); //设置默认选项当前年
// 个位数补0
const _M = M < 10 ? `0${M + 1}` : M.toString(); //月份比实际获取的少1,所以要加1
const _D = D < 10 ? `0${D}` : D.toString();
const _h = h < 10 ? `0${h}` : h.toString();
const _m = m < 10 ? `0${m}` : m.toString();
const _s = s < 10 ? `0${s}` : s.toString();
// 生成年月日时分秒时间值
data.selectedValues.push(Y);
data.selectedValues.push(_M);
data.selectedValues.push(_D);
data.selectedValues.push(_h);
data.selectedValues.push(_m);
data.selectedValues.push(_s);
data.columns.push(year); //生成年列
}
if (data.showType.includes('month')) {
let month = []; //获取12月数组
month = Object.keys(Array.apply(null, { length: 13 })).map(function (item) {
if (+item + 1 <= 10) {
return { text: "0" + item, value: "0" + item };
} else if (+item + 1 == 11) {
return { text: +item, value: +item };
} else {
return {
text: (+item + 0).toString(),
value: (+item + 0).toString()
};
}
});
month.splice(0, 1);
data.columns.push(month); //生成月列
}
if (data.showType.includes('day')) {
//获取当月的天数
let days = getCountDays(Y, M + 1);
let day = []; //创建当月天数数组
day = Object.keys(Array.apply(null, { length: days + 1 })).map(function (
item
) {
if (+item + 1 <= 10) {
return { text: "0" + item, value: "0" + item };
} else if (+item + 1 == 11) {
return { text: +item, value: +item };
} else {
return {
text: (+item + 0).toString(),
value: (+item + 0).toString()
};
}
});
day.splice(0, 1);
data.columns.push(day); //生成日列
}
if (data.showType.includes('hour')) {
let hour = []; //创建小时数组
hour = Object.keys(Array.apply(null, { length: 24 })).map(function (item) {
if (+item + 1 <= 10) {
return { text: "0" + item, value: "0" + item };
} else if (+item + 1 == 11) {
return { text: +item, value: +item };
} else {
return {
text: (+item + 0).toString(),
value: (+item + 0).toString()
};
}
});
data.columns.push(hour); //生成小时列
}
if (data.showType.includes('minute')) {
let mi = []; //创建分钟数组
mi = Object.keys(Array.apply(null, { length: 60 })).map(function (item) {
if (+item + 1 <= 10) {
return { text: "0" + item, value: "0" + item };
} else if (+item + 1 == 11) {
return { text: +item, value: +item };
} else {
return {
text: (+item + 0).toString(),
value: (+item + 0).toString()
};
}
});
data.columns.push(mi);//生成分钟列
}
if (data.showType.includes('second')) {
let ss = []; //创建秒数数组
ss = Object.keys(Array.apply(null, { length: 60 })).map(function (item) {
if (+item + 1 <= 10) {
return { text: "0" + item, value: "0" + item };
} else if (+item + 1 == 11) {
return { text: +item, value: +item };
} else {
return {
text: (+item + 0).toString(),
value: (+item + 0).toString()
};
}
});
data.columns.push(ss);//生成秒钟列
}
}
function getCountDays(year, month) {
//获取某年某月多少天
let day = new Date(year, month, 0);
return day.getDate();
}
// 关闭弹框
function confirmOn() {
emit("changeValue");
}
//时间选择器关闭 值不改变并关闭弹框
function cancelOn({ selectedValues }) {
confirmOn()
}
// 时间选择器确定 值改变
function onConfirm({ selectedValues }) {
let endval =
selectedValues[0] +
"-" +
selectedValues[1] +
"-" +
selectedValues[2] +
" " +
selectedValues[3] +
":" +
selectedValues[4] +
":" +
selectedValues[5];
confirmOn()
emit("confirm", endval);
}
</script>
......@@ -87,10 +87,10 @@ export default {
this.innerImage = [...this.imageData]
} else {
this.innerImage = [
{ fileType: 'pdf', id: 1, trueDownloadUrl: testUrl },
{ fileType: 'png', id: 2, trueDownloadUrl: testUrl },
{ fileType: 'png', id: 3, trueDownloadUrl: testUrl },
{ fileType: 'png', id: 4, trueDownloadUrl: testUrl }
// { fileType: 'pdf', id: 1, trueDownloadUrl: testUrl },
// { fileType: 'png', id: 2, trueDownloadUrl: testUrl },
// { fileType: 'png', id: 3, trueDownloadUrl: testUrl },
// { fileType: 'png', id: 4, trueDownloadUrl: testUrl }
]
}
},
......
......@@ -2,7 +2,7 @@
<div class="p-1 flex flex-col mp3">
<div v-if="file.annexFileName" class="text-12 mb-1 text-ellipsis">{{ file.annexFileName }}</div>
<div class="flex items-center justify-between gap-x-2.5">
<div class="shrink-0 play-bt" @click="start(file)">
<div class="shrink-0 play-bt" @click.stop="start(file)">
<doc-icon type="doc-play" v-if="!player.playing"/>
<doc-icon type="doc-pause" v-else/>
</div>
......
<template>
<div class="mp4">
<div class="flex flex-wrap justify-between video-list">
<div v-for="item in files" :key="item.annexId">
<div v-for="item in files" :key="item.annexId" @click.stop="start(item)">
<div class="item">
<div class="shrink-0 play-bt" @click="start(item)">
<div class="shrink-0 play-bt" >
<doc-icon type="doc-play" />
</div>
<span class="close-btn" @click.stop="removeBtn(item)" v-if="remove">
......
<template>
<van-popup v-model:show='innerShow' position='right' :style="{ height: '100%', width: '100%' }">
<van-popup v-if='innerShow' v-model:show='innerShow' position='right' :style="{ height: '100%', width: '100%' }">
<div class='flex flex-col' style='height: 100vh'>
<div class='p-3 text-black text-center shrink-0 doc-nav-bar'>
<span @click='onBack' class='text-12 back-bt'>
......@@ -9,11 +9,17 @@
</div>
<div class='grow overflow-y-auto pl-4 pr-4 pt-3 pb-3'>
{{fileType}}
<div>
<div class='flex flex-col '>
<!-- 文本 -->
<div class='card' v-if='contentList?.length'>
<div class='card' v-if='contentList?.length' @click='selectFiletype(1)'>
<div class='flex justify-between items-center'>
<div class='font-semibold mb-1'>文本</div>
<van-checkbox-group v-model="fileType" shape="square" icon-size="16px">
<van-checkbox :name="1"></van-checkbox>
</van-checkbox-group>
</div>
<div class='conten-bg'>
<div v-for='item in contentList' :key='item.templateMode' class='mb-1 flex'
:style='`order: ${item.templateMode}`'>
......@@ -24,16 +30,30 @@
</div>
</div>
</div>
<div class='card mt-4' v-if='mp4List?.length'>
<div class='font-semibold mb-1'>视频</div>
<div class='card mt-4' v-if='mp4List?.length' @click='selectFiletype(3)'>
<div class='flex justify-between items-center'>
<div class='font-semibold mb-1'>视频</div>
<van-checkbox-group v-model="fileType" shape="square" icon-size="16px">
<van-checkbox :name="3"></van-checkbox>
</van-checkbox-group>
</div>
<div class='conten-bg'>
<Mp4 :files='mp4List' :activeMediaUrl='activeMediaUrl'
@play='e => activeMediaUrl = e.annexUrl' />
</div>
</div>
<div class='card flex flex-col mt-4' style='row-gap: .06rem;' v-if='mp3List?.length'>
<div class='font-semibold mb-1'>音频</div>
<div class='card flex flex-col mt-4' style='row-gap: .06rem;' v-if='mp3List?.length' @click='selectFiletype(2)'>
<div class='flex justify-between items-center'>
<div class='font-semibold mb-1'>音频</div>
<van-checkbox-group v-model="fileType" shape="square" icon-size="16px">
<van-checkbox :name="2"></van-checkbox>
</van-checkbox-group>
</div>
<div class='conten-bg'>
<Mp3 :file='item' v-for='item in mp3List' :key='item.annexId'
:activeMediaUrl='activeMediaUrl'
......@@ -66,7 +86,8 @@ export default {
data() {
return {
info: {},
activeMediaUrl: ''
activeMediaUrl: '',
fileType: [1, 2, 3],
}
},
computed: {
......@@ -105,8 +126,16 @@ export default {
}).finally(() => {
})
},
selectFiletype(val) {
let index = this.fileType.findIndex(item => item == val)
if (index >= 0) {
this.fileType = this.fileType.filter(item => item != val)
} else {
this.fileType.push(val)
}
},
toUse() {
this.$emit('selectedInfo', this.id)
this.$emit('selectedInfo', this.id, this.fileType)
this.onBack()
},
onBack() {
......
......@@ -5,7 +5,7 @@
<div @click='onBack' class='text-12 back-bt'>
<doc-icon type='doc-left2' />
</div>
<div>随访详情</div>
<div>选择内容</div>
<div class='text-primary left-btn' @click='openSearch'>筛查</div>
</div>
......@@ -77,7 +77,14 @@
</van-popup>
<!-- 查看详情组件-->
<temDetail v-if='detailShow' :show='detailShow' :id='selectRecord.id' @closeDetail='detailClosed' @selectedInfo='detailToUse' :overlay='false'></temDetail>
<temDetail v-if='detailShow && innerShow'
:show='detailShow'
:id='selectRecord.id'
@closeDetail='detailClosed'
@selectedInfo='detailToUse'
:overlay='false'
></temDetail>
</div>
</div>
</van-popup>
......@@ -199,13 +206,13 @@ export default {
this.detailShow = val
},
//列表引用
toUse(record) {
this.$emit('selectRecord', record.id)
toUse(record, typeList = [1, 2, 3]) {
this.$emit('selectRecord', record.id, typeList)
this.onBack()
},
//详情选中引用
detailToUse(val) {
this.$emit('selectRecord', val)
detailToUse(val, typeList = []) {
this.$emit('selectRecord', val, typeList)
this.onBack()
},
onBack() {
......
......@@ -532,17 +532,20 @@ export default {
const {
personId,
visitWay,
visitWayRules,
visitWayRules ,
groupsArrays,
sendNumber,
...others
} = this.form
let par = {
visitWay,
visitWayRules,
groupsArrays,
sendNumber,
residentInfoId: this.form.residentInfoId,
residentsRecord: {
...others,
groupsArrays: this.info.groupsArrays,
id: this.form.personId
}
}
......
......@@ -251,8 +251,25 @@ export default {
onSubmit() {
return new Promise((resolve, reject) => {
this.$refs.form.validate().then(() => {
const { isSmsIsWx = [], ...others} = this.form
let isSms = 2
let isWx = 2
let wxTel = ''
if (isSmsIsWx.length && this.showPush) {
if (isSmsIsWx.includes(1)) {
isWx = 1
wxTel = this.modeEnumList.weixinTel
}
if (isSmsIsWx.includes(2)) {
isSms = 1
}
}
let par = {
...this.form
...others,
isSms,
isWx,
isSmsIsWx,
sendNumber: wxTel,
}
resolve(par)
}).catch((e) => {
......
......@@ -25,27 +25,77 @@
class='input-back mt-2 form-input'
/>
</div>
<!-- 健康指导-->
<!-- 健康指导-->
<div v-if='showTwo'>
<div class='flex justify-between items-center mt-5'>
<div class='label-title '>健康指导</div>
<van-button class='doc-btn-p' @click='toShowTem(1)'>选择内容</van-button>
</div>
<div class='mt-2'>
<GuideTextVideo :file-type="[1]"
:info="form.guide"
<div class='health mt-2'>
<GuideTextVideo :file-type='[1]'
:info='form.guide'
:content-title="'指导内容'"
:classify="1"
ref="guideRef"></GuideTextVideo>
:classify='1'
ref='guideRef'></GuideTextVideo>
</div>
</div>
<!-- 宣教内容-->
<!-- 宣教内容-->
<div v-if='showThree'>
<div class='flex justify-between items-center mt-5'>
<div class='label-title '>宣教内容</div>
<van-button class='doc-btn-p' @click='toShowTem(2)'>选择内容</van-button>
</div>
<div class='health mt-2'>
<div class='health-cell mt-2'>
<div class='no-req-label'>健康宣教</div>
<van-field
v-model='form.publicizeTypeName'
readonly
is-link
placeholder='请选择'
class='input-back mt-2 form-input'
@click='showPublicizeType= true'
>
<template #input>
<span class='text-end'>{{ form.publicizeTypeName }}</span>
</template>
</van-field>
<van-popup v-model:show='showPublicizeType' position='bottom'>
<div class='p-4'>
<div class='flex justify-between mb-4'>
<div class='greyColor' @click='showPublicizeType = false'>取消</div>
<div class='blueColor' @click='publicizeTypeConfirm'>确认</div>
</div>
<CheckBtn multiple column-3 :options="store.getDict('DC00091')"
v-model:value='checkPublicizeType'
:fieldNames="{text: 'name', value: 'value'}"
/>
</div>
</van-popup>
</div>
<div v-if='form?.publicizeType?.includes(1)'>
<GuideTextVideo :file-type='[1]'
:info='form.publicize'
:content-title="'文本内容'"
:classify='2'
ref='contentOne'></GuideTextVideo>
</div>
<div v-if='form?.publicizeType?.includes(2)'>
<GuideTextVideo :file-type='[2]'
:info='form.publicize'
:classify='2'
ref='contentTwo'></GuideTextVideo>
</div>
<div v-if='form?.publicizeType?.includes(3)'>
<GuideTextVideo :file-type='[3]'
:info='form.publicize'
:classify='2'
ref='contentThree'></GuideTextVideo>
</div>
</div>
</div>
<!-- 催检-->
......@@ -67,10 +117,13 @@
</div>
</div>
</div>
<van-popup v-model:show='showTime1' position='bottom'>
<van-date-picker v-model='currentTime1' @confirm='timeConfirm1' @cancel='showTime1 = false' />
</van-popup>
<DataTime
:values='startTime'
:showType="['year', 'month', 'day', 'hour']"
@changeValue='showTime1 = false'
:showPicker='showTime1'
@confirm='timeConfirm1'
/>
</div>
<!-- 上传随访照片-->
......@@ -119,7 +172,7 @@
</div>
</van-form>
<div>
<div v-if='showTem'>
<temList :show='showTem' @closed='closedTem' @selectRecord='getSelectTem'></temList>
</div>
</div>
......@@ -129,16 +182,18 @@
import { useStore } from '@/resident/store'
import dayjs from 'dayjs'
import DocIcon from '@/components/docIcon/DocIcon'
import { showToast } from 'vant'
import { fetchDataHandle } from '@/utils/common'
import { showFailToast, showToast } from 'vant'
import { fetchDataHandle, uniqueArr } from '@/utils/common'
import DocImageUpload from '@/doctor/components/docImageUpload/DocImageUpload'
import TemList from '@/doctor/components/template/temList'
import { getTemplateDetail } from '@/api/doctor/workbench'
import GuideTextVideo from '@/doctor/followUp/generalFU/form/GuideTextVideo'
import CheckBtn from '@/doctor/components/checkBtn/CheckBtn'
import DataTime from '@/doctor/components/dataTime/dataTime'
export default {
name: 'GeneralFUForm',
components: { GuideTextVideo, TemList, DocImageUpload, DocIcon },
components: { DataTime, CheckBtn, GuideTextVideo, TemList, DocImageUpload, DocIcon },
props: {
info: {
default: () => {
......@@ -163,6 +218,8 @@ export default {
showDate: false,
showTime1: false,
showTem: false,
showPublicizeType: false,
checkPublicizeType: [],
currentTime1: null,
citeInfo: 1,
rules: {
......@@ -173,7 +230,8 @@ export default {
nextVisitDateRange: {
min: undefined,
max: undefined
}
},
startTime: ''
}
},
watch: {
......@@ -238,35 +296,47 @@ export default {
this.currentTime1 = time.split('-')
},
methods: {
setForm(info = {}) {
const modeArray = this.store.getDict('DC00084')
let visitHealthGuideList = []
if (info.healthGuideContent) {
visitHealthGuideList = JSON.parse(info.healthGuideContent)
setForm(data = {}) {
let info = fetchDataHandle(data, {
visitWayRules: 'strToArrNum',
groupsArrays: 'strToArrNum',
publicizeType: 'strToArrNum'
})
let isSmsIsWx = []
if (info.id) {
const { isSms, isWx } = info
if (isSms == 1) {
isSmsIsWx = [1]
}
if (isWx == 1) {
isSmsIsWx = [2]
}
if (isSms == 1 && isWx == 1) {
isSmsIsWx = [1, 2]
}
} else {
isSmsIsWx = [1]
}
const form = {
id: info.id,
diseaseType: info.diseaseType,
groupsArrays: info.groupsArrays,
visitDate: info.visitDate || new dayjs(),
nextVisitDate: info.nextVisitDate || new dayjs().add(1, 'day').format('YYYY-MM-DD'),
nextVisitDate: info.nextVisitDate,
visitWay: info.visitWay || 1,
isSms: info.isSms,
isWx: info.isWx,
screenTime: new dayjs().add(1, 'day').format('YYYY-MM-DD'),
isSmsIsWx: isSmsIsWx,
visitContent: info.visitContent,
disposalOpinion: info.disposalOpinion,
uploadVisitRecord: info.uploadVisitRecord,
sceneVisitImage: info.sceneVisitImage,
screenTime: info.screenTime || new dayjs().add(1, 'day').format('YYYY-MM-DD HH:00:00'),
sendInfo: info.sendInfo,
visitHealthGuideList: modeArray.map(e => {
const item = visitHealthGuideList.find(i => i.templateMode === e.value)
return {
templateMode: e.value,
name: e.name,
templateContent: item ? item.templateContent : '',
id: item ? item.visitId : ''
}
})
publicizeType: info.publicizeType,
guide: info.guide || {},
publicize: info.publicize || {}
}
return form
},
......@@ -275,48 +345,346 @@ export default {
this.showDate = false
},
//催检日期选择
timeConfirm1({ selectedValues }) {
this.form.screenTime = selectedValues.join('-')
timeConfirm1(selectedValues) {
this.form.screenTime = dayjs(selectedValues).format('YYYY-MM-DD HH:00:00')
this.showTime1 = false
},
toShowTem(val) {
this.citeInfo =val
this.citeInfo = val
this.showTem = true
},
closedTem(val) {
this.showTem = val
},
//获取选中的模板
async getSelectTem(val) {
if (val) {
async getSelectTem(val, selectType = []) {
if (val && selectType && selectType.length) {
let par = { id: val }
let result = await getTemplateDetail(par)
const { data } = result
let obj = {
annexList: [],
contentList: [],
drugsList: []
}
let mp3List = data.annexList && data.annexList.filter(item => item.type == 2)
let mp4List = data.annexList && data.annexList.filter(item => item.type == 3)
if (selectType.includes(1)) { //是否返回文本选中
obj.contentList = data.contentList
obj.drugsList = data.drugsList
}
if (selectType.includes(2)) {//是否返回音频选中
obj.annexList = [...obj.annexList ,...mp3List]
}
if (selectType.includes(3)) {//是否返回视频选中
obj.annexList = [...obj.annexList, ...mp4List]
}
//健康指导
if (this.citeInfo == 1) {
} else { //宣教内容
if (this.showTwo && this.citeInfo == 1) {
this.setGuide(obj)
}
//宣教内容
if (this.showThree && this.citeInfo == 2) {
this.setPublicize(obj)
}
}
},
publicizeTypeConfirm() {
let res = []
this.store.getDict('DC00091').forEach(item => {
let selected = this.checkPublicizeType.filter(i => i == item.value)
if (selected && selected.length) {
res.push(item.name)
}
})
if (this.checkPublicizeType && this.checkPublicizeType.length) {
this.form.publicizeType = this.checkPublicizeType.join()
this.form.publicizeTypeName = res.join()
}
this.showPublicizeType = false
},
//健康指导模板赋值
async setGuide(val = {}) {
//获取上一次的值
let lastObj = {
contentList: [],
drugsList: []
}
let obj = await this.$refs.guideRef.getForm()
lastObj = {
contentList: obj.contentList,
drugsList: obj.drugsList
}
//重新赋值
let resObj = {
contentList: [],
drugsList: []
}
if (lastObj.contentList && lastObj.contentList.length) {
resObj.contentList = [...lastObj.contentList]
}
if (lastObj.drugsList && lastObj.drugsList.length) {
resObj.drugsList = [...lastObj.drugsList]
}
//判断模板文本是否选中 并赋值
if (val.contentList) {
//文本内容区域存在 初始值 后面选中的模板内容需要拼接在初始值后面
if (lastObj.contentList && lastObj.contentList.length) {
//合并相同的文本选项内容
resObj.contentList.forEach(item => {
val.contentList.forEach(vitem => {
if (item.templateMode != 5 && item.templateMode == vitem.templateMode) {
item.templateContent = item.templateContent ? item.templateContent + `\n` + vitem.templateContent : vitem.templateContent
}
})
})
//去掉 返回的val中与合并后相同的文本
resObj.contentList.forEach(item => {
let reIndex = val.contentList.findIndex(vitem => vitem.templateMode == item.templateMode)
if (reIndex != -1) {
val.contentList.splice(reIndex, 1)
}
})
//合并剩余的val.contentList到 resObj.contentList中
resObj.contentList = [...resObj.contentList, ...val.contentList]
//合并药物指导
//判断之前是否存在药物指导
if (lastObj.drugsList && lastObj.drugsList.length) {
//获取之前药物指导的最大_id的值
let rowId = 0
rowId = Math.max.apply(null, lastObj.drugsList.map(item => Number(item._id)))
val.drugsList.forEach((item, index) => {
item.id = ''
item._id = rowId + index + 1
})
//合并
resObj.drugsList = [...resObj.drugsList, ...val.drugsList]
} else {
resObj.drugsList = [...val.drugsList]
}
} else {
if (val.contentList) {
resObj.contentList = [...val.contentList]
resObj.drugsList = [...val.drugsList]
}
}
} else {
//模板未选中文本 赋初始值
if (lastObj.contentList && lastObj.contentList.length) {
resObj.contentList = [...lastObj.contentList]
}
}
console.log('resObj', resObj)
this.form.guide = resObj
},
//宣教内容模板赋值
async setPublicize(val = {}) {
//获取上一次的值
let lastObj = {
annexList: [],
contentList: [],
drugsList: []
}
//文本
if (this.form?.publicizeType?.includes(1)) {
let obj1 = await this.$refs.contentOne.getForm()
lastObj = {
annexList: [],
contentList: obj1.contentList,
drugsList: obj1.drugsList
}
}
//音频
if (this.form?.publicizeType?.includes(2)) {
let obj2 = await this.$refs.contentTwo.getForm()
let list = obj2.annexList.filter(item => item.type == 2)
lastObj = {
...lastObj,
annexList: list
}
}
//视频
if (this.form?.publicizeType?.includes(3)) {
let obj3 = await this.$refs.contentThree.getForm()
let list = obj3.annexList.filter(item => item.type == 3)
lastObj = {
...lastObj,
annexList: [...lastObj.annexList, ...list]
}
}
//重新赋值
console.log('json', val)
let resObj = {
annexList: [],
contentList: [],
drugsList: []
}
const { publicizeType = [], publicize = {} } = this.form
if (lastObj.annexList && lastObj.annexList.length) {
resObj.annexList = [...lastObj.annexList]
}
if (lastObj.contentList && lastObj.contentList.length) {
resObj.contentList = [...lastObj.contentList]
}
if (lastObj.drugsList && lastObj.drugsList.length) {
resObj.drugsList = [...lastObj.drugsList]
}
//文本
if (publicizeType.includes(1)) {
//判断模板文本是否选中 并赋值
if (val.contentList) {
//文本内容区域存在 初始值 后面选中的模板内容需要拼接在初始值后面
if (lastObj.contentList && lastObj.contentList.length) {
//合并相同的文本选项内容
resObj.contentList.forEach(item => {
val.contentList.forEach(vitem => {
if (item.templateMode != 5 && item.templateMode == vitem.templateMode) {
item.templateContent = item.templateContent ? item.templateContent + `\n` + vitem.templateContent : vitem.templateContent
}
})
})
//去掉 返回的val中与合并后相同的文本
resObj.contentList.forEach(item => {
let reIndex = val.contentList.findIndex(vitem => vitem.templateMode == item.templateMode)
if (reIndex != -1) {
val.contentList.splice(reIndex, 1)
}
})
//合并剩余的val.contentList到 resObj.contentList中
resObj.contentList = [...resObj.contentList, ...val.contentList]
//合并药物指导
//判断之前是否存在药物指导
if (lastObj.drugsList && lastObj.drugsList.length) {
//获取之前药物指导的最大_id的值
let rowId = 0
rowId = Math.max.apply(null, lastObj.drugsList.map(item => Number(item._id)))
val.drugsList.forEach((item, index) => {
item.id = ''
item._id = rowId + index + 1
})
//合并
resObj.drugsList = [...resObj.drugsList, ...val.drugsList]
} else {
resObj.drugsList = [...val.drugsList]
}
} else {
if (val.contentList) {
resObj.contentList = [...val.contentList]
resObj.drugsList = [...val.drugsList]
}
}
} else {
//模板未选中文本 赋初始值
if (lastObj.contentList && lastObj.contentList.length) {
resObj.contentList = [...lastObj.contentList]
}
}
}
//音频
if (publicizeType.includes(2)) {
//判断模板音频是否选中 并赋值
let mp3List = val.annexList.filter(item => item.type == 2) || []
if (mp3List && mp3List.length) {
if (resObj.annexList && resObj.annexList.length) {
let rowId = 0
rowId = Math.max.apply(null, resObj.annexList.map(item => Number(item.annexId)))
mp3List.forEach((item, index) => {
item['annexId'] = rowId + index + 1
resObj.annexList.push(item)
})
} else {
resObj.annexList = [...mp3List]
}
}
}
//视频
if (publicizeType.includes(3)) {
//判断模板视频是否选中 并赋值
let mp4List = val.annexList.filter(item => item.type == 3) || []
if (mp4List && mp4List.length) {
if (resObj.annexList && resObj.annexList.length) {
let rowId = 0
rowId = Math.max.apply(null, resObj.annexList.map(item => Number(item.annexId)))
mp4List.forEach((item, index) => {
item['annexId'] = rowId + index + 1
resObj.annexList.push(item)
})
} else {
resObj.annexList = [...mp4List]
}
}
}
//对视频音频去重
resObj.annexList = uniqueArr(resObj.annexList, 'relativeUrl')
this.form.publicize = resObj
},
onSubmit() {
return new Promise((resolve, reject) => {
this.$refs.form.validate().then(() => {
if (this.imgList.length > 6 || this.imgList2.length > 8) {
return
}
let time = dayjs(this.form.screenTime).format('YYYY-MM-DD')
let content = `${this.modeEnumList.urgeResidentShow ? `${this.firstForm.residentsRecord.residentName}先生/女士,` : `您好,`}请您于${time}${this.authInfo.unitName}进行专病高危筛查/慢病复查,祝早日恢复健康!`
let par = {
img1: this.imgList || [],
img2: this.imgList2 || [],
imgInput1: this.imgInputList1,
imgInput2: this.imgInputList2,
this.$refs.form.validate().then(async () => {
let time = dayjs(this.form.screenTime).format('YYYY-MM-DD HH:00:00')
let content = `${this.modeEnumList?.urgeResidentShow ? `${this.firstForm?.residentsRecord?.residentName}先生/女士,` : `您好,`}请您于${time}${this.authInfo.unitName}进行专病高危筛查/慢病复查,祝早日恢复健康!`
let res = {
...this.form,
urgentInsContent: content,
healthGuideContent: JSON.stringify(this.form.visitHealthGuideList)
urgentInsContent: content
}
resolve(par)
//健康指导
if (this.showTwo) {
let obj = await this.$refs.guideRef.submit()
res.guide = {
contentList: obj.contentList,
drugsList: obj.drugsList
}
}
//宣教内容
if (this.showThree) {
let resObj = {
annexList: [],
contentList: [],
drugsList: []
}
//文本
if (this.form?.publicizeType?.includes(1)) {
let obj1 = await this.$refs.contentOne.submit()
resObj = {
annexList: [],
contentList: obj1.contentList,
drugsList: obj1.drugsList
}
}
//音频
if (this.form?.publicizeType?.includes(2)) {
let obj2 = await this.$refs.contentTwo.submit()
let list = obj2.annexList.filter(item => item.type == 2)
if (!list.length) {
showFailToast('请上传音频')
return
}
resObj = {
...resObj,
annexList: list
}
}
//视频
if (this.form?.publicizeType?.includes(3)) {
let obj3 = await this.$refs.contentThree.submit()
let list = obj3.annexList.filter(item => item.type == 3)
if (!list.length) {
showFailToast('请上传视频')
return
}
resObj = {
...resObj,
annexList: [...resObj.annexList, ...list]
}
}
res.publicize = {
...resObj
}
}
resolve(res)
}).catch((e) => {
console.warn('generaFu error', e)
// reject(e)
......@@ -475,6 +843,9 @@ export default {
text-align: left;
}
:deep(.van-popup) {
min-height: 30% !important;
}
</style>
<style lang='less'>
......@@ -493,4 +864,5 @@ export default {
.van-swipe-item {
width: 100% !important;
}
</style>
\ No newline at end of file
......@@ -2,8 +2,7 @@
<van-form ref='form'
class='grow flex flex-col' style='min-height: 1px;flex-wrap: nowrap;'>
<div class='flex flex-col' v-if='fileType?.includes(1)'>
<div class='health mt-2'>
<div>
<!-- 无选项-->
<div class='health-cell mt-2' v-for="item in form.contentList.filter(e => e.templateModeTrans == '无')">
<div class='no-req-label'>{{ contentTitle }}</div>
......@@ -18,36 +17,37 @@
</div>
<!-- 更多选项-->
<div class='health-cell mt-2'>
<div class='no-req-label'>更多{{ contentTitle }}</div>
<van-field
v-model='form.contentSelectName'
readonly
is-link
placeholder='请选择'
class='input-back mt-2 form-input'
:rules='rules.contentSelectName'
@click='showContentSelect= true'
>
<template #input>
<span class='text-end'>{{ form.contentSelectName }}</span>
</template>
</van-field>
<van-popup v-model:show='showContentSelect' position='bottom'>
<div class='p-4'>
<div class='flex justify-between mb-4'>
<div class='greyColor' @click='showContentSelect = false'>取消</div>
<div class='blueColor' @click='contentSelectConfirm'>确认</div>
<div class='no-req-label'>更多{{ contentTitle }}</div>
<van-field
v-model='form.contentSelectName'
readonly
is-link
placeholder='请选择'
class='input-back mt-2 form-input'
:rules='rules.contentSelectName'
@click='showContentSelect= true'
>
<template #input>
<span class='text-end'>{{ form.contentSelectName }}</span>
</template>
</van-field>
<van-popup v-model:show='showContentSelect' position='bottom'>
<div class='p-4'>
<div class='flex justify-between mb-4'>
<div class='greyColor' @click='showContentSelect = false'>取消</div>
<div class='blueColor' @click='contentSelectConfirm'>确认</div>
</div>
<CheckBtn multiple column-2 :options='contentArray' v-model:value='checkContentSelect'
:fieldNames="{text: 'name', value: 'value'}" />
</div>
<CheckBtn multiple column-2 :options='contentArray' v-model:value='checkContentSelect'
:fieldNames="{text: 'name', value: 'value'}" />
</div>
</van-popup>
</van-popup>
</div>
<div class='health-cell mt-2' v-for="item in form.contentList.filter(e => e.templateModeTrans != '无')">
<template v-if='item.templateMode === 5'>
<div class='no-req-label'>药物指导</div>
<div v-for='(item, index) in form.drugsList' :key='item._id' :style="{marginTop: index == 0 ? '0': '.16rem'}">
<div v-for='(item, index) in form.drugsList' :key='item._id'
:style="{marginTop: index == 0 ? '0': '.16rem'}">
<div class='text-driver' v-if='index'></div>
<DocDrug v-model:value='item.drugsCode' placeholder='拼音码查询药品'
:valueName="selectData.drugsList ? selectData.drugsList[index]?.helpCode : ''"
......@@ -152,15 +152,20 @@
@play='e => activeMediaUrl = e.annexUrl'
remove
@onRemove='getMP3RemoveInfo'
class='mt-2'
/>
</div>
</div>
<div v-if='fileType.includes(3)' class='w-full'>
<Mp4 :files='_video' :activeMediaUrl='activeMediaUrl'
@play='e => activeMediaUrl = e.annexUrl'
remove
@onRemove='getMP4RemoveInfo'
/>
<div class='health-cell mt-2'>
<div class='no-req-label'>视频</div>
<Mp4 :files='_video' :activeMediaUrl='activeMediaUrl'
@play='e => activeMediaUrl = e.annexUrl'
remove
@onRemove='getMP4RemoveInfo'
class='mt-2'
/>
</div>
</div>
</van-form>
......@@ -286,18 +291,36 @@ export default {
]
let infoC = info.contentList || []
//判断父组件的数据里是否存在 无 的选项
let resList = infoC.filter(item => item.templateMode !=1)
if (!resList.length) {
contentList = [...initC, ...infoC]
let resList = infoC.filter(item => item.templateMode == 1)
if (!resList.length) { //不存在无选项
contentList = [ ...initC, ...infoC]
} else {
contentList = [...infoC]
contentList = [...infoC]
}
const drugsList = info?.drugsList?.length ? info.drugsList.map(e => {
if (e.id) {
e._id = e.id
e.doseUnitName = this.store.getDictValue(this.store.getDict('CP00081'), e.doseUnit)
e.frequencyName = this.store.getDictValue(this.store.getDict('CP00084'), e.frequency)
e.usageMethodName = this.store.getDictValue(this.store.getDict('CP00083'), e.usageMethod)
}
return e
}) : []
//给更多内容赋值
let contentSelectName = ''
let contentSelectNameList = []
this.checkContentSelect = []
contentList.forEach(item => {
if (item.templateMode !=1) {
this.checkContentSelect.push(item.templateMode)
contentSelectNameList.push(item.templateModeTrans)
}
if (contentSelectNameList && contentSelectNameList.length) {
contentSelectName = contentSelectNameList.join()
}
})
const form = {
id: info.id,
templateType: info.templateType,
......@@ -313,7 +336,8 @@ export default {
// 存放上传后返回的id
_video: JSON.parse(JSON.stringify(info._video || [])),
_audio: JSON.parse(JSON.stringify(info._audio || [])),
drugSelect: 1
drugSelect: 1,
contentSelectName: contentSelectName,
}
return form
},
......@@ -457,7 +481,7 @@ export default {
const drugsList = query.drugsList
let str = ''
drugsList.forEach(e => {
str = `药品名:${e.drugsName} 剂量:${e.dose} ${this.$dictValue('CP00081', e.doseUnit)} 频次:${this.$dictValue('CP00084', e.frequency)} 用法:${this.$dictValue('CP00083', e.usageMethod)}\n` + str
str = `药品名:${e.drugsName} 剂量:${e.dose} ${this.store.getDictValue('CP00081', e.doseUnit)} 频次:${this.store.getDictValue('CP00084', e.frequency)} 用法:${this.store.getDictValue('CP00083', e.usageMethod)}\n` + str
})
item.templateContent = str
}
......@@ -499,7 +523,7 @@ export default {
const drugsList = query.drugsList
let str = ''
drugsList.forEach(e => {
str = `药品名:${e.drugsName} 剂量:${e.dose} ${this.$dictValue('CP00081', e.doseUnit)} 频次:${this.$dictValue('CP00084', e.frequency)} 用法:${this.$dictValue('CP00083', e.usageMethod)}\n` + str
str = `药品名:${e.drugsName} 剂量:${e.dose} ${this.store.getDictValue('CP00081', e.doseUnit)} 频次:${this.store.getDictValue('CP00084', e.frequency)} 用法:${this.store.getDictValue('CP00083', e.usageMethod)}\n` + str
})
item.templateContent = str
}
......
......@@ -2,7 +2,7 @@
<div>
<van-nav-bar :title="routerDetail.id ? '修改通用随访': '新增通用随访'" left-text='' left-arrow
@click-left='toBack'></van-nav-bar>
<div class='p-4 h-overflow'>
<div class='p-4 h-overflow' ref='all'>
<base-info :info='info'
:modeEnumList='modeEnumList'
v-show='step == 1'
......@@ -186,6 +186,7 @@ export default {
this.modeEnumList = getModeEnum(this.info)
},
async toNext(val) {
this.$refs.all.scrollTo(0, 0)
if (val == 2) {
this.firstForm = await this.$refs.baseInfo.onSubmit()
}
......@@ -224,33 +225,10 @@ export default {
let baseInfo = await this.$refs.baseInfo.onSubmit()
let generalFUForm = await this.$refs.generalFUForm.onSubmit()
let commonBottom = await this.$refs.commonBottom.onSubmit()
let imgInput1List = []
let imgInput2List = []
let uploadVisitRecord = ''
let sceneVisitImage = ''
//图片上传
if (generalFUForm.imgInput1.length) {
imgInput1List = await this.upload(generalFUForm.imgInput1)
}
if (generalFUForm.imgInput2.length) {
imgInput2List = await this.upload(generalFUForm.imgInput2)
}
if (generalFUForm.img1.length) {
let img1List = this.baseImgHandle(generalFUForm.img1)
let lsit1 = [...imgInput1List, ...img1List]
uploadVisitRecord = Array.from(new Set(lsit1)).join()
}
if (generalFUForm.img2.length) {
let img2List = this.baseImgHandle(generalFUForm.img2)
let lsit2 = [...imgInput2List, ...img2List]
sceneVisitImage = Array.from(new Set(lsit2)).join()
}
let params = {
...baseInfo,
...generalFUForm,
...commonBottom,
uploadVisitRecord,
sceneVisitImage,
...baseInfo,
source: 2
}
if (this.info.id) {
......
......@@ -286,4 +286,18 @@ export function isResidentInfo() {
res = true
}
return res
}
//一维数组去重
export function uniqueArr(arr =[], key= '') {
let res = []
if (key) {
arr.forEach(item => {
let tmp = res.filter(i => i[key] == item[key])
if (!tmp.length) {
res.push(item)
}
})
}
return res
}
\ No newline at end of file
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment