index.vue 20 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796
  1. <template>
  2. <div class="mainContentBox">
  3. <div class="body">
  4. <div v-if="!excelStatus">
  5. <avue-crud
  6. ref="crudRef"
  7. v-model:search="search"
  8. v-model="form"
  9. :data="data"
  10. :option="option"
  11. v-model:page="page"
  12. @row-save="createRow"
  13. @row-update="updateRow"
  14. @row-del="deleteRow"
  15. @search-change="searchChange"
  16. @search-reset="resetChange"
  17. @size-change="dataList"
  18. @current-change="dataList"
  19. @selection-change="selectionChange"
  20. >
  21. <template #menu-left="{}">
  22. <el-button
  23. @click="addTemplate"
  24. class="ml-3"
  25. type="primary"
  26. icon="el-icon-plus"
  27. >
  28. 新 增
  29. </el-button>
  30. </template>
  31. <template #menu="{ row, index, type }">
  32. <el-button @click="lookTep(row)" text type="primary"
  33. >查看</el-button
  34. >
  35. <el-button @click="editTep(row)" text type="primary"
  36. >编辑</el-button
  37. >
  38. <el-popconfirm
  39. :visible="row.dialogVisible"
  40. title="您确认删除吗?"
  41. width="200"
  42. @cancel="row.dialogVisible = false"
  43. @confirm="deleteTep(row)"
  44. >
  45. <template #reference>
  46. <el-button @click="row.dialogVisible = true" text type="primary"
  47. >删除</el-button
  48. >
  49. </template>
  50. </el-popconfirm>
  51. </template>
  52. </avue-crud>
  53. </div>
  54. <div v-if="excelStatus" :key="excelKey" class="editView">
  55. <div class="exView" @mouseup="showPosition">
  56. <ExcelView
  57. ref="excelViewRef"
  58. :option="options"
  59. @confirm="confirm"
  60. v-model:data="exceldata"
  61. />
  62. </div>
  63. <div class="form" v-if="options.edit">
  64. <el-scrollbar>
  65. <el-form
  66. ref="formRef"
  67. :model="formVlaue"
  68. :rules="rules"
  69. label-width="auto"
  70. :show-message="false"
  71. status-icon
  72. >
  73. <el-form-item label="表格名称" prop="formName">
  74. <el-input v-model="formVlaue.formName" />
  75. </el-form-item>
  76. <el-form-item label="表格类型" prop="formType">
  77. <el-select
  78. v-model="formVlaue.formType"
  79. placeholder="请选择表格类型"
  80. >
  81. <el-option
  82. v-for="(item, index) in dicts.excel_type"
  83. :key="index"
  84. :label="item.dictLabel"
  85. :value="item.dictValue"
  86. />
  87. </el-select>
  88. </el-form-item>
  89. <el-form-item label="启用状态" prop="state">
  90. <el-select v-model="formVlaue.state" placeholder="请选择状态">
  91. <el-option
  92. v-for="(item, index) in dicts.excel_states"
  93. :key="index"
  94. :label="item.dictLabel"
  95. :value="item.dictValue"
  96. />
  97. </el-select>
  98. </el-form-item>
  99. <el-form-item>
  100. <div class="btns">
  101. <el-button
  102. v-if="!operaEditStatus"
  103. type="primary"
  104. @click="submitForm(formRef)"
  105. >
  106. 创 建
  107. </el-button>
  108. <el-button
  109. v-if="operaEditStatus"
  110. type="primary"
  111. @click="updateExForm(formRef)"
  112. >
  113. 更 新
  114. </el-button>
  115. <el-button v-if="!operaEditStatus" @click="resetForm(formRef)"
  116. >重 置</el-button
  117. >
  118. <el-button type="primary" @click="resetData">
  119. 取 消
  120. </el-button>
  121. </div>
  122. </el-form-item>
  123. </el-form>
  124. <div class="add">
  125. <div class="body">
  126. <el-form
  127. ref="formRef1"
  128. :model="addForm"
  129. :rules="addRules"
  130. label-width="auto"
  131. status-icon
  132. :show-message="false"
  133. style="width: 410px"
  134. >
  135. <el-form-item label="数据名称" prop="paramName">
  136. <el-input v-model="addForm.paramName" />
  137. </el-form-item>
  138. <el-form-item label="同步坐标" prop="position">
  139. <el-input :disabled="true" v-model="addForm.position" />
  140. </el-form-item>
  141. <el-form-item label="上限值" prop="up">
  142. <el-input v-model="addForm.up" />
  143. </el-form-item>
  144. <el-form-item label="下限值" prop="down">
  145. <el-input v-model="addForm.down" />
  146. </el-form-item>
  147. <el-form-item label="标准值" prop="standard">
  148. <el-input v-model="addForm.standard" />
  149. </el-form-item>
  150. <el-form-item label="数据来源" prop="source">
  151. <el-input v-model="addForm.source" />
  152. </el-form-item>
  153. <el-form-item>
  154. <div class="btns">
  155. <el-button
  156. :disabled="!operaEditStatus"
  157. type="primary"
  158. @click="creatAddForm()"
  159. >
  160. 新增
  161. </el-button>
  162. </div>
  163. </el-form-item>
  164. </el-form>
  165. </div>
  166. </div>
  167. <div class="table">
  168. <el-table
  169. id="table"
  170. border
  171. :data="settings"
  172. style="width: 430px; max-height: 240px"
  173. >
  174. <el-table-column prop="paramName" label="名称" />
  175. <el-table-column prop="position" label="坐标" />
  176. <el-table-column prop="checkStr" width="60" label="上限值">
  177. <template #default="{ row }">
  178. <span>{{ row.up ? row.up : "-" }}</span>
  179. </template>
  180. </el-table-column>
  181. <el-table-column prop="checkStr" width="60" label="下限值">
  182. <template #default="{ row }">
  183. <span>{{ row.down ? row.down : "-" }}</span>
  184. </template>
  185. </el-table-column>
  186. <el-table-column prop="checkStr" width="60" label="标准值">
  187. <template #default="{ row }">
  188. <span>{{ row.standard ? row.standard : "-" }}</span>
  189. </template>
  190. </el-table-column>
  191. <el-table-column prop="checkStr" width="60" label="数据来源">
  192. <template #default="{ row }">
  193. <span>{{ row.source ? row.source : "-" }}</span>
  194. </template>
  195. </el-table-column>
  196. <el-table-column label="操作" width="60">
  197. <template #default="{ row }">
  198. <el-button
  199. link
  200. type="primary"
  201. size="small"
  202. @click="deleteSettings(row.id)"
  203. >删除</el-button
  204. >
  205. </template>
  206. </el-table-column>
  207. </el-table>
  208. </div>
  209. <div class="btns">
  210. <el-button
  211. :disabled="searchForm.pageNo == 1"
  212. link
  213. type="primary"
  214. @click="deletePage"
  215. >
  216. 上一页
  217. </el-button>
  218. <el-button
  219. :disabled="
  220. searchForm.totalPages == searchForm.pageNo ||
  221. searchForm.totalPages == 0
  222. "
  223. link
  224. type="primary"
  225. @click="addPage"
  226. >
  227. 下一页
  228. </el-button>
  229. </div>
  230. </el-scrollbar>
  231. </div>
  232. <div class="form" v-else>
  233. <el-button type="primary" @click="resetData"> 返 回 </el-button>
  234. <div class="table">
  235. <el-table
  236. border
  237. :data="settings"
  238. style="width: 450px; max-height: 240px"
  239. >
  240. <el-table-column prop="paramName" label="数据名称" />
  241. <el-table-column prop="position" label="同步坐标" />
  242. </el-table>
  243. <div class="btns">
  244. <el-button
  245. :disabled="searchForm.pageNo == 1"
  246. link
  247. type="primary"
  248. @click="deletePage"
  249. >
  250. 上一页
  251. </el-button>
  252. <el-button
  253. :disabled="
  254. searchForm.totalPages == searchForm.pageNo ||
  255. searchForm.totalPages == 0
  256. "
  257. link
  258. type="primary"
  259. @click="addPage"
  260. >
  261. 下一页
  262. </el-button>
  263. </div>
  264. </div>
  265. </div>
  266. </div>
  267. </div>
  268. </div>
  269. </template>
  270. <script setup lang="ts">
  271. import { ref } from "vue";
  272. import { useCrud } from "@/hooks/userCrud";
  273. import {
  274. addExcel,
  275. delsExcel,
  276. delExcel,
  277. getInfo,
  278. updateExcel,
  279. getSettingsData,
  280. addSettingsData,
  281. deleteSettingsData,
  282. } from "@/api/excel";
  283. import ExcelView from "@/components/ExcelView/index.vue";
  284. import { useDictionaryStore } from "@/store";
  285. const { dicts } = useDictionaryStore();
  286. // const tableData = ref([]);
  287. const showPosition = () => {
  288. if (!excelStatus) return;
  289. addForm.value.position = excelViewRef.value.getRangeAxis()[0];
  290. };
  291. //初始化页面数据
  292. const resetData = () => {
  293. excelViewRef.value.saveCellData();
  294. excelViewRef.value.reset();
  295. resetAddForm();
  296. excelKey.value = excelKey.value + 1;
  297. options.value = {
  298. opreaState: true,
  299. in: true,
  300. out: true,
  301. print: true,
  302. edit: true,
  303. };
  304. exceldata.value = null;
  305. selectId.value = null;
  306. operaEditStatus.value = false;
  307. resetForm(formRef.value);
  308. formVlaue.formType = null;
  309. formVlaue.formName = null;
  310. formVlaue.state = null;
  311. excelStatus.value = false;
  312. };
  313. // 数据字典相关
  314. // 传入一个url,后面不带/
  315. const { form, data, option, search, page, toDeleteIds, Methords, Utils } =
  316. useCrud({
  317. src: "/api/v1/excelForm",
  318. });
  319. const {
  320. dataEditList,
  321. createRow,
  322. updateRow,
  323. deleteRow,
  324. searchChange,
  325. dataList,
  326. resetChange,
  327. } = Methords; //增删改查
  328. const { selectionChange, multipleDelete } = Methords; //选中和批量删除事件
  329. const crudRef = ref(null); //crudRef.value 获取avue-crud对象
  330. // 设置表格列或者其他自定义的option
  331. option.value = Object.assign(option.value, {
  332. selection: false,
  333. viewBtn: false,
  334. editBtn: false,
  335. delBtn: false,
  336. addBtn: false,
  337. menu: true,
  338. column: [
  339. {
  340. label: "表格名称",
  341. prop: "formName",
  342. headerAlign: "center",
  343. align: "center",
  344. search: true,
  345. overHidden: true,
  346. rules: [
  347. {
  348. required: true,
  349. message: "请填写图纸编号",
  350. trigger: "blur",
  351. },
  352. ],
  353. },
  354. {
  355. label: "表格类型",
  356. slot: true,
  357. search: true,
  358. headerAlign: "center",
  359. align: "center",
  360. prop: "formType",
  361. addDisplay: false,
  362. dicData: dicts.excel_type,
  363. props: { label: "dictLabel", value: "dictValue" },
  364. },
  365. {
  366. label: "表格状态",
  367. slot: true,
  368. search: true,
  369. headerAlign: "center",
  370. align: "center",
  371. prop: "state",
  372. addDisplay: false,
  373. dicData: dicts.excel_states,
  374. props: { label: "dictLabel", value: "dictValue" },
  375. },
  376. {
  377. label: "修改时间",
  378. slot: true,
  379. headerAlign: "center",
  380. align: "center",
  381. prop: "updated",
  382. addDisplay: false,
  383. },
  384. ],
  385. });
  386. // 存放操作表格相关业务代码
  387. const useAddTemplateHook = () => {
  388. //excelView 组件实例
  389. const excelViewRef = ref(null);
  390. //表格配置项
  391. const options = ref({
  392. //头部操作区域
  393. opreaState: true,
  394. //导入按钮展示
  395. in: true,
  396. //导出按钮展示
  397. out: true,
  398. print: true,
  399. //编辑状态 false:为查看状态
  400. edit: true,
  401. //当前操作表格名称
  402. inName: "",
  403. });
  404. //双向绑定表格data变量
  405. const exceldata = ref(null);
  406. //控制表格组件展示界面变量(包括表格展示页面和操作页面)
  407. const excelStatus = ref(false);
  408. //新增模版
  409. const addTemplate = () => {
  410. excelStatus.value = true;
  411. };
  412. //查看
  413. const lookTep = (row: any) => {
  414. options.value.edit = false;
  415. selectId.value = row.id;
  416. exceldata.value = JSON.parse(row.excelData);
  417. excelStatus.value = true;
  418. getSettingData();
  419. };
  420. //编辑
  421. const editTep = (row: any) => {
  422. options.value.inName = row.formName;
  423. exceldata.value = JSON.parse(row.excelData);
  424. formVlaue.formType = row.formType;
  425. formVlaue.formName = row.formName;
  426. formVlaue.state = row.state;
  427. selectId.value = row.id;
  428. operaEditStatus.value = true;
  429. excelStatus.value = true;
  430. getSettingData();
  431. };
  432. //删除
  433. const deleteTep = async (row: any) => {
  434. const { data, code } = await delExcel({
  435. id: row.id,
  436. });
  437. if (code == "200") {
  438. ElMessage.success("删除成功!");
  439. dataEditList();
  440. }
  441. };
  442. //获取组件内实时数据赋值到外层
  443. const confirm = (data: any) => {
  444. exceldata.value = data;
  445. };
  446. return {
  447. excelStatus,
  448. options,
  449. addTemplate,
  450. confirm,
  451. exceldata,
  452. excelViewRef,
  453. lookTep,
  454. editTep,
  455. deleteTep,
  456. };
  457. };
  458. const {
  459. excelStatus,
  460. options,
  461. addTemplate,
  462. confirm,
  463. exceldata,
  464. excelViewRef,
  465. lookTep,
  466. editTep,
  467. deleteTep,
  468. } = useAddTemplateHook();
  469. const useFormHook = () => {
  470. //KEY告知组件刷新
  471. const excelKey = ref(1);
  472. //表单data
  473. const formVlaue = reactive({ formType: null, formName: null, state: null });
  474. //表单是否为编辑状态变量
  475. const operaEditStatus = ref(false);
  476. //选中的行id
  477. const selectId = ref(null);
  478. //表单ref实例
  479. const formRef = ref(null);
  480. //表单校验规则
  481. const rules = reactive({
  482. formName: [
  483. {
  484. required: true,
  485. trigger: "blur",
  486. },
  487. ],
  488. formType: [
  489. {
  490. required: true,
  491. trigger: "blur",
  492. },
  493. ],
  494. state: [
  495. {
  496. required: true,
  497. trigger: "blur",
  498. },
  499. ],
  500. });
  501. //新增模版
  502. const submitForm = async (formEl: any) => {
  503. //@ts-ignore;
  504. excelViewRef.value.confirm();
  505. if (exceldata.value == null) return ElMessage.error("请提供表格数据!");
  506. if (!formEl) return;
  507. await formEl.validate(async (valid: any, fields: any) => {
  508. if (valid) {
  509. const { data, code } = await addExcel({
  510. ...formVlaue,
  511. excelData: exceldata.value,
  512. });
  513. if (code == "200") {
  514. ElMessage.success("添加成功!");
  515. resetData();
  516. dataEditList();
  517. editTep(data);
  518. }
  519. }
  520. });
  521. };
  522. //更新行内信息
  523. const updateExForm = async (formEl: any) => {
  524. //@ts-ignore;
  525. excelViewRef.value.saveCellData();
  526. //@ts-ignore;
  527. excelViewRef.value.confirm();
  528. if (exceldata.value == null) return ElMessage.error("请提供表格数据!");
  529. if (!formEl) return;
  530. await formEl.validate(async (valid: any, fields: any) => {
  531. if (valid) {
  532. const { data, code } = await updateExcel({
  533. ...formVlaue,
  534. excelData: exceldata.value,
  535. id: selectId.value,
  536. settings: settings.value,
  537. });
  538. if (code == "200") {
  539. ElMessage.success("修改成功!");
  540. resetData();
  541. dataEditList();
  542. }
  543. }
  544. });
  545. };
  546. //表达数据重置
  547. const resetForm = (formEl: any) => {
  548. if (!formEl) return;
  549. formEl.resetFields();
  550. };
  551. return {
  552. formVlaue,
  553. formRef,
  554. rules,
  555. selectId,
  556. excelKey,
  557. operaEditStatus,
  558. submitForm,
  559. resetForm,
  560. updateExForm,
  561. };
  562. };
  563. const {
  564. formVlaue,
  565. formRef,
  566. rules,
  567. selectId,
  568. excelKey,
  569. operaEditStatus,
  570. submitForm,
  571. resetForm,
  572. updateExForm,
  573. } = useFormHook();
  574. //表格新增 分页
  575. const useAddFormHook = () => {
  576. const formRef1 = ref(null);
  577. const settings = ref([]);
  578. const searchForm = ref({
  579. pageNo: 1,
  580. pageSize: 5,
  581. totalPages: 0,
  582. });
  583. const addForm = ref({
  584. paramName: "",
  585. position: "",
  586. up: "",
  587. down: "",
  588. standard: "",
  589. source: "",
  590. });
  591. const addPage = () => {
  592. searchForm.value.pageNo = searchForm.value.pageNo + 1;
  593. getSettingData();
  594. };
  595. const deletePage = () => {
  596. searchForm.value.pageNo = searchForm.value.pageNo - 1;
  597. getSettingData();
  598. };
  599. const getSettingData = async () => {
  600. const { data } = await getSettingsData({
  601. excelFormId: selectId.value,
  602. ...searchForm.value,
  603. });
  604. settings.value = data.records;
  605. settings.value.forEach((item: any) => {
  606. if (item.checkStr) {
  607. item.up = JSON.parse(item.checkStr).up;
  608. item.down = JSON.parse(item.checkStr).down;
  609. item.standard = JSON.parse(item.checkStr).standard;
  610. item.source = JSON.parse(item.checkStr).source;
  611. }
  612. });
  613. if (settings.value.length == 0 && searchForm.value.pageNo > 1) {
  614. deletePage();
  615. }
  616. searchForm.value.totalPages = data.totalPages;
  617. };
  618. const addSettings = async () => {
  619. addForm.value.checkStr = JSON.stringify({
  620. up: addForm.value.up,
  621. down: addForm.value.down,
  622. standard: addForm.value.standard,
  623. });
  624. const { data, code } = await addSettingsData({
  625. excelFormId: selectId.value,
  626. ...addForm.value,
  627. });
  628. if (code == "200") {
  629. ElMessage.success("添加成功");
  630. resetAddForm();
  631. getSettingData();
  632. }
  633. };
  634. const deleteSettings = async (id: any) => {
  635. const { data, code } = await deleteSettingsData({ id: id });
  636. if (code == "200") {
  637. ElMessage.success("删除成功");
  638. getSettingData();
  639. }
  640. };
  641. const resetAddForm = () => {
  642. addForm.value = {
  643. paramName: "",
  644. position: "",
  645. };
  646. searchForm.value = {
  647. pageNo: 1,
  648. pageSize: 5,
  649. totalPages: 0,
  650. };
  651. settings.value = [];
  652. };
  653. const creatAddForm = async () => {
  654. await formRef1.value.validate(async (valid: any, fields: any) => {
  655. if (valid) {
  656. addSettings();
  657. }
  658. });
  659. };
  660. const addRules = reactive({
  661. paramName: [
  662. {
  663. required: true,
  664. trigger: "blur",
  665. },
  666. ],
  667. position: [
  668. {
  669. required: true,
  670. trigger: "blur",
  671. },
  672. ],
  673. up: [
  674. {
  675. required: true,
  676. trigger: "blur",
  677. },
  678. ],
  679. down: [
  680. {
  681. required: true,
  682. trigger: "blur",
  683. },
  684. ],
  685. standard: [
  686. {
  687. required: true,
  688. trigger: "blur",
  689. },
  690. ],
  691. });
  692. return {
  693. formRef1,
  694. addForm,
  695. searchForm,
  696. settings,
  697. addRules,
  698. creatAddForm,
  699. resetAddForm,
  700. getSettingData,
  701. addSettings,
  702. addPage,
  703. deleteSettings,
  704. deletePage,
  705. };
  706. };
  707. const {
  708. formRef1,
  709. addForm,
  710. searchForm,
  711. settings,
  712. addRules,
  713. creatAddForm,
  714. deletePage,
  715. addPage,
  716. resetAddForm,
  717. getSettingData,
  718. deleteSettings,
  719. } = useAddFormHook();
  720. onMounted?.(() => {
  721. dataEditList();
  722. });
  723. </script>
  724. <style lang="scss" scoped>
  725. .table {
  726. width: 430px;
  727. padding-top: 20px;
  728. }
  729. .btns {
  730. width: 100%;
  731. justify-content: center;
  732. height: 30px;
  733. display: flex;
  734. align-items: center;
  735. .el-button {
  736. height: 20px;
  737. }
  738. }
  739. .add {
  740. width: 430px;
  741. height: 220px;
  742. display: flex;
  743. flex-direction: column;
  744. .body {
  745. display: flex;
  746. width: 430px;
  747. flex: 1;
  748. }
  749. }
  750. #table {
  751. height: calc(100vh - 540px) !important;
  752. }
  753. .editView {
  754. width: 100%;
  755. height: calc(100vh - 140px);
  756. display: flex;
  757. .exView {
  758. position: relative;
  759. width: calc(100% - 450px);
  760. height: 100%;
  761. }
  762. .form {
  763. width: 450px;
  764. height: 100%;
  765. font-size: 24px;
  766. padding: 20px;
  767. padding-right: 0px;
  768. .title {
  769. text-align: center;
  770. margin-bottom: 10px;
  771. }
  772. .btns {
  773. display: flex;
  774. align-items: center;
  775. justify-content: center;
  776. }
  777. }
  778. }
  779. :deep(.el-form-item) {
  780. margin-bottom: 2px !important;
  781. }
  782. :deep(.el-input__inner) {
  783. height: 24px !important;
  784. }
  785. </style>