Merge remote-tracking branch 'origin/dev' into dev

# Conflicts:
#	pages.json
This commit is contained in:
闫晓茹 2023-10-13 15:18:23 +08:00
commit fad8140fcc
42 changed files with 2050 additions and 561 deletions

View File

@ -11,7 +11,7 @@
/*每个页面公共css */
page {
// background-color: #F4F5F7;
background-color: #F4F5F7;
}
.app {

View File

@ -0,0 +1,12 @@
import request from "@/api/request.js"
export function getDoctorListtwo(pageNum, pageSize, teamNo, region) {
return request({
url: `/applet/signinfo/getDoctorList?pageNum=${pageNum}&pageSize=${pageSize}&teamNo=${teamNo}`,
method: 'get',
header: {
region: region
}
})
}

View File

@ -0,0 +1,12 @@
import request from "@/api/request.js"
//解约
export function rescindapplysave(data, region) {
return request({
url: `/applet/rescind/apply/save`,
method: 'post',
data: data,
header: {
region: region
}
})
}

View File

@ -0,0 +1,12 @@
import request from "@/api/request.js"
export function getPerformance(identity, region) {
return request({
url: `/applet/signinfo/getPerformance/${identity}`,
method: 'get',
header: {
region: region
}
})
}

View File

@ -44,4 +44,4 @@ export function getPackageByCrowdNo(data, region) {
region: region
}
})
}
}

View File

@ -0,0 +1,24 @@
import request from "@/api/request.js"
export function getContent(orgNo, region) {
return request({
url: `/applet/signinfo/getContent/${orgNo}`,
method: 'get',
header: {
region: region
}
})
}
export function getSignProtocol(cardNo, region) {
return request({
url: `/applet/signinfo/getSignProtocol/${cardNo}`,
method: 'get',
header: {
region: region
}
})
}

View File

@ -0,0 +1,263 @@
<template>
<view class="app">
<view class="agreement-title-box">
家庭医生签约服务协议书
</view>
<view class="agreement-content-container">
<view class="agreement-content_parta-box">
<h4>甲方</h4>
<h4 class="box-line">{{list.signInfo.agencyOrgName}}</h4>
</view>
<view class="agreement-content_parta-box">
<h4>乙方</h4>
<h4 class="box-line">{{list.signInfo.residentName?list.signInfo.residentName:''}}</h4>
</view>
<uni-table border stripe emptyText="暂无更多数据">
<uni-tr>
<uni-th>姓名</uni-th>
<uni-th>性别</uni-th>
<uni-th>年龄</uni-th>
<uni-th>身份证号</uni-th>
<uni-th>现住址</uni-th>
<uni-th>手机号码</uni-th>
<uni-th>选择签约基础服务包 </uni-th>
<uni-th>选择签约个性服务包</uni-th>
</uni-tr>
<uni-tr>
<uni-td>{{list.signInfo.residentName?list.signInfo.residentName:''}}</uni-td>
<uni-td>{{list.signInfo.gender === '1' ? '男' : '女'}}</uni-td>
<uni-td>{{list.signInfo.age?list.signInfo.age:''}}</uni-td>
<uni-td>{{list.signInfo.identity?list.signInfo.identity:''}}</uni-td>
<uni-td>{{list.signInfo.address?list.signInfo.address:''}}</uni-td>
<uni-td>{{list.signInfo.phone?list.signInfo.phone:''}}</uni-td>
<uni-td>{{list.basePackagesName?list.basePackagesName:''}} </uni-td>
<uni-td>{{list.specialPackagesName?list.specialPackagesName:""}}</uni-td>
</uni-tr>
</uni-table>
<view>
<p style='padding-top: 30rpx;line-height: 46rpx;'>甲乙双方本着平等尊重和自愿的原则签订此协议接受以下条款的约定</p>
<p style='padding: 30rpx 0;line-height: 46rpx;'>甲乙双方共同确定
<text class="box-line">{{list.signInfo.teamName}}</text>为乙方的家庭医生服务团队
</p>
<uni-table border stripe emptyText="暂无更多数据">
<uni-tr>
<uni-th>专病管理服务团队成员</uni-th>
<uni-th>姓名</uni-th>
<uni-th>职称</uni-th>
<uni-th>固定电话</uni-th>
<uni-th>联系电话</uni-th>
</uni-tr>
<uni-tr v-for="(member, index) in list.signInfo.dutyDoctorList" :index="index" :key="index">
<uni-td v-if="member.teamLeader">
团队长
</uni-td>
<uni-td v-else>
{{member.teamMemberType=='0'?'全科医生':''}}
{{member.teamMemberType=='1'?'专科医生':''}}
{{member.teamMemberType=='2'?'社区护士':''}}
{{member.teamMemberType=='3'?'公共卫生人员':''}}
</uni-td>
<uni-td>{{member.realname?member.realname:''}}</uni-td>
<uni-td>
{{member.profTitle=='0'?'初级':''}}
{{member.profTitle=='1'?'中级':''}}
{{member.profTitle=='2'?'高级':''}}
{{member.profTitle=='99'?'其他':''}}
</uni-td>
<uni-td>{{member.landline?member.landline:''}}</uni-td>
<uni-td>{{member.mobilePhone?member.mobilePhone:''}}</uni-td>
</uni-tr>
</uni-table>
<u-parse style="margin-top: 30rpx;" :html="list.protocolContent.content"></u-parse>
<h4 style='padding-top: 30rpx;font-weight: 600;'>服务收费</h4>
<p style='padding-top: 30rpx;line-height: 46rpx;'>1. 根据自愿选择的原则乙方选择<text
class="box-line">{{list.basePackagesName?list.basePackagesName:''}}{{list.specialPackagesName?''+list.specialPackagesName:''}}</text>由甲方提供相应服务服务费为<text
class="box-line">{{list.packSignCost}}</text>/</p>
<p style='padding-top: 30rpx;line-height: 46rpx;'>2.服务过程中根据医生判断及患者临时需求增加的服务内容按照国家相关规定和当地物价部门规定收费
</p>
<p style='padding-top: 30rpx;line-height: 46rpx;'>3.乙方应于<text
class="box-line">{{list.signInfo.signTime}}</text>
前将签约服务费缴纳至甲方机构指定科室不得由签约团队成员代收
</p>
<h4 style='padding-top: 30rpx;font-weight: 600;'>其他约定服务<text class="box-line">{{' '}}</text></h4>
<h4 style='padding-top: 30rpx;font-weight: 600;'>
保密条款签约居民授权其所签约的家庭医生及其团队成员可调阅其电子健康档案和在其他医疗机构的诊疗记录信息甲方有义务对签约居民的电子健康档案和在其他医疗机构的诊
疗记录信息予以保密除法律法规规定外未经签约居民允许不得泄露给第三方
</h4>
<h4 style='padding-top:30rpx;font-weight: 600;'>本协议未尽事宜经双方协商一致签订补充协议补充协议具有同等效力</h4>
<h4 style='padding-top: 30rpx;font-weight: 600;'>
本协议解释权归甲方协议一式两份乙双方各执一份自双方签字之日起生效
<text
class="box-line">{{list.signInfo.signTime}}{{' —— '}}{{list.signInfo.signDeadline}}</text>有效期<text
class="box-line">{{list.signYears}}</text>
</h4>
</view>
</view>
<view class="agreement-execute_container-img">
<view class="parta-execute_box">
<view class="textparta">甲方(团队长)签字</br><text style="padding-left: 15rpx;">(单位盖章)</text></view>
<image :src="list.doctorBase64" mode="aspectFill" style="width: 280rpx; height: 200rpx;"></image>
</view>
<view class="parta-execute_box">
<view class="textparta">乙方(居民)签字</br><text style="padding-left: 8rpx;">或拍照</text></view>
<image :src="list.residentBase64" mode="widthFix" style="width: 180rpx; height: 180rpx;"></image>
</view>
<view class="parta-execute_box">
<view class="textparta">机构公章</view>
<image :src="list.orgBase64" mode="widthFix" style="width: 180rpx; height: 180rpx;"></image>
</view>
</view>
<u-mask :show="signatureshow" @click="signatureshow = false">
<view style="position:absolute;bottom:0;height:900rpx;width:100%;background-color: #fff;"
v-if='signatureshow'>
<signature @userSignaturePictureUrl='userSignaturePicture' @click.native.stop
style='background-color: #F4F5F7;width: 100%;height: 900rpx;'></signature>
</view>
</u-mask>
<uni-fab ref="fab" horizontal="left" vertical="bottom" :content="fabContent" @trigger="fabTrigger" />
</view>
</template>
<script>
import baseurl from '@/api/baseurl.js'
import signature from '@/components/signature/signature.vue'
import {
getSignProtocol
} from '@/api/pagesC/contractsigningprotocol/index.js'
export default {
components: {
signature
},
data() {
return {
signatureshow: false,
list: null,
fabContent: [{
iconPath: '/static/pageC/signature-unselected.png',
selectedIconPath: '/static/pageC/signature-selected.png',
text: '居民签字',
active: true
}, {
iconPath: '/static/pageC/camera-unselected.png',
selectedIconPath: '/static/pageC/camera.png',
text: '居民拍照',
active: true
}],
};
},
methods: {
fabTrigger(e) {
if (e.index === 0) {
this.signatureshow = true
} else if (e.index === 1) {
this.openCamera()
}
},
openCamera() {
let that = this
setTimeout(function() {
uni.chooseImage({
sizeType: ['compressed'],
sourceType: ['camera'],
success: function(res) {
let tempFilePath = res.tempFilePaths[0]
uni.saveImageToPhotosAlbum({
filePath: tempFilePath,
success: (resp) => {
uni.uploadFile({
url: baseurl +
'/applet/sign/apply/residentSignatureUpload',
filePath: tempFilePath,
name: 'file',
header: {
region: '1'
},
timeout: 10000,
success(respp) {
// residentAutographPath
console.log(respp)
}
})
}
})
}
})
},
150)
},
// //
userSignaturePicture(data) {
this.signatureshow = false
},
info() {
getSignProtocol(this.cardNo, '1').then(res => {
this.list = res.data
})
},
},
onLoad(options) {
this.cardNo = options.cardNo
this.cardNo = '372424194703207523'
this.info();
},
}
</script>
<style lang="scss">
.app {
width: 98%;
margin: 10rpx auto;
background-color: #fff;
}
.agreement-title-box {
padding-top: 20rpx;
margin: 0 0 30rpx;
font-size: 40rpx;
font-weight: 600;
text-align: center;
}
.agreement-content-container {
margin: 10rpx 10rpx;
font-size: 16px;
color: #333333;
padding-bottom: 100rpx;
}
.agreement-content_parta-box {
display: flex;
flex-direction: row;
align-items: center;
justify-content: flex-start;
margin-bottom: 20rpx;
}
.box-line {
display: inline-block;
padding: 0 20rpx;
text-align: center;
border-bottom: 1px #808080 solid;
}
.agreement-execute_container-img {
display: flex;
flex-wrap: wrap;
padding-bottom: 200rpx;
.parta-execute_box {
width: 50%;
.textparta {
display: inline-block;
width: 100%;
text-align: center;
}
image {
display: block;
margin: 30rpx auto;
}
}
}
</style>

