crud.tsx 21 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833
  1. import { AddReq, EditReq, DelReq, CreateCrudOptionsProps,dict, CreateCrudOptionsRet, UserPageQuery,compute } from '@fast-crud/fast-crud';
  2. import * as api from './api';
  3. import { auth } from '/@/utils/authFunction';
  4. import { ja } from 'element-plus/es/locale';
  5. import {getBaseURL} from '/@/utils/baseUrl';
  6. import Cookies from 'js-cookie';
  7. import {request} from '/@/utils/service';
  8. import {Ref, shallowRef} from 'vue';
  9. import deviceSelector from '/@/components/deviceSelector/index.vue';
  10. export const createCrudOptions = function ({ crudExpose, dialogId,
  11. dialogVisible }: CreateCrudOptionsProps & { dialogId: Ref<number | null>; dialogVisible: Ref<boolean> }): CreateCrudOptionsRet {
  12. const pageRequest = async (query: UserPageQuery) => {
  13. return await api.GetList(query);
  14. };
  15. const editRequest = async ({ form, row }: EditReq) => {
  16. form.id = row.id;
  17. return await api.UpdateObj(form);
  18. };
  19. const delRequest = async ({ row }: DelReq) => {
  20. return await api.DelObj(row.id);
  21. };
  22. const addRequest = async ({ form }: AddReq) => {
  23. return await api.AddObj(form);
  24. };
  25. return {
  26. crudOptions: {
  27. request: {
  28. pageRequest,
  29. addRequest,
  30. editRequest,
  31. delRequest,
  32. },
  33. form:{
  34. wrapper: {
  35. buttons: {
  36. ok:{
  37. text:'提交',
  38. show:compute((row) => {
  39. return row.mode !=='view'
  40. })
  41. }
  42. }
  43. }
  44. },
  45. actionbar: {
  46. buttons: {
  47. add: {
  48. show: true,//auth('area:Create'),
  49. },
  50. },
  51. },
  52. toolbar:{
  53. show:false,
  54. },
  55. rowHandle:{
  56. fixed: 'right',
  57. width: 220,
  58. buttons:{
  59. remove:{
  60. show:true,
  61. },
  62. edit:{
  63. show:compute(({ row }) => {
  64. return row.status !== 3;
  65. }),
  66. },
  67. updateStatus: {
  68. text: '修改状态',
  69. show: false,
  70. order: 99,
  71. type: 'primary',
  72. click({ row }) {
  73. dialogId.value = row.id
  74. dialogVisible.value = true
  75. }
  76. }
  77. }
  78. },
  79. pagination: {
  80. show: true,
  81. },
  82. columns: {
  83. _index: {
  84. title: '序号',
  85. form: { show: false },
  86. column: {
  87. type: 'index',
  88. align: 'center',
  89. width: '70px',
  90. columnSetDisabled: true, //禁止在列设置中选择
  91. },
  92. },
  93. search:{
  94. title: '关键字搜索',
  95. search: { show: true,type: 'input', },
  96. type: 'input',
  97. form: {
  98. component: { placeholder: '请输入' },
  99. show:false},
  100. column: {show:false}
  101. },
  102. damage_no: {
  103. title: '编号',
  104. search: {
  105. show: false,
  106. },
  107. treeNode: true,
  108. type: 'input',
  109. column: {
  110. show:false,
  111. minWidth: 120,
  112. },
  113. form: {
  114. show:false,
  115. // rules: [
  116. // // 表单校验规则
  117. // // { required: true, message: '名称必填项' },
  118. // ],
  119. component: {
  120. placeholder: '请输入编号',
  121. onChange: async (context: any) => {
  122. // 当选择设备时,自动回填设备编号和设备名称
  123. console.log("onChange context:", context);
  124. }
  125. },
  126. },
  127. viewForm:{
  128. component: { placeholder: '' },
  129. rules: [{ required: true, message: '' }],
  130. }
  131. },
  132. device_code:{
  133. title: '设备编号',
  134. type: 'input',
  135. column: {
  136. show:true,
  137. minWidth: 120,
  138. },
  139. form: {
  140. show:true,
  141. component: { placeholder: '请填写设备编号',
  142. onBlur: async (event: any) => {
  143. // 当输入框失去焦点时,根据编号搜索设备信息
  144. const deviceCode = event.target.value?.trim();
  145. console.log("onBlur deviceCode:", deviceCode);
  146. if (!deviceCode) return;
  147. try {
  148. // 调用API搜索设备信息
  149. const response = await request({
  150. url: `/api/system/device/?code=${encodeURIComponent(deviceCode)}`,
  151. method: 'get'
  152. });
  153. console.log("设备搜索响应:", response);
  154. if (response.code === 2000 && response.data && response.data.length > 0) {
  155. const deviceData = response.data[0]; // 取第一个匹配的设备
  156. console.log("找到设备:", deviceData);
  157. // 使用 crudExpose 来设置表单数据
  158. const formData = crudExpose.getFormData();
  159. formData.device = deviceData.id; // 设置设备ID
  160. formData.device_code = deviceData.code; // 设置设备编号
  161. formData.device_name = deviceData.name; // 设置设备名称
  162. crudExpose.setFormData(formData);
  163. } else {
  164. console.log("未找到匹配的设备");
  165. // 可以在这里显示提示信息
  166. }
  167. } catch (error) {
  168. console.error("搜索设备信息失败:", error);
  169. }
  170. }
  171. },
  172. rules: [{ required: true, message: '请填写设备编号' }],
  173. },
  174. editForm:{
  175. component: { disabled: true },
  176. },
  177. viewForm:{
  178. component: { placeholder: '' },
  179. rules: [{ required: true, message: '' }],
  180. }
  181. },
  182. device:{
  183. title: '设备名称',
  184. type: 'table-selector',
  185. column: {
  186. show:false,
  187. minWidth: 120,
  188. },
  189. form: {
  190. component: {
  191. name: shallowRef(deviceSelector),
  192. vModel: 'modelValue',
  193. displayLabel: compute(({ row }) => {
  194. if (row && row.device_name) {
  195. return row.device_name;
  196. }
  197. return null;
  198. }),
  199. tableConfig: {
  200. url: '/api/system/device/',
  201. label: 'name',
  202. value: 'id',
  203. columns: [
  204. {
  205. prop: 'name',
  206. label: '设备名称',
  207. width: 150,
  208. },
  209. {
  210. prop: 'code',
  211. label: '设备编号',
  212. width: 120,
  213. },
  214. ],
  215. },
  216. onChange: async (selectedDeviceId: any) => {
  217. // 当选择设备时,自动回填设备编号和设备名称
  218. console.log("onChange selectedDeviceId:", selectedDeviceId);
  219. if (!selectedDeviceId) return;
  220. try {
  221. // 通过API获取设备详情
  222. const response = await request({
  223. url: `/api/system/device/${selectedDeviceId}/`,
  224. method: 'get'
  225. });
  226. console.log("response::::",response)
  227. if (response.code==2000) {
  228. const deviceData = response.data;
  229. console.log("设备数据:", deviceData);
  230. // 使用 crudExpose 来设置表单数据
  231. const formData = crudExpose.getFormData();
  232. formData.device_code = deviceData.code;
  233. formData.device_name = deviceData.name;
  234. crudExpose.setFormData(formData);
  235. }
  236. } catch (error) {
  237. console.error("获取设备信息失败:", error);
  238. }
  239. }
  240. },
  241. rules: [{ required: true, message: '请填写设备名称' }],
  242. },
  243. editForm:{
  244. component: { disabled: true },
  245. },
  246. viewForm:{
  247. component: { placeholder: '' },
  248. rules: [{ required: true, message: '' }],
  249. }
  250. },
  251. device_name:{
  252. title: '设备名称',
  253. type: 'input',
  254. column: {
  255. show:true,
  256. minWidth: 120,
  257. },
  258. form: {
  259. show:false,
  260. component: { placeholder: '请填写设备名称' },
  261. rules: [{ required: true, message: '请填写设备名称' }],
  262. },
  263. viewForm:{
  264. component: { placeholder: '' },
  265. rules: [{ required: true, message: '' }],
  266. }
  267. },
  268. quantity:{
  269. title: '维修数量',
  270. type: 'number',
  271. column: {
  272. minWidth: 120,
  273. },
  274. form: {
  275. component: {
  276. placeholder: '请填写维修数量',
  277. min: 0,
  278. precision: 0
  279. },
  280. rules: [
  281. { required: true, message: '请填写维修数量' },
  282. {
  283. type: 'number',
  284. min: 0,
  285. message: '维修数量不能为负数',
  286. trigger: 'blur'
  287. },
  288. {
  289. validator: (rule: any, value: any, callback: any) => {
  290. if (value !== null && value !== undefined && value !== '') {
  291. if (!Number.isInteger(Number(value)) || Number(value) < 0) {
  292. callback(new Error('维修数量必须为正整数'));
  293. } else {
  294. callback();
  295. }
  296. } else {
  297. callback();
  298. }
  299. },
  300. trigger: 'blur'
  301. }
  302. ],
  303. },
  304. editForm:{
  305. component: { disabled: true },
  306. },
  307. valueResolve({ form, value }) {
  308. form.quantity = Number(value);
  309. },
  310. viewForm:{
  311. component: { placeholder: '' },
  312. rules: [{ required: true, message: '' }],
  313. }
  314. },
  315. damage_type:{
  316. title: '维修类型',
  317. type: 'dict-select',
  318. dict: dict({
  319. data: [
  320. // { label: '报废', value: 0 },
  321. { label: '维修', value: 1 },
  322. ],
  323. }),
  324. column: {
  325. show:false,
  326. minWidth: 120,
  327. },
  328. form: {
  329. value:1,
  330. show:false,
  331. component: { placeholder: '请填写排序'},
  332. rules: [{ required: false, message: '请填写排序' }],
  333. },
  334. editForm:{
  335. component: { disabled: true },
  336. },
  337. viewForm:{
  338. component: { placeholder: '' },
  339. rules: [{ required: false, message: '' }],
  340. }
  341. },
  342. estimated_loss:{
  343. title: '维修费用(元)',
  344. type: 'number',
  345. column: {
  346. minWidth: 120,
  347. show:compute(({ form }) => {
  348. // 只有当选择了胜任力标签时才显示配置
  349. return form && form.damage_type === 1;
  350. })
  351. },
  352. form: {
  353. show:false,
  354. component: {
  355. placeholder: '请填写维修费用',
  356. min: 0,
  357. precision: 2
  358. },
  359. rules: [
  360. { required: false, message: '请填写维修费用' },
  361. {
  362. type: 'number',
  363. min: 0,
  364. message: '维修费用不能为负数',
  365. trigger: 'blur'
  366. },
  367. {
  368. validator: (rule: any, value: any, callback: any) => {
  369. if (value !== null && value !== undefined && value !== '') {
  370. const numValue = Number(value);
  371. if (isNaN(numValue) || numValue < 0) {
  372. callback(new Error('维修费用必须为有效的正数'));
  373. } else if (numValue > 999999.99) {
  374. callback(new Error('维修费用不能超过999999.99元'));
  375. } else {
  376. callback();
  377. }
  378. } else {
  379. callback();
  380. }
  381. },
  382. trigger: 'blur'
  383. }
  384. ],
  385. show:compute(({ form }) => {
  386. // 只有当选择了胜任力标签时才显示配置
  387. return form && form.damage_type === 1;
  388. })
  389. },
  390. editForm:{
  391. show:compute(({ form }) => {
  392. // 只有当选择了胜任力标签时才显示配置
  393. return form && form.status == 3;
  394. }),
  395. component: {
  396. placeholder: '请填写维修费用',
  397. min: 0,
  398. precision: 2
  399. },
  400. rules: [
  401. { required: false/* compute(({ form }) => {
  402. return form && form.status === 3;
  403. }) */, message: '请填写维修费用' },
  404. {
  405. type: 'number',
  406. min: 0,
  407. message: '维修费用不能为负数',
  408. trigger: 'blur'
  409. },
  410. {
  411. validator: (rule: any, value: any, callback: any) => {
  412. if (value !== null && value !== undefined && value !== '') {
  413. const numValue = Number(value);
  414. if (isNaN(numValue) || numValue < 0) {
  415. callback(new Error('维修费用必须为有效的正数'));
  416. } else if (numValue > 999999.99) {
  417. callback(new Error('维修费用不能超过999999.99元'));
  418. } else {
  419. callback();
  420. }
  421. } else {
  422. callback();
  423. }
  424. },
  425. trigger: 'blur'
  426. }
  427. ],
  428. },
  429. addForm:{
  430. show:false,
  431. },
  432. viewForm:{
  433. component: { placeholder: '' },
  434. rules: [{ required: true, message: '' }],
  435. show:compute(({ form }) => {
  436. // 只有当选择了胜任力标签时才显示配置
  437. return form && form.damage_type === 1;
  438. })
  439. },
  440. valueResolve({ form, value }) {
  441. form.estimated_loss = Number(value);
  442. }
  443. },
  444. responsible_person:{
  445. title: '维修人',
  446. type: 'input',
  447. column: {
  448. minWidth: 120,
  449. },
  450. form: {
  451. show:false,
  452. component: { placeholder: '请填写维修人姓名' },
  453. rules: [
  454. { required: false, message: '请填写维修人' },
  455. { min: 2, max: 20, message: '维修人姓名长度应在2-20个字符之间', trigger: 'blur' },
  456. {
  457. validator: (rule: any, value: any, callback: any) => {
  458. if (value && value.trim()) {
  459. const nameRegex = /^[\u4e00-\u9fa5a-zA-Z\s]+$/;
  460. if (!nameRegex.test(value.trim())) {
  461. callback(new Error('维修人姓名只能包含中文、英文字母和空格'));
  462. } else {
  463. callback();
  464. }
  465. } else {
  466. callback();
  467. }
  468. },
  469. trigger: 'blur'
  470. }
  471. ],
  472. },
  473. editForm:{
  474. show:compute(({ form }) => {
  475. // 只有当选择了胜任力标签时才显示配置
  476. return form && form.status == 3;
  477. }),
  478. component: { placeholder: '请填写维修人姓名' },
  479. rules: [
  480. { required:true /* compute(({ form }) => {
  481. return form && form.status === 2;
  482. }) */, message: '请填写维修人' },
  483. { min: 2, max: 20, message: '维修人姓名长度应在2-20个字符之间', trigger: 'blur' },
  484. {
  485. validator: (rule: any, value: any, callback: any) => {
  486. if (value && value.trim()) {
  487. const nameRegex = /^[\u4e00-\u9fa5a-zA-Z\s]+$/;
  488. if (!nameRegex.test(value.trim())) {
  489. callback(new Error('维修人姓名只能包含中文、英文字母和空格'));
  490. } else {
  491. callback();
  492. }
  493. } else {
  494. callback();
  495. }
  496. },
  497. trigger: 'blur'
  498. }
  499. ],
  500. },
  501. viewForm:{
  502. show:true,
  503. component: { placeholder: '' },
  504. rules: [{ required: true, message: '' }],
  505. }
  506. },
  507. responsible_phone:{
  508. title: '维修人电话',
  509. type: 'input',
  510. column: {
  511. show:true,
  512. minWidth: 120,
  513. },
  514. form: {
  515. show:false,
  516. component: { placeholder: '请填写维修人电话' },
  517. rules: [
  518. { required: false, message: '请填写维修人电话' },
  519. {
  520. validator: (rule: any, value: any, callback: any) => {
  521. if (value && value.trim()) {
  522. const phoneRegex = /^1[3-9]\d{9}$|^0\d{2,3}-?\d{7,8}$|^400-?\d{3}-?\d{4}$/;
  523. if (!phoneRegex.test(value.trim())) {
  524. callback(new Error('请输入正确的手机号码或固定电话号码'));
  525. } else {
  526. callback();
  527. }
  528. } else {
  529. callback();
  530. }
  531. },
  532. trigger: 'blur'
  533. }
  534. ],
  535. },
  536. editForm:{
  537. show:compute(({ form }) => {
  538. // 只有当选择了胜任力标签时才显示配置
  539. return form && form.status == 3;
  540. }),
  541. component: { placeholder: '请填写维修人电话' },
  542. rules: [
  543. { required: compute(({ form }) => {
  544. return form && form.status === 2;
  545. }), message: '请填写维修人电话' },
  546. {
  547. validator: (rule: any, value: any, callback: any) => {
  548. if (value && value.trim()) {
  549. const phoneRegex = /^1[3-9]\d{9}$|^0\d{2,3}-?\d{7,8}$|^400-?\d{3}-?\d{4}$/;
  550. if (!phoneRegex.test(value.trim())) {
  551. callback(new Error('请输入正确的手机号码或固定电话号码'));
  552. } else {
  553. callback();
  554. }
  555. } else {
  556. callback();
  557. }
  558. },
  559. trigger: 'blur'
  560. }
  561. ],
  562. },
  563. viewForm:{
  564. show:true,
  565. component: { placeholder: '' },
  566. rules: [{ required: false, message: '' }],
  567. }
  568. },
  569. reporter_name:{
  570. title: '负责人',
  571. type: 'input',
  572. column: {
  573. minWidth: 120,
  574. },
  575. form: {
  576. show:true,
  577. component: { placeholder: '请填写负责人' },
  578. rules: [{ required: false, message: '请填写负责人' }],
  579. },
  580. viewForm:{
  581. component: { placeholder: '' },
  582. rules: [{ required: false, message: '' }],
  583. }
  584. },
  585. status:{
  586. search:{
  587. show:true
  588. },
  589. title: '维修状态',
  590. type: 'dict-select',
  591. column: {
  592. show:true,
  593. minWidth: 120,
  594. },
  595. dict: dict({
  596. data: [
  597. { label: '待维修', value: 1 ,color: "warning"},
  598. { label: '维修中', value: 2 ,color: "primary"},
  599. { label: '维修完成', value: 3,color: "success" },
  600. ],
  601. }),
  602. form: {
  603. show:false,
  604. component: { placeholder: '请选择维修状态' },
  605. rules: [{ required: false, message: '请选择维修状态' }],
  606. },
  607. editForm:{
  608. show:true,
  609. component: { placeholder: '请选择维修状态' },
  610. rules: [{ required: true, message: '请选择维修状态' }],
  611. },
  612. viewForm:{
  613. show:true,
  614. component: { placeholder: '' },
  615. rules: [{ required: true, message: '' }],
  616. }
  617. },
  618. /* status_display:{
  619. title: '维修状态',
  620. type: 'input',
  621. column: {
  622. minWidth: 120,
  623. },
  624. form: {
  625. show:false,
  626. component: { placeholder: '请填写负责人' },
  627. rules: [{ required: false, message: '请填写负责人' }],
  628. },
  629. viewForm:{
  630. component: { placeholder: '' },
  631. rules: [{ required: true, message: '' }],
  632. }
  633. }, */
  634. remark:{
  635. title: '备注',
  636. type: 'input',
  637. column: {
  638. minWidth: 120,
  639. },
  640. form: {
  641. show:true,
  642. component: { placeholder: '请填写备注' },
  643. rules: [{ required: false, message: '请填写备注' }],
  644. },
  645. viewForm:{
  646. component: { placeholder: '' },
  647. rules: [{ required: false, message: '' }],
  648. }
  649. },
  650. damage_reason:{
  651. title: '维修原因',
  652. type: 'textarea',
  653. column: {
  654. minWidth: 120,
  655. },
  656. form: {
  657. component: { placeholder: '请填写维修原因' },
  658. rules: [{ required: false, message: '请填写维修原因' }],
  659. },
  660. viewForm:{
  661. component: { placeholder: '' },
  662. rules: [{ required: false, message: '' }],
  663. }
  664. },
  665. repair_result:{
  666. title: '维修结果',
  667. type: 'textarea',
  668. column: {
  669. minWidth: 120,
  670. },
  671. form: {
  672. show:false,
  673. component: { placeholder: '请填写维修结果' },
  674. rules: [{ required: false, message: '请填写维修结果' }],
  675. },
  676. editForm:{
  677. show:compute(({ form }) => {
  678. // 只有当选择了胜任力标签时才显示配置
  679. return form && form.status == 3;
  680. }),
  681. component: { placeholder: '请填写维修结果' },
  682. rules: [{ required: true, message: '请填写维修结果' }],
  683. },
  684. viewForm:{
  685. show:true,
  686. component: { placeholder: '' },
  687. rules: [{ required: true, message: '' }],
  688. }
  689. },
  690. damage_images:{
  691. title: '附件',
  692. type: 'image-uploader',
  693. column: {
  694. minWidth: 120,
  695. },
  696. form: {
  697. show: auth('image:upload'),
  698. component: {
  699. uploader: {
  700. type: 'form',
  701. limit: 1,
  702. action: '/api/system/device/upload-image/',
  703. accept: ".jpg,.png",
  704. uploadRequest: async ({ action, file, onProgress }) => {
  705. const token = Cookies.get('token');
  706. const data = new FormData();
  707. data.append("image", file);
  708. return await request({
  709. url: action,
  710. method: "post",
  711. timeout: 60000,
  712. headers: {
  713. "Content-Type": "multipart/form-data",
  714. "Authorization": token ? `JWT ${token}` : ''
  715. },
  716. data,
  717. onUploadProgress: (p) => {
  718. onProgress({ percent: Math.round((p.loaded / p.total) * 100) });
  719. }
  720. });
  721. },
  722. successHandle(ret) {
  723. // eslint-disable-next-line no-console
  724. // console.log("ret.data.image_url:::",ret.data.image_url);
  725. return {
  726. url: getBaseURL(ret.data.image_url),
  727. key: ret.data.id,
  728. ...ret.data
  729. };
  730. },
  731. }
  732. },
  733. },
  734. valueBuilder({ row, key }) {
  735. return row[key] ? [row[key]] : [];
  736. },
  737. valueResolve({ form, key }) {
  738. // eslint-disable-next-line no-console
  739. console.log("form[key]:::",form[key]);
  740. form[key] = Array.isArray(form[key]) ? form[key][0] : form[key];
  741. },
  742. viewForm:{
  743. component: { placeholder: '' },
  744. rules: [{ required: false, message: '' }],
  745. }
  746. },
  747. repair_start_time:{
  748. title: '维修开始时间',
  749. type: 'input',
  750. column: {
  751. minWidth: 120,
  752. },
  753. form: {
  754. show:false,
  755. component: { placeholder: '创建时间' },
  756. rules: [{ required: false, message: '创建时间' }],
  757. },
  758. viewForm:{
  759. component: { placeholder: '' },
  760. rules: [{ required: false, message: '' }],
  761. }
  762. },
  763. repair_end_time:{
  764. title: '维修完成时间',
  765. type: 'input',
  766. column: {
  767. minWidth: 120,
  768. },
  769. form: {
  770. show:false,
  771. component: {
  772. placeholder: '创建时间',
  773. valueFormat: "YYYY-MM-DD HH:mm:ss",
  774. },
  775. rules: [{ required: false, message: '创建时间' }],
  776. },
  777. viewForm:{
  778. component: { placeholder: '' },
  779. rules: [{ required: false, message: '' }],
  780. }
  781. },
  782. report_time:{
  783. title: '创建时间',
  784. type: 'input',
  785. column: {
  786. minWidth: 120,
  787. },
  788. form: {
  789. show:false,
  790. component: { placeholder: '创建时间' },
  791. rules: [{ required: false, message: '创建时间' }],
  792. },
  793. viewForm:{
  794. component: { placeholder: '' },
  795. rules: [{ required: false, message: '' }],
  796. }
  797. },
  798. },
  799. },
  800. };
  801. };