index.vue 21 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747
  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="hardwareCode">
  13. <el-input
  14. v-model="queryParams.hardwareCode"
  15. placeholder="请输入硬件编码"
  16. clearable
  17. @keyup.enter.native="handleQuery"
  18. />
  19. </el-form-item>
  20. <el-form-item label="硬件名称" prop="hardwareName">
  21. <el-input
  22. v-model="queryParams.hardwareName"
  23. placeholder="请输入硬件名称"
  24. clearable
  25. @keyup.enter.native="handleQuery"
  26. />
  27. </el-form-item>
  28. <el-form-item label="状态" prop="status">
  29. <el-select
  30. v-model="queryParams.status"
  31. placeholder="请选择硬件状态"
  32. clearable
  33. >
  34. <el-option
  35. v-for="dict in dict.type.hardware_status"
  36. :key="dict.value"
  37. :label="dict.label"
  38. :value="dict.value"
  39. />
  40. </el-select>
  41. </el-form-item>
  42. <el-form-item label="硬件类型" prop="hardwareTypeId">
  43. <el-select
  44. v-model="queryParams.hardwareTypeId"
  45. placeholder="请选择硬件类型"
  46. clearable
  47. >
  48. <el-option
  49. v-for="dict in hardwareTypeOption"
  50. :key="dict.key"
  51. :label="dict.label"
  52. :value="dict.key"
  53. />
  54. </el-select>
  55. </el-form-item>
  56. </el-row>
  57. <el-form-item label="规格型号" prop="hardwareSpec">
  58. <el-input
  59. v-model="queryParams.hardwareSpec"
  60. placeholder="请输入规格型号"
  61. clearable
  62. @keyup.enter.native="handleQuery"
  63. />
  64. </el-form-item>
  65. <el-form-item label="创建时间" prop="createTime">
  66. <el-date-picker
  67. v-model="createTime"
  68. type="datetimerange"
  69. :picker-options="pickerOptions"
  70. range-separator="-"
  71. start-placeholder="开始日期"
  72. end-placeholder="结束日期"
  73. align="right"
  74. style="width: 540px"
  75. >
  76. </el-date-picker>
  77. </el-form-item>
  78. <el-form-item label="所属车间" prop="status">
  79. <el-select
  80. v-model="queryParams.workshopName"
  81. placeholder="请选择所属车间"
  82. clearable
  83. @change="workShopChangequery"
  84. >
  85. <el-option
  86. v-for="dict in this.workshopOption"
  87. :key="dict.key"
  88. :label="dict.label"
  89. :value="dict.value"
  90. />
  91. </el-select>
  92. </el-form-item>
  93. <el-form-item style="margin-left: 50px">
  94. <el-button
  95. type="primary"
  96. icon="el-icon-search"
  97. size="mini"
  98. @click="handleQuery"
  99. >搜索</el-button
  100. >
  101. <el-button icon="el-icon-refresh" size="mini" @click="resetQuery"
  102. >重置</el-button
  103. >
  104. </el-form-item>
  105. </el-form>
  106. <el-row :gutter="10" class="mb8">
  107. <el-col :span="1.5">
  108. <el-button
  109. type="primary"
  110. plain
  111. icon="el-icon-plus"
  112. size="mini"
  113. @click="handleAdd"
  114. v-hasPermi="['mes:hw:information:add']"
  115. >新增</el-button
  116. >
  117. </el-col>
  118. <!-- <el-col :span="1.5">
  119. <el-button
  120. type="success"
  121. plain
  122. icon="el-icon-edit"
  123. size="mini"
  124. :disabled="single"
  125. @click="handleUpdate"
  126. v-hasPermi="['mes:dv:repair:edit']"
  127. >修改</el-button
  128. >
  129. </el-col> -->
  130. <el-col :span="1.5">
  131. <el-button
  132. type="danger"
  133. plain
  134. icon="el-icon-delete"
  135. size="mini"
  136. :disabled="multiple"
  137. @click="handleDelete"
  138. v-hasPermi="['mes:hw:information:batchremove']"
  139. >批量删除</el-button
  140. >
  141. </el-col>
  142. <right-toolbar
  143. :showSearch.sync="showSearch"
  144. @queryTable="getList"
  145. ></right-toolbar>
  146. </el-row>
  147. <el-table
  148. v-loading="loading"
  149. :data="repairList"
  150. @selection-change="handleSelectionChange"
  151. >
  152. <el-table-column type="selection" width="55" align="center" />
  153. <el-table-column
  154. label="硬件编码"
  155. width="120px"
  156. align="center"
  157. prop="hardwareCode"
  158. />
  159. <el-table-column
  160. label="硬件名称"
  161. width="150px"
  162. align="center"
  163. prop="hardwareName"
  164. :show-overflow-tooltip="true"
  165. />
  166. <el-table-column label="硬件类型" align="center" prop="hardwareTypeName" />
  167. <el-table-column label="规格型号" align="center" prop="hardwareSpec" />
  168. <el-table-column label="所属车间" align="center" prop="workshopName" />
  169. <el-table-column label="硬件状态" align="center" prop="status">
  170. <template slot-scope="scope">
  171. <dict-tag
  172. :options="dict.type.hardware_status"
  173. :value="scope.row.status"
  174. />
  175. </template>
  176. </el-table-column>
  177. <el-table-column
  178. label="创建时间"
  179. align="center"
  180. prop="createTime"
  181. width="180"
  182. >
  183. <template slot-scope="scope">
  184. <span>{{ scope.row.createTime }}</span>
  185. </template>
  186. </el-table-column>
  187. <el-table-column
  188. label="启用时间"
  189. align="center"
  190. prop="activationTime"
  191. width="120"
  192. >
  193. <template slot-scope="scope">
  194. <span>{{ scope.row.activationTime }}</span>
  195. </template>
  196. </el-table-column>
  197. <el-table-column label="可用次数" align="center" prop="availableTimes" />
  198. <el-table-column label="已用次数" align="center" prop="usedTimes" />
  199. <el-table-column label="可用寿命" align="center" prop="availableLife" />
  200. <el-table-column label="已用寿命" align="center" prop="usedLife" />
  201. <el-table-column
  202. label="操作"
  203. align="center"
  204. class-name="small-padding fixed-width"
  205. fixed="right"
  206. >
  207. <template slot-scope="scope">
  208. <el-button
  209. size="mini"
  210. type="text"
  211. icon="el-icon-edit"
  212. @click="handleUpdate(scope.row)"
  213. v-hasPermi="['mes:hw:information:edit']"
  214. >编辑</el-button
  215. >
  216. <el-button
  217. size="mini"
  218. type="text"
  219. icon="el-icon-delete"
  220. @click="handleDelete(scope.row)"
  221. v-hasPermi="['mes:hw:information:remove']"
  222. >删除</el-button
  223. >
  224. <!-- <el-button size="mini" type="text">预览</el-button>-->
  225. </template>
  226. </el-table-column>
  227. </el-table>
  228. <pagination
  229. v-show="total > 0"
  230. :total="total"
  231. :page.sync="queryParams.current"
  232. :limit.sync="queryParams.size"
  233. @pagination="getList"
  234. />
  235. <!-- 添加或修改设备维修单对话框 -->
  236. <el-dialog
  237. :title="title"
  238. :visible.sync="open"
  239. width="1100px"
  240. append-to-body
  241. >
  242. <el-form ref="form" :model="form" :rules="rules" label-width="120px">
  243. <el-row>
  244. <el-col :span="11">
  245. <el-form-item label="硬件编码" prop="hardwareCode">
  246. <el-input
  247. v-model="form.hardwareCode"
  248. placeholder="请输入硬件编码"
  249. style="width: 100%"
  250. />
  251. </el-form-item>
  252. </el-col>
  253. <el-col :span="11">
  254. <el-form-item label="硬件类型" prop="hardwareTypeName">
  255. <el-select
  256. v-model="form.hardwareTypeName"
  257. placeholder="请选择硬件类型"
  258. clearable
  259. style="width: 100%"
  260. @change="hardTypeChange"
  261. >
  262. <el-option
  263. v-for="dict in this.hardwareTypeOption"
  264. :key="dict.value"
  265. :label="dict.label"
  266. :value="dict.value"
  267. />
  268. </el-select>
  269. </el-form-item>
  270. </el-col>
  271. </el-row>
  272. <el-row>
  273. <el-col :span="11">
  274. <el-form-item label="硬件名称" prop="hardwareName">
  275. <el-input
  276. v-model="form.hardwareName"
  277. placeholder="请输入硬件名称"
  278. />
  279. </el-form-item>
  280. </el-col>
  281. <el-col :span="11">
  282. <el-form-item label="规格型号" prop="hardwareSpec">
  283. <el-input
  284. v-model="form.hardwareSpec"
  285. placeholder="请输入规格型号"
  286. />
  287. </el-form-item>
  288. </el-col>
  289. </el-row>
  290. <el-row>
  291. <el-col :span="11">
  292. <el-form-item label="启用日期" prop="activationTime">
  293. <el-date-picker
  294. clearable
  295. v-model="form.activationTime"
  296. style="width: 100%"
  297. type="date"
  298. value-format="yyyy-MM-dd"
  299. placeholder="请选择启用日期"
  300. >
  301. </el-date-picker> </el-form-item
  302. ></el-col>
  303. <el-col :span="11">
  304. <el-form-item label="所属车间" prop="workshopName">
  305. <el-select
  306. v-model="form.workshopName"
  307. placeholder="请选择所属车间"
  308. clearable
  309. style="width: 100%"
  310. @change="workShopChange"
  311. >
  312. <el-option
  313. v-for="dict in this.workshopOption"
  314. :key="dict.key"
  315. :label="dict.label"
  316. :value="dict.value"
  317. />
  318. </el-select>
  319. </el-form-item>
  320. </el-col>
  321. </el-row>
  322. <el-row>
  323. <el-col :span="11">
  324. <el-form-item label="可用次数" prop="availableTimes">
  325. <el-input
  326. v-model="form.availableTimes"
  327. placeholder="请输入可用次数"
  328. />
  329. </el-form-item>
  330. </el-col>
  331. <el-col :span="11">
  332. <el-form-item label="已用次数" prop="usedTimes">
  333. <el-input
  334. v-model="form.usedTimes"
  335. placeholder="请输入已用次数"
  336. />
  337. </el-form-item>
  338. </el-col>
  339. </el-row>
  340. <el-row>
  341. <el-col :span="11">
  342. <el-form-item label="可用寿命" prop="availableLife">
  343. <el-input
  344. v-model="form.availableLife"
  345. placeholder="请输入可用寿命"
  346. />
  347. </el-form-item>
  348. </el-col>
  349. <el-col :span="11">
  350. <el-form-item label="已用寿命" prop="usedLife">
  351. <el-input
  352. v-model="form.usedLife"
  353. placeholder="请输入已用寿命"
  354. />
  355. </el-form-item>
  356. </el-col>
  357. </el-row>
  358. <el-form-item label="状态" prop="status">
  359. <el-radio v-model="form.status" label="1" v-removeAriaHidden
  360. ><img
  361. src="@/assets/images/success.png"
  362. alt=""
  363. class="imgstatus"
  364. />
  365. 在线</el-radio
  366. >
  367. <el-radio v-model="form.status" v-removeAriaHidden label="2" ><img src="@/assets/images/error.png" alt="" class="imgstatus" />
  368. 离线</el-radio
  369. >
  370. <el-radio v-model="form.status" v-removeAriaHidden label="3"
  371. ><img src="@/assets/images/warn.png" alt="" class="imgstatus" />
  372. 异常</el-radio
  373. >
  374. </el-form-item>
  375. </el-form>
  376. <div slot="footer" class="dialog-footer">
  377. <el-button
  378. type="primary"
  379. @click="submitForm"
  380. >确 定</el-button
  381. >
  382. <el-button @click="cancel">取 消</el-button>
  383. </div>
  384. </el-dialog>
  385. </div>
  386. </template>
  387. <script>
  388. import {
  389. listHardware,
  390. getHardwareTypeListAPI,
  391. addHardware,
  392. updateHardware,
  393. delHardware,
  394. getHardwareInfo,
  395. listAllWorkshop
  396. } from '@/api/mes/hw/hardwareinfo'
  397. export default {
  398. name: "hardwareinfo",
  399. dicts: ["hardware_status"],
  400. // components: { Repairline, MachinerySelectSingle },
  401. data() {
  402. return {
  403. autoGenFlag: false,
  404. optType: undefined,
  405. // 遮罩层
  406. loading: true,
  407. // 选中数组
  408. ids: [],
  409. // 非单个禁用
  410. single: true,
  411. // 非多个禁用
  412. multiple: true,
  413. // 显示搜索条件
  414. showSearch: true,
  415. // 总条数
  416. total: 0,
  417. // 设备维修单表格数据
  418. repairList: [],
  419. // 弹出层标题
  420. title: "",
  421. // 是否显示弹出层
  422. open: false,
  423. // 查询参数
  424. createTime:'',
  425. queryParams: {
  426. current: 1,
  427. size: 10,
  428. hardwareCode:'',
  429. hardwareName:'',
  430. status:'',
  431. hardwareTypeName:'',
  432. hardwareSpec:'',
  433. startTime:'',
  434. endTime:'',
  435. workshopName:'',
  436. workshopCode:'',
  437. workshopId:'',
  438. },
  439. queryTypeParams: {
  440. enableFlag:'y',
  441. },
  442. workshopOption:[
  443. ],
  444. hardwareTypeOption:[],
  445. // 表单参数
  446. form: {
  447. hardwareTypeId:0,
  448. workshopCode:0,
  449. workshopId:0,
  450. },
  451. // 表单校验
  452. rules: {
  453. hardwareCode: [
  454. { required: true, message: "硬件编码不能为空", trigger: "blur" },
  455. ],
  456. hardwareName: [
  457. { required: true, message: "硬件名称不能为空", trigger: "blur" },
  458. ],
  459. },
  460. // 日期选择
  461. pickerOptions: {
  462. shortcuts: [
  463. {
  464. text: "最近一周",
  465. onClick(picker) {
  466. const end = new Date();
  467. const start = new Date();
  468. start.setTime(start.getTime() - 3600 * 1000 * 24 * 7);
  469. picker.$emit("pick", [start, end]);
  470. },
  471. },
  472. {
  473. text: "最近一个月",
  474. onClick(picker) {
  475. const end = new Date();
  476. const start = new Date();
  477. start.setTime(start.getTime() - 3600 * 1000 * 24 * 30);
  478. picker.$emit("pick", [start, end]);
  479. },
  480. },
  481. {
  482. text: "最近三个月",
  483. onClick(picker) {
  484. const end = new Date();
  485. const start = new Date();
  486. start.setTime(start.getTime() - 3600 * 1000 * 24 * 90);
  487. picker.$emit("pick", [start, end]);
  488. },
  489. },
  490. ],
  491. },
  492. value2: "",
  493. // 新增状态
  494. radio: 3,
  495. EditId:0,//修改判断
  496. };
  497. },
  498. created() {
  499. this.getList();
  500. this.getHardwareTypeList()
  501. },
  502. methods: {
  503. // 格式化日期查询数据
  504. formatDate(date) {
  505. if (date && date instanceof Date && !isNaN(date)) {
  506. // 使用本地时间
  507. return `${date.getFullYear()}-${String(date.getMonth() + 1).padStart(2, '0')}-${String(date.getDate()).padStart(2, '0')}`;
  508. }
  509. return null;
  510. },
  511. /** 查询设备维修单列表 */
  512. getList() {
  513. this.loading = true;
  514. // 格式化日期并更新 queryParams
  515. if (Array.isArray(this.createTime) && this.createTime.length === 2){
  516. this.queryParams.startTime = this.formatDate(this.createTime[0]);
  517. this.queryParams.endTime = this.formatDate(this.createTime[1]);
  518. }
  519. listHardware(this.queryParams).then((response) => {
  520. this.repairList = response.data.records;
  521. this.total = response.data.total;
  522. this.loading = false;
  523. });
  524. // 车间数据
  525. listAllWorkshop().then((response) => {
  526. this.workshopOption = response.data.map((item)=>{
  527. return {
  528. label:item.workshopName,
  529. value:item.workshopId,
  530. key:item.workshopCode,
  531. }
  532. });
  533. })
  534. },
  535. // 获取硬件类型-所有
  536. getHardwareTypeList() {
  537. getHardwareTypeListAPI(this.queryTypeParams).then(response => {
  538. console.log(response,'Type')
  539. this.hardwareTypeOption=response.data.map((item) => {
  540. return{
  541. label:item.hardwareTypeName,
  542. value: item.hardwareTypeCode,
  543. key:item.id,
  544. }
  545. })
  546. })
  547. },
  548. // 硬件类型下拉
  549. hardTypeChange(val){
  550. console.log(val,'下拉类型')
  551. const TypeId=this.hardwareTypeOption.find((item)=>{
  552. return item.value==val?item.key:null;
  553. })
  554. this.form.hardwareTypeId=TypeId.key
  555. this.form.hardwareTypeCode=TypeId.value
  556. this.form.hardwareTypeName=TypeId.label
  557. console.log(this.form.hardwareTypeId,'hardwareTypeId')
  558. },
  559. // 车间下拉 --新增表单
  560. workShopChange(val){
  561. console.log(val,'val')
  562. this.form.workshopId=val
  563. const item=this.workshopOption.find((item)=>{
  564. return item.value==val?item.key:null;
  565. })
  566. console.log(item,'item')
  567. this.form.workshopCode=item.key
  568. this.form.workshopName=item.label
  569. },
  570. workShopChangequery(val){
  571. console.log(val,'查询下拉')
  572. this.queryParams.workshopId=val
  573. const item=this.workshopOption.find((item)=>{
  574. return item.value==val?item.key:null;
  575. })
  576. this.queryParams.workshopCode=item.key
  577. this.queryParams.workshopName=item.label
  578. },
  579. // 取消按钮
  580. cancel() {
  581. this.open = false;
  582. this.reset();
  583. },
  584. // 表单重置
  585. reset() {
  586. this.form = {
  587. hardwareCode:'',
  588. hardwareName:'',
  589. status:'',
  590. hardwareTypeName:'',
  591. hardwareSpec:'',
  592. createTime:'',
  593. workshopName:'',
  594. workshopId: '',
  595. workshopCode: null,
  596. };
  597. this.autoGenFlag = false;
  598. this.resetForm("form");
  599. },
  600. /** 搜索按钮操作 */
  601. handleQuery() {
  602. this.queryParams.current = 1;
  603. this.getList();
  604. },
  605. /** 重置按钮操作 */
  606. resetQuery() {
  607. this.queryParams.workshopCode=""
  608. this.queryParams.workshopName=""
  609. this.queryParams.workshopId=""
  610. this.createTime="";//之所以不把这个值放到queryParams是因为会被携带到参数里create Time[0]这样的内容携带进去
  611. this.queryParams.startTime=""
  612. this.queryParams.endTime=""
  613. this.resetForm("queryForm");
  614. this.handleQuery();
  615. },
  616. // 多选框选中数据
  617. handleSelectionChange(selection) {
  618. this.ids = selection.map((item) => item.id);
  619. this.single = selection.length !== 1;
  620. this.multiple = !selection.length;
  621. },
  622. /** 新增按钮操作 */
  623. handleAdd() {
  624. this.reset();
  625. this.open = true;
  626. this.EditId=null
  627. this.title = "新增硬件信息";
  628. },
  629. /** 修改按钮操作 */
  630. handleUpdate(row) {
  631. this.reset();
  632. this.EditId = row.id || this.ids;
  633. getHardwareInfo(this.EditId).then((response) => {
  634. this.form = response.data;
  635. this.open = true;
  636. this.title = "编辑硬件信息";
  637. });
  638. },
  639. /** 提交按钮 */
  640. submitForm() {
  641. this.$refs["form"].validate((valid) => {
  642. if (valid) {
  643. if (this.EditId != null) {
  644. updateHardware(this.form).then((response) => {
  645. this.$modal.msgSuccess("修改成功");
  646. this.open = false;
  647. this.getList();
  648. });
  649. } else {
  650. console.log(this.form,'form')
  651. addHardware(this.form).then((response) => {
  652. this.$modal.msgSuccess("新增成功");
  653. this.open = false;
  654. this.EditId=null
  655. this.getList();
  656. });
  657. }
  658. }
  659. });
  660. },
  661. /** 删除按钮操作 */
  662. handleDelete(row) {
  663. const repairIds = row.id || this.ids;
  664. this.$modal
  665. .confirm('是否确认删除硬件编号为"' + repairIds + '"的数据项?')
  666. .then(function () {
  667. return delHardware(repairIds);
  668. })
  669. .then(() => {
  670. this.getList();
  671. this.$modal.msgSuccess("删除成功");
  672. })
  673. .catch(() => {
  674. });
  675. },
  676. /** 导出按钮操作 */
  677. handleExport() {
  678. this.download(
  679. "dv/repair/export",
  680. {
  681. ...this.queryParams,
  682. },
  683. `repair_${new Date().getTime()}.xlsx`
  684. );
  685. },
  686. //自动生成编码
  687. handleAutoGenChange(autoGenFlag) {
  688. if (autoGenFlag) {
  689. genCode("REPAIR_CODE").then((response) => {
  690. this.form.repairCode = response;
  691. });
  692. } else {
  693. this.form.repairCode = null;
  694. }
  695. },
  696. },
  697. };
  698. </script>
  699. <style scoped>
  700. .imgstatus {
  701. position: relative;
  702. top: 1px;
  703. left: 0px;
  704. }
  705. /deep/ .el-radio__inner {
  706. border-radius: 2px;
  707. }
  708. /deep/.el-radio__input.is-checked .el-radio__inner::after {
  709. content: "";
  710. width: 8px;
  711. height: 3px;
  712. border: 1px solid white;
  713. border-top: transparent;
  714. border-right: transparent;
  715. text-align: center;
  716. display: block;
  717. position: absolute;
  718. top: 3px;
  719. left: 2px;
  720. transform: rotate(-45deg);
  721. border-radius: 0pc;
  722. background: none;
  723. }
  724. </style>