View File

@ -0,0 +1,52 @@
<template>
<view class="signature" style="background-color: #F4F5F7;height: 800rpx;">
<Signature @init="onSignInit" style='background-color: #fff;height: 700rpx;width: 100%;'></Signature>
<view class="btns">
<button @click="clear">清空</button>
<button @click="revoke">撤回</button>
<button @click="saveTempFilePath">保存</button>
</view>
</view>
</template>
<script>
import Signature from '@/components/v-sign/v-sign.vue'
export default {
components: {
Signature
},
methods: {
onSignInit(signCtx) {
this.signCtx = signCtx
},
//
clear() {
this.signCtx.clear()
},
//
revoke() {
this.signCtx.revoke()
},
// h5 base64
async saveTempFilePath() {
const res = await this.signCtx.canvasToTempFilePath()
this.$emit('userSignaturePictureUrl', res)
},
}
}
</script>
<style lang='scss'>
.signature {
height: 800rpx;
position: relative;
}
.btns {
margin-top: 50rpx;
display: flex;
}
button {
width: 30%;
}
</style>

View File

@ -0,0 +1,15 @@
/**
* 判断是否未数值
* @param {Object} val
*/
export function isNumber(val) {
return !isNaN(Number(val))
}
/**
* 处理大小单位
* @param {Object} val
*/
export function formatSize(val) {
return isNumber(val) ? `${val}rpx` : val
}

View File

@ -0,0 +1,162 @@
<template>
<view class="v-sign-action" :style="[customStyle]">
<view
v-for="item in btns"
:key="item.label"
:class="['btn', { border: border }]"
:style="[{ 'margin-right': formatSize(space) }]"
@click="onBtnClick(item)"
>
<image :class="['icon', 'icon-' + item.action]" :src="item.icon"></image>
<text class="text">{{ item.label }}</text>
</view>
</view>
</template>
<script>
/**
* v-sign-action 控制按钮组v-sign 子组件
* @description 控制 v-sign 组件的一些按钮
* @tutorial
* @property {Array} actions 按钮配置 所有值 清空clear, 撤回prev 保存图片save
* @property {Boolean} border 按钮是否有边框
* @property {String/Number} space 按钮间隔
* @property {Object} customStyle 根元素自定义样式
* @event {Function} 点击对应类型按钮触发对应事件 例如点击 clear 则触发 clear 事件
* @example 示例
**/
import { formatSize } from './utils'
// v-sign
let vSignInterface
//
const btn_type = {
CLEAR: 'clear', //
PREV: 'prev', // /
// NEXT: 'next',
SAVE: 'save' //
}
const all_action = Object.values(btn_type)
const btnsConf = [
{
label: '清空',
action: btn_type.CLEAR,
icon: '/static/v-sign/clear.png'
},
{
label: '撤回',
action: btn_type.PREV,
icon: '/static/v-sign/prev.png'
},
// {
// label: '',
// action: btn_type.NEXT,
// icon: '/static/v-sign/next.png'
// },
{
label: '保存',
action: btn_type.SAVE,
icon: '/static/v-sign/save.png'
}
]
export default {
name: 'v-sign-action',
props: {
//
actions: {
type: Array,
default: () => all_action
},
//
border: {
type: Boolean,
default: true
},
//
space: {
type: [String, Number],
default: 12
},
//
customStyle: {
type: Object,
default: () => ({})
}
},
inject: ['getInterface'],
data() {
return {
formatSize
}
},
computed: {
btns() {
return btnsConf.filter(item => this.actions.includes(item.action))
}
},
mounted() {
vSignInterface = this.getInterface()
},
methods: {
async onBtnClick(btn) {
// console.log(btn, btn.action)
let emit_result
switch (btn.action) {
case btn_type.CLEAR:
vSignInterface.clear()
break
case btn_type.PREV:
vSignInterface.revoke()
break
// case btn_type.NEXT:
// console.log('next')
// break
case btn_type.SAVE:
emit_result = await vSignInterface.canvasToTempFilePath()
break
default:
break
}
// console.log(btn.action, emit_result);
//
this.$emit(btn.action, emit_result)
}
}
}
</script>
<style lang="scss" scoped>
.v-sign-action {
display: flex;
flex-wrap: wrap;
.btn {
display: flex;
align-items: center;
padding: 0 12rpx;
min-width: 88rpx;
white-space: nowrap;
&:last-child {
margin-right: 0;
}
&.border {
border: 2rpx solid #666;
border-radius: 12rpx;
}
.icon {
width: 28rpx;
height: 28rpx;
&.icon-clear,
&.icon-prev,
&.icon-next {
margin-right: 4rpx;
}
&.icon-save {
}
}
.text {
color: #666;
font-size: 28rpx;
}
}
}
</style>

View File

@ -0,0 +1,211 @@
<template>
<view class="v-sign-pen">
<view class="label" v-if="label">{{ label }}</view>
<view class="options">
<view
class="opt-item"
:style="{
minHeight: minWrapHeight,
marginRight: space + 'rpx'
}"
v-for="item in csizes"
:key="item.size"
@click="onItemClick(item)"
>
<view
:class="type"
:style="{
border:
border && currentSelect.size === item.size
? `${borderWidth}rpx solid ${activeColor}`
: ''
}"
>
<view class="inner" :style="[defaultInnerStyle(item)]"></view>
</view>
</view>
</view>
</view>
</template>
<script>
/**
* v-sign-pen 画笔v-sign 子组件
* @description 控制 v-sign 画笔的线宽
* @tutorial
* @property {String} type 选项样式 line / circle
* @property {String} label 标签
* @property {Array} sizes 画笔大小数组单位 px
* @property {String} color 选项颜色
* @property {String} activeColor 选中项颜色
* @property {Boolean} border 选中项是否有边框
* @property {Number} borderWidth 边框大小单位 rpx
* @property {String} space 选项间隙单位 rpx
* @property {Number} bigger 圆点变大变粗倍数
* @property {Number} minSize 圆点最小大小单位 px
* @event {Function} change 选择画笔大小时触发
* @example
**/
// v-sign
let vSignInterface
//
const type_style = {
CIRCLE: 'circle',
LINE: 'line'
}
export default {
name: 'v-sign-pen',
props: {
//
type: {
type: String,
default: type_style.CIRCLE
},
label: {
type: String
},
// px
sizes: {
type: Array,
default: () => [2, 4, 6, 8, 10]
},
//
color: {
type: String,
default: '#333'
},
//
activeColor: {
type: String,
default: '#333'
},
//
border: {
type: Boolean,
default: true
},
// , rpx
borderWidth: {
type: Number,
default: 4
},
// , rpx
space: {
type: Number,
default: 20
},
//
bigger: {
type: Number,
default: 2
},
// px
minSize: {
type: Number,
default: 4
}
},
inject: ['getInterface'],
data() {
return {
type_style,
currentSelect: null,
csizes: [],
maxSize: 0,
maxCsize: 0
}
},
computed: {
minWrapHeight() {
let height
switch (this.type) {
case type_style.CIRCLE:
height = this.maxCsize + 10 + 'px'
break
case type_style.LINE:
height = this.maxSize + 4 + 'px'
break
}
return height
}
},
created() {
this.csizes = this.sizes.map((size, index) => {
const csize = (index + 1) * this.bigger + this.minSize
this.maxSize = csize > this.maxSize ? csize : this.maxSize
this.maxCsize = csize > this.maxCsize ? csize : this.maxCsize
return {
size,
csize
}
})
this.currentSelect = this.csizes[0]
},
mounted() {
vSignInterface = this.getInterface()
this.setLineWidth()
},
methods: {
onItemClick(opt) {
this.currentSelect = opt
this.setLineWidth()
this.$emit('change', opt.size)
},
setLineWidth() {
vSignInterface.setLineWidth(this.currentSelect.size)
},
defaultInnerStyle(item) {
let width
let height
switch (this.type) {
case type_style.CIRCLE:
width = `${item.csize}px`
height = `${item.csize}px`
break
case type_style.LINE:
width = '20px'
height = `${item.size}px`
break
}
const background = this.currentSelect.size === item.size ? this.activeColor : this.color
return {
width,
height,
background
}
}
}
}
</script>
<style lang="scss" scoped>
.v-sign-pen {
padding: 12rpx;
.label {
font-size: 28rpx;
color: #333;
}
.options {
display: flex;
align-items: flex-end;
.opt-item {
display: flex;
align-items: flex-end;
justify-content: center;
&:last-child {
margin-right: 0;
}
.circle {
border-radius: 50%;
padding: 4rpx;
.inner {
border-radius: 50%;
}
}
.line {
padding: 4rpx;
}
}
}
}
</style>

