FirstServiceProjectConfirmationBody.vue 26 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639
  1. <script setup lang="ts">
  2. import { reactive, watch } from 'vue'
  3. import FieldItem from './FieldItem.vue'
  4. import SignatureItem from './SignatureItem.vue'
  5. interface ServiceItem {
  6. selected: string[]
  7. other: string
  8. remark?: string
  9. }
  10. interface FormData {
  11. partyBName?: string
  12. gender?: string
  13. roomNo?: string
  14. bedNo?: string
  15. assessDate?: string
  16. careLevel?: string
  17. agentName?: string
  18. emergencyContact?: string
  19. year?: string
  20. month?: string
  21. day?: string
  22. basicServices?: Record<string, ServiceItem>
  23. lifeCare?: Record<string, any>
  24. elderlyNursing?: Record<string, any>
  25. partyBSign?: string
  26. partyCSign?: string
  27. }
  28. const props = withDefaults(defineProps<{
  29. isTextMode?: boolean
  30. modelValue?: FormData
  31. }>(), {
  32. isTextMode: false,
  33. modelValue: () => ({})
  34. })
  35. const emit = defineEmits<{
  36. (e: 'update:modelValue', val: FormData): void
  37. }>()
  38. const defaultBasic = (): ServiceItem => ({ selected: [], other: '', remark: '' })
  39. const form = reactive<FormData>({
  40. partyBName: '',
  41. gender: '',
  42. roomNo: '',
  43. bedNo: '',
  44. assessDate: '',
  45. careLevel: '',
  46. agentName: '',
  47. emergencyContact: '',
  48. year: '',
  49. month: '',
  50. day: '',
  51. basicServices: {
  52. consultation: defaultBasic(),
  53. mealService: defaultBasic(),
  54. deliveryService: defaultBasic(),
  55. medicalService: defaultBasic(),
  56. chronicManagement: defaultBasic(),
  57. accompanyMedical: defaultBasic(),
  58. mentalSupport: defaultBasic(),
  59. safetyProtection: defaultBasic(),
  60. recreation: defaultBasic(),
  61. education: defaultBasic(),
  62. commission: defaultBasic(),
  63. sanitation: defaultBasic(),
  64. laundry: defaultBasic(),
  65. shopping: defaultBasic(),
  66. maintenance: defaultBasic(),
  67. communication: defaultBasic(),
  68. transportation: defaultBasic(),
  69. infrastructure: defaultBasic(),
  70. },
  71. lifeCare: {
  72. personalHygiene: { selected: [], other: '' },
  73. dressing: { selected: [], other: '' },
  74. grooming: { selected: [], other: '' },
  75. dietaryCare: { selected: [], other: '' },
  76. toiletCare: { selected: [], other: '' },
  77. oralCare: { selected: [], other: '' },
  78. skinCleaning: { selected: [], other: '' },
  79. positionTransfer: { selected: [], other: '' },
  80. excretionCare: { selected: [], other: '' },
  81. skinCare: { selected: [], other: '' },
  82. other: ''
  83. },
  84. elderlyNursing: {
  85. comprehensiveAssessment: false,
  86. chronicDisease: { selected: [], other: '' },
  87. diseaseNursing: { selected: [], other: '' },
  88. nursingTech: { selected: [], other: '' },
  89. healthGuidance: false,
  90. drugManagement: false,
  91. other: '',
  92. assistMedicalNursing: { selected: [], other: '' },
  93. rehabilitation: { selected: [], other: '' },
  94. palliativeCare: { selected: [], other: '' },
  95. otherAgreed: ''
  96. },
  97. partyBSign: '',
  98. partyCSign: ''
  99. })
  100. watch(() => props.modelValue, (val) => {
  101. if (!val) return
  102. Object.assign(form, JSON.parse(JSON.stringify(val)))
  103. }, { immediate: true, deep: true })
  104. const updateForm = () => {
  105. emit('update:modelValue', JSON.parse(JSON.stringify(form)))
  106. }
  107. const toggleBasic = (key: string, option: string) => {
  108. const item = form.basicServices![key]
  109. const idx = item.selected.indexOf(option)
  110. if (idx > -1) item.selected.splice(idx, 1)
  111. else item.selected.push(option)
  112. updateForm()
  113. }
  114. const toggleLife = (key: string, option: string) => {
  115. const item = form.lifeCare![key]
  116. const idx = item.selected.indexOf(option)
  117. if (idx > -1) item.selected.splice(idx, 1)
  118. else item.selected.push(option)
  119. updateForm()
  120. }
  121. const toggleElderly = (key: string, option: string) => {
  122. const item = form.elderlyNursing![key]
  123. const idx = item.selected.indexOf(option)
  124. if (idx > -1) item.selected.splice(idx, 1)
  125. else item.selected.push(option)
  126. updateForm()
  127. }
  128. const isChecked = (obj: any, option: string) => (obj?.selected || []).includes(option)
  129. const basicServices = [
  130. { name: '咨询服务', key: 'consultation', options: ['入住咨询', '法律咨询', '心理咨询', '医疗咨询', '护理咨询', '康复咨询', '教育咨询', '服务咨询'], other: '其他咨询' },
  131. { name: '膳食服务', key: 'mealService', options: ['食谱定制', '营养配餐', '食品加工与制作'], other: '其他膳食服务' },
  132. { name: '送餐服务', key: 'deliveryService', options: ['定期订餐', '按时送餐'], other: '其他送餐服务' },
  133. { name: '医疗服务', key: 'medicalService', options: ['疾病诊治', '健康指导', '预防保健、体检', '药事管理', '医疗相关风险管理及告知', '转诊转院'], other: '其他医疗服务', sub: { name: '慢病管理', key: 'chronicManagement', options: ['慢病监测', '健康咨询', '用药指导'], other: '其他慢病管理服务' } },
  134. { name: '陪同就医服务', key: 'accompanyMedical', options: ['陪同指定医院就医', '协助挂号', '协助完成各项检查', '协助取药'], other: '其他陪同就医服务' },
  135. { name: '心理/精神支持服务', key: 'mentalSupport', options: ['情绪疏导', '心理支持', '危机干预', '老年人家属心理支持服务'], other: '其他心理/精神支持服务' },
  136. { name: '安全保护服务', key: 'safetyProtection', options: ['安全风险评估', '安全教育', '提供安全设备设置'], other: '其他安全保护服务' },
  137. { name: '休闲娱乐服务', key: 'recreation', options: ['文体活动', '棋牌娱乐', '健身活动', '游艺活动', '影视观看服务', '参观游览'], other: '其他娱乐休闲服务' },
  138. { name: '教育服务', key: 'education', options: ['读书', '讲座', '老年大学'], other: '其他教育服务' },
  139. { name: '委托服务', key: 'commission', options: ['代读、代写书信', '代领物品', '代缴费用'], other: '其他委托服务' },
  140. { name: '环境卫生服务', key: 'sanitation', options: ['机构公共区域清洁', '老年人居室清洁'], other: '其他环境卫生服务', extra: ['频次', '频次'] },
  141. { name: '洗涤服务', key: 'laundry', options: ['老年人衣物洗涤', '老年人居室布草洗涤'], other: '其他洗涤服务', extra: ['频次', '频次'] },
  142. { name: '购物服务', key: 'shopping', options: ['代购日常生活物品', '陪同外出购物', '协助老年人使用网络购物'], other: '其他购物服务' },
  143. { name: '维修服务', key: 'maintenance', options: ['公共设施设备维修', '老年人居室设备维修'], other: '其他维修服务' },
  144. { name: '通信服务', key: 'communication', options: ['提供电话设备', '提供互联网上网服务'], other: '其他通信服务' },
  145. { name: '交通服务', key: 'transportation', options: ['提供交通工具运送老年人', '联系交通工具运送老年人'], other: '其他交通服务' },
  146. { name: '基础设施服务', key: 'infrastructure', options: ['提供居室内基本用电用水服务', '提供有线电视收视服务', '提供空调服务', '提供冬季取暖服务', '提供生活饮用水服务', '呼叫应答服务'], other: '其他基础设施服务' },
  147. ]
  148. const lifeCareItems = [
  149. { name: '个人清洁卫生服务', key: 'personalHygiene', options: ['洗脸', '洗手', '洗头', '洗脚', '按摩', '拍背', '协助整理个人物品', '清洁整理床铺', '更换床单位'], other: '其他个人清洁卫生服务' },
  150. { name: '穿衣服服务', key: 'dressing', options: ['更换上衣、裤子', '协助穿衣', '整理衣物'], other: '其他穿衣服务' },
  151. { name: '修饰服务', key: 'grooming', options: ['梳头', '剃须', '剪指/趾甲', '化妆'], other: '其他修饰服务' },
  152. { name: '饮食照料服务', key: 'dietaryCare', options: ['经口喂食或水', '鼻胃管喂食或水', '协助用膳'], other: '其他饮食服务' },
  153. { name: '如厕照料服务', key: 'toiletCare', options: ['定时提醒如厕', '使用便盆', '使用尿壶', '协助入厕排便、排尿'], other: '其他如厕服务' },
  154. { name: '口腔清洁服务', key: 'oralCare', options: ['刷牙', '漱口', '清洁义齿', '口腔擦拭'], other: '其他口腔清洁服务' },
  155. { name: '皮肤清洁服务', key: 'skinCleaning', options: ['淋浴', '床上擦浴', '清洗会阴'], other: '其他皮肤清洁服务' },
  156. { name: '体位转移服务', key: 'positionTransfer', options: ['进行床上体位转换', '床与轮椅转移', '床与平车转移'], other: '其他体位转移服务' },
  157. { name: '便溺照料服务', key: 'excretionCare', options: ['协助进行床上排便', '人工排便', '药物及辅助用品肛注排便', '床上排尿', '更换一次性尿垫', '更换一次性尿裤'], other: '其他便溺服务' },
  158. { name: '皮肤护理服务', key: 'skinCare', options: ['卧床老年人预防压疮', '老年人皮肤观察', '定时更换体位', '清洁皮肤', '使用预防压疮的器具'], other: '其他皮肤护理服务' },
  159. ]
  160. const elderlyNursingItems = [
  161. { name: '慢病管理服务', key: 'chronicDisease', options: ['老年人慢性非传染性疾病情况制定护理计划', '实施维持性治疗', '观察老年人症状变化、定期检测', '生活方式干预', '健康教育'], other: '其他慢病管理服务' },
  162. { name: '病症护理服务', key: 'diseaseNursing', options: ['常见病症进行观察', '按照医嘱针对护理'], other: '其他病症护理服务' },
  163. { name: '护理技术操作服务', key: 'nursingTech', options: ['清洁与舒适管理', '营养与排泄护理', '常见症状护理', '皮肤、伤口、造口护理', '气道护理', '引流护理', '生命体征监测', '急救技术', '常用标本采集', '给药治疗与护理'], other: '其他护理服务' },
  164. { name: '协助医疗护理服务', key: 'assistMedicalNursing', options: ['老年人日常生活观察', '协助或指导老年人使用辅助器具', '化验标本的收集送检'], other: '其他协助医疗护理服务' },
  165. { name: '康复服务', key: 'rehabilitation', options: ['康复评定和制定计划', '物理治疗', '作业治疗', '言语治疗', '中医康复治疗'], other: '其他康复服务' },
  166. { name: '安宁服务', key: 'palliativeCare', options: ['疼痛及其他症状护理服务', '舒适照护'], other: '其他安宁服务' },
  167. ]
  168. </script>
  169. <template>
  170. <div class="first-service-project">
  171. <div class="doc-title">首次服务项目确认表</div>
  172. <div class="doc-date">
  173. <span>时间:</span>
  174. <FieldItem v-model="form.year" :is-text-mode="isTextMode" width="60px" placeholder="" @update:model-value="updateForm" />
  175. <span>年</span>
  176. <FieldItem v-model="form.month" :is-text-mode="isTextMode" width="40px" placeholder="" @update:model-value="updateForm" />
  177. <span>月</span>
  178. <FieldItem v-model="form.day" :is-text-mode="isTextMode" width="40px" placeholder="" @update:model-value="updateForm" />
  179. <span>日</span>
  180. </div>
  181. <!-- 基本信息 -->
  182. <table class="info-table">
  183. <tbody>
  184. <tr>
  185. <td class="label">乙方姓名</td>
  186. <td><FieldItem v-model="form.partyBName" :is-text-mode="isTextMode" width="100%" placeholder="" @update:model-value="updateForm" /></td>
  187. <td class="label">性别</td>
  188. <td><FieldItem v-model="form.gender" :is-text-mode="isTextMode" width="100%" placeholder="" @update:model-value="updateForm" /></td>
  189. <td class="label">房间号/床号</td>
  190. <td><FieldItem v-model="form.roomNo" :is-text-mode="isTextMode" width="100%" placeholder="" @update:model-value="updateForm" />/<FieldItem v-model="form.bedNo" :is-text-mode="isTextMode" width="100%" placeholder="" @update:model-value="updateForm" /></td>
  191. </tr>
  192. <tr>
  193. <td class="label">评估日期</td>
  194. <td><FieldItem v-model="form.assessDate" :is-text-mode="isTextMode" type="date" width="100%" placeholder="" @update:model-value="updateForm" /></td>
  195. <td class="label">照料护理等级</td>
  196. <td colspan="3"><FieldItem v-model="form.careLevel" :is-text-mode="isTextMode" width="100%" placeholder="" @update:model-value="updateForm" /></td>
  197. </tr>
  198. <tr>
  199. <td class="label">代理人姓名</td>
  200. <td><FieldItem v-model="form.agentName" :is-text-mode="isTextMode" width="100%" placeholder="" @update:model-value="updateForm" /></td>
  201. <td class="label">紧急联系人姓名</td>
  202. <td colspan="3"><FieldItem v-model="form.emergencyContact" :is-text-mode="isTextMode" width="100%" placeholder="" @update:model-value="updateForm" /></td>
  203. </tr>
  204. </tbody>
  205. </table>
  206. <!-- 基础服务 -->
  207. <table class="service-table">
  208. <thead>
  209. <tr>
  210. <th colspan="3" class="section-title">基础服务</th>
  211. </tr>
  212. <tr>
  213. <th class="col-service">服务项目</th>
  214. <th class="col-content">服务内容</th>
  215. <th class="col-remark">备注</th>
  216. </tr>
  217. </thead>
  218. <tbody>
  219. <tr v-for="svc in basicServices" :key="svc.key">
  220. <td class="service-name">{{ svc.name }}</td>
  221. <td class="service-content">
  222. <template v-if="!isTextMode">
  223. <label v-for="(opt, idx) in svc.options" :key="opt" class="chk-label">
  224. <input type="checkbox" :checked="isChecked(form.basicServices![svc.key], opt)" @change="toggleBasic(svc.key, opt)" />
  225. <span>{{ opt }}</span>
  226. <span v-if="svc.extra && svc.extra[idx]" class="extra-label">{{ svc.extra[idx] }}:<FieldItem v-model="(form.basicServices as any)[svc.key]['extra' + idx]" :is-text-mode="isTextMode" width="60px" placeholder="" @update:model-value="updateForm" /></span>
  227. </label>
  228. <div v-if="svc.other" class="other-row">
  229. <span>{{ svc.other }}:</span>
  230. <FieldItem v-model="(form.basicServices as any)[svc.key].other" :is-text-mode="isTextMode" width="200px" placeholder="" @update:model-value="updateForm" />
  231. </div>
  232. <div v-if="svc.sub" class="sub-service">
  233. <div class="sub-name">{{ svc.sub.name }}</div>
  234. <label v-for="opt in svc.sub.options" :key="opt" class="chk-label">
  235. <input type="checkbox" :checked="isChecked(form.basicServices![svc.sub.key], opt)" @change="toggleBasic(svc.sub.key, opt)" />
  236. <span>{{ opt }}</span>
  237. </label>
  238. <div v-if="svc.sub.other" class="other-row">
  239. <span>{{ svc.sub.other }}:</span>
  240. <FieldItem v-model="(form.basicServices as any)[svc.sub.key].other" :is-text-mode="isTextMode" width="200px" placeholder="" @update:model-value="updateForm" />
  241. </div>
  242. </div>
  243. </template>
  244. <template v-else>
  245. <span v-for="opt in svc.options" :key="opt" class="text-chk">
  246. {{ isChecked(form.basicServices![svc.key], opt) ? '☑' : '□' }}{{ opt }}
  247. <span v-if="svc.extra && svc.extra[svc.options.indexOf(opt)]" class="extra-text">{{ svc.extra[svc.options.indexOf(opt)] }}:{{ (form.basicServices as any)[svc.key]['extra' + svc.options.indexOf(opt)] || '____' }}</span>
  248. </span>
  249. <span v-if="(form.basicServices as any)[svc.key].other" class="text-chk">☑{{ svc.other }}:{{ (form.basicServices as any)[svc.key].other }}</span>
  250. <span v-else-if="svc.other" class="text-chk">□{{ svc.other }}:____</span>
  251. <div v-if="svc.sub" class="sub-service">
  252. <div class="sub-name">{{ svc.sub.name }}</div>
  253. <span v-for="opt in svc.sub.options" :key="opt" class="text-chk">
  254. {{ isChecked(form.basicServices![svc.sub.key], opt) ? '☑' : '□' }}{{ opt }}
  255. </span>
  256. <span v-if="(form.basicServices as any)[svc.sub.key].other" class="text-chk">☑{{ svc.sub.other }}:{{ (form.basicServices as any)[svc.sub.key].other }}</span>
  257. <span v-else-if="svc.sub.other" class="text-chk">□{{ svc.sub.other }}:____</span>
  258. </div>
  259. </template>
  260. </td>
  261. <td class="service-remark">
  262. <FieldItem v-model="(form.basicServices as any)[svc.key].remark" :is-text-mode="isTextMode" width="100%" placeholder="" @update:model-value="updateForm" />
  263. </td>
  264. </tr>
  265. </tbody>
  266. </table>
  267. <!-- 等级护理照料服务 -->
  268. <div class="section-title-bar">等级护理照料服务</div>
  269. <!-- 生活照料服务 -->
  270. <table class="service-table no-remark">
  271. <thead>
  272. <tr>
  273. <th class="col-service">服务项目</th>
  274. <th class="col-content">服务内容</th>
  275. </tr>
  276. </thead>
  277. <tbody>
  278. <tr v-for="svc in lifeCareItems" :key="svc.key">
  279. <td class="service-name">{{ svc.name }}</td>
  280. <td class="service-content">
  281. <template v-if="!isTextMode">
  282. <label v-for="opt in svc.options" :key="opt" class="chk-label">
  283. <input type="checkbox" :checked="isChecked(form.lifeCare![svc.key], opt)" @change="toggleLife(svc.key, opt)" />
  284. <span>{{ opt }}</span>
  285. </label>
  286. <div v-if="svc.other" class="other-row">
  287. <span>{{ svc.other }}:</span>
  288. <FieldItem v-model="(form.lifeCare as any)[svc.key].other" :is-text-mode="isTextMode" width="200px" placeholder="" @update:model-value="updateForm" />
  289. </div>
  290. </template>
  291. <template v-else>
  292. <span v-for="opt in svc.options" :key="opt" class="text-chk">
  293. {{ isChecked(form.lifeCare![svc.key], opt) ? '☑' : '□' }}{{ opt }}
  294. </span>
  295. <span v-if="(form.lifeCare as any)[svc.key].other" class="text-chk">☑{{ svc.other }}:{{ (form.lifeCare as any)[svc.key].other }}</span>
  296. <span v-else-if="svc.other" class="text-chk">□{{ svc.other }}:____</span>
  297. </template>
  298. </td>
  299. </tr>
  300. <tr>
  301. <td class="service-name"></td>
  302. <td class="service-content">
  303. <template v-if="!isTextMode">
  304. <label class="chk-label">
  305. <input type="checkbox" v-model="form.lifeCare!.otherChecked" @change="updateForm" />
  306. <span>其他生活照料服务:</span>
  307. </label>
  308. <FieldItem v-model="form.lifeCare!.other" :is-text-mode="isTextMode" width="300px" placeholder="" @update:model-value="updateForm" />
  309. </template>
  310. <template v-else>
  311. <span class="text-chk">{{ form.lifeCare!.otherChecked ? '☑' : '□' }}其他生活照料服务:{{ form.lifeCare!.other || '____' }}</span>
  312. </template>
  313. </td>
  314. </tr>
  315. </tbody>
  316. </table>
  317. <!-- 老年护理服务 -->
  318. <table class="service-table no-remark">
  319. <thead>
  320. <tr>
  321. <th class="col-service">服务项目</th>
  322. <th class="col-content">服务内容</th>
  323. </tr>
  324. </thead>
  325. <tbody>
  326. <tr>
  327. <td class="service-name">老年人综合评估</td>
  328. <td class="service-content">
  329. <template v-if="!isTextMode">
  330. <label class="chk-label">
  331. <input type="checkbox" v-model="form.elderlyNursing!.comprehensiveAssessment" @change="updateForm" />
  332. <span>老年人综合评估</span>
  333. </label>
  334. </template>
  335. <template v-else>
  336. <span class="text-chk">{{ form.elderlyNursing!.comprehensiveAssessment ? '☑' : '□' }}老年人综合评估</span>
  337. </template>
  338. </td>
  339. </tr>
  340. <tr v-for="svc in elderlyNursingItems" :key="svc.key">
  341. <td class="service-name">{{ svc.name }}</td>
  342. <td class="service-content">
  343. <template v-if="!isTextMode">
  344. <label v-for="opt in svc.options" :key="opt" class="chk-label">
  345. <input type="checkbox" :checked="isChecked(form.elderlyNursing![svc.key], opt)" @change="toggleElderly(svc.key, opt)" />
  346. <span>{{ opt }}</span>
  347. </label>
  348. <div v-if="svc.other" class="other-row">
  349. <span>{{ svc.other }}:</span>
  350. <FieldItem v-model="(form.elderlyNursing as any)[svc.key].other" :is-text-mode="isTextMode" width="200px" placeholder="" @update:model-value="updateForm" />
  351. </div>
  352. </template>
  353. <template v-else>
  354. <span v-for="opt in svc.options" :key="opt" class="text-chk">
  355. {{ isChecked(form.elderlyNursing![svc.key], opt) ? '☑' : '□' }}{{ opt }}
  356. </span>
  357. <span v-if="(form.elderlyNursing as any)[svc.key].other" class="text-chk">☑{{ svc.other }}:{{ (form.elderlyNursing as any)[svc.key].other }}</span>
  358. <span v-else-if="svc.other" class="text-chk">□{{ svc.other }}:____</span>
  359. </template>
  360. </td>
  361. </tr>
  362. <tr>
  363. <td class="service-name"></td>
  364. <td class="service-content">
  365. <template v-if="!isTextMode">
  366. <label class="chk-label">
  367. <input type="checkbox" v-model="form.elderlyNursing!.healthGuidance" @change="updateForm" />
  368. <span>健康指导</span>
  369. </label>
  370. <label class="chk-label">
  371. <input type="checkbox" v-model="form.elderlyNursing!.drugManagement" @change="updateForm" />
  372. <span>药品管理服务</span>
  373. </label>
  374. <div class="other-row">
  375. <span>其他老年护理服务:</span>
  376. <FieldItem v-model="form.elderlyNursing!.other" :is-text-mode="isTextMode" width="300px" placeholder="" @update:model-value="updateForm" />
  377. </div>
  378. </template>
  379. <template v-else>
  380. <span class="text-chk">{{ form.elderlyNursing!.healthGuidance ? '☑' : '□' }}健康指导</span>
  381. <span class="text-chk">{{ form.elderlyNursing!.drugManagement ? '☑' : '□' }}药品管理服务</span>
  382. <span class="text-chk">其他老年护理服务:{{ form.elderlyNursing!.other || '____' }}</span>
  383. </template>
  384. </td>
  385. </tr>
  386. <tr>
  387. <td class="service-name">其他约定服务</td>
  388. <td class="service-content">
  389. <FieldItem v-model="form.elderlyNursing!.otherAgreed" :is-text-mode="isTextMode" width="100%" placeholder="" @update:model-value="updateForm" />
  390. </td>
  391. </tr>
  392. </tbody>
  393. </table>
  394. <!-- 签名 -->
  395. <div class="sign-row">
  396. <div class="sign-block">
  397. <span class="sign-label">乙方(签名):</span>
  398. <SignatureItem v-model="form.partyBSign" :is-text-mode="isTextMode" width="200" height="80" placeholder="(签字处)" title="乙方签字" @update:model-value="updateForm" />
  399. </div>
  400. <div class="sign-block">
  401. <span class="sign-label">丙方(签名或盖章):</span>
  402. <SignatureItem v-model="form.partyCSign" :is-text-mode="isTextMode" width="200" height="80" placeholder="(签字处)" title="丙方签字" @update:model-value="updateForm" />
  403. </div>
  404. </div>
  405. <div class="date-row">
  406. <FieldItem v-model="form.year" :is-text-mode="isTextMode" width="60px" placeholder="" @update:model-value="updateForm" />
  407. <span>年</span>
  408. <FieldItem v-model="form.month" :is-text-mode="isTextMode" width="40px" placeholder="" @update:model-value="updateForm" />
  409. <span>月</span>
  410. <FieldItem v-model="form.day" :is-text-mode="isTextMode" width="40px" placeholder="" @update:model-value="updateForm" />
  411. <span>日</span>
  412. </div>
  413. <!-- 备注 -->
  414. <div class="notice">
  415. <p>注:1. 根据乙方的照料护理等级确定相应服务内容。</p>
  416. <p>  2. “服务内容”一栏在确认内容后的“□”内打“√”,未选的在“□”内打“×”。</p>
  417. </div>
  418. </div>
  419. </template>
  420. <style scoped lang="scss">
  421. .first-service-project {
  422. width: 210mm;
  423. max-width: 100%;
  424. margin: 0 auto;
  425. font-family: 'SimSun', 'Microsoft YaHei', serif;
  426. font-size: 13px;
  427. color: #333;
  428. background: #fff;
  429. padding: 5mm;
  430. @media print {
  431. width: 210mm !important;
  432. max-width: 100%;
  433. padding: 0;
  434. border: none;
  435. margin: 0;
  436. box-sizing: border-box;
  437. }
  438. }
  439. .doc-title {
  440. text-align: center;
  441. font-size: 20px;
  442. font-weight: bold;
  443. margin-bottom: 8px;
  444. }
  445. .doc-date {
  446. text-align: center;
  447. margin-bottom: 12px;
  448. font-size: 14px;
  449. display: flex;
  450. align-items: center;
  451. justify-content: center;
  452. gap: 4px;
  453. }
  454. .info-table,
  455. .service-table {
  456. width: 100%;
  457. border-collapse: collapse;
  458. margin-bottom: 12px;
  459. th,
  460. td {
  461. border: 1px solid #333;
  462. padding: 6px 8px;
  463. vertical-align: top;
  464. }
  465. th {
  466. background: #f5f5f5;
  467. font-weight: bold;
  468. text-align: center;
  469. }
  470. .label {
  471. background: #f5f5f5;
  472. font-weight: bold;
  473. text-align: center;
  474. white-space: nowrap;
  475. width: 100px;
  476. }
  477. }
  478. .service-table {
  479. .section-title {
  480. background: #f5f5f5;
  481. font-weight: bold;
  482. text-align: center;
  483. font-size: 14px;
  484. }
  485. .col-service {
  486. width: 120px;
  487. text-align: center;
  488. }
  489. .col-content {
  490. min-width: 400px;
  491. }
  492. .col-remark {
  493. width: 100px;
  494. }
  495. .service-name {
  496. text-align: center;
  497. font-weight: bold;
  498. }
  499. .service-content {
  500. .chk-label {
  501. display: inline-flex;
  502. align-items: center;
  503. margin-right: 12px;
  504. margin-bottom: 4px;
  505. cursor: pointer;
  506. input[type='checkbox'] {
  507. margin-right: 4px;
  508. }
  509. }
  510. .text-chk {
  511. display: inline-block;
  512. margin-right: 12px;
  513. margin-bottom: 4px;
  514. }
  515. .other-row {
  516. margin-top: 4px;
  517. display: flex;
  518. align-items: center;
  519. gap: 4px;
  520. }
  521. .sub-service {
  522. margin-top: 6px;
  523. padding-left: 8px;
  524. border-left: 2px solid #ccc;
  525. .sub-name {
  526. font-weight: bold;
  527. margin-bottom: 4px;
  528. }
  529. }
  530. .extra-label,
  531. .extra-text {
  532. margin-left: 4px;
  533. }
  534. }
  535. }
  536. .section-title-bar {
  537. text-align: center;
  538. font-weight: bold;
  539. font-size: 14px;
  540. padding: 8px;
  541. border: 1px solid #333;
  542. border-bottom: none;
  543. background: #f5f5f5;
  544. }
  545. .sign-row {
  546. display: flex;
  547. justify-content: space-between;
  548. margin-top: 20px;
  549. padding: 0 20px;
  550. .sign-block {
  551. display: flex;
  552. align-items: flex-start;
  553. gap: 8px;
  554. .sign-label {
  555. white-space: nowrap;
  556. padding-top: 4px;
  557. }
  558. }
  559. }
  560. .date-row {
  561. text-align: right;
  562. margin-top: 12px;
  563. padding-right: 40px;
  564. display: flex;
  565. align-items: center;
  566. justify-content: flex-end;
  567. gap: 4px;
  568. }
  569. .notice {
  570. margin-top: 16px;
  571. font-size: 12px;
  572. color: #666;
  573. p {
  574. margin: 4px 0;
  575. }
  576. }
  577. @media print {
  578. .first-service-project {
  579. font-size: 12px;
  580. }
  581. .service-table {
  582. .col-content {
  583. min-width: auto;
  584. }
  585. }
  586. }
  587. </style>