roomDeital.vue 11 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392
  1. <template>
  2. <BasicModal
  3. v-bind="$attrs"
  4. @register="register"
  5. :minHeight="340"
  6. :title="modalTitle"
  7. @visible-change="handleVisibleChange"
  8. @ok="handleSubmit"
  9. @cancel="handleClose"
  10. >
  11. <div class="pt-2px pr-3px">
  12. <BasicForm @register="registerForm">
  13. <template #text="{ model, field }">
  14. {{ model[field] || '' }}
  15. </template>
  16. </BasicForm>
  17. </div>
  18. </BasicModal>
  19. </template>
  20. <script lang="ts">
  21. import { defineComponent, nextTick, ref, computed, reactive } from 'vue';
  22. import { BasicModal, useModalInner } from '/@/components/Modal';
  23. import { BasicForm, FormSchema, useForm } from '/@/components/Form/index';
  24. import { useMessage } from '/@/hooks/web/useMessage';
  25. // import { checkUserAddAble } from '/@/api/corporation/modal';
  26. import { useI18n } from '/@/hooks/web/useI18n';
  27. import { useUserStore } from '/@/store/modules/user';
  28. import { staffListApi } from '/@/api/staff/list';
  29. import { ListApi } from '/@/api/scene/live';
  30. import { bindUserList, createOrUpdate } from '/@/api/scene/list';
  31. // import dayjs from 'dayjs';
  32. import { cloneDeep } from 'lodash-es';
  33. const { t } = useI18n();
  34. export default defineComponent({
  35. components: { BasicModal, BasicForm },
  36. props: {
  37. userData: { type: Object },
  38. },
  39. emits: ['register', 'submit', 'tablelist'],
  40. setup(props, { emit }) {
  41. const { createMessage } = useMessage();
  42. const modalTitle = ref('编辑');
  43. const userStore = useUserStore();
  44. const userinfo = computed(() => userStore.getUserInfo);
  45. console.log('userinfovalue', userinfo.value);
  46. const { getCheckRole } = userStore;
  47. const isPropsData = reactive({
  48. isUpdate: true,
  49. isSetData: true,
  50. record: {},
  51. });
  52. const userIdList = reactive({
  53. list: [],
  54. });
  55. const schemas: FormSchema[] = [
  56. {
  57. field: 'name',
  58. label: '房间名称',
  59. component: 'Input',
  60. colProps: {
  61. span: 22,
  62. },
  63. required: true,
  64. componentProps: {
  65. maxLength: 100,
  66. autoComplete: 'off',
  67. },
  68. },
  69. {
  70. field: 'brandId',
  71. label: '房间场景',
  72. component: 'ApiSelect',
  73. itemProps: {
  74. validateTrigger: 'blur',
  75. },
  76. colProps: {
  77. span: 22,
  78. },
  79. required: true,
  80. componentProps: {
  81. api: ListApi,
  82. showSearch: true,
  83. resultField: 'list',
  84. labelField: 'name',
  85. valueField: 'id',
  86. immediate: true,
  87. params: {
  88. page: 1,
  89. limit: 1000,
  90. },
  91. onChange: brandIdChange,
  92. },
  93. },
  94. {
  95. field: 'anchorUserId',
  96. label: '主持人',
  97. component: 'ApiSelect',
  98. itemProps: {
  99. validateTrigger: 'blur',
  100. },
  101. colProps: {
  102. span: 22,
  103. },
  104. required: true,
  105. componentProps: {
  106. api: bindUserList,
  107. showSearch: true,
  108. disabled: true,
  109. resultField: 'list',
  110. labelField: 'userAndNick',
  111. valueField: 'id',
  112. immediate: true,
  113. params: {
  114. page: 1,
  115. limit: 1000,
  116. },
  117. },
  118. },
  119. {
  120. field: 'launchPeriod', //'effectiveStartTime',
  121. component: 'RangePicker',
  122. label: '开播时间段',
  123. colProps: {
  124. span: 22,
  125. },
  126. required: true,
  127. rules: [
  128. {
  129. required: true,
  130. // @ts-ignore
  131. validator: async (rule, value) => {
  132. console.log('validator', value);
  133. if (new Date(value[0]).getMinutes() == new Date(value[1]).getMinutes()) {
  134. return Promise.reject('结束时间应大于开始时间');
  135. } else {
  136. return Promise.resolve();
  137. }
  138. },
  139. trigger: 'change',
  140. },
  141. ],
  142. componentProps: {
  143. onChange: async (data) => {
  144. console.log('data', data);
  145. setFieldsValue({
  146. incrementEndTime: '',
  147. });
  148. },
  149. // valueFormat: 'YYYY-MM-DD HH:mm',
  150. format: 'YYYY-MM-DD HH:mm',
  151. showTime: true,
  152. // disabledDate: validateStartTime,
  153. },
  154. },
  155. // {
  156. // field: 'effectiveEndTime',
  157. // component: 'DatePicker',
  158. // label: '计划结束时间',
  159. // colProps: {
  160. // span: 22,
  161. // },
  162. // required: true,
  163. // componentProps: {
  164. // // valueFormat: 'YYYY-MM-DD HH:mm',
  165. // format: 'YYYY-MM-DD HH:mm',
  166. // showTime: true,
  167. // disabledDate: validateDate,
  168. // disabledTime: validateTime,
  169. // },
  170. // },
  171. {
  172. field: 'assistantUserId',
  173. component: 'ApiSelect',
  174. label: '助理',
  175. itemProps: {
  176. validateTrigger: 'blur',
  177. },
  178. colProps: {
  179. span: 22,
  180. },
  181. required: false,
  182. componentProps: {
  183. api: staffListApi,
  184. showSearch: true,
  185. resultField: 'list',
  186. labelField: 'nickName',
  187. valueField: 'id',
  188. immediate: false,
  189. params: {
  190. page: 1,
  191. limit: 1000,
  192. },
  193. onChange: async (data) => {
  194. console.log('data', data, arguments);
  195. },
  196. },
  197. },
  198. {
  199. field: 'id',
  200. component: 'Input',
  201. label: '测试',
  202. ifShow: false,
  203. // slot: 'text',
  204. },
  205. ];
  206. const [
  207. registerForm,
  208. {
  209. getFieldsValue,
  210. // validateFields,
  211. setFieldsValue,
  212. // setProps
  213. updateSchema,
  214. resetFields,
  215. validate,
  216. },
  217. ] = useForm({
  218. labelWidth: 120,
  219. schemas,
  220. showActionButtonGroup: false,
  221. actionColOptions: {
  222. span: 24,
  223. },
  224. });
  225. let addListFunc = () => {};
  226. const [register, { closeModal }] = useModalInner(async (data) => {
  227. data && onDataReceive(data);
  228. });
  229. function onDataReceive(data) {
  230. isPropsData.isUpdate = data.isUpdate || false;
  231. isPropsData.isSetData = data.isSetData || false;
  232. modalTitle.value = data.isSetData ? '查看' : data.isUpdate ? '编辑' : '新增';
  233. // const = ref('编辑');
  234. isPropsData.record = data.record || {};
  235. if (data.isUpdate) {
  236. //编辑
  237. setFieldsValue({
  238. ...data.record,
  239. });
  240. updateSchema(
  241. schemas.map((ele, index) => {
  242. return {
  243. ...ele,
  244. componentProps: {
  245. ...ele.componentProps,
  246. disabled: index < 3 ? true : false,
  247. },
  248. slot: '',
  249. };
  250. }),
  251. );
  252. if (data.record && data.record.brandId) {
  253. brandIdChange(data.record.brandId);
  254. }
  255. } else if (data.isSetData) {
  256. //查看
  257. let setSchemas = [];
  258. console.log('setFieldsValue', data.record);
  259. schemas.map((ele) => {
  260. let setSchemasItem = {
  261. ...ele,
  262. componentProps: {
  263. ...ele.componentProps,
  264. disabled: true,
  265. },
  266. // slot: 'text',
  267. };
  268. setSchemas.push(cloneDeep(setSchemasItem));
  269. });
  270. updateSchema(setSchemas);
  271. setFieldsValue(data.record);
  272. } else {
  273. //新增
  274. resetFields();
  275. updateSchema(
  276. schemas.map((ele) => {
  277. return {
  278. ...ele,
  279. componentProps: {
  280. ...ele.componentProps,
  281. disabled: false,
  282. },
  283. // slot: '',
  284. };
  285. }),
  286. );
  287. }
  288. }
  289. const handleSubmit = async () => {
  290. const values = await validate();
  291. const { launchPeriod } = values;
  292. console.log('validate', values, launchPeriod);
  293. let apiData = {
  294. ...values,
  295. effectiveEndTime: new Date(launchPeriod[0]).getTime(),
  296. effectiveStartTime: new Date(launchPeriod[1]).getTime(),
  297. };
  298. if (!isPropsData.isSetData) {
  299. apiData.id = isPropsData.record.id;
  300. await createOrUpdate(apiData);
  301. createMessage.success(t('common.optSuccess'));
  302. }
  303. resetFields();
  304. closeModal();
  305. emit('success');
  306. };
  307. function handleVisibleChange(v) {
  308. v && props.userData && nextTick(() => onDataReceive(props.userData));
  309. }
  310. function handleClose() {
  311. resetFields();
  312. }
  313. function brandIdChange(brandId) {
  314. let disabled = isPropsData.isUpdate ? isPropsData.isUpdate : brandId ? false : true;
  315. if (!brandId) {
  316. return;
  317. }
  318. if (!disabled) {
  319. setFieldsValue({
  320. anchorUserId: '',
  321. });
  322. }
  323. if (getCheckRole(['staff'])) {
  324. disabled = true;
  325. setFieldsValue({
  326. anchorUserId: userinfo.value.id,
  327. });
  328. }
  329. updateSchema({
  330. field: 'anchorUserId',
  331. componentProps: {
  332. immediate: true,
  333. params: {
  334. page: 1,
  335. limit: 1000,
  336. id: brandId,
  337. },
  338. onChange: UserIdChange,
  339. },
  340. });
  341. }
  342. function UserIdChange(data) {
  343. setFieldsValue({
  344. assistantUserId: '',
  345. });
  346. updateSchema({
  347. field: 'assistantUserId',
  348. componentProps: {
  349. api: async function (params) {
  350. const res = await staffListApi({ ...params, id: data });
  351. return res.list.filter((ele) => {
  352. return ele.id !== data;
  353. });
  354. },
  355. showSearch: true,
  356. resultField: 'list',
  357. labelField: 'nickName',
  358. valueField: 'id',
  359. immediate: true,
  360. params: {
  361. page: 1,
  362. limit: 1000,
  363. },
  364. onChange: async (data) => {
  365. console.log('data', data, arguments);
  366. },
  367. },
  368. });
  369. }
  370. return {
  371. t,
  372. modalTitle,
  373. register,
  374. userIdList,
  375. schemas,
  376. isPropsData,
  377. registerForm,
  378. brandIdChange,
  379. UserIdChange,
  380. handleVisibleChange,
  381. handleSubmit,
  382. addListFunc,
  383. closeModal,
  384. handleClose,
  385. getFieldsValue,
  386. setFieldsValue,
  387. // nextTick,
  388. };
  389. },
  390. });
  391. </script>