travel.ts 19 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730
  1. import VillageInfoApi, { CommonInfoModel } from "@/api/inhert/VillageInfoApi";
  2. import { useAliOssUploadCo } from "@/common/components/upload/AliOssUploadCo";
  3. import type { PickerIdFieldProps } from "@/components/dynamic/wrappers/PickerIdField";
  4. import type { FieldProps } from "@/components/form/Field.vue";
  5. import type { PickerFieldProps } from "@/components/form/PickerField.vue";
  6. import type { UploaderFieldProps } from "@/components/form/UploaderField.vue";
  7. import type { GroupForm, SingleForm } from "../forms";
  8. import { villageCommonContent } from "./common";
  9. export const villageInfoTravelGuideForm : SingleForm = [CommonInfoModel, (r) => ({
  10. formItems: [
  11. {
  12. label: '交通基本信息',
  13. name: 'transportBasic',
  14. type: 'flat-group',
  15. childrenColProps: {
  16. span: 24,
  17. },
  18. children: [
  19. {
  20. label: '路线',
  21. name: 'villageRoute',
  22. type: 'text',
  23. defaultValue: '',
  24. additionalProps: {
  25. placeholder: '请输路线',
  26. },
  27. rules: [{
  28. required: true,
  29. message: '请输路线',
  30. }]
  31. },
  32. {
  33. label: '距离县城',
  34. name: 'county',
  35. type: 'number',
  36. defaultValue: 0,
  37. additionalProps: { min: 0, addonAfter: 'KM' },
  38. rules: [{
  39. required: true,
  40. message: '请输入距离县城',
  41. }]
  42. },
  43. {
  44. label: '距离镇区中心',
  45. name: 'town',
  46. type: 'number',
  47. defaultValue: 0,
  48. additionalProps: { min: 0, addonAfter: 'KM' },
  49. rules: [{
  50. required: true,
  51. message: '请输入距离镇区中心',
  52. }]
  53. },
  54. {
  55. label: '距离市中心',
  56. name: 'city',
  57. type: 'number',
  58. defaultValue: 0,
  59. additionalProps: { min: 0, addonAfter: 'KM' },
  60. rules: [{
  61. required: true,
  62. message: '请输入距离市中心',
  63. }]
  64. }
  65. ]
  66. },
  67. {
  68. label: '交通设施信息',
  69. name: 'transportFacilities',
  70. type: 'flat-group',
  71. childrenColProps: {
  72. span: 24,
  73. },
  74. children: [
  75. {
  76. label: '最近高速收费站名称',
  77. name: 'tollStationName',
  78. type: 'text',
  79. defaultValue: '',
  80. additionalProps: {
  81. placeholder: '请输入最近高速收费站名称',
  82. },
  83. rules: [{
  84. required: true,
  85. message: '请输入最近高速收费站名称',
  86. }]
  87. },
  88. {
  89. label: '最近高速收费站名称',
  90. name: 'tollStation',
  91. type: 'text',
  92. defaultValue: '',
  93. additionalProps: {
  94. placeholder: '请输入最近高速收费站名称',
  95. },
  96. rules: []
  97. },
  98. {
  99. label: '距离最近火车站',
  100. name: 'trainStation',
  101. type: 'text',
  102. defaultValue: '',
  103. additionalProps: {
  104. placeholder: '请输入距离最近火车站',
  105. },
  106. rules: []
  107. },
  108. //有无公交车
  109. {
  110. label: '有无公交车',
  111. name: 'isBus',
  112. type: 'check-box-int',
  113. defaultValue: 0,
  114. additionalProps: {
  115. text: '有',
  116. },
  117. rules: [{
  118. required: true,
  119. message: '请选择有无公交车',
  120. type: 'number',
  121. }]
  122. },
  123. {
  124. label: '公交车介绍',
  125. name: 'busIntro',
  126. type: 'text',
  127. show: { callback: (_, rawModel) => (rawModel.isBus == 1) },
  128. defaultValue: '',
  129. additionalProps: {
  130. placeholder: '请输入公交车介绍',
  131. },
  132. rules: [{
  133. required: true,
  134. message: '请输入公交车介绍',
  135. }]
  136. },
  137. {
  138. label: '其他交通方式',
  139. name: 'otherBus',
  140. type: 'text',
  141. defaultValue: '',
  142. additionalProps: {
  143. placeholder: '请输入其他交通方式',
  144. },
  145. rules: []
  146. }
  147. ]
  148. },
  149. {
  150. label: '图片信息',
  151. name: 'imageInfo',
  152. type: 'flat-group',
  153. childrenColProps: {
  154. span: 24,
  155. },
  156. children: [
  157. {
  158. label: '景区全景图',
  159. name: 'panorama',
  160. type: 'uploader',
  161. defaultValue: '',
  162. additionalProps: {
  163. upload: useAliOssUploadCo('xiangyuan/travel/panorama', {
  164. getVillageId: () => r.value.getGlobalParams().villageId,
  165. overflow: () => r.value.emitMessage('storageOverflow'),
  166. }),
  167. maxFileSize: 1024 * 1024 * 20,
  168. single: true,
  169. } as UploaderFieldProps,
  170. rules: []
  171. },
  172. {
  173. label: '其他图',
  174. name: 'otherImage',
  175. type: 'uploader',
  176. defaultValue: '',
  177. additionalProps: {
  178. upload: useAliOssUploadCo('xiangyuan/travel/guide', {
  179. getVillageId: () => r.value.getGlobalParams().villageId,
  180. overflow: () => r.value.emitMessage('storageOverflow'),
  181. }),
  182. maxFileSize: 1024 * 1024 * 20,
  183. single: true,
  184. } as UploaderFieldProps,
  185. rules: []
  186. }
  187. ]
  188. },
  189. {
  190. label: '标识牌信息',
  191. name: 'signInfo',
  192. type: 'flat-group',
  193. childrenColProps: {
  194. span: 24,
  195. },
  196. children: [
  197. //解说牌
  198. {
  199. label: '有无解说牌',
  200. name: 'introBoard',
  201. type: 'check-box-int',
  202. defaultValue: 0,
  203. additionalProps: {
  204. text: '有',
  205. },
  206. rules: [{
  207. required: true,
  208. message: '请选择有无解说牌',
  209. }]
  210. },
  211. {
  212. label: '其他解说牌',
  213. name: 'otherIntroBoard',
  214. type: 'text',
  215. show: { callback: (_, rawModel) => (rawModel.introBoard == 1) },
  216. defaultValue: '',
  217. additionalProps: {
  218. placeholder: '请输入其他解说牌',
  219. },
  220. rules: []
  221. },
  222. {
  223. label: '有无解指示牌',
  224. name: 'indicateBoard',
  225. type: 'check-box-int',
  226. defaultValue: 0,
  227. additionalProps: {
  228. text: '有',
  229. },
  230. rules: [{
  231. required: true,
  232. message: '请选择有无指示牌',
  233. }]
  234. },
  235. {
  236. label: '其他指示牌',
  237. name: 'otherIndicateBoard',
  238. type: 'text',
  239. show: { callback: (_, rawModel) => (rawModel.indicateBoard == 1) },
  240. defaultValue: '',
  241. additionalProps: {
  242. placeholder: '请输入其他指示牌',
  243. },
  244. rules: [{
  245. required: true,
  246. message: '请输入其他指示牌',
  247. }]
  248. },
  249. {
  250. label: '有无安全告示牌',
  251. name: 'safeBoard',
  252. type: 'check-box-int',
  253. defaultValue: 0,
  254. additionalProps: {
  255. text: '有',
  256. },
  257. rules: [{
  258. required: true,
  259. message: '请选择有无安全告示牌',
  260. }]
  261. },
  262. {
  263. label: '其他安全告示牌',
  264. name: 'otherSafeBoard',
  265. type: 'text',
  266. show: { callback: (_, rawModel) => (rawModel.safeBoard == 1) },
  267. defaultValue: '',
  268. additionalProps: {
  269. placeholder: '请输入其他安全告示牌',
  270. },
  271. rules: [{
  272. required: true,
  273. message: '请输入其他安全告示牌',
  274. }]
  275. }
  276. ]
  277. },
  278. {
  279. label: '服务设施',
  280. name: 'serviceFacilities',
  281. type: 'flat-group',
  282. childrenColProps: {
  283. span: 24,
  284. },
  285. children: [
  286. {
  287. label: '有无游客服务中心',
  288. name: 'visitorCenter',
  289. type: 'check-box-int',
  290. defaultValue: 0,
  291. additionalProps: {
  292. text: '有',
  293. },
  294. rules: [{
  295. required: true,
  296. message: '请选择有有无游客服务中心',
  297. }]
  298. },
  299. {
  300. label: '游客服务中心面积',
  301. name: 'visitorCenterArea',
  302. type: 'text',
  303. show: { callback: (_, rawModel) => (rawModel.visitorCenter == 1) },
  304. defaultValue: '',
  305. additionalProps: {
  306. placeholder: '请输入游客服务中心面积',
  307. },
  308. rules: [{
  309. required: true,
  310. message: '请输入游客服务中心面积',
  311. }]
  312. },
  313. {
  314. label: '商业设施',
  315. name: 'business',
  316. type: 'select-id',
  317. additionalProps: {
  318. loadData: async () =>
  319. (await VillageInfoApi.getCategoryChildList(282))
  320. .map((p) => ({
  321. value: p.id,
  322. text: p.title,
  323. }))
  324. ,
  325. } as PickerIdFieldProps,
  326. formProps: { showRightArrow: true } as FieldProps,
  327. rules: [{
  328. required: true,
  329. message: '请选择商业设施',
  330. }],
  331. },
  332. {
  333. label: '其他商业设施',
  334. name: 'otherBusiness',
  335. type: 'text',
  336. defaultValue: '',
  337. show: { callback: (_, rawModel) => (rawModel.business == 288) },
  338. additionalProps: {
  339. placeholder: '请输入其他商业设施',
  340. },
  341. rules: [{
  342. required: true,
  343. message: '请输入其他商业设施',
  344. }]
  345. }
  346. ]
  347. },
  348. {
  349. label: '医疗与游览服务',
  350. name: 'medicalTourService',
  351. type: 'flat-group',
  352. childrenColProps: {
  353. span: 24,
  354. },
  355. children: [
  356. //医疗点
  357. {
  358. label: '有无医疗点',
  359. name: 'medicalPoint',
  360. type: 'select',
  361. defaultValue: 0,
  362. additionalProps: {
  363. columns: [[
  364. { value: 0, text: '无' },
  365. { value: 1, text: '有' },
  366. { value: 2, text: '其他' }
  367. ]],
  368. singleValue: true,
  369. } as PickerFieldProps,
  370. formProps: {
  371. showRightArrow: true,
  372. },
  373. rules: [{
  374. required: true,
  375. message: '请选择有无医疗点',
  376. }]
  377. },
  378. {
  379. label: '其他医疗点',
  380. name: 'otherMedicalPoint',
  381. type: 'text',
  382. show: { callback: (_, rawModel) => (rawModel.medicalPoint == 2) },
  383. defaultValue: '',
  384. additionalProps: {
  385. placeholder: '请输入其他医疗点',
  386. },
  387. rules: [{
  388. required: true,
  389. message: '请输入其他医疗点',
  390. }]
  391. },
  392. //游览车
  393. {
  394. label: '有无游览车',
  395. name: 'tourBus',
  396. type: 'select',
  397. defaultValue: 0,
  398. additionalProps: {
  399. columns: [[
  400. { value: 0, text: '无' },
  401. { value: 1, text: '有' },
  402. { value: 2, text: '其他' }
  403. ]],
  404. singleValue: true,
  405. } as PickerFieldProps,
  406. formProps: {
  407. showRightArrow: true,
  408. },
  409. rules: [{
  410. required: true,
  411. message: '请选择有无游览车',
  412. }]
  413. },
  414. {
  415. label: '其他游览车',
  416. name: 'otherTourBus',
  417. type: 'text',
  418. show: { callback: (_, rawModel) => (rawModel.tourBus == 2) },
  419. defaultValue: '',
  420. additionalProps: {
  421. placeholder: '请输入其他游览车',
  422. },
  423. rules: [{
  424. required: true,
  425. message: '请输入其他游览车',
  426. }]
  427. }
  428. ]
  429. },
  430. {
  431. label: '基础设施',
  432. name: 'infrastructure',
  433. type: 'flat-group',
  434. childrenColProps: {
  435. span: 24,
  436. },
  437. children: [
  438. {
  439. label: '机动车停车场',
  440. name: 'parkingLot',
  441. type: 'number',
  442. defaultValue: 0,
  443. additionalProps: { min: 0, addonAfter: '辆' },
  444. rules: []
  445. },
  446. {
  447. label: '分类垃圾点',
  448. name: 'garbagePoint',
  449. type: 'number',
  450. defaultValue: 0,
  451. additionalProps: {
  452. min: 0,
  453. addonAfter: '处',
  454. },
  455. rules: []
  456. },
  457. {
  458. label: '公共卫生间',
  459. name: 'publicToilets',
  460. type: 'number',
  461. defaultValue: 0,
  462. additionalProps: { min: 0, addonAfter: '处' },
  463. rules: []
  464. }
  465. ]
  466. }
  467. ]
  468. }), { title: '旅游导览', typeName: '', }]
  469. export const villageInfoRouteForm : SingleForm = [CommonInfoModel, (r) => ({
  470. formItems: [
  471. {
  472. label: '游览路线',
  473. name: 'serviceFacilities',
  474. type: 'flat-group',
  475. childrenColProps: {
  476. span: 24,
  477. },
  478. children: [
  479. {
  480. label: '游览路线',
  481. name: 'route',
  482. type: 'text',
  483. defaultValue: '',
  484. additionalProps: {
  485. placeholder: '请输入游览路线',
  486. },
  487. rules: [{
  488. required: true,
  489. message: '请输入游览路线',
  490. }]
  491. },
  492. {
  493. label: '路线名称',
  494. name: 'name',
  495. type: 'text',
  496. defaultValue: '',
  497. additionalProps: {
  498. placeholder: '请输入路线名称',
  499. },
  500. rules: [{
  501. required: true,
  502. message: '请输入路线名称',
  503. }]
  504. },
  505. {
  506. label: '描述',
  507. name: 'desc',
  508. type: 'richtext',
  509. defaultValue: '',
  510. additionalProps: {
  511. placeholder: '请输入描述',
  512. maxLength: 5000,
  513. showWordLimit: true,
  514. },
  515. rules: [{
  516. required: true,
  517. message: '请输入描述',
  518. }]
  519. },
  520. {
  521. label: '起始点',
  522. name: 'startPoint',
  523. type: 'text',
  524. defaultValue: '',
  525. additionalProps: {
  526. placeholder: '请输入起始点',
  527. },
  528. rules: [{
  529. required: true,
  530. message: '请输入起始点',
  531. }]
  532. },
  533. {
  534. label: '终止点',
  535. name: 'endPoint',
  536. type: 'text',
  537. defaultValue: '',
  538. additionalProps: {
  539. placeholder: '请输入终止点',
  540. },
  541. rules: [{
  542. required: true,
  543. message: '请输入终止点',
  544. }]
  545. },
  546. {
  547. label: '预计时长',
  548. name: 'estimate',
  549. type: 'number',
  550. defaultValue: 1,
  551. additionalProps: {
  552. min: 1,
  553. addonAfter: '小时',
  554. },
  555. rules: [{
  556. required: true,
  557. message: '请输入预计时长',
  558. }]
  559. },
  560. ...villageCommonContent(r, {
  561. title: '游览路线',
  562. showContent: false,
  563. showTitle: false,
  564. }).formItems
  565. ]
  566. },
  567. {
  568. label: '活动时间',
  569. name: 'serviceFacilities',
  570. type: 'flat-group',
  571. childrenColProps: {
  572. span: 24,
  573. },
  574. children: [
  575. {
  576. label: '活动标题',
  577. name: 'activity',
  578. type: 'text',
  579. defaultValue: '',
  580. additionalProps: {
  581. placeholder: '请输入活动标题',
  582. },
  583. rules: [{
  584. required: true,
  585. message: '请输入活动标题',
  586. }]
  587. },
  588. {
  589. label: '活动开始时间',
  590. name: 'startTime',
  591. type: 'datetime',
  592. defaultValue: '',
  593. additionalProps: {
  594. type: 'datetime',
  595. },
  596. rules: [{
  597. required: true,
  598. message: '请选择活动开始时间',
  599. }],
  600. },
  601. {
  602. label: '活动结束时间',
  603. name: 'endTime',
  604. type: 'datetime',
  605. defaultValue: '',
  606. additionalProps: {
  607. type: 'datetime',
  608. },
  609. rules: [{
  610. required: true,
  611. message: '请选择活动结束时间',
  612. }],
  613. },
  614. {
  615. label: '活动时长',
  616. name: 'duration',
  617. type: 'number',
  618. defaultValue: 0,
  619. additionalProps: {
  620. min: 0,
  621. addonAfter: '分钟',
  622. },
  623. rules: [{
  624. required: true,
  625. message: '请选择活动时长',
  626. }],
  627. },
  628. ...villageCommonContent(r, {
  629. title: '活动时间',
  630. showContent: false,
  631. showTitle: false,
  632. }).formItems
  633. ]
  634. },
  635. {
  636. label: '路线特色',
  637. name: 'serviceFacilities',
  638. type: 'flat-group',
  639. childrenColProps: {
  640. span: 24,
  641. },
  642. children: [
  643. {
  644. label: '特色',
  645. name: 'advant',
  646. type: 'richtext',
  647. defaultValue: '',
  648. additionalProps: {
  649. placeholder: '请输入特色',
  650. maxLength: 1000,
  651. showWordLimit: true,
  652. } as FieldProps,
  653. rules: [{
  654. required: true,
  655. message: '请输入特色',
  656. }]
  657. },
  658. {
  659. label: '文化背景',
  660. name: 'intro',
  661. type: 'richtext',
  662. defaultValue: '',
  663. additionalProps: {
  664. placeholder: '请输入文化背景',
  665. maxLength: 1000,
  666. showWordLimit: true,
  667. } as FieldProps,
  668. rules: [{
  669. required: true,
  670. message: '请输入文化背景',
  671. }]
  672. },
  673. {
  674. label: '精彩推荐',
  675. name: 'recommend',
  676. type: 'richtext',
  677. defaultValue: '',
  678. additionalProps: {
  679. placeholder: '请输入精彩推荐',
  680. maxLength: 1000,
  681. showWordLimit: true,
  682. } as FieldProps,
  683. rules: [{
  684. required: true,
  685. message: '请输入精彩推荐',
  686. }]
  687. },
  688. {
  689. label: '推荐描述',
  690. name: 'reason',
  691. type: 'richtext',
  692. defaultValue: '',
  693. additionalProps: {
  694. placeholder: '请输入推荐描述',
  695. maxLength: 1000,
  696. showWordLimit: true,
  697. } as FieldProps,
  698. rules: [{
  699. required: true,
  700. message: '请输入推荐描述',
  701. }]
  702. },
  703. {
  704. label: '活动亮点',
  705. name: 'highlight',
  706. type: 'richtext',
  707. defaultValue: '',
  708. additionalProps: {
  709. placeholder: '请输入活动亮点',
  710. maxLength: 1000,
  711. showWordLimit: true,
  712. } as FieldProps,
  713. rules: [{
  714. required: true,
  715. message: '请输入活动亮点',
  716. }]
  717. },
  718. ...villageCommonContent(r, {
  719. title: '路线特色',
  720. showContent: false,
  721. showTitle: false,
  722. }).formItems
  723. ]
  724. },
  725. ]
  726. }), { title: '旅游路线', typeName: '', }];