View File

@ -0,0 +1,238 @@
<template>
<view class="signature-wrap">
<canvas
:canvas-id="cid"
:id="cid"
@touchstart="onTouchStart"
@touchmove="onTouchMove"
@touchend="onTouchEnd"
style="height:600rpx"
:style="[{ width: formatSize(width)}, customStyle]"
></canvas>
<slot />
</view>
</template>
<script>
/**
* sign canvas 手写签名
* @description 设置线条宽度颜色撤回清空
* @tutorial
* @property {String} cid canvas id 不设置则默认为 v-sign-时间戳
* @property {String, Number} width canvas 宽度
* @property {String, Number} height canvas 高度
* @property {Object} customStyle 自定义样式
* @property {String} lineColor 画笔颜色
* @property {Number} lineWidth 画笔大小权重大于 v-sign-pen 组件设置的画笔大小
* @event {Function} init 当创建完 canvas 实例后触发向外提供 canvas实例撤回清空方法
* @example <v-sign @init="signInit"></v-sign>
*/
import { formatSize } from './utils'
// convas
let canvasCtx
export default {
name: 'v-sign',
props: {
// canvas id
cid: {
type: String,
default: `v-sign-${Date.now()}`
// required: true
},
// canvas
width: {
type: [String, Number],
default: '100%'
},
// canvas
height: {
type: [String, Number],
default: 300
},
// v-sign-pen
lineWidth: {
type: Number
},
// 线
lineColor: {
type: String,
default: '#000'
},
// canvas
customStyle: {
type: Object,
default: () => ({})
}
},
provide() {
return {
getInterface: this.provideInterface
}
},
data() {
return {
formatSize,
lineData: [],
winWidth: 0,
winHeight: 0,
penLineWidth: null, // v-sign-pen
}
},
mounted() {
canvasCtx = uni.createCanvasContext(this.cid, this)
//
this.$emit('init', this.provideInterface())
//
uni.getSystemInfo({
success: res => {
this.winWidth = res.windowWidth
this.winHeight = res.windowHeight
}
})
},
methods: {
onTouchStart(e) {
const pos = e.touches[0]
this.lineData.push({
style: {
color: this.lineColor,
width: this.lineWidth || this.penLineWidth || 4
},
//
coordinates: [
{
type: e.type,
x: pos.x,
y: pos.y
}
]
})
this.drawLine()
},
onTouchMove(e) {
const pos = e.touches[0]
this.lineData[this.lineData.length - 1].coordinates.push({
type: e.type,
x: pos.x,
y: pos.y
})
this.drawLine()
},
onTouchEnd(e) {
// console.log(e.type, e)
},
//
clear() {
this.lineData = []
canvasCtx.clearRect(0, 0, this.winWidth, this.winHeight)
canvasCtx.draw()
},
//
revoke() {
this.lineData.pop()
this.lineData.forEach((item, index) => {
canvasCtx.beginPath()
canvasCtx.setLineCap('round')
canvasCtx.setStrokeStyle(item.style.color)
canvasCtx.setLineWidth(item.style.width)
item.coordinates.forEach(pos => {
if (pos.type == 'touchstart') {
canvasCtx.moveTo(pos.x, pos.y)
} else {
canvasCtx.lineTo(pos.x, pos.y)
}
})
canvasCtx.stroke()
})
canvasCtx.draw()
},
// 线
drawLine() {
const lineDataLen = this.lineData.length
if (!lineDataLen) return
const currentLineData = this.lineData[lineDataLen - 1]
const coordinates = currentLineData.coordinates
const coordinatesLen = coordinates.length
if (!coordinatesLen) return
let startPos
let endPos
if (coordinatesLen < 2) {
// only start, no move event
startPos = coordinates[coordinatesLen - 1]
endPos = { x: startPos.x + 1, y: startPos.y }
} else {
startPos = coordinates[coordinatesLen - 2]
endPos = coordinates[coordinatesLen - 1]
}
const style = currentLineData.style
canvasCtx.beginPath()
canvasCtx.setLineCap('round')
canvasCtx.setStrokeStyle(style.color)
canvasCtx.setLineWidth(style.width)
canvasCtx.moveTo(startPos.x, startPos.y)
canvasCtx.lineTo(endPos.x, endPos.y)
// const P1 = this.caculateBezier(startPos, endPos, centerPos)
// console.log(P1.x, P1.y)
// canvasCtx.moveTo(startPos.x, startPos.y)
// canvasCtx.quadraticCurveTo(P1.x, P1.y, endPos.x, endPos.y)
canvasCtx.stroke()
canvasCtx.draw(true)
},
canvasToTempFilePath(conf = {}) {
return new Promise((resolve, reject) => {
uni.canvasToTempFilePath(
{
canvasId: this.cid,
...conf,
success: res => {
resolve(res.tempFilePath)
},
fail: err => {
console.log('fail', err)
reject(err)
}
},
this
)
})
},
setLineWidth(numberVal) {
this.penLineWidth = numberVal
},
provideInterface() {
return {
cid: this.cid,
ctx: canvasCtx,
clear: this.clear,
revoke: this.revoke,
canvasToTempFilePath: this.canvasToTempFilePath,
setLineWidth: this.setLineWidth
}
},
/**
* 计算二次贝塞尔曲线 控制点 P1
* 起点 P0(x0,y0)控制点P1(x1, y1)P2(x2, y2)曲线上任意点B(x, y)
* 二次贝塞尔公式B(t) = (1-t)²P0 + 2t(1-t)P1 + t²P2
* 代入坐标得
* x = (1-t)²*x0 + 2t(1-t)*x1 + *x2
* y = (1-t)²*y0 + 2t(1-t)*y1 + *y2
*/
caculateBezier(P0, P2, B, t = 0.5) {
const { x: x0, y: y0 } = P0
const { x: x2, y: y2 } = P2
const { x, y } = B
let x1 = (x - (1 - t) * (1 - t) * x0 - t * t * x2) / (2 * t * (1 - t))
let y1 = (y - (1 - t) * (1 - t) * y0 - t * t * y2) / (2 * t * (1 - t))
return { x: x1, y: y1 }
}
}
}
</script>
<style lang="scss" scoped>
.signature-wrap {
position: relative;
}
</style>

View File

@ -3,7 +3,7 @@
"^u-(.*)": "uview-ui/components/u-$1/u-$1.vue"
},
"pages": [ //pageshttps://uniapp.dcloud.io/collocation/pages
{
"path": "pages/startup/startup",
"style": {
@ -16,7 +16,7 @@
"enablePullDownRefresh": false,
"navigationStyle": "custom"
}
},
},
{
"path": "pages/medicalservice/medicalservice",
"style": {
@ -398,12 +398,6 @@
"navigationBarTitleText": "履约详情",
"enablePullDownRefresh": false
}
}, {
"path": "contractsigningprotocol/contractsigningprotocol",
"style": {
"navigationBarTitleText": "签约协议",
"enablePullDownRefresh": false
}
}
]
}, {
@ -509,6 +503,13 @@
"navigationBarTitleText": "",
"enablePullDownRefresh": false
}
},
{
"path": "contractsigningprotocol/contractsigningprotocol",
"style": {
"navigationBarTitleText": "签约协议",
"enablePullDownRefresh": false
}
}
]
}],
@ -551,4 +552,4 @@
}
]
}
}
}

View File

