index.vue 15 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552
  1. <template>
  2. <div class="app-container">
  3. <el-form
  4. :model="queryParams"
  5. ref="queryForm"
  6. size="small"
  7. :inline="true"
  8. v-show="showSearch"
  9. label-width="100px"
  10. >
  11. <el-row>
  12. <el-form-item label="锁具编码" prop="locksetCode">
  13. <el-input
  14. v-model="queryParams.locksetCode"
  15. placeholder="请输入锁具编码"
  16. clearable
  17. @keyup.enter.native="handleQuery"
  18. />
  19. </el-form-item>
  20. <el-form-item label="锁具名称" prop="locksetName">
  21. <el-input
  22. v-model="queryParams.locksetName"
  23. placeholder="请输入锁具名称"
  24. clearable
  25. @keyup.enter.native="handleQuery"
  26. />
  27. </el-form-item>
  28. <el-form-item label="锁具类型" prop="locksetTypeName">
  29. <treeselect
  30. style="width: 218px"
  31. v-model="queryParams.locksetTypeId"
  32. :options="locksetTypeOption"
  33. :normalizer="normalizer"
  34. placeholder="选择锁具类型"
  35. />
  36. </el-form-item>
  37. <el-form-item
  38. style="margin-left
  39. 20px"
  40. >
  41. <el-button
  42. type="primary"
  43. icon="el-icon-search"
  44. size="mini"
  45. @click="handleQuery"
  46. >搜索
  47. </el-button>
  48. <el-button icon="el-icon-refresh" size="mini" @click="resetQuery"
  49. >重置
  50. </el-button>
  51. </el-form-item>
  52. </el-row>
  53. </el-form>
  54. <el-row :gutter="10" class="mb8">
  55. <el-col :span="1.5">
  56. <el-button
  57. type="primary"
  58. plain
  59. icon="el-icon-plus"
  60. size="mini"
  61. @click="handleAdd"
  62. v-hasPermi="['mes:hw:information:add']"
  63. >新增
  64. </el-button>
  65. </el-col>
  66. <el-col :span="1.5">
  67. <el-button
  68. type="danger"
  69. plain
  70. icon="el-icon-delete"
  71. size="mini"
  72. :disabled="multiple"
  73. @click="handleDelete"
  74. v-hasPermi="['mes:hw:information:batchremove']"
  75. >批量删除
  76. </el-button>
  77. </el-col>
  78. <right-toolbar
  79. :showSearch.sync="showSearch"
  80. @queryTable="getList"
  81. ></right-toolbar>
  82. </el-row>
  83. <el-table
  84. v-loading="loading"
  85. :data="repairList"
  86. @selection-change="handleSelectionChange"
  87. >
  88. <el-table-column type="selection" width="55" align="center" />
  89. <el-table-column
  90. label="锁具编码"
  91. width="120px"
  92. align="center"
  93. prop="locksetCode"
  94. />
  95. <el-table-column
  96. label="锁具名称"
  97. width="150px"
  98. align="center"
  99. prop="locksetName"
  100. :show-overflow-tooltip="true"
  101. />
  102. <el-table-column label="锁具类型" align="center" prop="locksetTypeName" />
  103. <el-table-column label="锁具NFC" align="center" prop="locksetNfc" />
  104. <el-table-column label="锁具RFID" align="center" prop="locksetRfid" />
  105. <el-table-column label="物资ID" align="center" prop="materialsName" />
  106. <el-table-column
  107. label="创建时间"
  108. align="center"
  109. prop="createTime"
  110. width="180"
  111. >
  112. <template slot-scope="scope">
  113. <span>{{ scope.row.createTime }}</span>
  114. </template>
  115. </el-table-column>
  116. <el-table-column
  117. label="操作"
  118. align="center"
  119. class-name="small-padding fixed-width"
  120. fixed="right"
  121. >
  122. <template slot-scope="scope">
  123. <el-button
  124. size="mini"
  125. type="text"
  126. icon="el-icon-edit"
  127. @click="handleUpdate(scope.row)"
  128. v-hasPermi="['mes:hw:information:edit']"
  129. >编辑
  130. </el-button>
  131. <el-button
  132. size="mini"
  133. type="text"
  134. icon="el-icon-delete"
  135. @click="handleDelete(scope.row)"
  136. v-hasPermi="['mes:hw:information:remove']"
  137. >删除
  138. </el-button>
  139. <!-- <el-button size="mini" type="text">预览</el-button>-->
  140. </template>
  141. </el-table-column>
  142. </el-table>
  143. <pagination
  144. v-show="total > 0"
  145. :total="total"
  146. :page.sync="queryParams.current"
  147. :limit.sync="queryParams.size"
  148. @pagination="getList"
  149. />
  150. <!-- 添加或修改设备维修单对话框 -->
  151. <el-dialog :title="title" :visible.sync="open" width="450px" append-to-body>
  152. <el-form ref="form" :model="form" :rules="rules" label-width="120px">
  153. <el-form-item label="锁具类型" prop="locksetTypeId">
  154. <treeselect
  155. v-model="form.locksetTypeId"
  156. :options="locksetTypeOption"
  157. :normalizer="normalizer"
  158. placeholder="选择锁具类型"
  159. />
  160. </el-form-item>
  161. <el-row>
  162. <el-col :span="15">
  163. <el-form-item label="锁具编码" prop="locksetCode">
  164. <el-input
  165. v-model="form.locksetCode"
  166. placeholder="请输入锁具编码"
  167. style="width: 100%"
  168. />
  169. </el-form-item>
  170. </el-col>
  171. <el-col :span="8">
  172. <el-form-item label-width="80">
  173. <el-switch
  174. v-model="autoGenFlag"
  175. active-color="#13ce66"
  176. active-text="自动生成"
  177. @change="handleAutoGenChange(autoGenFlag)"
  178. >
  179. </el-switch>
  180. </el-form-item>
  181. </el-col>
  182. </el-row>
  183. <el-form-item label="锁具名称" prop="locksetName">
  184. <el-input v-model="form.locksetName" placeholder="请输入锁具名称" />
  185. </el-form-item>
  186. <el-form-item label="锁具NFC" prop="locksetNfc">
  187. <el-input v-model="form.locksetNfc" placeholder="请输入锁具Nfc" />
  188. </el-form-item>
  189. <el-form-item label="锁具RFID" prop="locksetRfid">
  190. <el-input v-model="form.locksetRfid" placeholder="请输入锁具RFID" />
  191. </el-form-item>
  192. <el-form-item label="物资ID" prop="materialsId">
  193. <el-select
  194. v-model="form.materialsId"
  195. placeholder="请选择物资ID"
  196. clearable
  197. style="width: 100%"
  198. >
  199. <el-option
  200. v-for="dict in this.materialsList"
  201. :key="dict.value"
  202. :label="dict.label"
  203. :value="dict.value"
  204. />
  205. </el-select>
  206. </el-form-item>
  207. </el-form>
  208. <div slot="footer" class="dialog-footer">
  209. <el-button type="primary" @click="submitForm">确 定</el-button>
  210. <el-button @click="cancel">取 消</el-button>
  211. </div>
  212. </el-dialog>
  213. </div>
  214. </template>
  215. <script>
  216. import {
  217. listLockAPI,
  218. addLockAPI,
  219. updateLockAPI,
  220. delLockAPI,
  221. getLockInfoAPI,
  222. } from "@/api/mes/Lock/Lock";
  223. import { listMaterials } from "@/api/mes/material/information";
  224. import { genCode } from "@/api/system/autocode/rule";
  225. import { listLockType } from "@/api/mes/locktype/locktype";
  226. import Treeselect from "@riophae/vue-treeselect";
  227. import "@riophae/vue-treeselect/dist/vue-treeselect.css";
  228. export default {
  229. name: "lock",
  230. dicts: ["hardware_status"],
  231. components: { Treeselect },
  232. data() {
  233. return {
  234. autoGenFlag: false,
  235. optType: undefined,
  236. // 遮罩层
  237. loading: true,
  238. // 选中数组
  239. ids: [],
  240. codes: [],
  241. // 非单个禁用
  242. single: true,
  243. // 非多个禁用
  244. multiple: true,
  245. // 显示搜索条件
  246. showSearch: true,
  247. // 总条数
  248. total: 0,
  249. // 设备维修单表格数据
  250. repairList: [],
  251. // 弹出层标题
  252. title: "",
  253. // 是否显示弹出层
  254. open: false,
  255. // 查询参数
  256. createTime: "",
  257. queryParams: {
  258. current: 1,
  259. size: 10,
  260. locksetCode: null,
  261. locksetName: null,
  262. locksetNfc: null,
  263. locksetRfid: null,
  264. locksetTypeId: undefined,
  265. materialsId: null,
  266. locksetTypeName: null,
  267. },
  268. queryMaterialParams: {
  269. current: 1,
  270. size: -1,
  271. },
  272. materialsList: [],
  273. locksetTypeOption: [],
  274. // 表单参数
  275. form: {},
  276. // 表单校验
  277. rules: {
  278. locksetCode: [
  279. { required: true, message: "锁具编码不能为空", trigger: "blur" },
  280. ],
  281. locksetName: [
  282. { required: true, message: "锁具名称不能为空", trigger: "blur" },
  283. ],
  284. locksetNfc: [
  285. { required: true, message: "锁具NFC不能为空", trigger: "blur" },
  286. ],
  287. locksetRfid: [
  288. { required: true, message: "锁具RFID不能为空", trigger: "blur" },
  289. ],
  290. },
  291. // 日期选择
  292. pickerOptions: {
  293. shortcuts: [
  294. {
  295. text: "最近一周",
  296. onClick(picker) {
  297. const end = new Date();
  298. const start = new Date();
  299. start.setTime(start.getTime() - 3600 * 1000 * 24 * 7);
  300. picker.$emit("pick", [start, end]);
  301. },
  302. },
  303. {
  304. text: "最近一个月",
  305. onClick(picker) {
  306. const end = new Date();
  307. const start = new Date();
  308. start.setTime(start.getTime() - 3600 * 1000 * 24 * 30);
  309. picker.$emit("pick", [start, end]);
  310. },
  311. },
  312. {
  313. text: "最近三个月",
  314. onClick(picker) {
  315. const end = new Date();
  316. const start = new Date();
  317. start.setTime(start.getTime() - 3600 * 1000 * 24 * 90);
  318. picker.$emit("pick", [start, end]);
  319. },
  320. },
  321. ],
  322. },
  323. value2: "",
  324. // 新增状态
  325. EditId: 0, //修改判断
  326. cascaderOptions: [], // 转换后的数据
  327. flatHardwareTypeOption: [], // 用于快速查找
  328. };
  329. },
  330. created() {
  331. this.getList();
  332. this.getLockTypeList();
  333. this.getMaterialList();
  334. },
  335. methods: {
  336. // 格式化日期查询数据
  337. formatDate(date) {
  338. if (date && date instanceof Date && !isNaN(date)) {
  339. // 使用本地时间
  340. return `${date.getFullYear()}-${String(date.getMonth() + 1).padStart(
  341. 2,
  342. "0"
  343. )}-${String(date.getDate()).padStart(2, "0")}`;
  344. }
  345. return null;
  346. },
  347. getMaterialList() {
  348. listMaterials(this.queryMaterialParams).then((response) => {
  349. this.materialsList = response.data.records.map((item) => {
  350. return {
  351. value: item.materialsCabinetId,
  352. label: item.materialsName,
  353. };
  354. });
  355. console.log(response, this.materialsList, "获取物资信息allList ");
  356. });
  357. },
  358. /** 查询设备维修单列表 */
  359. getList() {
  360. this.loading = true;
  361. // 格式化日期并更新 queryParams
  362. if (Array.isArray(this.createTime) && this.createTime.length === 2) {
  363. this.queryParams.startTime = this.formatDate(this.createTime[0]);
  364. this.queryParams.endTime = this.formatDate(this.createTime[1]);
  365. }
  366. // 锁具数据
  367. listLockAPI(this.queryParams).then((response) => {
  368. this.repairList = response.data.records;
  369. this.total = response.data.total;
  370. this.loading = false;
  371. });
  372. },
  373. // 获取锁具类型-所有
  374. getLockTypeList() {
  375. const data = {
  376. current: 1,
  377. size: -1,
  378. };
  379. listLockType(data).then((response) => {
  380. this.locksetTypeOption = this.handleTree(
  381. response.data.records,
  382. "locksetTypeId",
  383. "parentTypeId",
  384. "children"
  385. );
  386. console.log(this.locksetTypeOption, "this.locksetTypeOption");
  387. });
  388. },
  389. /** 转换部门数据结构 */
  390. normalizer(node) {
  391. if (node.children && !node.children.length) {
  392. delete node.children;
  393. }
  394. return {
  395. id: node.locksetTypeId,
  396. label: node.locksetTypeName,
  397. children: node.children,
  398. };
  399. },
  400. // 取消按钮
  401. cancel() {
  402. this.open = false;
  403. this.reset();
  404. },
  405. // 表单重置
  406. reset() {
  407. this.form = {
  408. locksetTypeId: null,
  409. locksetName: null,
  410. locksetCode: null,
  411. locksetNfc: null,
  412. locksetRfid: null,
  413. materialsId: null,
  414. locksetTypeName: null,
  415. };
  416. this.autoGenFlag = false;
  417. this.resetForm("form");
  418. },
  419. /** 搜索按钮操作 */
  420. handleQuery() {
  421. this.queryParams.current = 1;
  422. this.getList();
  423. },
  424. /** 重置按钮操作 */
  425. resetQuery() {
  426. this.queryParams.locksetCode = "";
  427. this.queryParams.locksetName = "";
  428. this.queryParams.locksetTypeId = "";
  429. this.resetForm("queryForm");
  430. this.handleQuery();
  431. },
  432. // 多选框选中数据
  433. handleSelectionChange(selection) {
  434. this.ids = selection.map((item) => item.locksetId);
  435. this.codes = selection.map((item) => item.locksetCode);
  436. this.single = selection.length !== 1;
  437. this.multiple = !selection.length;
  438. },
  439. /** 新增按钮操作 */
  440. handleAdd() {
  441. this.reset();
  442. this.open = true;
  443. this.EditId = null;
  444. this.title = "新增锁具信息";
  445. },
  446. /** 修改按钮操作 */
  447. handleUpdate(row) {
  448. this.reset();
  449. this.EditId = row.locksetId || this.ids;
  450. getLockInfoAPI(this.EditId).then((response) => {
  451. console.log(response, "编辑拿到单挑数");
  452. this.form = response.data;
  453. this.open = true;
  454. this.title = "编辑锁具信息";
  455. });
  456. },
  457. /** 提交按钮 */
  458. submitForm() {
  459. this.$refs["form"].validate((valid) => {
  460. if (valid) {
  461. if (this.EditId != null) {
  462. updateLockAPI(this.form).then((response) => {
  463. this.$modal.msgSuccess("修改成功");
  464. this.open = false;
  465. this.getList();
  466. });
  467. } else {
  468. console.log(this.form, "form");
  469. addLockAPI(this.form).then((response) => {
  470. this.$modal.msgSuccess("新增成功");
  471. this.open = false;
  472. this.EditId = null;
  473. this.getList();
  474. });
  475. }
  476. }
  477. });
  478. },
  479. /** 删除按钮操作 */
  480. handleDelete(row) {
  481. const repairIds = row.locksetId || this.ids;
  482. const repairCodes = row.locksetCode || this.codes;
  483. this.$modal
  484. .confirm('是否确认删除编码为"' + repairCodes + '"的数据项?')
  485. .then(function () {
  486. return delLockAPI(repairIds);
  487. })
  488. .then(() => {
  489. this.getList();
  490. this.$modal.msgSuccess("删除成功");
  491. })
  492. .catch(() => {});
  493. },
  494. //自动生成编码
  495. handleAutoGenChange(autoGenFlag) {
  496. if (autoGenFlag) {
  497. genCode("LOCK_CODE").then((response) => {
  498. this.form.locksetCode = response;
  499. });
  500. } else {
  501. this.form.locksetCode = null;
  502. }
  503. },
  504. },
  505. };
  506. </script>
  507. <style scoped>
  508. .imgstatus {
  509. position: relative;
  510. top: 1px;
  511. left: 0px;
  512. }
  513. /deep/ .el-radio__inner {
  514. border-radius: 2px;
  515. }
  516. /deep/ .el-radio__input.is-checked .el-radio__inner::after {
  517. content: "";
  518. width: 8px;
  519. height: 3px;
  520. border: 1px solid white;
  521. border-top: transparent;
  522. border-right: transparent;
  523. text-align: center;
  524. display: block;
  525. position: absolute;
  526. top: 3px;
  527. left: 2px;
  528. transform: rotate(-45deg);
  529. border-radius: 0pc;
  530. background: none;
  531. }
  532. </style>