AddForm.vue 18 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789
  1. <template>
  2. <el-drawer
  3. v-model="dialogVisible"
  4. :title="title"
  5. resizable
  6. :close-on-click-modal="false"
  7. :close-on-press-escape="false"
  8. :destroy-on-close="true"
  9. size="70%"
  10. :before-close="handleClosed"
  11. >
  12. <div class="attack-risk-form">
  13. <h1 class="form-title">首次服务项目确认表(附件)</h1>
  14. <!-- 基本信息 -->
  15. <el-row :gutter="40">
  16. <el-col :xs="24" :sm="24" :md="24" :lg="12" :xl="12" class="row">
  17. <text>长者姓名</text>
  18. <search-the-elderly ref="selectElderRef" :disabled="isDetail" @update_elder="elderUp" v-model="dataForm.elderName" :tId="dataForm.tenantId"/>
  19. </el-col>
  20. <el-col :xs="24" :sm="24" :md="24" :lg="12" :xl="12" class="row">
  21. <text>档案号</text>
  22. <el-input v-if="!isDetail" v-model="dataForm.contractNumber" disabled />
  23. <el-text v-else disabled="">{{dataForm.contractNumber}}</el-text>
  24. </el-col>
  25. </el-row>
  26. <el-row :gutter="40">
  27. <el-col :xs="24" :sm="24" :md="24" :lg="12" :xl="12" class="row">
  28. <text>入院日期</text>
  29. <el-input v-if="!isDetail" :model-value="dayjs(dataForm.checkInTime).format('YYYY-MM-DD')=='Invalid Date'?'':dayjs(dataForm.checkInTime).format('YYYY-MM-DD')" disabled />
  30. <el-text v-else disabled="">{{dayjs(dataForm.checkInTime).format('YYYY-MM-DD')}}</el-text>
  31. </el-col>
  32. <el-col :xs="24" :sm="24" :md="24" :lg="12" :xl="12" class="row">
  33. <text>床位号</text>
  34. <el-input v-if="!isDetail" v-model="dataForm.bedName" disabled />
  35. <el-text v-else disabled="">{{dataForm.bedName}}</el-text>
  36. </el-col>
  37. </el-row>
  38. <el-row :gutter="40">
  39. <el-col :xs="24" :sm="24" :md="24" :lg="12" :xl="12" class="row">
  40. <text>记录人</text>
  41. <el-input :disabled="isDetail" v-model="form.assessor" />
  42. </el-col>
  43. <el-col :xs="24" :sm="24" :md="24" :lg="12" :xl="12" class="row">
  44. <text>记录日期</text>
  45. <el-date-picker :disabled="isDetail" v-model="form.assessDate" type="date" style="width: 100%;"/>
  46. </el-col>
  47. </el-row>
  48. <!-- 内容区域 -->
  49. <div class="form-body">
  50. <FirstServiceProjectConfirmationBody
  51. v-model="firstServiceForm"
  52. :is-text-mode="isDetail"
  53. />
  54. </div>
  55. </div>
  56. <template #footer>
  57. <el-button @click="handleClosed">关闭</el-button>
  58. <el-button style="margin-left: 22px;margin-right: 30px" v-loading="formLoading" type="primary" v-show="!isDetail" @click="submitForm">确定</el-button>
  59. </template>
  60. </el-drawer>
  61. </template>
  62. <script lang="ts" setup>
  63. import { computed, ref, watch, reactive } from 'vue'
  64. import dayjs from 'dayjs'
  65. import FirstServiceProjectConfirmationBody from '../components/FirstServiceProjectConfirmationBody.vue'
  66. import { attackRiskCreate, attackRiskGetById, attackRiskUpdate, attackRiskGetByElderId } from "@/api/social-work";
  67. const message = useMessage() // 消息弹窗
  68. const { t } = useI18n() // 国际化
  69. const title = ref('')
  70. const dialogVisible = ref(false) // 弹窗
  71. const formRef = ref() // 表单 Ref
  72. const selectElderRef = ref() // 表单 Ref
  73. const firstServiceForm = reactive<Record<string, any>>({})
  74. const isDetail = ref(false) // 是否详情打开
  75. const formLoading = ref(false) // 表单的加载中:1)修改时的数据加载;2)提交的按钮禁用
  76. let dataForm = ref({
  77. // 表单字段
  78. id: undefined,
  79. idCard: '',
  80. contractNumber: '', //档案号
  81. elderName: '',//长者姓名
  82. bedName: '', //床位号
  83. elderAge: '', //年龄
  84. elderSex: '', //性别
  85. checkInTime: '', //入院日期
  86. elderId: '',
  87. tenantId: undefined
  88. })
  89. const elderUp = (e) => {
  90. dataForm.value.elderName = e.elderName
  91. dataForm.value.elderId = e.id
  92. dataForm.value.elderSex = e.elderSex === 1 ? '男' : '女'
  93. dataForm.value.bedName = e.bedName || ''
  94. dataForm.value.checkInTime = e.checkInTime
  95. dataForm.value.contractNumber = e.contractNumber||e.fileNumber
  96. dataForm.value.elderAge = e.elderAge
  97. }
  98. // ========== 攻击风险因素评估量表 表单序列化方法 ==========
  99. /** 风险程度样式类 */
  100. const riskLevelClass = computed(() => {
  101. const level = form.attackLevel
  102. if (!level || level === 0) return 'risk-none'
  103. if (level === 1) return 'risk-low'
  104. if (level === 2) return 'risk-medium'
  105. return 'risk-high'
  106. })
  107. /** 自动判断风险等级 */
  108. const autoJudgeRiskLevel = () => {
  109. const level = form.attackLevel
  110. if (!level || level === 0) form.riskLevel = 'none'
  111. else if (level === 1) form.riskLevel = 'low'
  112. else if (level === 2) form.riskLevel = 'medium'
  113. else form.riskLevel = 'high'
  114. }
  115. /** 将表单数据序列化为 JSON 对象 */
  116. const serializeFormData = () => {
  117. return {
  118. // 基本信息
  119. assessor: form.assessor || '',
  120. assessDate: form.assessDate ? dayjs(form.assessDate).format('YYYY-MM-DD') : '',
  121. // 攻击风险等级(1=I级,2=II级,3=III级,4=IV级)
  122. attackLevel: form.attackLevel || 0,
  123. // 各级别选择的具体项
  124. attackLevel1Items: form.attackLevel1Items || [],
  125. attackLevel2Items: form.attackLevel2Items || [],
  126. attackLevel3Items: form.attackLevel3Items || [],
  127. attackLevel4Items: form.attackLevel4Items || [],
  128. // 风险程度
  129. riskLevel: form.riskLevel || '',
  130. // 预防措施
  131. preventiveMeasures: form.preventiveMeasures || [],
  132. preventiveMeasuresOther: form.preventiveMeasuresOther || '',
  133. // 签名
  134. familySignature: form.familySignature || '',
  135. familySignDate: form.familySignDate ? dayjs(form.familySignDate).format('YYYY-MM-DD') : '',
  136. // 风险知情书内容
  137. riskDisclosure: {
  138. companyName: riskDisclosureForm.companyName || '',
  139. partyBSign: riskDisclosureForm.partyBSign || '',
  140. partyBDate: riskDisclosureForm.partyBDate || '',
  141. partyCSign: riskDisclosureForm.partyCSign || '',
  142. partyCDate: riskDisclosureForm.partyCDate || ''
  143. },
  144. // 首次服务项目确认表
  145. firstService: JSON.parse(JSON.stringify(firstServiceForm))
  146. }
  147. }
  148. /** 将 JSON 对象反序列化为表单数据 */
  149. const deserializeFormData = (formData: Record<string, any>) => {
  150. if (!formData) return
  151. // 基本信息
  152. form.assessor = formData.assessor || ''
  153. form.assessDate = formData.assessDate ? dayjs(formData.assessDate).toDate() : ''
  154. // 攻击风险等级
  155. form.attackLevel = formData.attackLevel || 0
  156. // 各级别选择的具体项
  157. form.attackLevel1Items = formData.attackLevel1Items || []
  158. form.attackLevel2Items = formData.attackLevel2Items || []
  159. form.attackLevel3Items = formData.attackLevel3Items || []
  160. form.attackLevel4Items = formData.attackLevel4Items || []
  161. // 风险程度
  162. form.riskLevel = formData.riskLevel || ''
  163. // 预防措施
  164. form.preventiveMeasures = formData.preventiveMeasures || []
  165. form.preventiveMeasuresOther = formData.preventiveMeasuresOther || ''
  166. // 签名
  167. form.familySignature = formData.familySignature || ''
  168. form.familySignDate = formData.familySignDate ? dayjs(formData.familySignDate).toDate() : ''
  169. // 风险知情书内容
  170. if (formData.riskDisclosure) {
  171. riskDisclosureForm.companyName = formData.riskDisclosure.companyName || ''
  172. riskDisclosureForm.partyBSign = formData.riskDisclosure.partyBSign || ''
  173. riskDisclosureForm.partyBDate = formData.riskDisclosure.partyBDate || ''
  174. riskDisclosureForm.partyCSign = formData.riskDisclosure.partyCSign || ''
  175. riskDisclosureForm.partyCDate = formData.riskDisclosure.partyCDate || ''
  176. }
  177. // 首次服务项目确认表
  178. if (formData.firstService) {
  179. Object.assign(firstServiceForm, JSON.parse(JSON.stringify(formData.firstService)))
  180. }
  181. }
  182. /** 重置攻击风险因素评估表表单数据 */
  183. const resetAttackRiskForm = () => {
  184. form.assessor = ''
  185. form.assessDate = ''
  186. // 攻击风险等级
  187. form.attackLevel = 0
  188. // 各级别选择的具体项
  189. form.attackLevel1Items = []
  190. form.attackLevel2Items = []
  191. form.attackLevel3Items = []
  192. form.attackLevel4Items = []
  193. // 风险程度
  194. form.riskLevel = ''
  195. // 预防措施
  196. form.preventiveMeasures = []
  197. form.preventiveMeasuresOther = ''
  198. // 签名
  199. form.familySignature = ''
  200. form.familySignDate = ''
  201. // 风险知情书
  202. riskDisclosureForm.companyName = '颐年医养'
  203. riskDisclosureForm.partyBSign = ''
  204. riskDisclosureForm.partyBDate = ''
  205. riskDisclosureForm.partyCSign = ''
  206. riskDisclosureForm.partyCDate = ''
  207. // 首次服务项目确认表
  208. Object.keys(firstServiceForm).forEach(key => delete (firstServiceForm as any)[key])
  209. }
  210. /** 打开弹窗 */
  211. const open = async (tenantId, id?: any, detail: boolean = false) => {
  212. resetForm()
  213. dialogVisible.value = true
  214. dataForm.value.id = id || undefined
  215. dataForm.value.tenantId = tenantId
  216. isDetail.value = detail
  217. if (id) {
  218. title.value = "编辑-攻击风险因素评估"
  219. // 加载评估数据
  220. await loadAttackRiskData(id)
  221. } else {
  222. title.value = "新增-攻击风险因素评估"
  223. }
  224. }
  225. /** 加载评估数据 */
  226. const loadAttackRiskData = async (id: number) => {
  227. try {
  228. const res = await attackRiskGetById(id)
  229. if (res) {
  230. // 填充长者基本信息
  231. dataForm.value.elderName = res.elderName || ''
  232. dataForm.value.elderId = res.elderId || ''
  233. dataForm.value.elderSex = res.elderSex || ''
  234. dataForm.value.bedName = res.bedName || ''
  235. dataForm.value.checkInTime = res.checkInTime || ''
  236. dataForm.value.contractNumber = res.fileNumber || ''
  237. dataForm.value.elderAge = res.elderAge || ''
  238. await selectElderRef.value.upData(res.elderName, res.elderId)
  239. // 解析 assessData
  240. if (res.assessData) {
  241. const formData = JSON.parse(res.assessData)
  242. deserializeFormData(formData)
  243. }
  244. }
  245. } catch (error) {
  246. message.error('加载评估数据失败')
  247. }
  248. }
  249. /** 根据长者ID加载评估数据 */
  250. const loadAttackRiskByElderId = async (elderId: number) => {
  251. try {
  252. const res = await attackRiskGetByElderId(elderId)
  253. if (res && res.assessData) {
  254. const formData = JSON.parse(res.assessData)
  255. deserializeFormData(formData)
  256. }
  257. } catch (error) {
  258. // 无历史数据,不处理
  259. }
  260. }
  261. const form = reactive({
  262. // 基本信息
  263. assessor: '',
  264. assessDate: '',
  265. // 攻击风险等级(0=无,1=I级,2=II级,3=III级,4=IV级)
  266. attackLevel: 0,
  267. // 各级别选择的具体项
  268. attackLevel1Items: [], // I级选择的项(1-7)
  269. attackLevel2Items: [], // II级选择的项(1-3)
  270. attackLevel3Items: [], // III级选择的项(1-4)
  271. attackLevel4Items: [], // IV级选择的项(1-2)
  272. // 风险程度
  273. riskLevel: '',
  274. // 预防措施
  275. preventiveMeasures: [],
  276. preventiveMeasuresOther: '',
  277. // 签名
  278. familySignature: '',
  279. familySignDate: ''
  280. })
  281. // 监听攻击等级变化,自动判断风险等级
  282. watch(() => form.attackLevel, () => {
  283. autoJudgeRiskLevel()
  284. })
  285. // 风险知情书表单数据
  286. const riskDisclosureForm = reactive({
  287. elderName: '',
  288. companyName: '颐年医养',
  289. assessor: '',
  290. assessDate: '',
  291. partyBSign: '',
  292. partyBDate: '',
  293. partyCSign: '',
  294. partyCDate: ''
  295. })
  296. // 长者信息变化时同步到风险告知书
  297. watch(
  298. () => dataForm.value.elderName,
  299. (name) => {
  300. riskDisclosureForm.elderName = name
  301. }
  302. )
  303. // 记录人变化时同步
  304. watch(
  305. () => form.assessor,
  306. (val) => {
  307. riskDisclosureForm.assessor = val
  308. }
  309. )
  310. watch(
  311. () => form.assessDate,
  312. (val) => {
  313. riskDisclosureForm.assessDate = val ? dayjs(val).format('YYYY-MM-DD') : ''
  314. }
  315. )
  316. defineExpose({ open }) // 提供 open 方法,用于打开弹窗
  317. /** 提交表单 */
  318. const emit = defineEmits(['success']) // 定义 success 事件,用于操作成功后的回调
  319. const submitForm = async () => {
  320. if (formLoading.value) {
  321. return
  322. }
  323. formLoading.value = true
  324. // 提交请求
  325. try {
  326. const assessData = serializeFormData()
  327. const tempParams = {
  328. ...dataForm.value,
  329. assessData: JSON.stringify(assessData),
  330. attackLevel: form.attackLevel,
  331. riskLevel: form.riskLevel,
  332. assessor: form.assessor,
  333. assessScore: form.attackLevel,
  334. assessDate: form.assessDate ? dayjs(form.assessDate).format('YYYY-MM-DD') : ''
  335. }
  336. if (dataForm.value.id) {
  337. const res = await attackRiskUpdate(tempParams)
  338. if (res) {
  339. message.success(t('common.updateSuccess'))
  340. dialogVisible.value = false
  341. // 发送操作成功的事件
  342. emit('success')
  343. }
  344. } else {
  345. const res = await attackRiskCreate(tempParams)
  346. if (res) {
  347. message.success(t('common.createSuccess'))
  348. dialogVisible.value = false
  349. // 发送操作成功的事件
  350. emit('success')
  351. }
  352. }
  353. } finally {
  354. setTimeout(() => {
  355. formLoading.value = false
  356. }, 500)
  357. }
  358. }
  359. /** 重置表单 */
  360. const resetForm = () => {
  361. dataForm.value = {
  362. id: undefined,
  363. idCard: '',
  364. contractNumber: '', //档案号
  365. elderName: '',//长者姓名
  366. bedName: '', //床位号
  367. elderAge: '', //年龄
  368. elderSex: '', //性别
  369. checkInTime: '', //入院日期
  370. elderId: '',
  371. tenantId: undefined
  372. }
  373. formRef.value?.resetFields()
  374. // 重置攻击风险因素评估表表单
  375. resetAttackRiskForm()
  376. }
  377. // 关闭表单
  378. const handleClosed = () => {
  379. dialogVisible.value = false
  380. resetForm()
  381. }
  382. </script>
  383. <style scoped lang="scss">
  384. .form-title {
  385. text-align: center;
  386. font-size: 20px;
  387. width: 100%;
  388. margin-bottom: 20px;
  389. }
  390. .attack-risk-form {
  391. max-width: 1200px;
  392. margin: 0 auto;
  393. background: #fff;
  394. .info-row {
  395. display: flex;
  396. gap: 40px;
  397. width: 100%;
  398. flex-direction: row;
  399. align-items: center;
  400. margin-bottom: 10px;
  401. .info-item {
  402. display: flex;
  403. align-items: center;
  404. gap: 8px;
  405. .label {
  406. width: 82px;
  407. text-align: right;
  408. margin-right: 4px;
  409. white-space: nowrap;
  410. }
  411. }
  412. }
  413. .form-body {
  414. border: 1px solid #333;
  415. padding: 15px;
  416. }
  417. // 调整 Element Plus 组件样式
  418. :deep(.el-input__inner) {
  419. height: 28px;
  420. line-height: 28px;
  421. border-top: none;
  422. border-left: none;
  423. border-right: none;
  424. border-radius: 0;
  425. padding: 0 4px;
  426. &:focus {
  427. border-color: #409eff;
  428. }
  429. }
  430. :deep(.el-checkbox__label),
  431. :deep(.el-radio__label) {
  432. padding-left: 4px;
  433. }
  434. }
  435. .row{
  436. margin-bottom: 12px;
  437. display: flex;
  438. flex-direction: row;
  439. align-items: center;
  440. text{
  441. text-align: right;
  442. margin-right: 4px;
  443. width: 82px;
  444. }
  445. }
  446. // NGASR自杀风险评估量表 特有样式
  447. .total-score-section {
  448. display: flex;
  449. justify-content: space-between;
  450. align-items: center;
  451. padding: 15px;
  452. background: #f5f7fa;
  453. border-radius: 4px;
  454. margin-bottom: 20px;
  455. .total-score {
  456. display: flex;
  457. align-items: baseline;
  458. gap: 4px;
  459. .score-label {
  460. font-size: 16px;
  461. font-weight: bold;
  462. }
  463. .score-value {
  464. font-size: 28px;
  465. font-weight: bold;
  466. color: #409eff;
  467. }
  468. .score-max {
  469. font-size: 14px;
  470. color: #909399;
  471. }
  472. }
  473. .risk-level {
  474. font-size: 16px;
  475. font-weight: bold;
  476. padding: 8px 16px;
  477. border-radius: 4px;
  478. &.risk-none {
  479. color: #67c23a;
  480. background: #f0f9eb;
  481. }
  482. &.risk-low {
  483. color: #e6a23c;
  484. background: #fdf6ec;
  485. }
  486. &.risk-medium {
  487. color: #f56c6c;
  488. background: #fef0f0;
  489. }
  490. &.risk-high {
  491. color: #f56c6c;
  492. background: #fef0f0;
  493. border: 1px solid #f56c6c;
  494. }
  495. }
  496. }
  497. .assessment-table {
  498. width: 100%;
  499. border-collapse: collapse;
  500. margin-bottom: 20px;
  501. table {
  502. width: 100%;
  503. border: 1px solid #333;
  504. th, td {
  505. border: 1px solid #333;
  506. padding: 12px;
  507. text-align: left;
  508. vertical-align: top;
  509. }
  510. th {
  511. background: #f5f7fa;
  512. font-weight: bold;
  513. text-align: center;
  514. }
  515. .content-col {
  516. width: 65%;
  517. }
  518. .level-col {
  519. width: 10%;
  520. text-align: center;
  521. }
  522. .select-col {
  523. width: 25%;
  524. text-align: center;
  525. }
  526. .content {
  527. text-align: left;
  528. .content-title {
  529. font-weight: bold;
  530. margin-bottom: 8px;
  531. }
  532. .content-item {
  533. margin-left: 15px;
  534. margin-bottom: 4px;
  535. font-size: 13px;
  536. }
  537. }
  538. .level {
  539. text-align: center;
  540. font-weight: bold;
  541. }
  542. .select {
  543. text-align: center;
  544. :deep(.el-radio) {
  545. margin-right: 0;
  546. }
  547. }
  548. }
  549. }
  550. .risk-judgment-section {
  551. margin: 20px 0;
  552. padding: 15px;
  553. background: #f5f7fa;
  554. border-radius: 4px;
  555. border: 1px solid #e4e7ed;
  556. .risk-judgment-title {
  557. font-weight: bold;
  558. font-size: 16px;
  559. margin-bottom: 12px;
  560. color: #303133;
  561. }
  562. .risk-options {
  563. display: flex;
  564. flex-wrap: wrap;
  565. gap: 20px;
  566. :deep(.el-radio) {
  567. margin-right: 0;
  568. }
  569. }
  570. }
  571. .preventive-section {
  572. margin: 20px 0;
  573. padding: 15px;
  574. background: #f5f7fa;
  575. border-radius: 4px;
  576. border: 1px solid #e4e7ed;
  577. .preventive-title {
  578. font-weight: bold;
  579. font-size: 16px;
  580. margin-bottom: 12px;
  581. color: #303133;
  582. }
  583. .preventive-options {
  584. display: flex;
  585. flex-wrap: wrap;
  586. gap: 15px;
  587. :deep(.el-checkbox) {
  588. margin-right: 20px;
  589. margin-bottom: 8px;
  590. }
  591. .other-input {
  592. width: 200px;
  593. margin-left: 10px;
  594. }
  595. }
  596. }
  597. .signature-section {
  598. margin: 20px 0;
  599. padding: 15px;
  600. background: #f5f7fa;
  601. border-radius: 4px;
  602. border: 1px solid #e4e7ed;
  603. .signature-row {
  604. display: flex;
  605. justify-content: space-between;
  606. align-items: center;
  607. gap: 20px;
  608. }
  609. .signature-item {
  610. display: flex;
  611. align-items: center;
  612. gap: 10px;
  613. &.date-item {
  614. :deep(.el-date-picker) {
  615. width: 150px;
  616. }
  617. }
  618. }
  619. .signature-label {
  620. font-weight: bold;
  621. white-space: nowrap;
  622. }
  623. .signature-input {
  624. width: 150px;
  625. }
  626. .date-picker {
  627. width: 150px;
  628. }
  629. }
  630. .note-section {
  631. margin-top: 20px;
  632. padding: 15px;
  633. background: #f5f7fa;
  634. border-radius: 4px;
  635. border: 1px solid #e4e7ed;
  636. .note-title {
  637. font-weight: bold;
  638. font-size: 16px;
  639. margin-bottom: 12px;
  640. color: #303133;
  641. }
  642. .note-content {
  643. font-size: 13px;
  644. line-height: 1.8;
  645. color: #606266;
  646. p {
  647. margin: 5px 0;
  648. }
  649. .indent {
  650. margin-left: 20px;
  651. }
  652. }
  653. }
  654. </style>