@ -114,7 +114,7 @@
//
goonline() {
uni.navigateTo({
url: "/pagesB/mysigning/mysigning"
url: "/pagesC/Onlinesigning/Onlinesigning"
})
// if (!this.userinfo) {
// this.gologin();
@ -246,4 +246,4 @@
<style lang="scss">
@import "./homepage.scss";
</style>
</style>

View File

@ -114,4 +114,4 @@
padding-left: 10rpx;
}
}
}
}

View File

@ -3,7 +3,7 @@
<view class="content" v-for="(item,index) in prejectlist">
<view class="big">{{item.projectName}}
</view>
<view class="servename" @tap="result(item.projectId)">
<view class="servename" @tap="result(item)">
查看筛查结果
</view>
</view>
@ -33,7 +33,7 @@
} from '@/api/pagesB/SelectItem/SelectItem.js'
export default {
data() {
return {
prejectlist:{},
};
@ -43,19 +43,20 @@
projectTypedata(projectType).then(res=>{
this.prejectlist=res.data
console.log(res)
})
// this.resultstype();
},
methods: {
resultstype(){
},
//
result(item){
console.log(item)
uni.navigateTo({
url: `/pagesB/screeningResult/screeningResult?registerId=${item}`
url: `/pagesB/screeningResult/screeningResult?projectId=${item.projectId}`
});
console.log(item)

View File

@ -86,11 +86,7 @@
</script>
<style lang="scss">
page {
background-color: #F4F5F7;
}
.app {
.app {
.card {
background-color: #fff;

View File

@ -1,19 +0,0 @@
<template>
<view>
</view>
</template>
<script>
export default {
data() {
return {
};
}
}
</script>
<style lang="scss">
</style>

View File

@ -0,0 +1,178 @@
.app {
padding-top: 10rpx;
width: 100%;
.btns {
width: 100%;
display: flex;
font-size: 31rpx;
justify-content: space-around;
text-align: center;
font-weight: 500;
margin-top: 80rpx;
padding-bottom: 50rpx;
.btnleft {
width: 290rpx;
height: 62rpx;
background: #FFFFFF;
border: 1px solid #26A888;
border-radius: 5rpx;
color: #26A888;
line-height: 62rpx
}
.btnright {
width: 289rpx;
height: 62rpx;
background: #26A888;
border-radius: 5rpx;
color: #FFFFFF;
line-height: 62rpx;
}
}
.item {
width: 96%;
margin: 20rpx auto;
background-color: #fff;
box-shadow: 0rpx 9rpx 31rpx 9rpx rgba(0, 0, 0, 0.03);
border-radius: 5rpx;
padding-bottom: 50rpx;
.select {
width: 90%;
height: 80rpx;
background: #F6F6F6;
margin: 12rpx auto;
border-radius: 5rpx;
display: flex;
position: relative;
text {
padding: 0 60rpx 0 20rpx;
line-height: 80rpx;
font-size: 22rpx;
font-weight: 400;
height: 80rpx;
color: #8E8E8E;
// text-overflow: -o-ellipsis-lastline;
// overflow: hidden;
// text-overflow: ellipsis;
// display: -webkit-box;
// -webkit-line-clamp: 1;
// line-clamp: 1;
// -webkit-box-orient: vertical;
// white-space:normal;
// word-break:break-all;
}
image {
width: 9rpx;
height: 17rpx;
position: absolute;
right: 40rpx;
top: 50%;
-webkit-transform: translateY(-50%);
transform: translateY(-50%);
}
}
.textarea {
font-size: 18rpx;
font-weight: 400;
color: #8E8E8E;
line-height: 42rpx;
padding: 30rpx 0 0 40rpx;
}
.text {
font-size: 30rpx;
font-weight: 400;
color: #333333;
padding: 30rpx 0 0 40rpx;
}
::v-deep .u-upload {
padding: 30rpx 30rpx 0 30rpx;
}
.input {
width: 90%;
height: 80rpx;
border-radius: 5rpx;
background: #f6f6f6;
margin: 20rpx 0 0 40rpx;
position: relative;
padding-left: 10rpx;
image {
width: 10rpx;
height: 20rpx;
position: absolute;
top: 50%;
right: 5%;
transform: translateY(-50%);
}
.uni-textarea-placeholder {
padding-left: 12rpx;
font-size: 22rpx;
font-weight: 400;
color: #8E8E8E !important;
}
.phsy {
padding-left: 12rpx;
font-size: 22rpx;
font-weight: 400;
color: #8E8E8E !important;
}
.inputtext {
padding-left: 12rpx;
color: black;
font-size: 26rpx;
width: 90%;
height: 80rpx;
line-height: 80rpx;
}
.uinput {
color: black;
font-size: 26rpx;
width: 90%;
height: 80rpx;
line-height: 80rpx;
}
.noimageuinput {
width: 98% !important;
}
}
}
.title {
width: 100%;
padding: 10rpx 0 10rpx 35rpx;
.left {
vertical-align: middle;
display: inline-block;
width: 10rpx;
height: 30rpx;
background: #26A888;
border-radius: 1rpx;
}
.right {
vertical-align: middle;
display: inline-block;
font-size: 30rpx;
font-weight: 500;
color: #26A888;
line-height: 30rpx;
margin-left: 20rpx;
}
}
}

View File

@ -39,6 +39,14 @@
<input v-model="formdata.phone" class="uinput noimageuinput" placeholder="请输入患者联系电话" type="text"
placeholder-class="phsy" />
</view>
<view class="text">
选择医生
</view>
<view class="select" @tap='gochoosedoctor'>
<text v-if="formdata.doctorName" style="font-size: 26rpx;color: #303133;">{{formdata.doctorName}}</text>
<text v-else>请选择医生</text>
<image src="../../static/huijiantou.png" mode=""></image>
</view>
</view>
<view class="title">
<view class="left">
@ -163,6 +171,13 @@
},
onShow() {
this.areaInfo();
let that = this
uni.$on('doctordata', function(data) {
let item = JSON.parse(data.data)
that.formdata.doctorName = item.realname
that.formdata.doctorId = item.userNo
uni.$off('doctordata')
})
},
methods: {
updata() {
@ -222,153 +237,15 @@
this.address = '请选择所属地区'
}
},
gochoosedoctor() {
uni.navigateTo({
url: '/pagesC/choosedoctor/choosedoctor'
})
},
}
}
</script>
<style lang="scss">
page {
background-color: #F4F5F7;
}
.app {
padding-top: 10rpx;
width: 100%;
.btns {
width: 100%;
display: flex;
font-size: 31rpx;
justify-content: space-around;
text-align: center;
font-weight: 500;
margin-top: 80rpx;
padding-bottom: 50rpx;
.btnleft {
width: 290rpx;
height: 62rpx;
background: #FFFFFF;
border: 1px solid #26A888;
border-radius: 5rpx;
color: #26A888;
line-height: 62rpx
}
.btnright {
width: 289rpx;
height: 62rpx;
background: #26A888;
border-radius: 5rpx;
color: #FFFFFF;
line-height: 62rpx;
}
}
.item {
width: 96%;
margin: 20rpx auto;
background-color: #fff;
box-shadow: 0rpx 9rpx 31rpx 9rpx rgba(0, 0, 0, 0.03);
border-radius: 5rpx;
padding-bottom: 50rpx;
.textarea {
font-size: 18rpx;
font-weight: 400;
color: #8E8E8E;
line-height: 42rpx;
padding: 30rpx 0 0 40rpx;
}
.text {
font-size: 30rpx;
font-weight: 400;
color: #333333;
padding: 30rpx 0 0 40rpx;
}
::v-deep .u-upload {
padding: 30rpx 30rpx 0 30rpx;
}
.input {
width: 90%;
height: 80rpx;
border-radius: 5rpx;
background: #f6f6f6;
margin: 20rpx 0 0 40rpx;
position: relative;
padding-left: 10rpx;
image {
width: 10rpx;
height: 20rpx;
position: absolute;
top: 50%;
right: 5%;
transform: translateY(-50%);
}
.uni-textarea-placeholder {
padding-left: 12rpx;
font-size: 22rpx;
font-weight: 400;
color: #8E8E8E !important;
}
.phsy {
padding-left: 12rpx;
font-size: 22rpx;
font-weight: 400;
color: #8E8E8E !important;
}
.inputtext {
padding-left: 12rpx;
color: black;
font-size: 26rpx;
width: 90%;
height: 80rpx;
line-height: 80rpx;
}
.uinput {
color: black;
font-size: 26rpx;
width: 90%;
height: 80rpx;
line-height: 80rpx;
}
.noimageuinput {
width: 98% !important;
}
}
}
.title {
width: 100%;
padding: 10rpx 0 10rpx 35rpx;
.left {
vertical-align: middle;
display: inline-block;
width: 10rpx;
height: 30rpx;
background: #26A888;
border-radius: 1rpx;
}
.right {
vertical-align: middle;
display: inline-block;
font-size: 30rpx;
font-weight: 500;
color: #26A888;
line-height: 30rpx;
margin-left: 20rpx;
}
}
}
</style>
@import './createnewconsultation.scss';
</style>

View File

@ -74,11 +74,7 @@
</script>
<style lang="scss">
page {
background-color: #F4F5F7;
}
.app {
.app {
width: 96%;
margin: 16rpx auto;
color: #666666;

View File

@ -47,11 +47,7 @@
</script>
<style lang="scss">
page {
background-color: #F4F5F7;
}
.app {
.app {
background-color: #fff;
width: 96%;
margin: 20rpx auto 0;

View File

@ -114,10 +114,6 @@
</script>
<style lang="scss">
page {
background-color: #F4F5F7;
}
.app {
width: 96%;
margin: 20rpx auto;

View File

@ -1,6 +1,3 @@
page {
background-color: #F4F5F7;
}
.app {
color: #333333;

View File

@ -1,6 +1,4 @@
page {
background-color: #F4F5F7;
}
.app {
background-color: #F4F5F7;
width: 100%;

View File

@ -0,0 +1,94 @@
.app {
width: 96%;
margin: 20rpx auto;
background-color: #fff;
.list {
width: 100%;
.item {
width: 96%;
margin: 0 auto;
padding-bottom: 60rpx;
border-bottom: 2rpx solid #E6E6E6;
position: relative;
height: 300rpx;
.zixunbtn {
width: 169rpx;
height: 61rpx;
background: #26A888;
border-radius: 5rpx;
font-size: 28rpx;
font-weight: 400;
color: #FFFFFF;
line-height: 61rpx;
text-align: center;
position: absolute;
top: 65%;
right: 10rpx;
}
.title {
position: absolute;
top: 70%;
left: 210rpx;
font-size: 18rpx;
font-weight: 500;
color: #FFA733;
line-height: 30rpx;
height: 30rpx;
background: #FFFFFF;
border: 1px solid #FFA115;
border-radius: 5rpx;
text-align: center;
padding: 0 15rpx;
}
.phone {
position: absolute;
top: 38%;
left: 210rpx;
font-size: 28rpx;
font-weight: 400;
color: #959595;
}
.name {
position: absolute;
font-size: 28rpx;
font-weight: 500;
color: #333333;
top: 20%;
left: 210rpx;
}
image {
position: absolute;
top: 50%;
transform: translateY(-50%);
left: 5rpx;
width: 180rpx;
height: 180rpx;
}
}
}
.teamname {
padding: 20rpx 0 0 30rpx;
display: flex;
align-items: flex-end;
image {
width: 40rpx;
height: 36rpx;
}
.name {
padding-left: 15rpx;
font-size: 28rpx;
font-weight: 500;
color: #000000;
}
}
}

View File

@ -3,37 +3,22 @@
<view class="teamname">
<image src="../../static/pagesB/myfamilydoctorteam.png" mode=""></image>
<view class="name">
中心团队
{{list?list[0].teamName:''}}
</view>
</view>
<view class="list">
<view class="item">
<image src="../../static/pagesB/Behave.png" mode=""></image>
<view class="item" v-for='item in list'>
<image src="../../static/docHead.png" mode=""></image>
<view class="name">
齐鲁医院张医生
{{item.realname?item.realname:''}}
</view>
<view class="phone">
17869882345
{{item.mobilePhone?item.mobilePhone:''}}
</view>
<view class="title">
全科医生
{{item.teamMemberTypeName?item.teamMemberTypeName:''}}
</view>
<view class="zixunbtn">
咨询
</view>
</view>
<view class="item">
<image src="../../static/pagesB/Behave.png" mode=""></image>
<view class="name">
齐鲁医院张医生
</view>
<view class="phone">
17869882345
</view>
<view class="title">
全科医生
</view>
<view class="zixunbtn">
<view class="zixunbtn" @tap='goseekadvicefrom'>
咨询
</view>
</view>
@ -42,112 +27,58 @@
</template>
<script>
import {
getDoctorListtwo
} from '@/api/pagesB/myfamilydoctorteam/index.js'
export default {
data() {
return {
pageNum: 1,
pageSize: 10,
teamNo: null,
list: null,
total: 0,
};
}
},
onLoad(options) {
this.teamNo = options.teamNo
this.info()
},
methods: {
info() {
getDoctorListtwo(this.pageNum, this.pageSize, this.teamNo, '1').then(res => {
this.list = res.rows
this.total = res.total
})
},
//
goseekadvicefrom() {
uni.navigateTo({
url: `/pagesB/imagetextConsultation/imagetextConsultation`
})
},
},
onReachBottom() { //
if (this.list.length >= this.total) {} else {
this.pageNum++;
getDoctorListtwo(this.pageNum, this.pageSize, this.teamNo, '1').then(res => {
res.rows.forEach(e => {
this.list.push(e)
})
this.total = res.total
})
}
},
onPullDownRefresh() { //
this.pageNum = 1;
this.info()
setTimeout(function() {
uni.stopPullDownRefresh();
}, 1000);
},
}
</script>
<style lang="scss">
page {
background-color: #F4F5F7;
}
.app {
width: 96%;
margin: 20rpx auto;
background-color: #fff;
.list {
width: 100%;
.item {
width: 96%;
margin: 0 auto ;
padding-bottom: 60rpx;
border-bottom: 2rpx solid #E6E6E6;
position: relative;
height: 300rpx;
.zixunbtn {
width: 169rpx;
height: 61rpx;
background: #26A888;
border-radius: 5rpx;
font-size: 28rpx;
font-weight: 400;
color: #FFFFFF;
line-height: 61rpx;
text-align: center;
position: absolute;
top: 65%;
right: 10rpx;
}
.title {
position: absolute;
top: 70%;
left: 210rpx;
font-size: 18rpx;
font-weight: 500;
color: #FFA733;
line-height: 30rpx;
height: 30rpx;
background: #FFFFFF;
border: 1px solid #FFA115;
border-radius: 5rpx;
text-align: center;
padding: 0 15rpx;
}
.phone {
position: absolute;
top: 38%;
left: 210rpx;
font-size: 28rpx;
font-weight: 400;
color: #959595;
}
.name {
position: absolute;
font-size: 28rpx;
font-weight: 500;
color: #333333;
top: 20%;
left: 210rpx;
}
image {
position: absolute;
top: 50%;
transform: translateY(-50%);
left: 5rpx;
width: 180rpx;
height: 180rpx;
}
}
}
.teamname {
padding: 20rpx 0 0 30rpx;
display: flex;
align-items: flex-end;
image {
width: 40rpx;
height: 36rpx;
}
.name {
padding-left: 15rpx;
font-size: 28rpx;
font-weight: 500;
color: #000000;
}
}
}
</style>
@import './myfamilydoctorteam.scss';
</style>

View File

@ -0,0 +1,220 @@
.app {
width: 96%;
margin: 20rpx auto;
background-color: #fff;
padding-bottom: 50rpx;
font-size: 31rpx;
.mask {
background-color: #fff;
width: 100%;
position: relative;
height: 100%;
padding-top: 80rpx;
.titletext {
width: 100%;
padding: 40rpx 30rpx 0;
display: flex;
.select {
width: 60%;
height: 63rpx;
border: 2rpx solid #d0d0d0;
border-radius: 5rpx;
display: flex;
position: relative;
flex: 1;
text {
height: 63rpx;
padding: 0 60rpx 0 20rpx;
line-height: 63rpx;
font-weight: 400;
color: gray;
font-size: 24rpx;
// text-overflow: -o-ellipsis-lastline;
// overflow: hidden;
// text-overflow: ellipsis;
// display: -webkit-box;
// -webkit-line-clamp: 1;
// line-clamp: 1;
// -webkit-box-orient: vertical;
// white-space:normal;
// word-break:break-all;
}
image {
width: 9rpx;
height: 17rpx;
position: absolute;
right: 40rpx;
top: 50%;
-webkit-transform: translateY(-50%);
transform: translateY(-50%);
}
}
}
.btnss {
display: flex;
text-align: center;
border-top: 1rpx solid #f6f6f6;
font-size: 32rpx;
line-height: 100rpx;
width: 100%;
position: absolute;
bottom: 0;
.cancel {
width: 50%;
height: 100rpx;
border-right: 0.5rpx solid #f6f6f6;
}
.Rescind {
width: 50%;
height: 100rpx;
color: #55d0df;
border-left: 0.5rpx solid #f6f6f6;
}
}
textarea {
padding: 10rpx 20rpx;
font-size: 24rpx;
border: 1rpx solid #d0d0d0;
flex: 1;
}
text {
display: inline-block;
padding-left: 20rpx;
width: 200rpx;
height: 50rpx;
font-size: 28rpx;
line-height: 50rpx;
color: #333333;
}
}
.btns {
width: 100%;
display: flex;
justify-content: space-evenly;
padding-bottom: 100rpx;
.leftbtn,
.rightbtn {
width: 290rpx;
height: 62rpx;
background: #FFFFFF;
border: 1px solid #26A888;
border-radius: 5rpx;
text-align: center;
font-weight: 500;
color: #26A888;
line-height: 62rpx;
}
.rightbtn {
color: #fff;
background: #26A888;
}
}
.lookbtn {
margin: 50rpx auto 0;
width: 497rpx;
height: 62rpx;
background: #FFFFFF;
border: 1px solid #26A888;
border-radius: 5rpx;
font-weight: 500;
color: #26A888;
text-align: center;
line-height: 62rpx;
}
.border {
width: 94%;
height: 2rpx;
margin: 60rpx auto 30rpx;
background: #E6E6E6;
}
.item {
width: 100%;
padding: 30rpx 50rpx 0 50rpx;
font-size: 30rpx;
font-weight: 400;
color: #333333;
word-break: break-all;
}
.flexitem {
display: flex;
justify-content: space-between;
.right {
display: flex;
align-items: flex-end;
image {
width: 30rpx;
height: 30rpx;
}
text {
padding-left: 10rpx;
}
}
}
.name {
width: 100%;
font-size: 38rpx;
font-weight: 500;
color: #333333;
padding: 60rpx 50rpx 0 50rpx;
display: flex;
align-items: flex-end;
.text {
margin-right: 40rpx;
}
.card {
font-size: 18rpx;
font-weight: 400;
color: #FFA115;
padding: 0 15rpx;
height: 35rpx;
line-height: 35rpx;
background: #FFFFFF;
border: 1px solid #FFA115;
border-radius: 5rpx;
margin-right: 14rpx;
text-align: center;
}
}
.title {
width: 100%;
padding: 20rpx 0 0 30rpx;
display: flex;
align-items: flex-end;
.text {
font-size: 28rpx;
font-weight: 500;
color: #000000;
padding-left: 20rpx;
}
image {
width: 35rpx;
height: 35rpx;
}
}
}

View File

@ -15,7 +15,7 @@
</view>
</view>
<view class="item">
{{list.gender=='2'?'女':''}}{{list.gender=='1'?'男':''}}&nbsp;&nbsp;&nbsp; {{list.age}}
{{list.gender=='2'?'女':''}}{{list.gender=='1'?'男':''}}&nbsp;&nbsp;&nbsp; {{list.age? list.age +'岁':''}}
</view>
<view class="item">
{{list.phone?list.phone:''}}
@ -73,17 +73,48 @@
<view class="border">
</view>
<view class="btns">
<view class="leftbtn">
<view class="leftbtn" @tap='maskshow = true'>
申请解约
</view>
<view class="rightbtn" @tap='gocontractsigningprotocol'>
查看签约协议
</view>
</view>
<u-popup v-model="maskshow" mode="center" length="90%" closeable height="50%">
<view class="mask" @tap.stop=''>
<view class="titletext">
<text>解约类型</text>
<view class="select" @tap='maskshowtwo=true'>
<text v-if="list.rescindName">{{list.rescindName}}</text>
<text v-else>请选择解约类型</text>
<image src="../../static/huijiantou.png" mode=""></image>
</view>
</view>
<view class="titletext">
<text>解约原因</text>
<textarea name="" id="" cols="30" rows="10" style="width: 60%;color: gray;" placeholder="请输入解决原因"
v-model="list.rescindReason"></textarea>
</view>
<view class="btnss">
<view class="cancel" @click="maskshowtwo=false">
取消
</view>
<view class="Rescind" @click="rescindapplysaveinfo">
解约
</view>
</view>
</view>
</u-popup>
<u-toast ref="uToast" />
<u-select v-model="maskshowtwo" mode="single-column" :list="maskshowtwolist" @confirm="maskshowtwoconfirm"
z-index='10076'></u-select>
</view>
</template>
<script>
import {
rescindapplysave
} from '@/api/pagesB/mysigning/index.js'
import {
detail,
} from '@/api/pages/homepage/homepage.js'
@ -91,15 +122,54 @@
data() {
return {
list: {},
maskshow: false,
maskshowtwo: false,
maskshowtwolist: [{
value: 1,
label: '主动解约'
},
{
value: 2,
label: '迁出'
}, {
value: 3,
label: '死亡'
}, {
value: 4,
label: '到期'
}, {
value: 5,
label: '其他'
},
],
};
},
methods: {
//
rescindapplysaveinfo() {
rescindapplysave(this.list).then(res => {
if (res.code == 200) {
this.$refs.uToast.show({
title: '您已解约成功',
type: 'success',
})
setTimeout(() => {
uni.switchTab({
url: "/pages/homepage/homepage"
})
}, 2000)
}
})
},
//
detailinfo() {
// detail(uni.getStorageSync('userinfo').cardNo, this.region).then(res => {
detail('372424194703207523', '1').then(res => {
if (res.code == 200) {
this.list = res.data
this.list.rescindType = null
this.list.rescindName = null
this.list.rescindReason = null
this.list.crowdsName = this.list.crowdsName.split(',')
this.list.packagesName = this.list.packagesName.split(',')
}
@ -108,7 +178,7 @@
//
gomyfamilydoctorteam() {
uni.navigateTo({
url: '/pagesB/myfamilydoctorteam/myfamilydoctorteam'
url: `/pagesB/myfamilydoctorteam/myfamilydoctorteam?teamNo=${this.list.teamNo}`
})
},
//
@ -120,18 +190,22 @@
//
gocontractsigningprotocol() {
uni.navigateTo({
url: "/pagesB/contractsigningprotocol/contractsigningprotocol"
url: `/pagesC/contractsigningprotocol/contractsigningprotocol?orgNo=${this.list.orgNo}&cardNo=${this.list.identity}`
})
},
//
goseekadvicefrom() {
uni.navigateTo({
url: `pagesB/imagetextConsultation/imagetextConsultation`
url: `/pagesB/imagetextConsultation/imagetextConsultation`
})
// uni.navigateTo({
// url: `/pagesC/seekadvicefrom/seekadvicefrom?item=${JSON.stringify(this.list)}`
// })
},
maskshowtwoconfirm(e) {
this.list.rescindType = e[0].value
this.list.rescindName = e[0].label
},
},
onLoad(options) {
this.detailinfo();
@ -140,135 +214,5 @@
</script>
<style lang="scss">
page {
background-color: #F4F5F7;
}
.app {
width: 96%;
margin: 20rpx auto;
background-color: #fff;
padding-bottom: 50rpx;
font-size: 31rpx;
.btns {
width: 100%;
display: flex;
justify-content: space-evenly;
padding-bottom: 100rpx;
.leftbtn,
.rightbtn {
width: 290rpx;
height: 62rpx;
background: #FFFFFF;
border: 1px solid #26A888;
border-radius: 5rpx;
text-align: center;
font-weight: 500;
color: #26A888;
line-height: 62rpx;
}
.rightbtn {
color: #fff;
background: #26A888;
}
}
.lookbtn {
margin: 50rpx auto 0;
width: 497rpx;
height: 62rpx;
background: #FFFFFF;
border: 1px solid #26A888;
border-radius: 5rpx;
font-weight: 500;
color: #26A888;
text-align: center;
line-height: 62rpx;
}
.border {
width: 94%;
height: 2rpx;
margin: 60rpx auto 30rpx;
background: #E6E6E6;
}
.item {
width: 100%;
padding: 30rpx 50rpx 0 50rpx;
font-size: 30rpx;
font-weight: 400;
color: #333333;
word-break: break-all;
}
.flexitem {
display: flex;
justify-content: space-between;
.right {
display: flex;
align-items: flex-end;
image {
width: 30rpx;
height: 30rpx;
}
text {
padding-left: 10rpx;
}
}
}
.name {
width: 100%;
font-size: 38rpx;
font-weight: 500;
color: #333333;
padding: 60rpx 50rpx 0 50rpx;
display: flex;
align-items: flex-end;
.text {
margin-right: 40rpx;
}
.card {
font-size: 18rpx;
font-weight: 400;
color: #FFA115;
padding: 0 15rpx;
height: 35rpx;
line-height: 35rpx;
background: #FFFFFF;
border: 1px solid #FFA115;
border-radius: 5rpx;
margin-right: 14rpx;
text-align: center;
}
}
.title {
width: 100%;
padding: 20rpx 0 0 30rpx;
display: flex;
align-items: flex-end;
.text {
font-size: 28rpx;
font-weight: 500;
color: #000000;
padding-left: 20rpx;
}
image {
width: 35rpx;
height: 35rpx;
}
}
}
</style>
@import './mysigning.scss';
</style>

View File

@ -1,14 +1,14 @@
<template>
<view class="app">
<u-collapse :accordion='false'>
<u-collapse-item :title="item.head" v-for="item in itemList" :key="item.id"
:class="headitemid.find(e=>e==item.id)?'headcollapse':''" @change='tapcollapse(item.id)'>
<view class="itemtext" v-for="uitem in item.item">
<u-collapse-item :title="item.packageName" v-for="item in itemlist" :key="item.packageNo"
:class="item.check?'headcollapse':''" @change='tapcollapse(item)'>
<view class="itemtext" v-for="uitem in item.formList">
<view class="left">
{{uitem.body}}
{{uitem.formName}}
</view>
<view class="right">
{{uitem.text}}
{{uitem.performanceCount}}/{{uitem.serviceFreq}}
</view>
</view>
</u-collapse-item>
@ -17,67 +17,37 @@
</template>
<script>
import {
getPerformance
} from "@/api/pagesB/performancedetails/index.js"
export default {
data() {
return {
headitemid: [],
itemList: [{
head: "高血压个性服务包",
id: 1,
item: [{
body: '大生化',
text: '1/1'
},
{
body: '心电图',
text: '1/1'
}
]
}, {
head: "高血压基本公卫服务包",
id: 2,
item: [{
body: '大生化',
text: '1/1'
},
{
body: '心电图',
text: '1/1'
}
]
}, {
head: "老年人个性服务包",
id: 3,
item: [{
body: '大生化',
text: '1/1'
},
{
body: '心电图',
text: '1/1'
}
]
}],
itemlist: [],
};
},
watch: {},
methods: {
tapcollapse(i) {
let findindex = this.headitemid.findIndex(e => e == i)
if (findindex != -1) {
this.headitemid.splice(findindex, 1)
} else {
this.headitemid.push(i)
}
tapcollapse(item) {
item.check = !item.check
},
}
info() {
// getPerformance(uni.getStorageSync('userinfo').cardNo, '1').then(res => {
getPerformance('372424194703207523', '1').then(res => {
res.data.forEach(e => {
e.check = false
})
this.itemlist = res.data
})
},
},
onLoad() {
this.info();
},
}
</script>
<style lang="scss">
page {
background-color: #F4F5F7;
}
.app {
width: 96%;
margin: 20rpx auto;
@ -109,6 +79,7 @@
border-bottom: 2rpx solid #E6E6E6;
margin: 0 auto;
display: flex;
justify-content: space-between;
}
.headcollapse {

View File

@ -4,6 +4,7 @@
<!-- <view>筛查日期{{ item.screeningDate }}</view> -->
<view style="font-size: 16px;font-weight: 900;">{{ item.screeningDate }}</view>
<view style="border-bottom: 1px solid #EDEDED;margin: 8px 0;"></view>
<view>筛查项目{{ item.projectName }}</view>
<view>筛查医院{{ item.hospitalName }}</view>
<view>责任医生{{ item.doctorName}}</view>
<view style="border-bottom: 1px solid #EDEDED;margin: 10px 0;"></view>
@ -28,7 +29,7 @@
pageSize:10,
total: 0,
// qure:{
// }
};
},

View File

@ -9,7 +9,7 @@
<view style="color: #2968F1;" @click="goToScreeningRecord" v-show="type != '1'">筛查记录</view>
</view>
<view class="tabbarCon">
<view style="text-align: center;color: #26A888;">
<view style="text-align: center;color: #26A888;" v-if="screeningResultData.projectName">
{{screeningResultData.projectName}}
</view>
<uni-segmented-control :current="Inv" :values="items" @clickItem="onClickItem" styleType="text"
@ -201,13 +201,14 @@ import baseurl from '@/api/baseurl.js'
onShow() {
this.baseurl=baseurl
console.log(baseurl)
},
onLoad(e) {
// console.log(e);
console.log(e);
this.type = e.type
if (e) {
this.registerId = e.registerId
this.projectId = e.projectId
}
if (e.screeningId) {
screeningResultDetail(e.screeningId).then(res => {
@ -217,16 +218,17 @@ import baseurl from '@/api/baseurl.js'
console.log(this.screeningResultData, '000000')
})
} else {
this.patientld = 52;
// this.patientld= uni.getStorageSync('patientld');
// this.patientld = 52;
this.userinfo= uni.getStorageSync('userinfo');
this.patientld = this.userinfo.patientld;
this.getLastScreeningResult()
}
},
methods: {
lookpath() {
var that = this
var url = that.baseurl + `/nurseApplet/screening/record/fileview/${that.screeningResultData.screeningId}`
var url = that.baseurl + `/nurseApplet/screening/record/fileview/${that.screeningResultData.attachment}`
console.log(url,'1')
uni.downloadFile({
url: url,
@ -293,8 +295,9 @@ import baseurl from '@/api/baseurl.js'
},
//
getLastScreeningResult() {
lastScreeningResult(this.patientld, this.registerId).then(res => {
console.log(this.registerId,'999')
lastScreeningResult(this.patientld,this.projectId).then(res => {
// console.log(res);
this.items.push(res.data.projectName)
this.screeningResultData = res.data
@ -365,4 +368,4 @@ import baseurl from '@/api/baseurl.js'
color: #393939;
border-bottom: 3px solid #4DC2A8;
}
</style>
</style>

View File

@ -1,8 +1,4 @@
page {
background-color: #F4F5F7;
}
.app {
.app {
width: 96%;
margin: 20rpx auto;
background-color: #F7F5F5;

View File

@ -103,7 +103,11 @@
<image src="../../static/huijiantou.png" mode=""></image>
</view>
</view>
<view class="signing">
<view class="name">
签约周期()
<u-input v-model="query.signYears" type='number' :border="true" placeholder="请输入签约周期(单位年)" />
</view>
<view class=" signing">
<view class="agency">
签约提醒:
</view>
@ -144,6 +148,7 @@
</u-checkbox-group>
</scroll-view>
</u-popup>
<protocol></protocol>
<u-toast ref="uToast" />
</view>
</template>
@ -159,7 +164,11 @@
getSex,
getBirthday
} from '@/api/conversion.js'
import protocol from '@/components/protocol/index.vue'
export default {
components: {
protocol
},
data() {
return {
showGroup: 1,
@ -200,12 +209,19 @@
crowdNoList: null,
packageList: [],
packageNoList: null,
signYears: null,
}
}
},
watch: {
// 'query.signYears': {
// handler(newVal, oldVal) {},
// }
},
methods: {
updata() {
if (this.radio == 2) {
if (!this.query.signYears) this.query.signYears = 1
let date = new Date();
let year = date.getFullYear();
let month = date.getMonth() + 1;
@ -450,4 +466,4 @@
</script>
<style lang="scss">
@import "./Onlinesigning.scss";
</style>
</style>

View File

@ -1,7 +1,3 @@
page {
background-color: #F4F5F7;
}
.app {
width: 100%;

View File

@ -28,10 +28,14 @@
import {
getDoctorList
} from '@/api/pagesC/choosedoctor/index.js'
import {
getDoctorListtwo
} from '@/api/pagesB/myfamilydoctorteam/index.js'
export default {
data() {
return {
orgNo: null,
teamNo: null,
doctorlist: [],
doctortotal: 0,
pageNum: 1,
@ -39,10 +43,17 @@
},
methods: {
getDoctorListinfo() {
getDoctorList(this.pageNum, this.orgNo, '1').then(res => {
this.doctorlist = res.rows
this.doctortotal = res.total
})
if (this.orgNo) {
getDoctorList(this.pageNum, this.orgNo, '1').then(res => {
this.doctorlist = res.rows
this.doctortotal = res.total
})
} else {
getDoctorListtwo(this.pageNum, 10, this.teamNo, '1').then(res => {
this.doctorlist = res.rows
this.doctortotal = res.total
})
}
},
emitdata(item) {
uni.$emit('doctordata', {
@ -54,18 +65,32 @@
},
},
onLoad(options) {
this.orgNo = options.orgNo
if (options.orgNo) {
this.orgNo = options.orgNo
} else {
// this.teamNo = uni.getStorageSync('userinfo').teamNo
this.teamNo = "00bf7f5a02f3460aa975721ff9f5e533"
}
this.getDoctorListinfo();
},
onReachBottom() { //
if (this.doctorlist.length >= this.doctortotal) {} else {
this.pageNum++;
getDoctorList(this.pageNum, this.orgNo, '1').then(res => {
res.rows.forEach(e => {
this.doctorlist.push(e)
if (this.orgNo) {
getDoctorList(this.pageNum, this.orgNo, '1').then(res => {
res.rows.forEach(e => {
this.doctorlist.push(e)
})
this.doctortotal = res.total
})
this.doctortotal = res.total
})
} else {
getDoctorListtwo(this.pageNum, 10, this.teamNo, '1').then(res => {
res.rows.forEach(e => {
this.doctorlist.push(e)
})
this.doctortotal = res.total
})
}
}
},
onPullDownRefresh() { //

View File

@ -0,0 +1,263 @@
<template>
<view class="app">
<view class="agreement-title-box">
家庭医生签约服务协议书
</view>
<view class="agreement-content-container">
<view class="agreement-content_parta-box">
<h4>甲方</h4>
<h4 class="box-line">{{list.signInfo.agencyOrgName}}</h4>
</view>
<view class="agreement-content_parta-box">
<h4>乙方</h4>
<h4 class="box-line">{{list.signInfo.residentName?list.signInfo.residentName:''}}</h4>
</view>
<uni-table border stripe emptyText="暂无更多数据">
<uni-tr>
<uni-th>姓名</uni-th>
<uni-th>性别</uni-th>
<uni-th>年龄</uni-th>
<uni-th>身份证号</uni-th>
<uni-th>现住址</uni-th>
<uni-th>手机号码</uni-th>
<uni-th>选择签约基础服务包 </uni-th>
<uni-th>选择签约个性服务包</uni-th>
</uni-tr>
<uni-tr>
<uni-td>{{list.signInfo.residentName?list.signInfo.residentName:''}}</uni-td>
<uni-td>{{list.signInfo.gender === '1' ? '男' : '女'}}</uni-td>
<uni-td>{{list.signInfo.age?list.signInfo.age:''}}</uni-td>
<uni-td>{{list.signInfo.identity?list.signInfo.identity:''}}</uni-td>
<uni-td>{{list.signInfo.address?list.signInfo.address:''}}</uni-td>
<uni-td>{{list.signInfo.phone?list.signInfo.phone:''}}</uni-td>
<uni-td>{{list.basePackagesName?list.basePackagesName:''}} </uni-td>
<uni-td>{{list.specialPackagesName?list.specialPackagesName:""}}</uni-td>
</uni-tr>
</uni-table>
<view>
<p style='padding-top: 30rpx;line-height: 46rpx;'>甲乙双方本着平等尊重和自愿的原则签订此协议接受以下条款的约定</p>
<p style='padding: 30rpx 0;line-height: 46rpx;'>甲乙双方共同确定
<text class="box-line">{{list.signInfo.teamName}}</text>为乙方的家庭医生服务团队
</p>
<uni-table border stripe emptyText="暂无更多数据">
<uni-tr>
<uni-th>专病管理服务团队成员</uni-th>
<uni-th>姓名</uni-th>
<uni-th>职称</uni-th>
<uni-th>固定电话</uni-th>
<uni-th>联系电话</uni-th>
</uni-tr>
<uni-tr v-for="(member, index) in list.signInfo.dutyDoctorList" :index="index" :key="index">
<uni-td v-if="member.teamLeader">
团队长
</uni-td>
<uni-td v-else>
{{member.teamMemberType=='0'?'全科医生':''}}
{{member.teamMemberType=='1'?'专科医生':''}}
{{member.teamMemberType=='2'?'社区护士':''}}
{{member.teamMemberType=='3'?'公共卫生人员':''}}
</uni-td>
<uni-td>{{member.realname?member.realname:''}}</uni-td>
<uni-td>
{{member.profTitle=='0'?'初级':''}}
{{member.profTitle=='1'?'中级':''}}
{{member.profTitle=='2'?'高级':''}}
{{member.profTitle=='99'?'其他':''}}
</uni-td>
<uni-td>{{member.landline?member.landline:''}}</uni-td>
<uni-td>{{member.mobilePhone?member.mobilePhone:''}}</uni-td>
</uni-tr>
</uni-table>
<u-parse style="margin-top: 30rpx;" :html="list.protocolContent.content"></u-parse>
<h4 style='padding-top: 30rpx;font-weight: 600;'>服务收费</h4>
<p style='padding-top: 30rpx;line-height: 46rpx;'>1. 根据自愿选择的原则乙方选择<text
class="box-line">{{list.basePackagesName?list.basePackagesName:''}}{{list.specialPackagesName?''+list.specialPackagesName:''}}</text>由甲方提供相应服务服务费为<text
class="box-line">{{list.packSignCost}}</text>/</p>
<p style='padding-top: 30rpx;line-height: 46rpx;'>2.服务过程中根据医生判断及患者临时需求增加的服务内容按照国家相关规定和当地物价部门规定收费
</p>
<p style='padding-top: 30rpx;line-height: 46rpx;'>3.乙方应于<text
class="box-line">{{list.signInfo.signTime}}</text>
前将签约服务费缴纳至甲方机构指定科室不得由签约团队成员代收
</p>
<h4 style='padding-top: 30rpx;font-weight: 600;'>其他约定服务<text class="box-line">{{' '}}</text></h4>
<h4 style='padding-top: 30rpx;font-weight: 600;'>
保密条款签约居民授权其所签约的家庭医生及其团队成员可调阅其电子健康档案和在其他医疗机构的诊疗记录信息甲方有义务对签约居民的电子健康档案和在其他医疗机构的诊
疗记录信息予以保密除法律法规规定外未经签约居民允许不得泄露给第三方
</h4>
<h4 style='padding-top:30rpx;font-weight: 600;'>本协议未尽事宜经双方协商一致签订补充协议补充协议具有同等效力</h4>
<h4 style='padding-top: 30rpx;font-weight: 600;'>
本协议解释权归甲方协议一式两份乙双方各执一份自双方签字之日起生效
<text
class="box-line">{{list.signInfo.signTime}}{{' —— '}}{{list.signInfo.signDeadline}}</text>有效期<text
class="box-line">{{list.signYears}}</text>
</h4>
</view>
</view>
<view class="agreement-execute_container-img">
<view class="parta-execute_box">
<view class="textparta">甲方(团队长)签字</br><text style="padding-left: 15rpx;">(单位盖章)</text></view>
<image :src="list.doctorBase64" mode="aspectFill" style="width: 280rpx; height: 200rpx;"></image>
</view>
<view class="parta-execute_box">
<view class="textparta">乙方(居民)签字</br><text style="padding-left: 8rpx;">或拍照</text></view>
<image :src="list.residentBase64" mode="widthFix" style="width: 180rpx; height: 180rpx;"></image>
</view>
<view class="parta-execute_box">
<view class="textparta">机构公章</view>
<image :src="list.orgBase64" mode="widthFix" style="width: 180rpx; height: 180rpx;"></image>
</view>
</view>
<!-- <u-mask :show="signatureshow" @click="signatureshow = false">
<view style="position:absolute;bottom:0;height:900rpx;width:100%;background-color: #fff;"
v-if='signatureshow'>
<signature @userSignaturePictureUrl='userSignaturePicture' @click.native.stop
style='background-color: #F4F5F7;width: 100%;height: 900rpx;'></signature>
</view>
</u-mask> -->
<!-- <uni-fab ref="fab" horizontal="left" vertical="bottom" :content="fabContent" @trigger="fabTrigger" /> -->
</view>
</template>
<script>
import baseurl from '@/api/baseurl.js'
import signature from '@/components/signature/signature.vue'
import {
getSignProtocol
} from '@/api/pagesC/contractsigningprotocol/index.js'
export default {
components: {
signature
},
data() {
return {
signatureshow: false,
list: null,
fabContent: [{
iconPath: '/static/pageC/signature-unselected.png',
selectedIconPath: '/static/pageC/signature-selected.png',
text: '居民签字',
active: true
}, {
iconPath: '/static/pageC/camera-unselected.png',
selectedIconPath: '/static/pageC/camera.png',
text: '居民拍照',
active: true
}],
};
},
methods: {
fabTrigger(e) {
if (e.index === 0) {
this.signatureshow = true
} else if (e.index === 1) {
this.openCamera()
}
},
openCamera() {
let that = this
setTimeout(function() {
uni.chooseImage({
sizeType: ['compressed'],
sourceType: ['camera'],
success: function(res) {
let tempFilePath = res.tempFilePaths[0]
uni.saveImageToPhotosAlbum({
filePath: tempFilePath,
success: (resp) => {
uni.uploadFile({
url: baseurl +
'/applet/sign/apply/residentSignatureUpload',
filePath: tempFilePath,
name: 'file',
header: {
region: '1'
},
timeout: 10000,
success(respp) {
// residentAutographPath
console.log(respp)
}
})
}
})
}
})
},
150)
},
// //
userSignaturePicture(data) {
this.signatureshow = false
},
info() {
getSignProtocol(this.cardNo, '1').then(res => {
this.list = res.data
})
},
},
onLoad(options) {
this.cardNo = options.cardNo
this.cardNo = '372424194703207523'
this.info();
},
}
</script>
<style lang="scss">
.app {
width: 98%;
margin: 10rpx auto;
background-color: #fff;
}
.agreement-title-box {
padding-top: 20rpx;
margin: 0 0 30rpx;
font-size: 40rpx;
font-weight: 600;
text-align: center;
}
.agreement-content-container {
margin: 10rpx 10rpx;
font-size: 16px;
color: #333333;
padding-bottom: 100rpx;
}
.agreement-content_parta-box {
display: flex;
flex-direction: row;
align-items: center;
justify-content: flex-start;
margin-bottom: 20rpx;
}
.box-line {
display: inline-block;
padding: 0 20rpx;
text-align: center;
border-bottom: 1px #808080 solid;
}
.agreement-execute_container-img {
display: flex;
flex-wrap: wrap;
padding-bottom: 200rpx;
.parta-execute_box {
width: 50%;
.textparta {
display: inline-block;
width: 100%;
text-align: center;
}
image {
display: block;
margin: 30rpx auto;
}
}
}
</style>

View File

@ -103,7 +103,22 @@
that.query.lng = resp.longitude
that.getNearbyOrginfo()
},
fail: function(err) {},
fail: function(err) {
// uni.openSetting({
// success(res) {
// if (res.authSetting['scope.userLocation']) {
// uni.getLocation({
// type: 'wgs84',
// success: function(resp) {
// that.query.lat = resp.latitude
// that.query.lng = resp.longitude
// that.getNearbyOrginfo()
// },
// });
// }
// }
// });
},
});
},
onReachBottom() { //
@ -127,10 +142,6 @@
</script>
<style lang="scss">
page {
background-color: #F4F5F7;
}
.app {
width: 94%;
margin: 20rpx auto;
@ -277,4 +288,4 @@
::v-deep .u-cell-box {}
}
}
</style>
</style>

Binary file not shown.

After

Width:  |  Height:  |  Size: 6.2 KiB

BIN
static/pageC/camera.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 4.3 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 9.3 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 15 KiB