SelectRoomForm.vue 9.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344
  1. <template>
  2. <a-spin :spinning="confirmLoading">
  3. <j-form-container :disabled="formDisabled">
  4. <a-form-model
  5. ref="form"
  6. :model="model"
  7. :rules="validatorRules"
  8. slot="detail"
  9. >
  10. <a-row>
  11. <a-col :span="24">
  12. <a-form-model-item
  13. label="房型"
  14. :labelCol="labelCol"
  15. :wrapperCol="wrapperCol"
  16. >
  17. <a-checkbox default-checked disabled>{{ layoutName }}</a-checkbox>
  18. </a-form-model-item>
  19. </a-col>
  20. <!-- <a-col :span="24">
  21. <a-form-model-item
  22. label="房态"
  23. :labelCol="labelCol"
  24. :wrapperCol="wrapperCol"
  25. prop="roomStatus"
  26. >
  27. <a-checkbox-group
  28. v-model="model.roomStatus"
  29. :options="roomStatusOptions"
  30. />
  31. </a-form-model-item>
  32. </a-col> -->
  33. <a-col :span="24">
  34. <a-form-model-item
  35. label="已排房"
  36. :labelCol="labelCol"
  37. :wrapperCol="wrapperCol"
  38. >
  39. {{ model.rooms.length || 0 }}/{{ presetNum }}间
  40. </a-form-model-item>
  41. </a-col>
  42. <a-col :span="24">
  43. <a-form-model-item
  44. label="已选"
  45. :labelCol="labelCol"
  46. :wrapperCol="{
  47. xs: { span: 24 },
  48. sm: { span: 20 },
  49. }"
  50. prop="roomStatus"
  51. >
  52. <a-tag
  53. color="blue"
  54. closable
  55. :visible="visible"
  56. @close.stop="tagClose2(index, item.name)"
  57. v-for="(item, index) in model.rooms"
  58. :key="index"
  59. >{{ item.name }}</a-tag
  60. >
  61. </a-form-model-item>
  62. </a-col>
  63. <a-col :span="24">
  64. <a-form-model-item
  65. label="房间"
  66. :labelCol="labelCol"
  67. :wrapperCol="{
  68. xs: { span: 24 },
  69. sm: { span: 20 },
  70. }"
  71. >
  72. <a-tabs
  73. default-active-key="room-all"
  74. tab-position="left"
  75. :style="{ height: '300px' }"
  76. >
  77. <a-tab-pane
  78. tab="全部"
  79. key="room-all"
  80. >
  81. <div>
  82. <a-row :gutter="[8, 8]" style="overflow: auto;height:300px;">
  83. <a-col
  84. :span="24"
  85. v-for="(item, index) in (roomList || [])"
  86. :key="index"
  87. v-if="item.floorRooms.length > 0"
  88. >
  89. <div>{{ item.buildingName + item.floorName }}</div>
  90. <div style="display:flex;flex-wrap:wrap;">
  91. <div
  92. v-for="(r, rIndex) in item.floorRooms"
  93. @click="checkRoomClick(r)"
  94. :key="'floorRooms' + rIndex"
  95. :class="[r.check == 1 ? 'check' : 'nocheck', r.kz == 1 ? 'kz' : '',]"
  96. class="nocheck room-status">
  97. <!-- <div
  98. :class="[
  99. r.check == 1 ? 'check' : 'nocheck',
  100. r.kz == 1 ? 'kz' : '',
  101. ]"
  102. style="display:flex;flex-wrap:wrap;"
  103. @click="checkRoomClick(r)"
  104. >
  105. <div class="nocheck room-status">
  106. {{ r.name }}
  107. </div>
  108. </div> -->
  109. {{ r.name }}
  110. </div>
  111. </div>
  112. </a-col>
  113. </a-row>
  114. </div>
  115. </a-tab-pane>
  116. <a-tab-pane
  117. v-for="(room, index) in roomList"
  118. :key="'room' + index"
  119. :tab="room.floorName"
  120. >
  121. <div
  122. id="components-grid-demo-playground"
  123. style="height: 300px; overflow: hidden auto"
  124. >
  125. <a-row :gutter="[8, 8]">
  126. <a-col
  127. :span="3"
  128. v-for="(r, rIndex) in room.floorRooms"
  129. :key="'floorRooms' + rIndex"
  130. >
  131. <div
  132. :class="[
  133. r.check == 1 ? 'check' : '',
  134. r.kz == 1 ? 'kz' : '',
  135. ]"
  136. class="nocheck"
  137. @click="checkRoomClick(r)"
  138. >
  139. {{ r.name }}
  140. </div></a-col
  141. >
  142. </a-row>
  143. </div>
  144. </a-tab-pane>
  145. </a-tabs>
  146. </a-form-model-item>
  147. </a-col>
  148. </a-row>
  149. </a-form-model>
  150. </j-form-container>
  151. </a-spin>
  152. </template>
  153. <script>
  154. import { httpAction, getAction } from '@/api/manage'
  155. import { validateDuplicateValue } from '@/utils/util'
  156. export default {
  157. name: 'SelectRoomForm',
  158. components: {},
  159. props: {
  160. // 表单禁用
  161. disabled: {
  162. type: Boolean,
  163. default: false,
  164. required: false
  165. }
  166. },
  167. data() {
  168. const rooms = []
  169. for (let i = 0; i < 100; i++) {
  170. rooms.push({
  171. id: '100' + i,
  172. roomNo: 1000 + i,
  173. check: 0,
  174. kz: i == 1 ? 1 : 0
  175. })
  176. }
  177. const rooms2 = []
  178. for (let i = 0; i < 50; i++) {
  179. rooms2.push({
  180. id: '200' + i,
  181. roomNo: 2000 + i,
  182. check: 0,
  183. kz: i == 5 ? 1 : 0
  184. })
  185. }
  186. return {
  187. visible: true,
  188. roomList: [
  189. { key: '1层', child: rooms },
  190. { key: '2层', child: rooms2 }
  191. ],
  192. roomTypeOptions: [],
  193. roomStatusOptions: ['空净', '空脏'],
  194. model: { roomType: '', rooms: [] },
  195. labelCol: {
  196. xs: { span: 24 },
  197. sm: { span: 2 }
  198. },
  199. wrapperCol: {
  200. xs: { span: 24 },
  201. sm: { span: 16 }
  202. },
  203. confirmLoading: false,
  204. validatorRules: {
  205. dateRange: [{ required: true, message: '请选择维修时间!' }],
  206. remark: [{ required: true, message: '请输入维修原因!' }]
  207. },
  208. url: {
  209. add: '/business/busMeetingRoom/add',
  210. edit: '/business/busMeetingRoom/edit',
  211. queryById: '/business/busMeetingRoom/queryById'
  212. },
  213. layoutName: '',
  214. presetNum: 0
  215. }
  216. },
  217. computed: {
  218. formDisabled() {
  219. return this.disabled
  220. }
  221. },
  222. created() {
  223. var _info = JSON.parse(localStorage.getItem('storeInfo'))
  224. if (_info) {
  225. this.model.hotelId = _info.id
  226. }
  227. // 备份model原始值
  228. this.modelDefault = JSON.parse(JSON.stringify(this.model))
  229. },
  230. methods: {
  231. checkRoomClick(row) {
  232. if (row.check === 1) {
  233. row.check = 0
  234. var index = this.model.rooms.findIndex((t) => t.key1 == row.key1)
  235. this.model.rooms.splice(index, 1)
  236. } else {
  237. if (this.model.rooms.length >= this.presetNum) {
  238. this.$message.warning('超过排房数量')
  239. return
  240. }
  241. row.check = 1
  242. this.model.rooms.push(row)
  243. }
  244. },
  245. tagClose2(index, key1) {
  246. this.model.rooms.splice(index, 1)
  247. this.roomList.some((t) => {
  248. var r = t.floorRooms.some((c) => {
  249. if (c.name === key1) {
  250. c.check = 0
  251. return true
  252. }
  253. return false
  254. })
  255. if (r === true) {
  256. return true
  257. }
  258. })
  259. },
  260. onChange(date, dateString) {
  261. console.log(date, dateString)
  262. },
  263. add(row) {
  264. console.log('buildingRooms', row.buildingRooms)
  265. this.layoutName = row.layout.name
  266. this.presetNum = row.layout.presetNum
  267. this.roomList = row.buildingRooms
  268. this.edit(this.modelDefault)
  269. },
  270. edit(record) {
  271. this.model = Object.assign({}, record)
  272. this.roomList.forEach((t) => {
  273. t.floorRooms.forEach((f) => {
  274. if (f.check && f.check == 1) {
  275. this.model.rooms.push(f)
  276. }
  277. })
  278. })
  279. this.visible = true
  280. },
  281. submitForm() {
  282. const that = this
  283. if (that.model.rooms.length === 0) {
  284. that.$message.warning('请先选择房间')
  285. return
  286. }
  287. that.$emit('ok', that.model.rooms)
  288. }
  289. }
  290. }
  291. </script>
  292. <style scoped>
  293. #components-grid-demo-playground [class~="ant-col"] {
  294. background: transparent;
  295. border: 0;
  296. }
  297. #components-grid-demo-playground [class~="ant-col"] > div {
  298. /* background: #00a0e9; */
  299. height: 28px;
  300. line-height: 28px;
  301. font-size: 13px;
  302. text-align: center;
  303. cursor: pointer;
  304. border-radius: 5px;
  305. }
  306. #components-grid-demo-playground .check {
  307. border: 1px solid #00a0e9;
  308. }
  309. #components-grid-demo-playground .kz {
  310. background: rgba(166, 166, 166, 1);
  311. }
  312. #components-grid-demo-playground pre {
  313. background: #f9f9f9;
  314. border-radius: 6px;
  315. font-size: 13px;
  316. padding: 8px 16px;
  317. }
  318. #components-grid-demo-playground .nocheck {
  319. border: 1px solid #cccccc;
  320. border-left-width: 2px;
  321. }
  322. .check {
  323. border: 1px solid #00a0e9 !important;
  324. }
  325. .nocheck {
  326. border: 1px solid #cccccc;
  327. }
  328. .room-status{
  329. /* height: 100%; */
  330. /* line-height: 100%; */
  331. font-size: 13px;
  332. text-align: center;
  333. cursor: pointer;
  334. border-radius: 5px;
  335. margin-right: 10px;
  336. border: 1px solid #cccccc;
  337. padding: 0px 16px;
  338. margin-top: 5px;
  339. border-left-width: 2px;
  340. border-left-style: solid;
  341. }
  342. </style>