room.vue 12 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431
  1. <template>
  2. <div class="p-4">
  3. <BasicTable @register="registerTable" :rowSelection="{ type: 'checkbox' }">
  4. <template #toolbar>
  5. <a-button
  6. type="primary"
  7. v-show="
  8. getCheckRole(['super', 'plat_admin']) ||
  9. (getCheckRole(['company_admin', 'staff']) && getEquity([2]))
  10. "
  11. @click="handleAddLiveScene"
  12. >
  13. 创建房间</a-button
  14. >
  15. </template>
  16. <template #cover="{ record }">
  17. <TableImg
  18. :size="150"
  19. :simpleShow="true"
  20. :imgList="[record.appListPicUrl || '/resource/img/pic_bg@2x.png']"
  21. />
  22. </template>
  23. <template #Time="{ record }">
  24. <Time :value="record.createTime" mode="datetime" />
  25. </template>
  26. <template #liveEndTime="{ record }">
  27. <Time v-if="record.liveEndTime" :value="record.liveEndTime" mode="datetime" />
  28. <span v-else>-</span>
  29. </template>
  30. <template #liveTime="{ record }">
  31. <Time :value="record.effectiveStartTime" mode="datetime" />
  32. <br />
  33. <Time :value="record.effectiveEndTime" mode="datetime" />
  34. </template>
  35. <template #houseType="{ record }">
  36. {{ renderHouseType(Number(record.type)) }}
  37. </template>
  38. <template #action="{ record }">
  39. <TableAction :actions="renderActions(record)" />
  40. </template>
  41. </BasicTable>
  42. <roomDetail @success="reload" @register="registerModal" />
  43. </div>
  44. </template>
  45. <script lang="ts">
  46. import { defineComponent, computed, toRaw } from 'vue';
  47. import dayjs from 'dayjs';
  48. import {
  49. BasicTable,
  50. useTable,
  51. BasicColumn,
  52. FormProps,
  53. TableAction,
  54. TableImg,
  55. } from '/@/components/Table';
  56. import { useMessage } from '/@/hooks/web/useMessage';
  57. import { Time } from '/@/components/Time';
  58. // import { LiveSceneDeleteApi } from '/@/api/scene/live';
  59. import { useI18n } from '/@/hooks/web/useI18n';
  60. import { useUserStore } from '/@/store/modules/user';
  61. import { useModal } from '/@/components/Modal';
  62. import roomDetail from './roomDetail.vue';
  63. import { listRoomsApi, dismissRoom, deleteRoom } from '/@/api/scene/list';
  64. export default defineComponent({
  65. components: { BasicTable, TableAction, TableImg, roomDetail, Time },
  66. emits: ['register'],
  67. setup() {
  68. const { createMessage, createConfirm } = useMessage();
  69. const userStore = useUserStore();
  70. const { getCheckRole, getEquity } = userStore;
  71. const { t } = useI18n();
  72. const [registerModal, { openModal: addopenModal }] = useModal();
  73. const permList = computed(() => userStore.getPermList);
  74. const columns: BasicColumn[] = [
  75. {
  76. title: 'ID',
  77. dataIndex: 'id',
  78. fixed: 'left',
  79. width: 100,
  80. },
  81. {
  82. title: t('routes.room.anchorRoom'),
  83. dataIndex: 'name',
  84. ellipsis: false,
  85. width: 130,
  86. },
  87. {
  88. title: t('routes.room.brandName'),
  89. dataIndex: 'brandName',
  90. ellipsis: false,
  91. width: 130,
  92. },
  93. {
  94. title: t('routes.room.capacities'),
  95. dataIndex: 'capacities',
  96. // slots: { customRender: 'houseType' },
  97. width: 100,
  98. customRender: ({ record }) => {
  99. return record.capacities || '-';
  100. },
  101. },
  102. {
  103. title: '主持人',
  104. dataIndex: 'anchorUserName',
  105. width: 140,
  106. },
  107. {
  108. title: '助理',
  109. dataIndex: 'assistantUserName',
  110. width: 140,
  111. customRender: ({ record }) => {
  112. return record.assistantUserName || '-';
  113. },
  114. },
  115. {
  116. title: '助理手机号',
  117. dataIndex: 'assistantPhone',
  118. width: 140,
  119. customRender: ({ record }) => {
  120. return record.assistantPhone || '-';
  121. },
  122. },
  123. {
  124. title: '创建时间',
  125. dataIndex: 'createTime',
  126. slots: { customRender: 'Time' },
  127. width: 150,
  128. },
  129. {
  130. title: '开播时间段',
  131. dataIndex: 'effectiveStartTime',
  132. slots: { customRender: 'liveTime' },
  133. width: 180,
  134. },
  135. {
  136. title: '房间结束时间',
  137. dataIndex: 'liveEndTime',
  138. slots: { customRender: 'liveEndTime' },
  139. width: 140,
  140. },
  141. {
  142. title: '创建人',
  143. dataIndex: 'createUserName',
  144. width: 180,
  145. },
  146. {
  147. title: t('routes.room.roomStatus'),
  148. dataIndex: 'state',
  149. width: 180,
  150. customRender: ({ record }) => {
  151. const enable = record.state;
  152. const text = renderRoomType(enable); // ? t('routes.room.statusText.1') : t('routes.room.statusText.0');
  153. return text;
  154. },
  155. },
  156. {
  157. title: t('common.operation'),
  158. dataIndex: '',
  159. slots: { customRender: 'action' },
  160. ifShow:
  161. (!getCheckRole(['host', 'tourist']) && getEquity(2)) ||
  162. getCheckRole(['super', 'plat_admin']),
  163. width: 100,
  164. fixed: 'right',
  165. },
  166. ];
  167. const searchForm: Partial<FormProps> = {
  168. labelWidth: 100,
  169. schemas: [
  170. {
  171. field: 'name',
  172. label: t('routes.room.anchorRoom'),
  173. component: 'Input',
  174. componentProps: {
  175. maxLength: 100,
  176. },
  177. colProps: {
  178. xl: 5,
  179. xxl: 5,
  180. },
  181. },
  182. {
  183. field: 'anchorUserName',
  184. label: t('routes.room.anchorUserName'),
  185. component: 'Input',
  186. componentProps: {
  187. maxLength: 100,
  188. },
  189. colProps: {
  190. xl: 5,
  191. xxl: 5,
  192. },
  193. },
  194. {
  195. field: 'state',
  196. label: t('routes.room.listRoomsState'),
  197. component: 'Select',
  198. colProps: {
  199. xl: 5,
  200. xxl: 5,
  201. },
  202. defaultValue: '',
  203. componentProps: {
  204. options: [
  205. {
  206. label: t('common.all'),
  207. value: '',
  208. key: '0',
  209. },
  210. {
  211. label: t('routes.room.statusText.101'),
  212. value: 101,
  213. key: '101',
  214. },
  215. {
  216. label: t('routes.room.statusText.102'),
  217. value: 102,
  218. key: '102',
  219. },
  220. {
  221. label: t('routes.room.statusText.103'),
  222. value: 103,
  223. key: '103',
  224. },
  225. ],
  226. },
  227. },
  228. ],
  229. };
  230. function renderHouseType(type: number): string {
  231. switch (type) {
  232. case 0:
  233. return '新房';
  234. case 1:
  235. return '二手房';
  236. case 2:
  237. return '公寓';
  238. case 3:
  239. return '民宿';
  240. case 4:
  241. return '装修';
  242. default:
  243. return t(`routes.room.houseType.9`);
  244. }
  245. }
  246. function renderRoomType(type: number): string {
  247. switch (type) {
  248. case 0:
  249. return '新房';
  250. case 1:
  251. return '二手房';
  252. case 2:
  253. return '公寓';
  254. case 3:
  255. return '民宿';
  256. case 4:
  257. return '装修';
  258. case 101:
  259. return t('routes.room.statusText.101');
  260. case 102:
  261. return t('routes.room.statusText.102');
  262. case 103:
  263. return t('routes.room.statusText.103');
  264. default:
  265. return t(`routes.room.houseType.9`);
  266. }
  267. }
  268. const [registerTable, { reload }] = useTable({
  269. title: t(`routes.room.liveBroadcast`),
  270. api: listRoomsApi,
  271. columns: columns,
  272. useSearchForm: true,
  273. formConfig: searchForm,
  274. showTableSetting: true,
  275. tableSetting: { fullScreen: true },
  276. showIndexColumn: false,
  277. rowKey: 'id',
  278. pagination: { pageSize: 20 },
  279. clickToRowSelect: false,
  280. fetchSetting: {
  281. pageField: 'page',
  282. sizeField: 'limit',
  283. listField: 'list',
  284. totalField: 'totalCount',
  285. },
  286. sortFn: (sortInfo) => {
  287. console.log('sortInfo', sortInfo);
  288. let order = sortInfo.order && sortInfo.order.replace('end', '');
  289. return { ...sortInfo, sidx: sortInfo.field, order: order };
  290. },
  291. });
  292. function handleBindAnchor(record: Recordable) {
  293. createConfirm({
  294. width: 500,
  295. iconType: 'warning',
  296. title: '温馨提示',
  297. content: `关闭房间后,房间内的所有人都会退出房间,是否继续关闭?<br>(关闭后,房间状态将改为已结束)`,
  298. onOk: async () => {
  299. handleDismissRoom(record);
  300. },
  301. });
  302. }
  303. function openTargetModal(record: Recordable) {
  304. addopenModal(true, {
  305. isUpdate: true,
  306. record: {
  307. ...toRaw(record),
  308. launchPeriod: [
  309. record.effectiveStartTime &&
  310. dayjs(record.effectiveStartTime).format('YYYY-MM-DD HH:mm:ss'),
  311. record.effectiveEndTime &&
  312. dayjs(record.effectiveEndTime).format('YYYY-MM-DD HH:mm:ss'),
  313. ],
  314. },
  315. });
  316. }
  317. function handleAddLiveScene() {
  318. addopenModal(true, {});
  319. }
  320. function handleSeeLiveScene(record: Recordable) {
  321. let setRecord = toRaw(record);
  322. addopenModal(true, {
  323. isSetData: true,
  324. record: {
  325. ...setRecord,
  326. brandId: setRecord.brandName,
  327. anchorUserId: setRecord.anchorUserName,
  328. assistantUserId: setRecord.assistantUserName,
  329. launchPeriod: [
  330. record.effectiveEndTime &&
  331. dayjs(record.effectiveEndTime).format('YYYY-MM-DD HH:mm:ss'),
  332. record.effectiveStartTime &&
  333. dayjs(record.effectiveStartTime).format('YYYY-MM-DD HH:mm:ss'),
  334. ],
  335. },
  336. });
  337. }
  338. function handleDtelRoom(record) {
  339. createConfirm({
  340. width: 500,
  341. iconType: 'warning',
  342. title: '删除房间',
  343. content: `删除房间后,房间信息及数据将进行销毁,是否继续删除?`,
  344. onOk: async () => {
  345. handleDeleteLiveScene(record);
  346. },
  347. });
  348. }
  349. function renderActions(record: Recordable) {
  350. if (record.state == '101') {
  351. return [
  352. {
  353. label: '结束房间',
  354. color: 'error',
  355. onClick: handleBindAnchor.bind(null, record),
  356. },
  357. ];
  358. } else if (record.state == '102') {
  359. //未开播
  360. return [
  361. {
  362. color: 'warning',
  363. label: '编辑',
  364. onClick: openTargetModal.bind(null, record),
  365. },
  366. {
  367. color: 'error',
  368. label: '删除',
  369. onClick: handleDtelRoom.bind(null, record),
  370. },
  371. ];
  372. } else {
  373. //103:已结束
  374. return [
  375. {
  376. color: 'warning',
  377. label: '查看',
  378. onClick: handleSeeLiveScene.bind(null, record),
  379. },
  380. {
  381. color: 'error',
  382. label: '删除',
  383. onClick: handleDtelRoom.bind(null, record),
  384. },
  385. ];
  386. }
  387. }
  388. async function handleDismissRoom(record: Recordable) {
  389. await dismissRoom({ id: record.id });
  390. createMessage.success(t('common.optSuccess'));
  391. reload();
  392. }
  393. async function handleDeleteLiveScene(record: Recordable) {
  394. await deleteRoom({ id: record.id });
  395. createMessage.success(t('common.optSuccess'));
  396. reload();
  397. }
  398. return {
  399. registerTable,
  400. createMessage,
  401. handleDtelRoom,
  402. renderActions,
  403. renderRoomType,
  404. renderHouseType,
  405. t,
  406. registerModal,
  407. handleBindAnchor,
  408. permList,
  409. reload,
  410. openTargetModal,
  411. handleAddLiveScene,
  412. handleSeeLiveScene,
  413. handleDeleteLiveScene,
  414. getCheckRole,
  415. getEquity,
  416. };
  417. },
  418. });
  419. </script>