roomDetail.vue 14 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481
  1. <template>
  2. <BasicModal
  3. v-bind="$attrs"
  4. @register="register"
  5. :minHeight="340"
  6. :width="580"
  7. :title="modalTitle"
  8. @visible-change="handleVisibleChange"
  9. @ok="handleSubmit"
  10. @cancel="handleClose"
  11. >
  12. <div class="pt-2px pr-3px">
  13. <BasicForm @register="registerForm">
  14. <template #text="{ model, field }">
  15. {{ model[field] || '' }}
  16. </template>
  17. </BasicForm>
  18. </div>
  19. </BasicModal>
  20. </template>
  21. <script lang="ts">
  22. import { defineComponent, nextTick, ref, computed, reactive } from 'vue';
  23. import { BasicModal, useModalInner } from '/@/components/Modal';
  24. import { BasicForm, FormSchema, useForm } from '/@/components/Form/index';
  25. import { useMessage } from '/@/hooks/web/useMessage';
  26. // import { checkUserAddAble } from '/@/api/corporation/modal';
  27. import { useI18n } from '/@/hooks/web/useI18n';
  28. import { useUserStore } from '/@/store/modules/user';
  29. import { staffListApi } from '/@/api/staff/list';
  30. import { ListApi } from '/@/api/scene/live';
  31. import { bindUserList, createOrUpdate } from '/@/api/scene/list';
  32. import { dateUtil } from '/@/utils/dateUtil';
  33. import { cloneDeep } from 'lodash-es';
  34. const now = dateUtil();
  35. const { t } = useI18n();
  36. export default defineComponent({
  37. components: { BasicModal, BasicForm },
  38. props: {
  39. userData: { type: Object },
  40. },
  41. emits: ['register', 'submit', 'tablelist'],
  42. setup(props, { emit }) {
  43. const { createMessage } = useMessage();
  44. const modalTitle = ref('编辑');
  45. const userStore = useUserStore();
  46. const userinfo = computed(() => userStore.getUserInfo);
  47. const { companyId } = userinfo.value;
  48. console.log('userinfovalue', userinfo.value);
  49. const { getCheckRole } = userStore;
  50. const isPropsData = reactive({
  51. isUpdate: true,
  52. isSetData: true,
  53. record: {},
  54. });
  55. const userIdList = reactive({
  56. list: [],
  57. });
  58. const schemas: FormSchema[] = [
  59. {
  60. field: 'name',
  61. label: '房间名称',
  62. component: 'Input',
  63. colProps: {
  64. span: 22,
  65. },
  66. required: true,
  67. componentProps: {
  68. maxLength: 15,
  69. autoComplete: 'off',
  70. },
  71. rules: [
  72. {
  73. required: true,
  74. // @ts-ignore
  75. validator: async (rule, value) => {
  76. if (!value) {
  77. return Promise.reject('请输入房间名称');
  78. }
  79. let iconRule2 =
  80. /[\uD83C|\uD83D|\uD83E][\uDC00-\uDFFF][\u200D|\uFE0F]|[\uD83C|\uD83D|\uD83E][\uDC00-\uDFFF]|[0-9|*|#]\uFE0F\u20E3|[0-9|#]\u20E3|[\u203C-\u3299]\uFE0F\u200D|[\u203C-\u3299]\uFE0F|[\u2122-\u2B55]|\u303D|[\A9|\AE]\u3030|\uA9|\uAE|\u3030/gi;
  81. if (iconRule2.test(value)) {
  82. return Promise.reject('不支持特殊符号');
  83. } else {
  84. return Promise.resolve();
  85. }
  86. },
  87. trigger: 'change',
  88. },
  89. ],
  90. },
  91. {
  92. field: 'brandId',
  93. label: '房间场景',
  94. component: 'ApiSelect',
  95. itemProps: {
  96. validateTrigger: 'blur',
  97. },
  98. colProps: {
  99. span: 22,
  100. },
  101. required: true,
  102. componentProps: {
  103. api: ListApi,
  104. showSearch: true,
  105. resultField: 'list',
  106. labelField: 'name',
  107. optionFilterProp: 'label',
  108. valueField: 'id',
  109. immediate: true,
  110. params: {
  111. page: 1,
  112. limit: 1000,
  113. },
  114. onChange: brandIdChange,
  115. },
  116. },
  117. {
  118. field: 'anchorUserId',
  119. label: '主持人',
  120. component: 'ApiSelect',
  121. itemProps: {
  122. validateTrigger: 'blur',
  123. },
  124. colProps: {
  125. span: 22,
  126. },
  127. required: true,
  128. componentProps: {
  129. api: bindUserList,
  130. showSearch: true,
  131. disabled: true,
  132. resultField: 'list',
  133. labelField: 'userAndNick',
  134. optionFilterProp: 'label',
  135. valueField: 'id',
  136. immediate: false,
  137. params: {
  138. page: 1,
  139. limit: 1000,
  140. },
  141. },
  142. },
  143. {
  144. field: 'launchPeriod', //'effectiveStartTime',
  145. component: 'RangePicker',
  146. label: '开播时间段',
  147. colProps: {
  148. span: 22,
  149. },
  150. required: true,
  151. rules: [
  152. {
  153. required: true,
  154. // @ts-ignore
  155. validator: async (rule, value) => {
  156. if (isPropsData.isSetData) {
  157. return Promise.resolve();
  158. }
  159. if (!value) {
  160. return Promise.reject('请选择时间段');
  161. }
  162. // console.log('check', rule, value, record);
  163. console.log('value[1]', value[1].unix(), value);
  164. if (value[0].unix() > value[1].unix()) {
  165. return Promise.reject('开始时间要小于结束时间');
  166. }
  167. if (value[0].unix() > value[1].unix() - 300) {
  168. return Promise.reject('时间段最小5分钟');
  169. }
  170. return Promise.resolve();
  171. },
  172. trigger: 'change',
  173. },
  174. ],
  175. componentProps: {
  176. onChange: async (data) => {
  177. console.log('data', data);
  178. setFieldsValue({
  179. incrementEndTime: '',
  180. });
  181. },
  182. format: 'YYYY-MM-DD HH:mm',
  183. showTime: true,
  184. disabledDate(current) {
  185. return current && current < now;
  186. },
  187. disabledTime(_) {
  188. // if (type === 'start') {
  189. // return {
  190. // // ...Array(dateUtil().minute()).keys()
  191. // disabledHours: () => [...Array(dateUtil().hour()).keys()],
  192. // disabledMinutes: () => [],
  193. // disabledSeconds: () => [],
  194. // };
  195. // }
  196. return {
  197. disabledHours: () => [...Array(dateUtil().hour()).keys()],
  198. disabledMinutes: () => [],
  199. disabledSeconds: () => [],
  200. };
  201. },
  202. // disabledDate: validateStartTime,
  203. },
  204. },
  205. // {
  206. // field: 'effectiveEndTime',
  207. // component: 'DatePicker',
  208. // label: '计划结束时间',
  209. // colProps: {
  210. // span: 22,
  211. // },
  212. // required: true,
  213. // componentProps: {
  214. // // valueFormat: 'YYYY-MM-DD HH:mm',
  215. // format: 'YYYY-MM-DD HH:mm',
  216. // showTime: true,
  217. // disabledDate: validateDate,
  218. // disabledTime: validateTime,
  219. // },
  220. // },
  221. {
  222. field: 'assistantUserId',
  223. component: 'ApiSelect',
  224. label: '助理',
  225. itemProps: {
  226. validateTrigger: 'blur',
  227. },
  228. colProps: {
  229. span: 22,
  230. },
  231. required: false,
  232. componentProps: {
  233. api: staffListApi,
  234. showSearch: true,
  235. optionFilterProp: 'label',
  236. resultField: 'list',
  237. labelField: 'nickName',
  238. valueField: 'id',
  239. immediate: true,
  240. params: {
  241. page: 1,
  242. limit: 1000,
  243. companyId: companyId,
  244. },
  245. onChange: async (data) => {
  246. console.log('data', data, arguments);
  247. },
  248. },
  249. },
  250. {
  251. field: 'id',
  252. component: 'Input',
  253. label: '测试',
  254. ifShow: false,
  255. // slot: 'text',
  256. },
  257. ];
  258. const [
  259. registerForm,
  260. {
  261. getFieldsValue,
  262. // validateFields,
  263. setFieldsValue,
  264. // setProps
  265. updateSchema,
  266. resetFields,
  267. validate,
  268. },
  269. ] = useForm({
  270. labelWidth: 120,
  271. schemas,
  272. showActionButtonGroup: false,
  273. actionColOptions: {
  274. span: 24,
  275. },
  276. });
  277. let addListFunc = () => {};
  278. const [register, { closeModal }] = useModalInner(async (data) => {
  279. data && onDataReceive(data);
  280. });
  281. function onDataReceive(data) {
  282. isPropsData.isUpdate = data.isUpdate || false;
  283. isPropsData.isSetData = data.isSetData || false;
  284. modalTitle.value = data.isSetData ? '查看' : data.isUpdate ? '编辑' : '新增';
  285. // const = ref('编辑');
  286. isPropsData.record = data.record || {};
  287. console.log('setFieldsValue', data.record);
  288. if (data.isUpdate) {
  289. //编辑
  290. setFieldsValue({
  291. ...data.record,
  292. });
  293. updateSchema(
  294. schemas.map((ele, index) => {
  295. return {
  296. ...ele,
  297. componentProps: {
  298. ...ele.componentProps,
  299. disabled: index < 3 && index != 0 ? true : false,
  300. },
  301. slot: '',
  302. };
  303. }),
  304. );
  305. if (data.record && data.record.brandId) {
  306. brandIdChange(data.record.brandId);
  307. }
  308. if (data.record && data.record.anchorUserId) {
  309. UserIdChange(data.record.anchorUserId);
  310. }
  311. } else if (data.isSetData) {
  312. //查看
  313. let setSchemas = [];
  314. schemas.map((ele) => {
  315. let setSchemasItem = {
  316. ...ele,
  317. required: false,
  318. rules: [],
  319. componentProps: {
  320. ...ele.componentProps,
  321. disabled: true,
  322. },
  323. // slot: 'text',
  324. };
  325. setSchemas.push(cloneDeep(setSchemasItem));
  326. });
  327. updateSchema(setSchemas);
  328. setFieldsValue(data.record);
  329. } else {
  330. //新增
  331. resetFields();
  332. updateSchema(
  333. schemas.map((ele) => {
  334. return {
  335. ...ele,
  336. componentProps: {
  337. ...ele.componentProps,
  338. disabled: false,
  339. },
  340. // slot: '',
  341. };
  342. }),
  343. );
  344. }
  345. }
  346. const handleSubmit = async () => {
  347. const values = await validate();
  348. const { launchPeriod } = values;
  349. console.log('validate', values, launchPeriod);
  350. if (isPropsData.isSetData) {
  351. closeModal();
  352. return;
  353. }
  354. if (
  355. values.launchPeriod[0].valueOf() < dateUtil().valueOf() ||
  356. values.launchPeriod[1].valueOf() < dateUtil().valueOf()
  357. ) {
  358. createMessage.warn('开始或结束时间不能少于当前时间');
  359. return;
  360. }
  361. let apiData = {
  362. ...values,
  363. effectiveEndTime:
  364. new Date(launchPeriod[0]).getTime() > new Date(launchPeriod[1]).getTime()
  365. ? new Date(launchPeriod[0]).getTime()
  366. : new Date(launchPeriod[1]).getTime(),
  367. effectiveStartTime:
  368. new Date(launchPeriod[0]).getTime() > new Date(launchPeriod[1]).getTime()
  369. ? new Date(launchPeriod[1]).getTime()
  370. : new Date(launchPeriod[0]).getTime(),
  371. };
  372. if (!isPropsData.isSetData) {
  373. apiData.id = isPropsData.record.id;
  374. await createOrUpdate(apiData);
  375. createMessage.success(t('common.optSuccess'));
  376. }
  377. resetFields();
  378. closeModal();
  379. emit('success');
  380. };
  381. function handleVisibleChange(v) {
  382. v && props.userData && nextTick(() => onDataReceive(props.userData));
  383. }
  384. function handleClose() {
  385. resetFields();
  386. }
  387. function brandIdChange(brandId) {
  388. let disabled = isPropsData.isUpdate ? isPropsData.isUpdate : brandId ? false : true;
  389. if (!brandId) {
  390. return;
  391. }
  392. console.log('userinfo.value.id,', userinfo.value.id, getCheckRole(['staff']));
  393. if (getCheckRole(['staff'])) {
  394. disabled = true;
  395. setFieldsValue({
  396. anchorUserId: userinfo.value.id,
  397. });
  398. UserIdChange(userinfo.value.id);
  399. } else if (!disabled) {
  400. setFieldsValue({
  401. anchorUserId: '',
  402. });
  403. }
  404. updateSchema({
  405. field: 'anchorUserId',
  406. componentProps: {
  407. immediate: true,
  408. disabled,
  409. params: {
  410. page: 1,
  411. limit: 1000,
  412. id: brandId,
  413. },
  414. onChange: UserIdChange,
  415. },
  416. });
  417. }
  418. function UserIdChange(data) {
  419. console.log('UserIdChange,', data, userinfo.value.id, isPropsData.isUpdate);
  420. if (!isPropsData.isUpdate) {
  421. setFieldsValue({
  422. assistantUserId: '',
  423. });
  424. }
  425. updateSchema({
  426. field: 'assistantUserId',
  427. componentProps: {
  428. api: async function (params) {
  429. const res = await staffListApi({ ...params, id: data });
  430. return res.list.filter((ele) => {
  431. return ele.id !== data;
  432. });
  433. },
  434. showSearch: true,
  435. resultField: 'list',
  436. optionFilterProp: 'label',
  437. labelField: 'nickName',
  438. valueField: 'id',
  439. immediate: true,
  440. params: {
  441. page: 1,
  442. limit: 1000,
  443. },
  444. onChange: async (data) => {
  445. console.log('data', data, arguments);
  446. },
  447. },
  448. });
  449. }
  450. return {
  451. t,
  452. modalTitle,
  453. register,
  454. userIdList,
  455. schemas,
  456. isPropsData,
  457. registerForm,
  458. brandIdChange,
  459. UserIdChange,
  460. handleVisibleChange,
  461. handleSubmit,
  462. addListFunc,
  463. closeModal,
  464. handleClose,
  465. getFieldsValue,
  466. setFieldsValue,
  467. // nextTick,
  468. };
  469. },
  470. });
  471. </script>
  472. <style lang="less">
  473. // .ant-form-item-control-input {
  474. // div {
  475. // div {
  476. // width: 100%;
  477. // }
  478. // }
  479. // }
  480. </style>