detailModal.vue 20 KB

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