roomDeital.vue 13 KB

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