detailModal.vue 17 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548
  1. <template>
  2. <BasicModal
  3. v-bind="$attrs"
  4. @register="register"
  5. :title="title"
  6. @visible-change="handleVisibleChange"
  7. @cancel="resetFields"
  8. @ok="handleSubmit"
  9. :min-height="400"
  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, ref, nextTick, onMounted, 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 { companyAdd, companyUpdate } from '/@/api/customer';
  26. import { useI18n } from '/@/hooks/web/useI18n';
  27. import { uploadApi } from '/@/api/product/index';
  28. import { getByRyId, addAuth, checkAuthOtherApi } from '/@/api/operate';
  29. import { useModalInner } from '/@/components/Modal';
  30. import dayjs from 'dayjs';
  31. const { t } = useI18n();
  32. export default defineComponent({
  33. components: { BasicModal, BasicForm },
  34. props: {
  35. userData: { type: Object },
  36. },
  37. emits: ['update', 'register'],
  38. setup(props, { emit }) {
  39. const modelRef = ref(false);
  40. const isEdit = ref(true);
  41. const editTime = ref('');
  42. const fileFlow = reactive({
  43. file: null,
  44. });
  45. const { createMessage } = useMessage();
  46. const title = ref('新增客户');
  47. const optionsName = ref([]);
  48. const range = (start, end) => {
  49. const result = [];
  50. for (let i = start; i < end; i++) {
  51. result.push(i);
  52. }
  53. return result;
  54. };
  55. const disabledLookTime = (date) => {
  56. let startTime = editTime.value || '';
  57. const hour = dayjs(startTime).hour(); // 获取当前的小时
  58. const min = dayjs(startTime).minute(); // 获取当前的分钟
  59. const second = dayjs(startTime).second(); // 获取当前秒
  60. if (dayjs(date).format('YYYY-MM-DD') === dayjs(startTime).format('YYYY-MM-DD')) {
  61. if (dayjs(date).format('HH') === dayjs(startTime).format('HH')) {
  62. if (dayjs(date).format('mm') === dayjs(startTime).format('mm')) {
  63. return {
  64. disabledHours: () => range(0, 24).splice(0, hour),
  65. disabledMinutes: () => range(0, 60).splice(0, min),
  66. disabledSeconds: () => range(0, 60).splice(0, second),
  67. };
  68. } else {
  69. return {
  70. disabledHours: () => range(0, 24).splice(0, hour),
  71. disabledMinutes: () => range(0, 60).splice(0, min),
  72. };
  73. }
  74. } else {
  75. return {
  76. disabledHours: () => range(0, 24).splice(0, hour),
  77. };
  78. }
  79. }
  80. };
  81. const disabledTime = (date) => {
  82. const hour = dayjs().hour(); // 获取当前的小时
  83. const min = dayjs().minute(); // 获取当前的分钟
  84. const second = dayjs().second(); // 获取当前秒
  85. if (dayjs(date).format('YYYY-MM-DD') === dayjs().format('YYYY-MM-DD')) {
  86. if (dayjs(date).format('HH') === dayjs().format('HH')) {
  87. if (dayjs(date).format('mm') === dayjs().format('mm')) {
  88. return {
  89. disabledHours: () => range(0, 24).splice(0, hour),
  90. disabledMinutes: () => range(0, 60).splice(0, min),
  91. disabledSeconds: () => range(0, 60).splice(0, second),
  92. };
  93. } else {
  94. return {
  95. disabledHours: () => range(0, 24).splice(0, hour),
  96. disabledMinutes: () => range(0, 60).splice(0, min),
  97. };
  98. }
  99. } else {
  100. return {
  101. disabledHours: () => range(0, 24).splice(0, hour),
  102. };
  103. }
  104. }
  105. };
  106. const schemas: FormSchema[] = [
  107. {
  108. field: 'num',
  109. component: 'Input',
  110. show: false,
  111. label: 'id',
  112. required: false,
  113. },
  114. {
  115. field: 'ryId',
  116. component: 'AutoComplete',
  117. label: '人员ID',
  118. required: true,
  119. componentProps: {
  120. filterOption: onFilterOption,
  121. onSearch: onSearch,
  122. onChange: (data) => {
  123. const item = optionsName.value && optionsName.value.find((ele) => ele.ryId == data);
  124. setFieldsValue({ ryNickName: item && item.ryNickName ? item.ryNickName : '' });
  125. },
  126. },
  127. colProps: {
  128. span: 20,
  129. },
  130. },
  131. {
  132. field: 'ryNickName',
  133. component: 'Input',
  134. label: '姓名',
  135. required: true,
  136. colProps: {
  137. span: 20,
  138. },
  139. componentProps: {
  140. disabled: true,
  141. },
  142. },
  143. {
  144. field: 'editAuth',
  145. component: 'RadioGroup',
  146. label: '编辑权限',
  147. defaultValue: 0,
  148. colProps: {
  149. span: 24,
  150. },
  151. componentProps: {
  152. options: getOptionList('editAuth', 1),
  153. onChange: async (value) => {
  154. let params = await getFieldsValue();
  155. console.log('params', params, value);
  156. isEdit.value = value.target.value == 0 ? true : false;
  157. if (value.target.value == 1) {
  158. params.lookAuth = 1;
  159. }
  160. params.isEmpower = isEdit.value ? [0] : params.isEmpower;
  161. setFieldsValue({ ...params, editAuth: value.target.value });
  162. updateSchema([
  163. {
  164. field: 'editEndTime',
  165. ifShow: value.target.value == 2,
  166. },
  167. {
  168. field: 'lookAuth',
  169. componentProps: {
  170. disabled: value.target.value == 1,
  171. },
  172. },
  173. {
  174. field: 'lookEndTime',
  175. ifShow: value.target.value != 1 && params.lookAuth == 2,
  176. },
  177. {
  178. field: 'isEmpower',
  179. componentProps: {
  180. options: setOption(),
  181. },
  182. },
  183. ]);
  184. },
  185. },
  186. },
  187. {
  188. field: 'editEndTime',
  189. component: 'DatePicker',
  190. label: '编辑到期日期',
  191. ifShow: false,
  192. required: true,
  193. rules: [
  194. {
  195. required: true,
  196. // @ts-ignore
  197. validator: async (rule, value) => {
  198. console.log('value',value, dayjs().isBefore(dayjs(value)))
  199. if (!value) {
  200. return Promise.reject('请选中日期');
  201. }
  202. if (!dayjs().isBefore(dayjs(value))) {
  203. /* eslint-disable-next-line */
  204. return Promise.reject('到期时间已过期');
  205. }
  206. return Promise.resolve();
  207. },
  208. trigger: 'change',
  209. },
  210. ],
  211. componentProps: {
  212. disabled: false,
  213. showTime: {
  214. valueFormat: 'HH:mm',
  215. format: 'HH:mm',
  216. },
  217. showToday: false,
  218. valueFormat: 'YYYY-MM-DD HH:mm',
  219. type: 'datetime',
  220. format: 'YYYY-MM-DD HH:mm',
  221. disabledDate: (current) => {
  222. return current && current < dayjs().startOf('day');
  223. },
  224. disabledTime: disabledTime,
  225. onChange: (value) => {
  226. editTime.value = value;
  227. setFieldsValue({ lookEndTime: '' });
  228. updateSchema({
  229. field: 'lookEndTime',
  230. componentProps: {
  231. disabledTime: disabledLookTime,
  232. disabledDate: (current) => {
  233. return current && (current < dayjs().startOf('day') || current < dayjs(value));
  234. },
  235. },
  236. });
  237. },
  238. },
  239. },
  240. {
  241. field: 'lookAuth',
  242. component: 'RadioGroup',
  243. label: '查看权限',
  244. defaultValue: 1,
  245. colProps: {
  246. span: 24,
  247. },
  248. componentProps: {
  249. options: getOptionList('lookAuth', 1),
  250. onChange: (value) => {
  251. updateSchema({
  252. field: 'lookEndTime',
  253. ifShow: value.target.value == 2,
  254. });
  255. },
  256. },
  257. },
  258. {
  259. field: 'lookEndTime',
  260. component: 'DatePicker',
  261. label: '查看到期日期',
  262. ifShow: false,
  263. required: true,
  264. // defaultValue: dayjs().add(1, 'month').format('YYYY-MM-DD HH:mm'),
  265. componentProps: {
  266. disabled: false,
  267. type: 'datetime',
  268. showTime: {
  269. valueFormat: 'HH:mm',
  270. format: 'HH:mm',
  271. },
  272. showToday: false,
  273. valueFormat: 'YYYY-MM-DD HH:mm',
  274. format: 'YYYY-MM-DD HH:mm',
  275. disabledTime: disabledLookTime,
  276. disabledDate: (current) => {
  277. console.log('current', current);
  278. return current && current < dayjs();
  279. },
  280. },
  281. rules: [
  282. {
  283. required: true,
  284. // @ts-ignore
  285. validator: async (rule, value) => {
  286. if (!value) {
  287. return Promise.reject('请选中日期');
  288. }
  289. if (!dayjs().isBefore(dayjs(value))) {
  290. /* eslint-disable-next-line */
  291. return Promise.reject('到期时间已过期');
  292. }
  293. return Promise.resolve();
  294. },
  295. trigger: 'change',
  296. },
  297. ],
  298. },
  299. {
  300. field: 'isAuthor',
  301. component: 'RadioGroup',
  302. label: '是否可授权他人',
  303. defaultValue: 0,
  304. colProps: {
  305. span: 24,
  306. },
  307. componentProps: {
  308. options: getOptionList('isAuthor', 1),
  309. onChange: (value) => {
  310. updateSchema({
  311. field: 'isEmpower',
  312. ifShow: value.target.value == 1,
  313. });
  314. },
  315. },
  316. },
  317. {
  318. field: 'isEmpower',
  319. component: 'CheckboxGroup',
  320. label: '授权他人权限',
  321. ifShow: false,
  322. colProps: {
  323. span: 24,
  324. },
  325. componentProps: {
  326. options: setOption(),
  327. },
  328. },
  329. ];
  330. const [
  331. registerForm,
  332. { validate, getFieldsValue, resetFields, setFieldsValue, updateSchema },
  333. ] = useForm({
  334. labelWidth: 110,
  335. schemas,
  336. showActionButtonGroup: false,
  337. actionColOptions: {
  338. span: 24,
  339. },
  340. });
  341. onMounted(() => {});
  342. let addListFunc = () => {};
  343. const [register, { closeModal }] = useModalInner(async (data) => {
  344. onSearch('');
  345. let checkAuthOther = await checkAuthOtherApi({ num: data.num });
  346. let setData = {
  347. ...checkAuthOther,
  348. ...data,
  349. isEmpower: [0], //[data.canAuthLook ? 0 : '', data.canEditLook ? 1 : ''],
  350. };
  351. let lookEndTime = checkAuthOther.lookEndTime?checkAuthOther.lookEndTime:dayjs().format('YYYY-MM-DD HH:mm:ss')
  352. let mylookEndTime = checkAuthOther.editEndTime>lookEndTime?checkAuthOther.editEndTime:lookEndTime
  353. editTime.value = checkAuthOther.editEndTime;
  354. console.log('setData', setData);
  355. isEdit.value = true;
  356. if (data) {
  357. title.value = data.id ? '编辑授权' : '新增授权';
  358. modelRef.value = data.id ? true : false;
  359. setFieldsValue({
  360. ...setData,
  361. editAuth: 0,
  362. isAuthor: 0,
  363. });
  364. } else {
  365. title.value = '新增客户';
  366. }
  367. updateSchema([
  368. {
  369. field: 'isEmpower',
  370. ifShow: false,
  371. componentProps: {
  372. options: setOption(),
  373. },
  374. },
  375. {
  376. field: 'isAuthor',
  377. componentProps: {
  378. disabled: setData.isAuthor == 0,
  379. },
  380. },
  381. {
  382. field: 'editAuth',
  383. componentProps: { options: getOptionList('editAuth', setData.editAuth) },
  384. },
  385. {
  386. field: 'lookAuth',
  387. componentProps: {
  388. disabled: false,
  389. options: getOptionList('lookAuth', setData.lookAuth),
  390. },
  391. },
  392. {
  393. field: 'editEndTime',
  394. ifShow: data.editAuth == 2,
  395. componentProps: {
  396. disabled: checkAuthOther.editEndTime,
  397. disabledDate: (current) => {
  398. if (checkAuthOther.editEndTime) {
  399. return (
  400. current &&
  401. (current < dayjs().startOf('day') ||
  402. current > dayjs(checkAuthOther.editEndTime))
  403. );
  404. } else {
  405. return current && current < dayjs().startOf('day');
  406. }
  407. },
  408. },
  409. },
  410. {
  411. field: 'lookEndTime',
  412. ifShow: setData.lookAuth == 2,
  413. componentProps: {
  414. disabled: checkAuthOther.lookEndTime,
  415. disabledDate: (current) => {
  416. if (mylookEndTime) {
  417. return (
  418. current &&
  419. (current < dayjs(mylookEndTime))
  420. );
  421. } else {
  422. return current && current < dayjs().startOf('day');
  423. }
  424. },
  425. },
  426. },
  427. ]);
  428. });
  429. function onFilterOption(inputText: string, option) {
  430. console.log('option', inputText, option.value);
  431. if (option.value) {
  432. return option.value.indexOf(inputText) >= 0;
  433. }
  434. // return option.value.indexOf(inputText.toUpperCase()) >= 0;
  435. }
  436. async function onSearch(searchText) {
  437. const list = await getByRyId({ ryId: searchText });
  438. optionsName.value =
  439. list.map((ele) => {
  440. return { ...ele, value: ele.ryId };
  441. }) || [];
  442. // console.log('paramList', optionsList);
  443. // optionsName.value = optionsList || [];
  444. updateSchema({
  445. field: 'ryId',
  446. componentProps: {
  447. options: optionsName.value,
  448. },
  449. });
  450. }
  451. const handleSubmit = async () => {
  452. try {
  453. const params = await validate();
  454. console.log('params', params);
  455. let canEditLook = params.isEmpower && params.isEmpower.some((item) => item == 1) ? 1 : 0;
  456. await addAuth({
  457. ...params,
  458. lookEndTime:
  459. params.lookAuth == 2 ? dayjs(params.lookEndTime).format('YYYY-MM-DD HH:mm:ss') : '',
  460. editEndTime:
  461. params.editAuth == 2 ? dayjs(params.editEndTime).format('YYYY-MM-DD HH:mm:ss') : '',
  462. canEditLook,
  463. canAuthLook:
  464. canEditLook || (params.isEmpower && params.isEmpower.some((item) => item == 0))
  465. ? 1
  466. : 0,
  467. });
  468. closeModal();
  469. resetFields();
  470. emit('update');
  471. createMessage.success('操作成功');
  472. } catch (error) {
  473. console.log('not passing', error);
  474. }
  475. };
  476. function setOption() {
  477. return [
  478. { label: '查看权限', value: 0, disabled: true },
  479. { label: '编辑权限', value: 1, disabled: isEdit.value },
  480. ];
  481. }
  482. function handleVisibleChange(_) {
  483. // console.log(v);
  484. // v && props.userData && nextTick(() => onDataReceive(props.userData));
  485. }
  486. function getOptionList(type: string, auth: any) {
  487. let optionList = {
  488. editAuth: [
  489. { label: '无权编辑', value: 0 },
  490. { label: '不限时编辑', value: 1 },
  491. { label: '限时编辑', value: 2 },
  492. ],
  493. lookAuth: [
  494. { label: '不限时查看', value: 1 },
  495. { label: '限时查看', value: 2 },
  496. ],
  497. isAuthor: [
  498. { label: '不可授权', value: 0 },
  499. { label: '可授权他人', value: 1 },
  500. ],
  501. };
  502. let option = optionList[type];
  503. if ((!auth && auth != 0) || auth == 1) {
  504. return option;
  505. } else if (auth == 2) {
  506. return option.map((ele) => {
  507. return {
  508. ...ele,
  509. disabled: ele.value == 1,
  510. };
  511. });
  512. } else {
  513. return option.map((ele) => {
  514. if (type == 'lookAuth' && ele.value == 2) {
  515. return {
  516. ...ele,
  517. disabled: false,
  518. };
  519. } else {
  520. return {
  521. ...ele,
  522. disabled: ele.value != 0,
  523. };
  524. }
  525. });
  526. }
  527. }
  528. return {
  529. register,
  530. schemas,
  531. registerForm,
  532. modelRef,
  533. fileFlow,
  534. handleVisibleChange,
  535. handleSubmit,
  536. getOptionList,
  537. addListFunc,
  538. resetFields,
  539. title,
  540. t,
  541. disabledTime,
  542. };
  543. },
  544. });
  545. </script>