Browse Source

1.编写和对接设备台账管理、设备采集参数管理、设备二维码维护、备件库存管理、出入库管理页面功能

2.编写和对接报警管理模块(报警编码管理、仪表报警规则、报警记录)页面功能
dev
selia-zx 2 months ago
parent
commit
3b03187098
  1. 44
      src/api/alarm/alarmCode.js
  2. 18
      src/api/alarm/alarmRecord.js
  3. 44
      src/api/alarm/alarmRule.js
  4. 10
      src/api/device/comm.js
  5. 58
      src/api/device/gather.js
  6. 58
      src/api/device/qrCode.js
  7. 44
      src/api/device/spare.js
  8. 19
      src/api/device/spareInOut.js
  9. 1
      src/assets/icons/svg/Inbound.svg
  10. 1
      src/assets/icons/svg/Outbound.svg
  11. 1
      src/assets/icons/svg/alarm.svg
  12. 1
      src/assets/icons/svg/alarmCode.svg
  13. 1
      src/assets/icons/svg/alarmRecord.svg
  14. 1
      src/assets/icons/svg/alarmRule.svg
  15. 1
      src/assets/icons/svg/spare.svg
  16. 1
      src/assets/icons/svg/spareInOut.svg
  17. 8
      src/utils/global.js
  18. 495
      src/views/alarm/alarmCode/index.vue
  19. 379
      src/views/alarm/alarmRecord/index.vue
  20. 812
      src/views/alarm/alarmRule/index.vue
  21. 20
      src/views/device/comm/index.vue
  22. 10
      src/views/device/gateway/index.vue
  23. 871
      src/views/device/gather/index.vue
  24. 76
      src/views/device/ledger/index.vue
  25. 10
      src/views/device/maintenance/index.vue
  26. 556
      src/views/device/qrCode/index.vue
  27. 461
      src/views/device/spare/index.vue
  28. 436
      src/views/device/spareInOut/index.vue

44
src/api/alarm/alarmCode.js

@ -0,0 +1,44 @@
import request from "@/utils/request";
// 查询报警编码列表
export function alarmCodeList(query) {
return request({
url: "/alarm/ac/list",
method: "get",
params: query,
});
}
// 根据id查询编码信息
export function getAlarmCode(acId) {
return request({
url: "/alarm/ac/" + acId,
method: "get",
});
}
// 新增报警编码
export function addAlarmCode(data) {
return request({
url: "/alarm/ac",
method: "post",
data: data,
});
}
// 修改报警编码信息
export function updateAlarmCode(data) {
return request({
url: "/alarm/ac",
method: "put",
data: data,
});
}
// 删除报警编码信息
export function delAlarmCode(acIds) {
return request({
url: "/alarm/ac/" + acIds,
method: "delete",
});
}

18
src/api/alarm/alarmRecord.js

@ -0,0 +1,18 @@
import request from "@/utils/request";
// 查询报警记录列表
export function alarmRecordList(query) {
return request({
url: "/alarm/ard/list",
method: "get",
params: query,
});
}
// 根据id查询报警记录信息
export function getAlarmRecord(ardId) {
return request({
url: "/alarm/ard/" + ardId,
method: "get",
});
}

44
src/api/alarm/alarmRule.js

@ -0,0 +1,44 @@
import request from "@/utils/request";
// 查询仪表报警规则列表
export function alarmRuleList(query) {
return request({
url: "/alarm/ar/list",
method: "get",
params: query,
});
}
// 根据id查询报警规则信息
export function getAlarmRule(arId) {
return request({
url: "/alarm/ar/" + arId,
method: "get",
});
}
// 新增报警规则
export function addAlarmRule(data) {
return request({
url: "/alarm/ar",
method: "post",
data: data,
});
}
// 修改报警规则信息
export function updateAlarmRule(data) {
return request({
url: "/alarm/ar",
method: "put",
data: data,
});
}
// 删除报警编码信息
export function delAlarmRule(arIds) {
return request({
url: "/alarm/ar/" + arIds,
method: "delete",
});
}

10
src/api/device/comm.js

@ -9,10 +9,10 @@ export function cmpList(query) {
})
}
// 根据id查询网关信息
export function getCMP(cpmId) {
// 根据id查询设备参数信息
export function getCMP(cmpId) {
return request({
url: '/device/cmp/' + cpmId,
url: '/device/cmp/' + cmpId,
method: 'get'
})
}
@ -36,9 +36,9 @@ export function updateCMP(data) {
}
// 删除设备参数
export function delCMP(cpmIds) {
export function delCMP(cmpIds) {
return request({
url: '/device/cmp/' + cpmIds,
url: '/device/cmp/' + cmpIds,
method: 'delete'
})
}

58
src/api/device/gather.js

@ -1,44 +1,44 @@
import request from '@/utils/request'
import request from "@/utils/request";
// 查询网关列表
export function gatewayList(query) {
// 查询设备采集参数列表
export function cpmList(query) {
return request({
url: '/device/gateway/list',
method: 'get',
params: query
})
url: "/device/cpm/list",
method: "get",
params: query,
});
}
// 根据id查询网关信息
export function getGateway(gwId) {
// 根据id查询设备采集参数信息
export function getCPM(cpmId) {
return request({
url: '/device/gateway/' + gwId,
method: 'get'
})
url: "/device/cpm/" + cpmId,
method: "get",
});
}
// 新增网关参数
export function addGateway(data) {
// 新增设备采集参数
export function addCPM(data) {
return request({
url: '/device/gateway',
method: 'post',
data: data
})
url: "/device/cpm",
method: "post",
data: data,
});
}
// 修改网关参数
export function updateGateway(data) {
// 修改设备采集参数
export function updateCPM(data) {
return request({
url: '/device/gateway',
method: 'put',
data: data
})
url: "/device/cpm",
method: "put",
data: data,
});
}
// 删除网关参数
export function delGateway(gwIds) {
// 删除设备采集参数
export function delCPM(cpmIds) {
return request({
url: '/device/gateway/' + gwIds,
method: 'delete'
})
url: "/device/cpm/" + cpmIds,
method: "delete",
});
}

58
src/api/device/qrCode.js

@ -1,44 +1,44 @@
import request from '@/utils/request'
import request from "@/utils/request";
// 查询网关列表
export function gatewayList(query) {
// 批量创建二维码
export function createCode(query) {
return request({
url: '/device/gateway/list',
method: 'get',
params: query
})
url: "/device/qr/create",
method: "get",
params: query,
});
}
// 根据id查询网关信息
export function getGateway(gwId) {
//获取二维码列表数据
export function codeList(query) {
return request({
url: '/device/gateway/' + gwId,
method: 'get'
})
url: "/device/qr/list",
method: "get",
params: query,
});
}
// 新增网关参数
export function addGateway(data) {
// 根据id查询二维码数据信息
export function getCode(qrId) {
return request({
url: '/device/gateway',
method: 'post',
data: data
})
url: "/device/qr/" + qrId,
method: "get",
});
}
// 修改网关参数
export function updateGateway(data) {
// 修改二维码
export function updateCode(data) {
return request({
url: '/device/gateway',
method: 'put',
data: data
})
url: "/device/qr",
method: "put",
data: data,
});
}
// 删除网关参数
export function delGateway(gwIds) {
// 删除二维码
export function delCode(qrIds) {
return request({
url: '/device/gateway/' + gwIds,
method: 'delete'
})
url: "/device/qr/" + qrIds,
method: "delete",
});
}

44
src/api/device/spare.js

@ -0,0 +1,44 @@
import request from "@/utils/request";
// 查询备件库存列表
export function spareList(query) {
return request({
url: "/device/spare/list",
method: "get",
params: query,
});
}
// 根据id查询备件库存信息
export function getSpare(spareId) {
return request({
url: "/device/spare/" + spareId,
method: "get",
});
}
// 新增备件库存
export function addSpare(data) {
return request({
url: "/device/spare",
method: "post",
data: data,
});
}
// 修改备件库存
export function updateSpare(data) {
return request({
url: "/device/spare",
method: "put",
data: data,
});
}
// 删除备件库存
export function delSpare(spareIds) {
return request({
url: "/device/spare/" + spareIds,
method: "delete",
});
}

19
src/api/device/spareInOut.js

@ -0,0 +1,19 @@
import request from "@/utils/request";
// 查询出入库列表
export function spareInOutList(query) {
return request({
url: "/device/spareInOut/list",
method: "get",
params: query,
});
}
// 添加出入库信息
export function addSpareInOut(data) {
return request({
url: "/device/spareInOut",
method: "post",
data: data,
});
}

1
src/assets/icons/svg/Inbound.svg

@ -0,0 +1 @@
<?xml version="1.0" standalone="no"?><!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd"><svg t="1741069071863" class="icon" viewBox="0 0 1024 1024" version="1.1" xmlns="http://www.w3.org/2000/svg" p-id="29311" xmlns:xlink="http://www.w3.org/1999/xlink" width="200" height="200"><path d="M271.058824 810.164706h481.882352v-60.235294h-481.882352z" fill="" p-id="29312"></path><path d="M180.705882 57.223529c-66.258824 0-120.470588 54.211765-120.470588 120.470589v662.588235c0 66.258824 54.211765 120.470588 120.470588 120.470588h662.588236c66.258824 0 120.470588-54.211765 120.470588-120.470588v-662.588235c0-66.258824-54.211765-120.470588-120.470588-120.470589h-90.352942v60.235295h90.352942c36.141176 0 60.235294 24.094118 60.235294 60.235294v662.588235c0 30.117647-24.094118 60.235294-60.235294 60.235294h-662.588236c-30.117647 0-60.235294-24.094118-60.235294-60.235294v-662.588235c0-30.117647 24.094118-60.235294 60.235294-60.235294h102.4v-60.235295h-102.4z" fill="" p-id="29313"></path><path d="M481.882353 551.152941v-373.458823h60.235294v373.458823l102.4-108.423529 42.164706 42.164706-174.682353 180.705882-180.705882-180.705882 42.164706-42.164706 108.423529 108.423529z" fill="" p-id="29314"></path></svg>

After

Width:  |  Height:  |  Size: 1.2 KiB

1
src/assets/icons/svg/Outbound.svg

@ -0,0 +1 @@
<?xml version="1.0" standalone="no"?><!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd"><svg t="1741069089597" class="icon" viewBox="0 0 1024 1024" version="1.1" xmlns="http://www.w3.org/2000/svg" p-id="30472" xmlns:xlink="http://www.w3.org/1999/xlink" width="200" height="200"><path d="M271.058824 810.164706h481.882352v-60.235294h-481.882352z" fill="" p-id="30473"></path><path d="M180.705882 57.223529c-66.258824 0-120.470588 54.211765-120.470588 120.470589v662.588235c0 66.258824 54.211765 120.470588 120.470588 120.470588h662.588236c66.258824 0 120.470588-54.211765 120.470588-120.470588v-662.588235c0-66.258824-54.211765-120.470588-120.470588-120.470589h-90.352942v60.235295h90.352942c36.141176 0 60.235294 24.094118 60.235294 60.235294v662.588235c0 30.117647-24.094118 60.235294-60.235294 60.235294h-662.588236c-30.117647 0-60.235294-24.094118-60.235294-60.235294v-662.588235c0-30.117647 24.094118-60.235294 60.235294-60.235294h102.4v-60.235295h-102.4z" fill="" p-id="30474"></path><path d="M548.141176 298.164706v373.458823h-60.235294v-373.458823l-102.4 108.423529-42.164706-42.164706 174.682353-180.705882 180.705883 180.705882-42.164706 42.164706-108.42353-108.423529z" fill="" p-id="30475"></path></svg>

After

Width:  |  Height:  |  Size: 1.2 KiB

1
src/assets/icons/svg/alarm.svg

@ -0,0 +1 @@
<?xml version="1.0" standalone="no"?><!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd"><svg t="1741138490250" class="icon" viewBox="0 0 1025 1024" version="1.1" xmlns="http://www.w3.org/2000/svg" p-id="1495" xmlns:xlink="http://www.w3.org/1999/xlink" width="200.1953125" height="200"><path d="M996.602007 0H25.685619C11.986622 0 0 11.986622 0 25.685619v972.628762c0 13.698997 11.986622 25.685619 25.685619 25.685619h972.628762c13.698997 0 25.685619-11.986622 25.685619-25.685619V25.685619C1022.287625 11.986622 1010.301003 0 996.602007 0zM467.478261 171.237458c0-23.973244 20.548495-42.809365 44.521739-42.809364s44.521739 18.83612 44.521739 42.809364v102.742475c0 23.973244-20.548495 42.809365-44.521739 42.809365s-44.521739-18.83612-44.521739-42.809365v-102.742475z m-308.227425 229.458194c-18.83612-15.411371-23.973244-42.809365-8.561873-61.645485 15.411371-18.83612 42.809365-22.26087 63.35786-8.561873l83.906354 63.35786c18.83612 15.411371 23.973244 42.809365 8.561873 61.645485-8.561873 10.274247-22.26087 17.123746-35.959866 17.123746-10.274247 0-18.83612-3.424749-27.397993-8.561873l-83.906355-63.35786zM770.568562 844.200669c0 15.411371-13.698997 27.397993-29.110368 27.397993H282.541806c-15.411371 0-29.110368-11.986622-29.110368-27.397993v-116.441472c0-15.411371 13.698997-27.397993 29.110368-27.397993h39.384615c15.411371 0 29.110368-11.986622 29.110368-27.397993V491.451505c0-73.632107 61.645485-131.852843 136.989967-131.852843h49.658863c75.344482 0 136.989967 59.93311 136.989966 131.852843v181.511706c0 15.411371 13.698997 27.397993 29.110368 27.397993h39.384616c15.411371 0 29.110368 11.986622 29.110367 27.397993v116.441472z m92.468227-443.505017l-83.906354 63.35786c-8.561873 6.849498-17.123746 8.561873-27.397994 8.561873-13.698997 0-27.397993-5.137124-35.959866-17.123746-15.411371-18.83612-11.986622-46.234114 8.561873-61.645485l83.906355-63.35786c18.83612-15.411371 47.946488-11.986622 63.357859 8.561873 15.411371 18.83612 11.986622 46.234114-8.561873 61.645485z" fill="" p-id="1496"></path></svg>

After

Width:  |  Height:  |  Size: 2.0 KiB

1
src/assets/icons/svg/alarmCode.svg

@ -0,0 +1 @@
<?xml version="1.0" standalone="no"?><!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd"><svg t="1741139118779" class="icon" viewBox="0 0 1024 1024" version="1.1" xmlns="http://www.w3.org/2000/svg" p-id="19352" xmlns:xlink="http://www.w3.org/1999/xlink" width="200" height="200"><path d="M786.0224 741.5808a35.6864 35.6864 0 1 0 13.6192 2.6624 35.7376 35.7376 0 0 0-13.6704-2.6624h0.0512z" p-id="19353" fill=""></path><path d="M786.0224 553.472a223.8976 223.8976 0 1 0 223.8464 223.744 224.5632 224.5632 0 0 0-223.8464-223.744z m124.4672 241.664v0.512a25.6 25.6 0 0 1-18.0224 18.8416l-3.584 0.9728a26.88 26.88 0 0 0-18.432 31.6416l1.1264 3.7888a25.856 25.856 0 0 1-7.168 24.9856c-4.6592 3.6352-9.6768 6.912-14.848 9.7792-5.12 3.072-10.496 5.7856-15.9744 8.0896h-0.512a25.5488 25.5488 0 0 1-25.0368-5.9904l-2.2528-2.4576a26.8288 26.8288 0 0 0-36.6592 0l-2.304 2.4576a25.6 25.6 0 0 1-26.2144 6.3488 171.3664 171.3664 0 0 1-30.8224-17.7664l-0.4096-0.4608a25.9072 25.9072 0 0 1-7.168-24.9856l1.0752-3.584a26.624 26.624 0 0 0-2.9184-19.5584 26.3168 26.3168 0 0 0-15.36-12.288l-3.328-0.8192a25.6 25.6 0 0 1-18.5344-19.456 159.0272 159.0272 0 0 1 0-35.6352v-0.6144a25.4464 25.4464 0 0 1 17.9712-18.7904l3.7888-0.8704a27.136 27.136 0 0 0 18.3296-31.744l-1.1264-3.6864a25.8048 25.8048 0 0 1 7.1168-25.0368c4.6592-3.6864 9.6768-7.0144 14.8992-9.8304 5.12-3.072 10.4448-5.7856 15.9744-8.0384h0.512a25.4976 25.4976 0 0 1 25.0368 6.0416l2.6112 2.7648a26.9312 26.9312 0 0 0 36.608 0l2.56-2.7136a25.5488 25.5488 0 0 1 24.9344-6.0416h1.0752a117.76 117.76 0 0 1 15.4624 7.936c5.2224 2.7648 10.1888 6.0416 14.848 9.6768h0.4096a25.856 25.856 0 0 1 7.168 24.9344v0.4608l-1.2288 3.4304a26.88 26.88 0 0 0 18.2272 31.5904l3.6352 0.8192a25.7024 25.7024 0 0 1 18.0736 18.8416l1.024 12.8v5.5296c0.256 6.0416 0.1024 12.1344-0.512 18.176z" p-id="19354" fill=""></path><path d="M780.9536 495.36c63.232 0 124.4672 22.3744 172.8 63.232V133.4272A132.8128 132.8128 0 0 0 820.9408 0H147.5584A133.6832 133.6832 0 0 0 14.1312 133.4272V911.36c2.3552 94.6176 112.2304 145.7152 187.4944 88.7296l192.512-146.2784 49.3568-37.6832c14.2336-10.752 32.2048-15.36 49.8688-12.9024 7.8848 1.3312 15.4624 3.9936 22.528 7.7824a265.216 265.216 0 0 1-4.1984-46.592 269.824 269.824 0 0 1 269.2608-269.056z m-609.28-316.7232h645.7344a42.752 42.752 0 0 1-0.5632 85.504H171.6736a42.8032 42.8032 0 0 1 0-85.504z m0 342.5792a42.8032 42.8032 0 0 1 0-85.504h400.7424a42.8032 42.8032 0 1 1 0 85.504H171.6736z" p-id="19355" fill=""></path></svg>

After

Width:  |  Height:  |  Size: 2.5 KiB

1
src/assets/icons/svg/alarmRecord.svg

@ -0,0 +1 @@
<?xml version="1.0" standalone="no"?><!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd"><svg t="1741138846834" class="icon" viewBox="0 0 1024 1024" version="1.1" xmlns="http://www.w3.org/2000/svg" p-id="8039" xmlns:xlink="http://www.w3.org/1999/xlink" width="200" height="200"><path d="M509.952064 209.146752c31.763487 0 58.427614-25.619679 58.427614-57.342207V57.374217c0-31.763487-26.623168-58.427614-58.427614-57.342208-31.783966 0-58.427614 25.640158-58.427614 57.342208v93.365401A58.386655 58.386655 0 0 0 509.952064 209.146752z m182.450617-58.407134c0 31.763487 26.623168 58.407134 58.407134 57.342208 16.383488 0 30.71904-5.11984 42.023646-17.427936 11.284127-11.263648 17.427935-25.619679 16.383488-39.955231V57.374217c0-31.763487-26.623168-58.427614-58.427614-57.342208-31.763487 0-58.407134 25.640158-58.407134 57.342208h1.003489v93.365401z m-423.328847 58.407134c31.783966 0 58.427614-25.619679 58.427613-57.342207V57.374217c0-31.763487-25.619679-57.342207-58.427613-57.342208-31.763487 0-58.407134 25.640158-58.407134 57.342208v93.365401c0 32.766976 27.667615 58.407134 58.407134 58.407134z m0 0M512.143356 775.708242A120.336718 120.336718 0 1 0 391.827117 655.371523a120.336718 120.336718 0 0 0 120.316239 120.336719z m0-206.268112a86.013311 86.013311 0 1 1-86.013312 86.013311 86.013311 86.013311 0 0 1 86.013312-86.095229z" fill="" p-id="8040"></path><path d="M930.188527 93.335973h-90.109183v57.342207c0 46.119518-38.910784 83.965375-86.115708 83.965375s-86.013311-36.862848-86.013311-83.965375v-57.342207H598.013311v57.342207c0 46.119518-38.910784 83.965375-86.013311 83.965375s-86.013311-36.862848-86.013311-83.965375v-57.342207h-69.629824v57.342207c0 46.119518-38.910784 83.965375-86.115708 83.965375s-86.013311-36.862848-86.013311-83.965375v-57.342207h-90.109183c-31.783966 0-58.427614 25.619679-58.427614 57.342207V966.657793c0 31.783966 26.623168 57.342207 58.427614 57.342207H927.116623c31.763487 0 58.427614-25.619679 58.427614-57.342207h3.071904V150.739618c0-31.783966-25.640158-57.403646-58.427614-57.403645zM656.092776 381.582962l20.213128-27.851929a34.384845 34.384845 0 0 1 48.024099-7.597843 34.384845 34.384845 0 0 1 7.577363 48.044578l-20.192649 27.83145a34.384845 34.384845 0 1 1-55.621941-40.426256z m-178.313786-69.998452a34.384845 34.384845 0 0 1 68.749211 0v34.384845a34.384845 34.384845 0 1 1-68.749211 0z m34.364366 137.518901A206.268112 206.268112 0 0 1 718.431947 655.371523v171.903747a34.405324 34.405324 0 0 1-34.405325 34.384845H340.260089a34.405324 34.405324 0 0 1-34.384846-34.384845V655.371523a206.288591 206.288591 0 0 1 206.268113-206.268112z m-225.928298-80.565801a34.323407 34.323407 0 0 1 13.74165-22.40442 34.384845 34.384845 0 0 1 48.024099 7.638801l20.213128 27.810971A34.384845 34.384845 0 1 1 312.571994 421.906821l-20.213128-27.81097a34.343886 34.343886 0 0 1-6.143808-25.558241z m-61.581435 212.043291l-32.766976-10.628787a34.364366 34.364366 0 1 1 21.216617-65.390596l32.766976 10.649267a34.384845 34.384845 0 1 1-21.237096 65.370116z m528.16269 384.21327h-481.264956a34.384845 34.384845 0 1 1 0-68.749211h481.264956a34.384845 34.384845 0 1 1 0 68.749211z m79.255122-394.842057l-32.664579 10.649267a34.384845 34.384845 0 1 1-21.278055-65.411076l32.766976-10.628787a34.384845 34.384845 0 1 1 21.257576 65.390596z" fill="" p-id="8041"></path></svg>

After

Width:  |  Height:  |  Size: 3.3 KiB

1
src/assets/icons/svg/alarmRule.svg

@ -0,0 +1 @@
<?xml version="1.0" standalone="no"?><!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd"><svg t="1741138938204" class="icon" viewBox="0 0 1024 1024" version="1.1" xmlns="http://www.w3.org/2000/svg" p-id="13700" xmlns:xlink="http://www.w3.org/1999/xlink" width="200" height="200"><path d="M810.666667 128a85.333333 85.333333 0 0 1 85.333333 85.333333v597.333334a85.333333 85.333333 0 0 1-85.333333 85.333333H213.333333a85.333333 85.333333 0 0 1-85.333333-85.333333V213.333333a85.333333 85.333333 0 0 1 85.333333-85.333333h597.333334z m-250.496 109.354667a57.6 57.6 0 0 0-99.285334 5.077333L204.330667 737.237333l-2.474667 5.333334a57.6 57.6 0 0 0 53.589333 78.762666h513.109334l5.546666-0.256a57.6 57.6 0 0 0 45.568-83.84L563.114667 242.432zM512 282.837333l245.973333 474.496H265.984L512 282.837333zM640 640H384l-3.84 0.341333A21.333333 21.333333 0 0 0 384 682.666667h256l3.84-0.341334A21.333333 21.333333 0 0 0 640 640z m-64-106.666667h-128l-3.84 0.341334a21.333333 21.333333 0 0 0 3.84 42.325333h128l3.84-0.341333a21.333333 21.333333 0 0 0-3.84-42.325334zM554.666667 426.666667h-85.333334l-3.84 0.341333A21.333333 21.333333 0 0 0 469.333333 469.333333h85.333334l3.84-0.341333A21.333333 21.333333 0 0 0 554.666667 426.666667z" fill="" p-id="13701"></path></svg>

After

Width:  |  Height:  |  Size: 1.3 KiB

1
src/assets/icons/svg/spare.svg

@ -0,0 +1 @@
<?xml version="1.0" standalone="no"?><!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd"><svg t="1741058212305" class="icon" viewBox="0 0 1024 1024" version="1.1" xmlns="http://www.w3.org/2000/svg" p-id="3595" xmlns:xlink="http://www.w3.org/1999/xlink" width="200" height="200"><path d="M301.056 878.592l180.224-96.256V624.64l-180.224 81.92v172.032z m-30.72-225.28L460.8 567.296 270.336 481.28 79.872 567.296l190.464 86.016z m512 225.28l180.224-96.256V624.64l-180.224 81.92v172.032z m-28.672-225.28l190.464-86.016-190.464-86.016L563.2 567.296l190.464 86.016zM542.72 505.856l180.224-81.92v-133.12l-180.224 81.92v133.12zM512 317.44l206.848-94.208L512 129.024l-206.848 94.208L512 317.44z m512 258.048v206.848c0 12.288-2.048 22.528-8.192 32.768-6.144 10.24-14.336 18.432-24.576 22.528l-210.944 112.64c-8.192 4.096-16.384 6.144-26.624 6.144s-18.432-2.048-26.624-6.144L516.096 839.68c-2.048 0-4.096 0-4.096-2.048 0 0-2.048 2.048-4.096 2.048L296.96 952.32c-8.192 4.096-16.384 6.144-26.624 6.144s-18.432-2.048-26.624-6.144L32.768 839.68c-10.24-6.144-18.432-12.288-24.576-22.528C2.048 806.912 0 796.672 0 784.384V575.488c0-12.288 4.096-24.576 10.24-34.816s16.384-18.432 26.624-24.576l204.8-92.16V225.28c0-12.288 4.096-24.576 10.24-34.816s16.384-18.432 26.624-24.576l210.944-96.256c8.192-4.096 14.336-4.096 22.528-4.096 8.192 0 16.384 2.048 24.576 4.096l210.944 96.256c10.24 6.144 20.48 12.288 26.624 24.576 6.144 10.24 10.24 22.528 10.24 34.816v198.656l204.8 92.16c12.288 6.144 20.48 14.336 26.624 24.576 4.096 10.24 8.192 22.528 8.192 34.816z" p-id="3596" fill=""></path></svg>

After

Width:  |  Height:  |  Size: 1.6 KiB

1
src/assets/icons/svg/spareInOut.svg

@ -0,0 +1 @@
<?xml version="1.0" standalone="no"?><!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd"><svg t="1741058258475" class="icon" viewBox="0 0 1121 1024" version="1.1" xmlns="http://www.w3.org/2000/svg" p-id="5686" xmlns:xlink="http://www.w3.org/1999/xlink" width="218.9453125" height="200"><path d="M 975.238 24.3322 H 146.286 l -146.286 243.81 v 731.429 h 1121.52 l -0.24381 -744.497 L 975.238 24.3322 Z M 243.81 121.905 h 633.905 l 146.286 195.048 H 146.286 l 97.5238 -195.048 Z m 195.048 682.618 H 292.571 v -195.048 H 195.048 l 146.286 -146.286 h 48.7619 l 146.286 146.286 H 438.857 v 195.048 Z m 292.571 48.7619 l -146.286 -146.286 h 97.5238 v -195.048 h 146.286 v 195.048 h 97.5238 l -146.286 146.286 h -48.7619 Z" fill="" p-id="5687"></path></svg>

After

Width:  |  Height:  |  Size: 796 B

8
src/utils/global.js

@ -0,0 +1,8 @@
// 图片url
export const imgUrl = "http://192.168.1.222:8080";
export default {
imgUrl,
};

495
src/views/alarm/alarmCode/index.vue

@ -0,0 +1,495 @@
<template>
<div class="app-container">
<div class="btn-condition">
<div class="condition-left" v-show="showSearch">
<el-form
:model="queryParams"
ref="queryForm"
size="small"
:inline="true"
label-width="68px"
>
<el-form-item label="消息编码" prop="msgCode">
<el-input
v-model="queryParams.msgCode"
placeholder="请输入消息编码"
clearable
@keyup.enter.native="handleQuery"
/>
</el-form-item>
<el-form-item label="采集类别" prop="status">
<el-select
v-model="queryParams.status"
placeholder="选择采集类别"
clearable
>
<el-option
v-for="dict in dict.type.alarm_collection_type"
:key="dict.value"
:label="dict.label"
:value="dict.value"
/>
</el-select>
</el-form-item>
<el-form-item label="事件类型" prop="eventType">
<el-select
v-model="queryParams.eventType"
placeholder="选择事件类型"
clearable
>
<el-option
v-for="dict in dict.type.alarm_event_type"
:key="dict.value"
:label="dict.label"
:value="dict.value"
/>
</el-select>
</el-form-item>
<el-form-item label="报警等级" prop="alarmLevel">
<el-select
v-model="queryParams.alarmLevel"
placeholder="选择报警等级"
clearable
>
<el-option
v-for="dict in dict.type.alarm_level"
:key="dict.value"
:label="dict.label"
:value="dict.value"
/>
</el-select>
</el-form-item>
</el-form>
<div class="primary-btn">
<el-button
type="primary"
icon="el-icon-search"
size="mini"
@click="handleQuery"
>搜索</el-button
>
</div>
<div class="cancel-btn">
<el-button
type="cancel"
icon="el-icon-refresh"
size="mini"
@click="resetQuery"
>重置</el-button
>
</div>
</div>
</div>
<el-row :gutter="10" class="mb8">
<el-col :span="1.5">
<div class="primary-btn" v-hasPermi="['system:post:add']">
<el-button
type="primary"
icon="el-icon-plus"
size="mini"
@click="handleAdd"
>新增</el-button
>
</div>
</el-col>
<el-col :span="1.5">
<div class="success-btn" v-hasPermi="['system:post:edit']">
<el-button
type="success"
icon="el-icon-edit"
size="mini"
:disabled="single"
@click="handleUpdate"
>修改</el-button
>
</div>
</el-col>
<el-col :span="1.5">
<div class="delete-btn" v-hasPermi="['system:post:remove']">
<el-button
type="delete"
icon="el-icon-delete"
size="mini"
:disabled="multiple"
@click="handleDelete"
>删除</el-button
>
</div>
</el-col>
<el-col :span="1.5">
<div class="warning-btn" v-hasPermi="['system:post:export']">
<el-button
type="warning"
icon="el-icon-download"
size="mini"
@click="handleExport"
>导出</el-button
>
</div>
</el-col>
<right-toolbar
:showSearch.sync="showSearch"
@queryTable="getList"
></right-toolbar>
</el-row>
<el-table
v-loading="loading"
:data="postList"
@selection-change="handleSelectionChange"
>
<el-table-column type="selection" width="55" align="center" />
<el-table-column label="消息编码" align="center" prop="msgCode" />
<el-table-column label="采集类别" align="center" prop="collectionType">
<template slot-scope="scope">
<dict-tag
:options="dict.type.alarm_collection_type"
:value="scope.row.collectionType"
/>
</template>
</el-table-column>
<el-table-column label="事件类型" align="center" prop="eventType">
<template slot-scope="scope">
<dict-tag
:options="dict.type.alarm_event_type"
:value="scope.row.eventType"
/>
</template>
</el-table-column>
<el-table-column label="报警等级" align="center" prop="alarmLevel">
<template slot-scope="scope">
<dict-tag
:options="dict.type.alarm_level"
:value="scope.row.alarmLevel"
/>
</template>
</el-table-column>
<el-table-column label="消息标题" align="center" prop="msgTitle" />
<el-table-column label="消息内容" align="center" prop="msgContent" />
<!-- <el-table-column
label="更新时间"
align="center"
prop="updateTime"
width="180"
>
<template slot-scope="scope">
<span>{{ parseTime(scope.row.updateTime) }}</span>
</template>
</el-table-column> -->
<el-table-column
label="操作"
align="center"
class-name="small-padding fixed-width"
>
<template slot-scope="scope">
<el-button
size="mini"
type="text"
icon="el-icon-edit"
@click="handleUpdate(scope.row)"
v-hasPermi="['system:post:edit']"
>修改</el-button
>
<el-button
size="mini"
type="text"
icon="el-icon-delete"
@click="handleDelete(scope.row)"
v-hasPermi="['system:post:remove']"
>删除</el-button
>
</template>
</el-table-column>
</el-table>
<pagination
v-show="total > 0"
:total="total"
:page.sync="queryParams.pageNum"
:limit.sync="queryParams.pageSize"
@pagination="getList"
/>
<!-- 添加或报警编码对话框 -->
<el-dialog :title="title" :visible.sync="open" width="700px" append-to-body>
<el-form ref="form" :model="form" :rules="rules" label-width="80px">
<el-row type="flex" justify="center">
<el-col :span="12">
<el-form-item label="消息编码" prop="msgCode">
<el-input v-model="form.msgCode" placeholder="请输入消息编码" />
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item label="采集类别" prop="collectionType">
<el-select
v-model="form.collectionType"
placeholder="请选择采集类别"
clearable
>
<el-option
v-for="dict in dict.type.alarm_collection_type"
:key="dict.value"
:label="dict.label"
:value="dict.value"
/>
</el-select>
</el-form-item>
</el-col>
</el-row>
<el-row type="flex" justify="center">
<el-col :span="12">
<el-form-item label="事件类型" prop="eventType">
<el-select
v-model="form.eventType"
placeholder="请选择事件类型"
clearable
>
<el-option
v-for="dict in dict.type.alarm_event_type"
:key="dict.value"
:label="dict.label"
:value="dict.value"
/>
</el-select> </el-form-item
></el-col>
<el-col :span="12">
<el-form-item label="报警等级" prop="alarmLevel">
<el-select
v-model="form.alarmLevel"
placeholder="请选择报警等级"
clearable
>
<el-option
v-for="dict in dict.type.alarm_level"
:key="dict.value"
:label="dict.label"
:value="dict.value"
/>
</el-select> </el-form-item
></el-col>
</el-row>
<el-row type="flex" justify="center">
<el-col :span="24">
<el-form-item label="消息标题" prop="msgTitle">
<el-input v-model="form.msgTitle" placeholder="请输入消息标题" />
</el-form-item>
</el-col>
</el-row>
<el-row type="flex" justify="center">
<el-col :span="24">
<el-form-item label="消息内容" prop="msgContent">
<el-input
v-model="form.msgContent"
type="textarea"
placeholder="请输入消息内容"
/>
</el-form-item>
</el-col>
</el-row>
</el-form>
<div slot="footer" class="dialog-footer">
<el-button @click="cancel"> </el-button>
<el-button type="primary" @click="submitForm"> </el-button>
</div>
</el-dialog>
</div>
</template>
<script>
import {
alarmCodeList,
getAlarmCode,
delAlarmCode,
addAlarmCode,
updateAlarmCode,
} from "@/api/alarm/alarmCode";
export default {
name: "alarmCode",
dicts: ["alarm_collection_type", "alarm_event_type", "alarm_level"],
data() {
return {
//
loading: true,
//
ids: [],
//
single: true,
//
multiple: true,
//
showSearch: true,
//
total: 0,
//
postList: [],
//
title: "",
//
open: false,
//
queryParams: {
pageNum: 1,
pageSize: 10,
msgCode: "",
collectionType: "",
eventType: "",
alarmLevel: "",
},
//
form: {},
//
rules: {
msgCode: [
{ required: true, message: "消息编码不能为空", trigger: "blur" },
],
collectionType: [
{ required: true, message: "请选择采集类别", trigger: "blur" },
],
eventType: [
{ required: true, message: "请选择事件类型", trigger: "blur" },
],
alarmLevel: [
{ required: true, message: "请选择报警等级", trigger: "blur" },
],
msgTitle: [
{ required: true, message: "消息标题不能为空", trigger: "blur" },
],
msgContent: [
{ required: true, message: "消息内容不能为空", trigger: "blur" },
],
},
};
},
created() {
this.getList();
},
methods: {
/** 查询报警编码列表 */
getList() {
this.loading = true;
alarmCodeList(this.queryParams).then((response) => {
this.postList = response.rows;
this.total = response.total;
this.loading = false;
});
},
//
cancel() {
this.open = false;
this.reset();
this.form.id = "";
},
//
reset() {
this.form = {
msgCode: "",
collectionType: "",
eventType: "",
alarmLevel: "",
msgTitle: "",
msgContent: "",
};
this.resetForm("form");
},
/** 搜索按钮操作 */
handleQuery() {
this.queryParams.pageNum = 1;
this.getList();
},
/** 重置按钮操作 */
resetQuery() {
this.resetForm("queryForm");
this.handleQuery();
},
//
handleSelectionChange(selection) {
this.ids = selection.map((item) => item.id);
this.single = selection.length != 1;
this.multiple = !selection.length;
},
/** 新增按钮操作 */
handleAdd() {
this.reset();
this.open = true;
this.title = "添加报警编码";
},
/** 修改按钮操作 */
handleUpdate(row) {
this.reset();
this.form.id = "";
const acId = row.id || this.ids;
console.log("");
getAlarmCode(acId).then((response) => {
// this.form = response.data;
this.form = {
id: response.data.id,
msgCode: response.data.msgCode,
collectionType:
response.data.collectionType !== null
? response.data.collectionType.toString()
: null,
eventType:
response.data.eventType !== null
? response.data.eventType.toString()
: null,
alarmLevel:
response.data.alarmLevel !== null
? response.data.alarmLevel.toString()
: null,
msgTitle: response.data.msgTitle,
msgContent: response.data.msgContent,
};
this.open = true;
this.title = "修改报警编码";
});
},
/** 提交按钮 */
submitForm: function () {
this.$refs["form"].validate((valid) => {
if (valid) {
if (this.form.id != undefined) {
updateAlarmCode(this.form).then((response) => {
this.$modal.msgSuccess("修改成功");
this.open = false;
this.getList();
});
} else {
console.log("新增参数", this.form);
addAlarmCode(this.form).then((response) => {
this.$modal.msgSuccess("新增成功");
this.open = false;
this.getList();
});
}
}
});
},
/** 删除按钮操作 */
handleDelete(row) {
const Ids = row.id || this.ids;
this.$modal
.confirm('是否确认删除报警编码编号为"' + Ids + '"的数据项?')
.then(function () {
return delAlarmCode(Ids);
})
.then(() => {
this.getList();
this.$modal.msgSuccess("删除成功");
})
.catch(() => {});
},
/** 导出按钮操作 */
handleExport() {
this.download(
"device/gateway/export",
{
...this.queryParams,
},
`post_${new Date().getTime()}.xlsx`
);
},
},
};
</script>

379
src/views/alarm/alarmRecord/index.vue

@ -0,0 +1,379 @@
<template>
<div class="app-container">
<div class="btn-condition">
<div class="condition-left" v-show="showSearch">
<el-form
:model="queryParams"
ref="queryForm"
size="small"
:inline="true"
label-width="68px"
>
<el-form-item label="设备名称" prop="deviceName">
<el-input
v-model="queryParams.deviceName"
placeholder="请输入设备名称"
clearable
@keyup.enter.native="handleQuery"
/>
</el-form-item>
<el-form-item label="报警类型" prop="alarmType">
<el-select
v-model="queryParams.alarmType"
placeholder="选择报警类型"
clearable
>
<el-option
v-for="dict in dict.type.alarm_type"
:key="dict.value"
:label="dict.label"
:value="dict.value"
/>
</el-select>
</el-form-item>
<el-form-item label="事件类型" prop="eventType">
<el-select
v-model="queryParams.eventType"
placeholder="选择事件类型"
clearable
>
<el-option
v-for="dict in dict.type.alarm_event_type"
:key="dict.value"
:label="dict.label"
:value="dict.value"
/>
</el-select>
</el-form-item>
<el-form-item label="报警等级" prop="alarmLevel">
<el-select
v-model="queryParams.alarmLevel"
placeholder="选择报警等级"
clearable
>
<el-option
v-for="dict in dict.type.alarm_level"
:key="dict.value"
:label="dict.label"
:value="dict.value"
/>
</el-select>
</el-form-item>
<el-form-item label="报警内容" prop="content">
<el-input
v-model="queryParams.content"
placeholder="请输入报警内容"
clearable
@keyup.enter.native="handleQuery"
/>
</el-form-item>
</el-form>
<div class="primary-btn">
<el-button
type="primary"
icon="el-icon-search"
size="mini"
@click="handleQuery"
>搜索</el-button
>
</div>
<div class="cancel-btn">
<el-button
type="cancel"
icon="el-icon-refresh"
size="mini"
@click="resetQuery"
>重置</el-button
>
</div>
<div class="warning-btn" v-hasPermi="['system:post:export']">
<el-button
type="warning"
icon="el-icon-download"
size="mini"
@click="handleExport"
>导出</el-button
>
</div>
</div>
</div>
<el-table v-loading="loading" :data="postList">
<el-table-column label="设备名称" align="center" prop="deviceName" />
<el-table-column label="仪表名称" align="center" prop="cpmName" />
<el-table-column label="报警类型" align="center" prop="alarmType">
<template slot-scope="scope">
<dict-tag
:options="dict.type.alarm_type"
:value="scope.row.alarmType"
/>
</template>
</el-table-column>
<el-table-column label="事件类型" align="center" prop="eventType">
<template slot-scope="scope">
<dict-tag
:options="dict.type.alarm_event_type"
:value="scope.row.eventType"
/>
</template>
</el-table-column>
<el-table-column label="报警等级" align="center" prop="alarmLevel">
<template slot-scope="scope">
<dict-tag
:options="dict.type.alarm_level"
:value="scope.row.alarmLevel"
/>
</template>
</el-table-column>
<el-table-column label="报警内容" align="center" prop="content" />
<!-- <el-table-column
label="更新时间"
align="center"
prop="updateTime"
width="180"
>
<template slot-scope="scope">
<span>{{ parseTime(scope.row.updateTime) }}</span>
</template>
</el-table-column> -->
<el-table-column
label="操作"
align="center"
class-name="small-padding fixed-width"
>
<template slot-scope="scope">
<el-button
size="mini"
type="text"
icon="el-icon-tickets"
@click="handleUpdate(scope.row)"
v-hasPermi="['system:post:edit']"
>详情</el-button
>
</template>
</el-table-column>
</el-table>
<pagination
v-show="total > 0"
:total="total"
:page.sync="queryParams.pageNum"
:limit.sync="queryParams.pageSize"
@pagination="getList"
/>
<!-- 修改报警记录对话框 -->
<el-dialog :title="title" :visible.sync="open" width="700px" append-to-body>
<el-form ref="form" :model="form" :rules="rules" label-width="80px">
<el-row type="flex" justify="center">
<el-col :span="12">
<el-form-item label="设备名称" prop="deviceName">
<el-input
v-model="form.deviceName"
placeholder="请输入设备名称"
readonly
/>
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item label="报警类型" prop="alarmType">
<el-select
v-model="form.alarmType"
placeholder="请选择报警类型"
disabled
>
<el-option
v-for="dict in dict.type.alarm_type"
:key="dict.value"
:label="dict.label"
:value="dict.value"
/>
</el-select>
</el-form-item>
</el-col>
</el-row>
<el-row type="flex" justify="center">
<el-col :span="12">
<el-form-item label="事件类型" prop="eventType">
<el-select
v-model="form.eventType"
placeholder="请选择事件类型"
disabled
>
<el-option
v-for="dict in dict.type.alarm_event_type"
:key="dict.value"
:label="dict.label"
:value="dict.value"
/>
</el-select> </el-form-item
></el-col>
<el-col :span="12">
<el-form-item label="报警等级" prop="alarmLevel">
<el-select
v-model="form.alarmLevel"
placeholder="请选择报警等级"
disabled
>
<el-option
v-for="dict in dict.type.alarm_level"
:key="dict.value"
:label="dict.label"
:value="dict.value"
/>
</el-select> </el-form-item
></el-col>
</el-row>
<el-row type="flex" justify="center">
<el-col :span="12">
<el-form-item label="仪表名称" prop="cpmName">
<el-input v-model="form.cpmName" readonly />
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item label="报警时间" prop="createTime">
<el-input v-model="form.createTime" readonly />
</el-form-item>
</el-col>
</el-row>
<el-row type="flex" justify="center">
<el-col :span="24">
<el-form-item label="报警内容" prop="content">
<el-input v-model="form.content" type="textarea" readonly />
</el-form-item>
</el-col>
</el-row>
</el-form>
<div slot="footer" class="dialog-footer">
<el-button @click="cancel"> </el-button>
</div>
</el-dialog>
</div>
</template>
<script>
import { alarmRecordList, getAlarmRecord } from "@/api/alarm/alarmRecord";
export default {
name: "alarmRecord",
dicts: ["alarm_type", , "alarm_type", "alarm_event_type", "alarm_level"],
data() {
return {
//
loading: true,
//
ids: [],
//
single: true,
//
multiple: true,
//
showSearch: true,
//
total: 0,
//
postList: [],
//
title: "",
//
open: false,
//
queryParams: {
pageNum: 1,
pageSize: 10,
alarmType: "",
deviceName: "",
eventType: "",
alarmLevel: "",
content: "",
},
//
form: {},
//
rules: {},
};
},
created() {
this.getList();
},
methods: {
/** 查询报警编码列表 */
getList() {
this.loading = true;
alarmRecordList(this.queryParams).then((response) => {
this.postList = response.rows;
this.total = response.total;
this.loading = false;
});
},
//
cancel() {
this.open = false;
this.reset();
this.form.id = "";
},
//
reset() {
this.form = {
msgCode: "",
collectionType: "",
eventType: "",
alarmLevel: "",
msgTitle: "",
msgContent: "",
};
this.resetForm("form");
},
/** 搜索按钮操作 */
handleQuery() {
this.queryParams.pageNum = 1;
this.getList();
},
/** 重置按钮操作 */
resetQuery() {
this.resetForm("queryForm");
this.handleQuery();
},
/** 修改按钮操作 */
handleUpdate(row) {
this.reset();
this.form.id = "";
const acId = row.id || this.ids;
console.log("");
getAlarmRecord(acId).then((response) => {
// this.form = response.data;
this.form = {
id: response.data.id,
deviceName: response.data.deviceName,
alarmType:
response.data.alarmType !== null
? response.data.alarmType.toString()
: null,
eventType:
response.data.eventType !== null
? response.data.eventType.toString()
: null,
alarmLevel:
response.data.alarmLevel !== null
? response.data.alarmLevel.toString()
: null,
cpmName: response.data.cpmName,
content: response.data.content,
createTime: response.data.createTime,
};
this.open = true;
this.title = "报警记录详情";
});
},
/** 导出按钮操作 */
handleExport() {
this.download(
"device/gateway/export",
{
...this.queryParams,
},
`post_${new Date().getTime()}.xlsx`
);
},
},
};
</script>

812
src/views/alarm/alarmRule/index.vue

@ -0,0 +1,812 @@
<template>
<div class="app-container">
<div class="btn-condition">
<div class="condition-left" v-show="showSearch">
<el-form
:model="queryParams"
ref="queryForm"
size="small"
:inline="true"
label-width="68px"
>
<el-form-item label="报警类型" prop="alarmType">
<el-select
v-model="queryParams.alarmType"
placeholder="选择报警类型"
clearable
>
<el-option
v-for="dict in dict.type.alarm_type"
:key="dict.value"
:label="dict.label"
:value="dict.value"
/>
</el-select>
</el-form-item>
<el-form-item label="事件类型" prop="eventType">
<el-select
v-model="queryParams.eventType"
placeholder="选择事件类型"
clearable
>
<el-option
v-for="dict in dict.type.alarm_event_type"
:key="dict.value"
:label="dict.label"
:value="dict.value"
/>
</el-select>
</el-form-item>
<el-form-item label="报警等级" prop="alarmLevel">
<el-select
v-model="queryParams.alarmLevel"
placeholder="选择报警等级"
clearable
>
<el-option
v-for="dict in dict.type.alarm_level"
:key="dict.value"
:label="dict.label"
:value="dict.value"
/>
</el-select>
</el-form-item>
</el-form>
<div class="primary-btn">
<el-button
type="primary"
icon="el-icon-search"
size="mini"
@click="handleQuery"
>搜索</el-button
>
</div>
<div class="cancel-btn">
<el-button
type="cancel"
icon="el-icon-refresh"
size="mini"
@click="resetQuery"
>重置</el-button
>
</div>
</div>
</div>
<el-row :gutter="10" class="mb8">
<el-col :span="1.5">
<div class="primary-btn" v-hasPermi="['system:post:add']">
<el-button
type="primary"
icon="el-icon-plus"
size="mini"
@click="handleAdd"
>新增</el-button
>
</div>
</el-col>
<el-col :span="1.5">
<div class="success-btn" v-hasPermi="['system:post:edit']">
<el-button
type="success"
icon="el-icon-edit"
size="mini"
:disabled="single"
@click="handleUpdate"
>修改</el-button
>
</div>
</el-col>
<el-col :span="1.5">
<div class="delete-btn" v-hasPermi="['system:post:remove']">
<el-button
type="delete"
icon="el-icon-delete"
size="mini"
:disabled="multiple"
@click="handleDelete"
>删除</el-button
>
</div>
</el-col>
<el-col :span="1.5">
<div class="warning-btn" v-hasPermi="['system:post:export']">
<el-button
type="warning"
icon="el-icon-download"
size="mini"
@click="handleExport"
>导出</el-button
>
</div>
</el-col>
<right-toolbar
:showSearch.sync="showSearch"
@queryTable="getList"
></right-toolbar>
</el-row>
<el-table
v-loading="loading"
:data="postList"
@selection-change="handleSelectionChange"
>
<el-table-column type="selection" width="55" align="center" />
<el-table-column label="报警类型" align="center" prop="alarmType">
<template slot-scope="scope">
<dict-tag
:options="dict.type.alarm_type"
:value="scope.row.alarmType"
/>
</template>
</el-table-column>
<el-table-column label="事件类型" align="center" prop="eventType">
<template slot-scope="scope">
<dict-tag
:options="dict.type.alarm_event_type"
:value="scope.row.eventType"
/>
</template>
</el-table-column>
<el-table-column label="报警等级" align="center" prop="alarmLevel">
<template slot-scope="scope">
<dict-tag
:options="dict.type.alarm_level"
:value="scope.row.alarmLevel"
/>
</template>
</el-table-column>
<el-table-column label="设备名称" align="center" prop="deviceName" />
<el-table-column label="仪表名称" align="center" prop="cpmId">
<template slot-scope="scope">
<dict-tag :options="dict.type.sys_mt_type" :value="scope.row.cpmId" />
</template>
</el-table-column>
<el-table-column
label="报警延时时间"
align="center"
prop="delayTimes"
width="110"
/>
<el-table-column label="时段设置" align="center" prop="timePeriodSet">
<template slot-scope="scope">
<span v-if="scope.row.timePeriodSet === 0">全时段</span>
<span v-if="scope.row.timePeriodSet === 1">自定义时段</span>
</template>
</el-table-column>
<el-table-column label="开始时段" align="center" prop="beginTime">
<template slot-scope="scope">
<span>{{ parseTime(scope.row.beginTime) }}</span>
</template>
</el-table-column>
<el-table-column label="结束时段" align="center" prop="endTime">
<template slot-scope="scope">
<span>{{ parseTime(scope.row.endTime) }}</span>
</template>
</el-table-column>
<el-table-column label="触发事件" align="center" prop="triggerEvent">
<template slot-scope="scope">
<span v-if="scope.row.triggerEvent === 0"></span>
<span v-if="scope.row.triggerEvent === 1"></span>
</template>
</el-table-column>
<el-table-column label="条件1" align="center" prop="condition1" />
<el-table-column label="阈值1" align="center" prop="threshold1" />
<el-table-column label="条件2" align="center" prop="condition2" />
<el-table-column label="阈值2" align="center" prop="threshold2" />
<!-- <el-table-column label="能源节点" align="center" prop="energyNode" />
<el-table-column label="能源类型" align="center" prop="energyType" /> -->
<el-table-column label="状态" align="center" prop="status">
<template slot-scope="scope">
<span
:class="getStatusClass(scope.row.status)"
v-if="scope.row.status === 0"
>已启用</span
>
<span
:class="getStatusClass(scope.row.status)"
v-if="scope.row.status === 1"
>未启用</span
>
</template>
</el-table-column>
<el-table-column
label="操作"
align="center"
class-name="small-padding fixed-width"
>
<template slot-scope="scope">
<el-button
size="mini"
type="text"
icon="el-icon-edit"
@click="handleUpdate(scope.row)"
v-hasPermi="['system:post:edit']"
>修改</el-button
>
<el-button
size="mini"
type="text"
icon="el-icon-delete"
@click="handleDelete(scope.row)"
v-hasPermi="['system:post:remove']"
>删除</el-button
>
</template>
</el-table-column>
</el-table>
<pagination
v-show="total > 0"
:total="total"
:page.sync="queryParams.pageNum"
:limit.sync="queryParams.pageSize"
@pagination="getList"
/>
<!-- 添加或报警规则对话框 -->
<el-dialog :title="title" :visible.sync="open" width="700px" append-to-body>
<el-form ref="form" :model="form" :rules="rules" label-width="110px">
<el-row type="flex" justify="center">
<el-col :span="12">
<el-form-item label="设备名称" prop="ledgerId">
<el-select
v-model="form.ledgerId"
placeholder="请选择设备类型"
clearable
@change="handleDevice"
>
<el-option
v-for="item in devices"
:key="item.id"
:label="item.deviceName"
:value="item.id"
/>
</el-select>
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item label="仪表名称" prop="cpmId">
<el-select
v-model="form.cpmId"
placeholder="请选择仪表类型"
clearable
@change="handleMeter"
>
<el-option
v-for="dict in dict.type.sys_mt_type"
:key="dict.value"
:label="dict.label"
:value="dict.value"
/>
</el-select>
</el-form-item>
</el-col>
</el-row>
<el-row type="flex" justify="center">
<el-col :span="12">
<el-form-item label="报警类型" prop="alarmType">
<el-select
v-model="form.alarmType"
placeholder="请选择报警类型"
clearable
>
<el-option
v-for="dict in dict.type.alarm_type"
:key="dict.value"
:label="dict.label"
:value="dict.value"
/>
</el-select>
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item label="报警延时时间" prop="delayTimes">
<el-input
clearable
v-model="form.delayTimes"
placeholder="请输入"
/>
</el-form-item>
</el-col>
</el-row>
<el-row type="flex" justify="center">
<el-col :span="12">
<el-form-item label="事件类型" prop="eventType">
<el-select
v-model="form.eventType"
placeholder="请选择事件类型"
clearable
>
<el-option
v-for="dict in dict.type.alarm_event_type"
:key="dict.value"
:label="dict.label"
:value="dict.value"
/>
</el-select> </el-form-item
></el-col>
<el-col :span="12">
<el-form-item label="报警等级" prop="alarmLevel">
<el-select
v-model="form.alarmLevel"
placeholder="请选择报警等级"
clearable
>
<el-option
v-for="dict in dict.type.alarm_level"
:key="dict.value"
:label="dict.label"
:value="dict.value"
/>
</el-select> </el-form-item
></el-col>
</el-row>
<el-row type="flex" justify="center">
<el-col :span="12">
<el-form-item label="触发事件" prop="triggerEvent">
<el-select
v-model="form.triggerEvent"
placeholder="请选择"
clearable
>
<el-option label="开" value="0" />
<el-option label="关" value="1" />
</el-select>
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item label="时段设置" prop="timePeriodSet">
<el-select
v-model="form.timePeriodSet"
placeholder="请选择"
clearable
>
<el-option label="全时段" value="0" />
<el-option label="自定义时段" value="1" />
</el-select>
</el-form-item>
</el-col>
</el-row>
<el-row type="flex" justify="center" v-if="form.timePeriodSet === '1'">
<el-col :span="12">
<el-form-item label="开始时段" prop="beginTime">
<el-date-picker
v-model="form.beginTime"
type="date"
value-format="yyyy-MM-dd"
placeholder="选择日期"
>
</el-date-picker>
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item label="结束时段" prop="endTime">
<el-date-picker
v-model="form.endTime"
type="date"
value-format="yyyy-MM-dd"
placeholder="选择日期"
>
</el-date-picker>
</el-form-item>
</el-col>
</el-row>
<el-row type="flex" justify="center">
<el-col :span="12">
<el-form-item label="条件1" prop="condition1">
<el-input
clearable
v-model="form.condition1"
placeholder="请输入条件"
/>
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item label="阈值1" prop="threshold1">
<el-input
clearable
v-model="form.threshold1"
placeholder="请输入阈值"
/>
</el-form-item>
</el-col>
</el-row>
<el-row type="flex" justify="center">
<el-col :span="12">
<el-form-item label="条件2" prop="condition2">
<el-input
clearable
v-model="form.condition2"
placeholder="请输入条件"
/>
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item label="阈值2" prop="threshold2">
<el-input
clearable
v-model="form.threshold2"
placeholder="请输入阈值"
/>
</el-form-item>
</el-col>
</el-row>
<el-row type="flex" justify="flex-start">
<el-col :span="12">
<el-form-item label="状态" prop="status">
<el-select v-model="form.status" placeholder="请选择" clearable>
<el-option label="已启用" value="0" />
<el-option label="未启用" value="1" />
</el-select>
</el-form-item>
</el-col>
</el-row>
</el-form>
<div slot="footer" class="dialog-footer">
<el-button @click="cancel"> </el-button>
<el-button type="primary" @click="submitForm"> </el-button>
</div>
</el-dialog>
</div>
</template>
<script>
import {
alarmRuleList,
getAlarmRule,
delAlarmRule,
addAlarmRule,
updateAlarmRule,
} from "@/api/alarm/alarmRule";
import { ledgerList } from "@/api/device/ledger";
import { cpmList } from "@/api/device/gather";
export default {
name: "alarmRule",
dicts: ["alarm_type", "alarm_event_type", "alarm_level", "sys_mt_type"],
data() {
//
const validateBeginTime = (rule, value, callback) => {
if (this.form.timePeriodSet === "1") {
if (!value) {
callback(new Error("请选择开始时段"));
} else {
callback();
}
} else {
callback();
}
};
const validateEndTime = (rule, value, callback) => {
if (this.form.timePeriodSet === "1") {
if (!value) {
callback(new Error("请选择结束时段"));
} else if (new Date(value) <= new Date(this.form.beginTime)) {
callback(new Error("结束时间必须大于开始时间"));
} else {
callback();
}
} else {
callback();
}
};
const validateAtLeastOnePair = (rule, value, callback) => {
const { condition1, threshold1, condition2, threshold2 } = this.form;
if ((condition1 && threshold1) || (condition2 && threshold2)) {
callback();
} else {
callback(new Error("至少要有一组条件和阈值不能为空"));
}
};
return {
//
loading: true,
//
ids: [],
//
single: true,
//
multiple: true,
//
showSearch: true,
//
total: 0,
//
postList: [],
//
title: "",
//
open: false,
//
queryParams: {
pageNum: 1,
pageSize: 10,
alarmType: "",
eventType: "",
alarmLevel: "",
},
//
form: {},
//
rules: {
ledgerId: [
{ required: true, message: "设备名称不能为空", trigger: "blur" },
],
cpmId: [
{ required: true, message: "仪表名称不能为空", trigger: "blur" },
],
eventType: [
{ required: true, message: "请选择事件类型", trigger: "blur" },
],
alarmLevel: [
{ required: true, message: "请选择报警等级", trigger: "blur" },
],
alarmType: [
{ required: true, message: "请选择报警事件", trigger: "blur" },
],
delayTimes: [
{ required: true, message: "消息内容不能为空", trigger: "blur" },
],
timePeriodSet: [
{ required: true, message: "请选择一个时段设置", trigger: "blur" },
],
beginTime: [
{
validator: validateBeginTime,
trigger: "change",
},
],
endTime: [
{
validator: validateEndTime,
trigger: "change",
},
],
status: [{ required: true, message: "请选择状态", trigger: "blur" }],
condition1: [{ validator: validateAtLeastOnePair, trigger: "blur" }],
threshold1: [{ validator: validateAtLeastOnePair, trigger: "blur" }],
condition2: [{ validator: validateAtLeastOnePair, trigger: "blur" }],
threshold2: [{ validator: validateAtLeastOnePair, trigger: "blur" }],
},
devices: [], //
meters: [], //
};
},
created() {
this.getDeviceList();
this.getMeterList();
this.getList();
},
methods: {
//
getStatusClass(status) {
switch (status) {
case 0:
return "status-green";
case 1:
return "status-red";
default:
return "";
}
},
//
getDeviceList() {
let data = {
pageNum: 1,
pageSize: 100000,
};
ledgerList(data).then((response) => {
this.devices = response.rows;
});
},
//
getMeterList() {
let data = {
pageNum: 1,
pageSize: 100000,
};
cpmList(data).then((response) => {
this.meters = response.rows;
});
},
/** 查询报警编码列表 */
getList() {
this.loading = true;
alarmRuleList(this.queryParams).then((response) => {
this.postList = response.rows;
this.total = response.total;
this.loading = false;
});
},
//
cancel() {
this.open = false;
this.reset();
this.form.id = "";
},
//
reset() {
this.form = {
eventType: "",
alarmLevel: "",
alarmType: "",
ledgerId: "",
deviceName: "",
cpmId: "",
cpmName: "",
delayTimes: "",
timePeriodSet: "",
beginTime: "",
endTime: "",
triggerEvent: "",
condition1: "",
threshold1: "",
condition2: "",
threshold2: "",
energyNode: "",
energyType: "",
status: "",
};
this.resetForm("form");
},
/** 搜索按钮操作 */
handleQuery() {
this.queryParams.pageNum = 1;
this.getList();
},
/** 重置按钮操作 */
resetQuery() {
this.resetForm("queryForm");
this.handleQuery();
},
//
handleSelectionChange(selection) {
this.ids = selection.map((item) => item.id);
this.single = selection.length != 1;
this.multiple = !selection.length;
},
//
handleDevice(selectedValue) {
// value label
const selectedItem = this.devices.find(
(item) => item.id === selectedValue
);
if (selectedItem) {
const selectedLabel = selectedItem.deviceName;
console.log("选中的 value:", selectedValue);
console.log("选中的 label:", selectedLabel);
//
this.form.ledgerId = selectedValue;
this.form.deviceName = selectedLabel;
}
},
//
handleMeter(selectedValue) {
// value label
const selectedItem = this.meters.find(
(item) => item.id === selectedValue
);
if (selectedItem) {
const selectedLabel = selectedItem.mtType;
console.log("选中的 value:", selectedValue);
console.log("选中的 label:", selectedLabel);
//
this.form.cpmId = selectedValue;
this.form.cpmName = selectedLabel;
}
},
/** 新增按钮操作 */
handleAdd() {
this.reset();
this.open = true;
this.title = "添加报警规则";
},
/** 修改按钮操作 */
handleUpdate(row) {
this.reset();
this.form.id = "";
const arId = row.id || this.ids;
console.log("");
getAlarmRule(arId).then((response) => {
// this.form = response.data;
this.form = {
id: response.data.id,
eventType:
response.data.eventType !== null
? response.data.eventType.toString()
: null,
alarmLevel:
response.data.alarmLevel !== null
? response.data.alarmLevel.toString()
: null,
alarmType:
response.data.alarmType !== null
? response.data.alarmType.toString()
: null,
ledgerId: response.data.ledgerId,
deviceName: response.data.deviceName,
cpmId: response.data.cpmId,
cpmName: response.data.cpmName,
delayTimes: response.data.delayTimes,
timePeriodSet:
response.data.timePeriodSet !== null
? response.data.timePeriodSet.toString()
: null,
beginTime: response.data.beginTime,
endTime: response.data.endTime,
triggerEvent:
response.data.triggerEvent !== null
? response.data.triggerEvent.toString()
: null,
condition1: response.data.condition1,
threshold1: response.data.threshold1,
condition2: response.data.condition2,
threshold2: response.data.threshold2,
energyNode: "",
energyType: "",
status:
response.data.status !== null
? response.data.status.toString()
: null,
};
this.open = true;
this.title = "修改报警规则";
});
},
/** 提交按钮 */
submitForm: function () {
this.$refs["form"].validate((valid) => {
if (valid) {
if (this.form.id != undefined) {
updateAlarmRule(this.form).then((response) => {
this.$modal.msgSuccess("修改成功");
this.open = false;
this.getList();
});
} else {
console.log("新增参数", this.form);
addAlarmRule(this.form).then((response) => {
this.$modal.msgSuccess("新增成功");
this.open = false;
this.getList();
});
}
}
});
},
/** 删除按钮操作 */
handleDelete(row) {
const Ids = row.id || this.ids;
this.$modal
.confirm('是否确认删除报警规则编号为"' + Ids + '"的数据项?')
.then(function () {
return delAlarmRule(Ids);
})
.then(() => {
this.getList();
this.$modal.msgSuccess("删除成功");
})
.catch(() => {});
},
/** 导出按钮操作 */
handleExport() {
this.download(
"device/gateway/export",
{
...this.queryParams,
},
`post_${new Date().getTime()}.xlsx`
);
},
},
};
</script>
<style lang="scss" scoped>
.status-green {
color: rgb(7, 214, 110);
}
.status-red {
color: red;
}
</style>

20
src/views/device/comm/index.vue

@ -375,10 +375,22 @@ export default {
this.form = {
id: response.data.id,
mtType: response.data.mtType,
baudRate: response.data.baudRate.toString(),
dataBit: response.data.dataBit.toString(),
stopBit: response.data.stopBit.toString(),
parity: response.data.parity.toString(),
baudRate:
response.data.baudRate !== null
? response.data.baudRate.toString()
: null,
dataBit:
response.data.dataBit !== null
? response.data.dataBit.toString()
: null,
stopBit:
response.data.stopBit !== null
? response.data.stopBit.toString()
: null,
parity:
response.data.parity !== null
? response.data.parity.toString()
: null,
remark: response.data.remark,
};
this.open = true;

10
src/views/device/gateway/index.vue

@ -437,8 +437,14 @@ export default {
port: response.data.port,
collectionLoop: response.data.collectionLoop,
internetCard: response.data.internetCard,
operatorType: response.data.operatorType.toString(),
communicationType: response.data.communicationType.toString(),
operatorType:
response.data.operatorType !== null
? response.data.operatorType.toString()
: null,
communicationType:
response.data.communicationType !== null
? response.data.communicationType.toString()
: null,
remark: response.data.remark,
};
this.open = true;

871
src/views/device/gather/index.vue

@ -1,4 +1,871 @@
<template>
<div>设备采集参数管理</div>
</template>
<div class="app-container">
<div class="btn-condition">
<div class="condition-left" v-show="showSearch">
<el-form
:model="queryParams"
ref="queryForm"
size="small"
:inline="true"
label-width="90px"
>
<el-form-item label="仪表类型" prop="mtType">
<el-select
v-model="queryParams.mtType"
placeholder="请选择仪表类型"
clearable
>
<el-option
v-for="dict in dict.type.sys_mt_type"
:key="dict.value"
:label="dict.label"
:value="dict.value"
/>
</el-select>
</el-form-item>
<el-form-item label="系统类型" prop="systemType">
<el-select
v-model="queryParams.systemType"
placeholder="请选择系统类型"
clearable
>
<el-option
v-for="dict in dict.type.sys_type"
:key="dict.value"
:label="dict.label"
:value="dict.value"
/>
</el-select>
</el-form-item>
<el-form-item label="参数类型" prop="paramType">
<el-select
v-model="queryParams.paramType"
placeholder="请选择采集参数类型"
clearable
>
<el-option
v-for="dict in dict.type.sys_param_type"
:key="dict.value"
:label="dict.label"
:value="dict.value"
/>
</el-select>
</el-form-item>
<el-form-item label="设备台账id" prop="deviceLedgerId">
<el-input v-model="queryParams.deviceLedgerId"></el-input>
</el-form-item>
<el-form-item label="日期范围" prop="timeArr">
<el-date-picker
style="width: 220px"
v-model="timeArr"
type="daterange"
unlink-panels
range-separator="~"
start-placeholder="开始日期"
end-placeholder="结束日期"
value-format="yyyy-MM-dd"
@change="dateChange"
>
</el-date-picker>
</el-form-item>
</el-form>
<div class="primary-btn">
<el-button
type="primary"
icon="el-icon-search"
size="mini"
@click="handleQuery"
>搜索</el-button
>
</div>
<div class="cancel-btn">
<el-button
type="cancel"
icon="el-icon-refresh"
size="mini"
@click="resetQuery"
>重置</el-button
>
</div>
</div>
</div>
<el-row :gutter="10" class="mb8">
<el-col :span="1.5">
<div class="primary-btn" v-hasPermi="['system:post:add']">
<el-button
type="primary"
icon="el-icon-plus"
size="mini"
@click="handleAdd"
>新增</el-button
>
</div>
</el-col>
<el-col :span="1.5">
<div class="success-btn" v-hasPermi="['system:post:edit']">
<el-button
type="success"
icon="el-icon-edit"
size="mini"
:disabled="single"
@click="handleUpdate"
>修改</el-button
>
</div>
</el-col>
<el-col :span="1.5">
<div class="delete-btn" v-hasPermi="['system:post:remove']">
<el-button
type="delete"
icon="el-icon-delete"
size="mini"
:disabled="multiple"
@click="handleDelete"
>删除</el-button
>
</div>
</el-col>
<el-col :span="1.5">
<div class="warning-btn" v-hasPermi="['system:post:export']">
<el-button
type="warning"
icon="el-icon-download"
size="mini"
@click="handleExport"
>导出</el-button
>
</div>
</el-col>
<right-toolbar
:showSearch.sync="showSearch"
@queryTable="getList"
></right-toolbar>
</el-row>
<el-table
v-loading="loading"
:data="postList"
@selection-change="handleSelectionChange"
>
<el-table-column type="selection" width="55" align="center" />
<el-table-column label="仪表类型" align="center" prop="mtType">
<template slot-scope="scope">
<dict-tag
:options="dict.type.sys_mt_type"
:value="scope.row.mtType"
/>
</template>
</el-table-column>
<!-- <el-table-column
label="仪表编号"
align="center"
prop="mtCode"
/> -->
<el-table-column label="仪表表号" align="center" prop="mtNum" />
<el-table-column label="寄存器地址" align="center" prop="registerAddr" />
<el-table-column label="功能码" align="center" prop="funcCode" />
<el-table-column label="识别码" align="center" prop="mtCaliberPulse" />
<el-table-column label="口径脉冲" align="center" prop="identifyCode" />
<el-table-column label="仪表范围" align="center" prop="mtRange" />
<el-table-column label="倍率" align="center" prop="mtRatio" />
<el-table-column label="保留位数" align="center" prop="mtInitValue" />
<el-table-column label="数据类型" align="center" prop="dataType">
<template slot-scope="scope">
<dict-tag
:options="dict.type.sys_data_type"
:value="scope.row.dataType"
/>
</template>
</el-table-column>
<el-table-column label="当前值" align="center" prop="curValue" />
<el-table-column label="是否累计" align="center" prop="mtIsSum">
<template slot-scope="scope">
<span v-if="scope.row.mtIsSum === 0"></span>
<span v-if="scope.row.mtIsSum === 1"></span>
</template>
</el-table-column>
<el-table-column label="单位" align="center" prop="unit" />
<el-table-column label="排序" align="center" prop="sort" />
<el-table-column label="网关Id" align="center" prop="gatewayId" />
<el-table-column
label="仪表设备通信参数"
align="center"
prop="communicationParamId"
/>
<el-table-column label="协议类型" align="center" prop="protocolType">
<template slot-scope="scope">
<dict-tag
:options="dict.type.sys_protocol_type"
:value="scope.row.protocolType"
/>
</template>
</el-table-column>
<el-table-column label="通讯方式" align="center" prop="communicationType">
<template slot-scope="scope">
<dict-tag
:options="dict.type.sys_communication_type"
:value="scope.row.communicationType"
/>
</template>
</el-table-column>
<el-table-column label="寄存器大小" align="center" prop="registerSize" />
<el-table-column label="是否使用" align="center" prop="isUse">
<template slot-scope="scope">
<span v-if="scope.row.isUse === 0"></span>
<span v-if="scope.row.isUse === 1"></span>
</template>
</el-table-column>
<el-table-column label="别名" align="center" prop="otherName" />
<el-table-column label="累计/瞬时标识" align="center" prop="grade" />
<el-table-column label="系统类型" align="center" prop="systemType">
<template slot-scope="scope">
<dict-tag
:options="dict.type.sys_type"
:value="scope.row.systemType"
/>
</template>
</el-table-column>
<el-table-column
label="采集设备"
align="center"
prop="terminalDeviceType"
>
<template slot-scope="scope">
<dict-tag
:options="dict.type.sys_device_type"
:value="scope.row.terminalDeviceType"
/>
</template>
</el-table-column>
<el-table-column label="参数类型" align="center" prop="paramType">
<template slot-scope="scope">
<dict-tag
:options="dict.type.sys_param_type"
:value="scope.row.paramType"
/>
</template>
</el-table-column>
<el-table-column label="采集类别" align="center" prop="collectionType">
<template slot-scope="scope">
<dict-tag
:options="dict.type.alarm_collection_type"
:value="scope.row.collectionType"
/>
</template>
</el-table-column>
<!-- <el-table-column label="创建时间" align="center" prop="createTime">
<template slot-scope="scope">
<span>{{ parseTime(scope.row.createTime) }}</span>
</template>
</el-table-column>
<el-table-column label="备注" align="center" prop="remark" /> -->
<el-table-column
label="操作"
align="center"
class-name="small-padding fixed-width"
>
<template slot-scope="scope">
<el-button
size="mini"
type="text"
icon="el-icon-edit"
@click="handleUpdate(scope.row)"
v-hasPermi="['system:post:edit']"
>修改</el-button
>
<el-button
size="mini"
type="text"
icon="el-icon-delete"
@click="handleDelete(scope.row)"
v-hasPermi="['system:post:remove']"
>删除</el-button
>
</template>
</el-table-column>
</el-table>
<pagination
v-show="total > 0"
:total="total"
:page.sync="queryParams.pageNum"
:limit.sync="queryParams.pageSize"
@pagination="getList"
/>
<!-- 添加或修改设备采集参数对话框 -->
<el-dialog :title="title" :visible.sync="open" width="700px" append-to-body>
<el-form ref="form" :model="form" :rules="rules" label-width="100px">
<el-row type="flex" justify="center">
<el-col :span="12">
<el-form-item label="仪表类型" prop="mtType">
<el-select
v-model="form.mtType"
placeholder="请选择仪表类型"
clearable
>
<el-option
v-for="dict in dict.type.sys_mt_type"
:key="dict.value"
:label="dict.label"
:value="dict.value"
/>
</el-select>
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item label="仪表表号" prop="mtNum">
<el-input v-model="form.mtNum" placeholder="请输入仪表表号" />
</el-form-item>
</el-col>
</el-row>
<el-row type="flex" justify="center">
<el-col :span="12">
<el-form-item label="采集编号" prop="mtCode">
<el-input v-model="form.mtCode" placeholder="请输入采集编号" />
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item label="寄存器地址" prop="registerAddr">
<el-input
v-model="form.registerAddr"
placeholder="请输入仪表表号"
/>
</el-form-item>
</el-col>
</el-row>
<el-row type="flex" justify="center">
<el-col :span="12">
<el-form-item label="功能码" prop="funcCode">
<el-input v-model="form.funcCode" placeholder="请输入功能码" />
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item label="识别码" prop="identifyCode">
<el-input
v-model="form.identifyCode"
placeholder="请输入识别码"
/>
</el-form-item>
</el-col>
</el-row>
<el-row type="flex" justify="center">
<el-col :span="12">
<el-form-item label="口径脉冲" prop="mtCaliberPulse">
<el-input
v-model="form.mtCaliberPulse"
placeholder="请输入口径脉冲"
/>
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item label="仪表范围" prop="mtRange">
<el-input v-model="form.mtRange" placeholder="请输入仪表范围" />
</el-form-item>
</el-col>
</el-row>
<el-row type="flex" justify="center">
<el-col :span="12">
<el-form-item label="倍率" prop="mtRatio">
<el-input v-model="form.mtRatio" placeholder="请输入倍率" />
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item label="初始值" prop="mtInitValue">
<el-input v-model="form.mtInitValue" placeholder="请输入初始值" />
</el-form-item>
</el-col>
</el-row>
<el-row type="flex" justify="center">
<el-col :span="12">
<el-form-item label="保留位数" prop="digits">
<el-input v-model="form.digits" placeholder="请输入保留位数" />
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item label="数据类型" prop="dataType">
<el-select
v-model="form.dataType"
placeholder="请选择数据类型"
clearable
>
<el-option
v-for="dict in dict.type.sys_data_type"
:key="dict.value"
:label="dict.label"
:value="dict.value"
/>
</el-select>
</el-form-item>
</el-col>
</el-row>
<el-row type="flex" justify="center">
<el-col :span="12">
<el-form-item label="是否累计" prop="mtIsSum">
<el-select
clearable
placeholder="请选择是否"
v-model="form.mtIsSum"
>
<el-option label="否" value="0"></el-option>
<el-option label="是" value="1"></el-option>
</el-select> </el-form-item
></el-col>
<el-col :span="12">
<el-form-item label="单位" prop="unit">
<el-input
v-model="form.unit"
placeholder="请输入单位"
/> </el-form-item
></el-col>
</el-row>
<el-row type="flex" justify="center">
<el-col :span="12">
<el-form-item label="排序" prop="sort">
<el-input
v-model="form.sort"
placeholder="请输入排序" /></el-form-item
></el-col>
<el-col :span="12">
<el-form-item label="网关id" prop="gatewayId">
<el-input
v-model="form.gatewayId"
placeholder="请输入网关id"
/> </el-form-item
></el-col>
</el-row>
<el-row type="flex" justify="center">
<el-col :span="12">
<el-form-item label="设备通信参数" prop="communicationParamId">
<el-input
v-model="form.communicationParamId"
placeholder="请输设备通信参数" /></el-form-item
></el-col>
<el-col :span="12">
<el-form-item label="寄存器大小" prop="registerSize">
<el-input
v-model="form.registerSize"
placeholder="请输入寄存器大小"
/> </el-form-item
></el-col>
</el-row>
<el-row type="flex" justify="center">
<el-col :span="12">
<el-form-item label="协议类型" prop="protocolType">
<el-select
v-model="form.protocolType"
placeholder="请选择协议类型"
clearable
>
<el-option
v-for="dict in dict.type.sys_protocol_type"
:key="dict.value"
:label="dict.label"
:value="dict.value"
/>
</el-select>
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item label="通信类型" prop="communicationType">
<el-select
v-model="form.communicationType"
placeholder="请选择通信类型"
clearable
>
<el-option
v-for="dict in dict.type.sys_communication_type"
:key="dict.value"
:label="dict.label"
:value="dict.value"
/>
</el-select> </el-form-item
></el-col>
</el-row>
<el-row type="flex" justify="center">
<el-col :span="12">
<el-form-item label="是否使用" prop="isUse">
<el-select
clearable
placeholder="请选择是否"
v-model="form.isUse"
>
<el-option label="是" value="0"></el-option>
<el-option label="否" value="1"></el-option>
</el-select> </el-form-item
></el-col>
<el-col :span="12">
<el-form-item label="别名" prop="otherName">
<el-input
v-model="form.otherName"
placeholder="请输入别名"
/> </el-form-item
></el-col>
</el-row>
<el-row type="flex" justify="center">
<el-col :span="12">
<el-form-item label="累计/瞬时标识" prop="grade">
<el-input v-model="form.grade" placeholder="请输入标识" />
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item label="系统类型" prop="systemType">
<el-select
v-model="form.systemType"
placeholder="请选择系统类型"
clearable
>
<el-option
v-for="dict in dict.type.sys_type"
:key="dict.value"
:label="dict.label"
:value="dict.value"
/>
</el-select> </el-form-item
></el-col>
</el-row>
<el-row type="flex" justify="center">
<el-col :span="12">
<el-form-item label="参数类型" prop="paramType">
<el-select
v-model="form.paramType"
placeholder="请选择参数类型"
clearable
>
<el-option
v-for="dict in dict.type.sys_param_type"
:key="dict.value"
:label="dict.label"
:value="dict.value"
/>
</el-select> </el-form-item
></el-col>
<el-col :span="12">
<el-form-item label="采集类别" prop="collectionType">
<el-select
v-model="form.collectionType"
placeholder="请选择采集类别"
clearable
>
<el-option
v-for="dict in dict.type.alarm_collection_type"
:key="dict.value"
:label="dict.label"
:value="dict.value"
/>
</el-select>
</el-form-item>
</el-col>
</el-row>
<el-row type="flex" justify="center">
<el-col :span="12">
<el-form-item label="采集设备" prop="terminalDeviceType">
<el-select
v-model="form.terminalDeviceType"
placeholder="请选择采集设备"
clearable
>
<el-option
v-for="dict in dict.type.sys_device_type"
:key="dict.value"
:label="dict.label"
:value="dict.value"
/>
</el-select> </el-form-item
></el-col>
<el-col :span="12">
<el-form-item label="设备台账id" prop="deviceLedgerId">
<el-input
v-model="form.deviceLedgerId"
placeholder="请输入id"
/> </el-form-item
></el-col>
</el-row>
</el-form>
<div slot="footer" class="dialog-footer">
<el-button @click="cancel"> </el-button>
<el-button type="primary" @click="submitForm"> </el-button>
</div>
</el-dialog>
</div>
</template>
<script>
import {
cpmList,
getCPM,
delCPM,
addCPM,
updateCPM,
} from "@/api/device/gather";
export default {
name: "gather",
dicts: [
"sys_mt_type",
"sys_type",
"sys_param_type",
"sys_data_type",
"sys_protocol_type",
"sys_communication_type",
"sys_device_type",
"alarm_collection_type",
],
data() {
return {
timeArr: [],
//
loading: true,
//
ids: [],
//
single: true,
//
multiple: true,
//
showSearch: true,
//
total: 0,
//
postList: [],
//
title: "",
//
open: false,
//
queryParams: {
pageNum: 1,
pageSize: 10,
beginTime: "",
endTime: "",
mtType: "",
mtNum: "",
deviceLedgerId: "",
systemType: "",
paramType: "",
},
//
form: {},
//
rules: {
mtType: [
{ required: true, message: "请选择仪表类型", trigger: "blur" },
],
},
};
},
created() {
this.getList();
},
methods: {
//
dateChange() {
// console.log("", this.timeArr);
if (!this.timeArr) {
this.$nextTick(() => {
this.timeArr = [];
this.queryParams.beginTime = "";
this.queryParams.endTime = "";
});
} else {
this.queryParams.beginTime = this.timeArr[0];
this.queryParams.endTime = this.timeArr[1];
}
},
/** 查询设备参数列表 */
getList() {
this.loading = true;
cpmList(this.queryParams).then((response) => {
this.postList = response.rows;
this.total = response.total;
this.loading = false;
});
},
//
cancel() {
this.open = false;
this.reset();
this.form.id = "";
},
//
reset() {
this.form = {
remark: "",
deviceLedgerId: "",
mtType: "",
mtNum: "",
mtCode: "",
registerAddr: "",
funcCode: "",
identifyCode: "",
mtCaliberPulse: "",
mtRange: "",
mtRatio: "",
mtInitValue: "",
digits: "",
dataType: "",
mtIsSum: "",
unit: "",
sort: "",
gatewayId: "",
communicationParamId: "",
protocolType: "",
communicationType: "",
registerSize: "",
isUse: "",
otherName: "",
grade: "",
paramType: "",
systemType: "",
terminalDeviceType: "",
collectionType: "",
};
this.resetForm("form");
},
/** 搜索按钮操作 */
handleQuery() {
this.queryParams.pageNum = 1;
this.getList();
},
/** 重置按钮操作 */
resetQuery() {
this.resetForm("queryForm");
this.handleQuery();
},
//
handleSelectionChange(selection) {
this.ids = selection.map((item) => item.id);
this.single = selection.length != 1;
this.multiple = !selection.length;
},
/** 新增按钮操作 */
handleAdd() {
this.reset();
this.open = true;
this.title = "添加设备采集参数信息";
},
/** 修改按钮操作 */
handleUpdate(row) {
this.reset();
this.form.id = "";
const cpmId = row.id || this.ids;
console.log("row", row);
getCPM(cpmId).then((response) => {
console.log("打印结果", response.data);
// this.form = response.data;
this.form = {
id: response.data.id,
remark: response.data.remark,
deviceLedgerId: response.data.deviceLedgerId,
mtType:
response.data.mtType !== null
? response.data.mtType.toString()
: null,
mtNum: response.data.mtNum,
mtCode: response.data.mtCode,
registerAddr: response.data.registerAddr,
funcCode: response.data.funcCode,
identifyCode: response.data.identifyCode,
mtCaliberPulse: response.data.mtCaliberPulse,
mtRange: response.data.mtRange,
mtRatio: response.data.mtRatio,
mtInitValue: response.data.mtInitValue,
digits: response.data.digits,
dataType:
response.data.dataType !== null
? response.data.dataType.toString()
: null,
mtIsSum:
response.data.mtIsSum !== null
? response.data.mtIsSum.toString()
: null,
unit: response.data.unit,
sort: response.data.sort,
gatewayId: response.data.gatewayId,
communicationParamId: response.data.communicationParamId,
protocolType:
response.data.protocolType !== null
? response.data.protocolType.toString()
: null,
communicationType:
response.data.communicationType !== null
? response.data.communicationType.toString()
: null,
registerSize: response.data.registerSize,
isUse:
response.data.isUse !== null
? response.data.isUse.toString()
: null,
otherName: response.data.otherName,
grade: response.data.grade,
paramType:
response.data.paramType !== null
? response.data.paramType.toString()
: null,
systemType:
response.data.systemType !== null
? response.data.systemType.toString()
: null,
collectionType:
response.data.collectionType !== null
? response.data.collectionType.toString()
: null,
terminalDeviceType:
response.data.terminalDeviceType !== null
? response.data.terminalDeviceType.toString()
: null,
};
this.open = true;
this.title = "修改设备参数信息";
});
},
/** 提交按钮 */
submitForm: function () {
this.$refs["form"].validate((valid) => {
if (valid) {
if (this.form.id != undefined) {
updateCPM(this.form).then((response) => {
this.$modal.msgSuccess("修改成功");
this.open = false;
this.getList();
});
} else {
console.log("新增参数", this.form);
addCPM(this.form).then((response) => {
this.$modal.msgSuccess("新增成功");
this.open = false;
this.getList();
});
}
}
});
},
/** 删除按钮操作 */
handleDelete(row) {
const Ids = row.id || this.ids;
this.$modal
.confirm('是否确认删除设备采集参数编号为"' + Ids + '"的数据项?')
.then(function () {
return delCPM(Ids);
})
.then(() => {
this.getList();
this.$modal.msgSuccess("删除成功");
})
.catch(() => {});
},
/** 导出按钮操作 */
handleExport() {
this.download(
"device/gateway/export",
{
...this.queryParams,
},
`post_${new Date().getTime()}.xlsx`
);
},
},
};
</script>

76
src/views/device/ledger/index.vue

@ -172,6 +172,14 @@
<el-tag type="danger" v-if="scope.row.status === 1">停用</el-tag>
</template>
</el-table-column>
<el-table-column label="系统类型" align="center" prop="systemType">
<template slot-scope="scope">
<dict-tag
:options="dict.type.sys_type"
:value="scope.row.systemType"
/>
</template>
</el-table-column>
<el-table-column
label="操作"
align="center"
@ -254,15 +262,6 @@
></el-col>
</el-row>
<el-row type="flex" justify="center">
<el-col :span="12">
<el-form-item label="关联二维码Id" prop="qrCodeId">
<el-input
v-model="form.qrCodeId"
placeholder="请选择"
clearable
/>
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item label="预计使用寿命" prop="serviceLife">
<el-input
@ -271,8 +270,6 @@
clearable
/> </el-form-item
></el-col>
</el-row>
<el-row type="flex" justify="center">
<el-col :span="12">
<el-form-item label="技术参数描述" prop="techParams">
<el-input
@ -282,6 +279,8 @@
/>
</el-form-item>
</el-col>
</el-row>
<el-row type="flex" justify="center">
<el-col :span="12">
<el-form-item label="设备文档" prop="techDoc">
<el-input
@ -290,8 +289,6 @@
clearable
/> </el-form-item
></el-col>
</el-row>
<el-row type="flex" justify="center">
<el-col :span="12">
<el-form-item label="设备安装时间" prop="installTime">
<el-date-picker
@ -303,14 +300,14 @@
</el-date-picker>
</el-form-item>
</el-col>
</el-row>
<el-row type="flex" justify="center">
<el-col :span="12">
<el-form-item label="状态" prop="status">
<el-select v-model="form.status" placeholder="请选择" clearable>
<el-option label="正常" value="0" />
<el-option label="停用" value="1" /> </el-select></el-form-item
></el-col>
</el-row>
<el-row type="flex" justify="center">
<el-col :span="12">
<el-form-item label="是否需要采集" prop="isCollection">
<el-select
@ -323,6 +320,8 @@
</el-select>
</el-form-item>
</el-col>
</el-row>
<el-row type="flex" justify="center">
<el-col :span="12">
<el-form-item label="是否计算能效" prop="isCalcEnergy">
<el-select
@ -334,15 +333,20 @@
<el-option label="否" value="1" />
</el-select> </el-form-item
></el-col>
</el-row>
<el-row type="flex" justify="center" style="margin-bottom: 34px">
<el-col :span="24">
<el-form-item label="备注" prop="remark">
<el-input
v-model="form.remark"
type="textarea"
placeholder="请输入内容"
/> </el-form-item
<el-col :span="12">
<el-form-item label="系统类型" prop="systemType">
<el-select
v-model="form.systemType"
placeholder="请选择系统类型"
clearable
>
<el-option
v-for="dict in dict.type.sys_type"
:key="dict.value"
:label="dict.label"
:value="dict.value"
/>
</el-select> </el-form-item
></el-col>
</el-row>
</el-form>
@ -362,10 +366,9 @@ import {
addLedger,
updateLedger,
} from "@/api/device/ledger";
export default {
name: "ledger",
dicts: ["sys_device_type"],
dicts: ["sys_device_type", "sys_type"],
data() {
return {
timeArr: [],
@ -493,7 +496,7 @@ export default {
this.reset();
this.form.id = "";
const ledgerId = row.id || this.ids;
console.log("");
console.log("row", row);
getLedger(ledgerId).then((response) => {
// this.form = response.data;
this.form = {
@ -507,9 +510,22 @@ export default {
techParams: response.data.techParams,
techDoc: response.data.techDoc,
installTime: response.data.installTime,
isCollection: response.data.isCollection.toString(),
isCalcEnergy: response.data.isCalcEnergy.toString(),
status: response.data.status.toString(),
isCollection:
response.data.isCollection !== null
? response.data.isCollection.toString()
: null,
isCalcEnergy:
response.data.isCalcEnergy !== null
? response.data.isCalcEnergy.toString()
: null,
status:
response.data.status !== null
? response.data.status.toString()
: null,
systemType:
response.data.systemType !== null
? response.data.systemType.toString()
: null,
remark: response.data.remark,
};
this.open = true;

10
src/views/device/maintenance/index.vue

@ -583,9 +583,15 @@ export default {
// this.form = response.data;
this.form = {
id: response.data.id,
maintainType: response.data.maintainType.toString(),
maintainType:
response.data.maintainType !== null
? response.data.maintainType.toString()
: null,
maintainPeople: response.data.maintainPeople,
deviceType: response.data.deviceType.toString(),
deviceType:
response.data.deviceType !== null
? response.data.deviceType.toString()
: null,
cost: response.data.cost,
execTime: response.data.execTime,
spendTimes: response.data.spendTimes,

556
src/views/device/qrCode/index.vue

@ -1,3 +1,555 @@
<template>
<div>设备二维码</div>
</template>
<div class="app-container">
<div class="btn-condition">
<div class="condition-left" v-show="showSearch">
<el-form
:model="queryParams"
ref="queryForm"
size="small"
:inline="true"
label-width="90px"
>
<el-form-item label="二维码状态" prop="status">
<el-select
v-model="queryParams.status"
placeholder="请选择状态"
clearable
>
<el-option
v-for="dict in dict.type.qrcode_status"
:key="dict.value"
:label="dict.label"
:value="dict.value"
/>
</el-select>
</el-form-item>
</el-form>
<div class="primary-btn">
<el-button
type="primary"
icon="el-icon-search"
size="mini"
@click="handleQuery"
>搜索</el-button
>
</div>
<div class="cancel-btn">
<el-button
type="cancel"
icon="el-icon-refresh"
size="mini"
@click="resetQuery"
>重置</el-button
>
</div>
</div>
</div>
<el-row :gutter="10" class="mb8">
<el-col :span="1.5">
<div class="primary-btn" v-hasPermi="['system:post:add']">
<el-button
type="primary"
icon="el-icon-folder-add"
size="mini"
@click="handleAdd"
>批量生成二维码</el-button
>
</div>
</el-col>
<el-col :span="1.5">
<div class="success-btn" v-hasPermi="['system:post:edit']">
<el-button
type="success"
icon="el-icon-edit"
size="mini"
:disabled="single"
@click="handleUpdate"
>修改</el-button
>
</div>
</el-col>
<el-col :span="1.5">
<div class="delete-btn" v-hasPermi="['system:post:remove']">
<el-button
type="delete"
icon="el-icon-delete"
size="mini"
:disabled="multiple"
@click="handleDelete"
>删除</el-button
>
</div>
</el-col>
<el-col :span="1.5">
<div class="warning-btn" v-hasPermi="['system:post:export']">
<el-button
type="warning"
icon="el-icon-download"
size="mini"
@click="handleExport"
>导出</el-button
>
</div>
</el-col>
<right-toolbar
:showSearch.sync="showSearch"
@queryTable="getList"
></right-toolbar>
</el-row>
<el-table
v-loading="loading"
:data="postList"
@selection-change="handleSelectionChange"
>
<el-table-column type="selection" width="55" align="center" />
<el-table-column label="二维码序列号" align="center" prop="serialNum" />
<el-table-column label="二维码图片" align="center" prop="picContent">
<template slot-scope="scope">
<div
@click="goPreView(scope.row.picContent)"
style="
width: 100%;
height: 30px;
display: flex;
flex-direction: row;
align-items: center;
justify-content: center;
cursor: pointer;
"
>
<img
style="height: 100%"
v-if="scope.row.picContent"
:src="imgUrl + scope.row.picContent"
alt="Base64 Image"
/>
<span v-else></span>
</div>
<!-- <div class="success-btn">
<el-button
type="success"
size="mini"
@click="goPreView(scope.row.picContent)"
>预览</el-button
>
</div> -->
</template>
</el-table-column>
<el-table-column
label="关联设备ID"
align="center"
prop="deviceLedgerId"
/>
<el-table-column label="设备名称" align="center" prop="deviceName" />
<el-table-column label="绑定时间" align="center" prop="bindTime">
<template slot-scope="scope">
<span>{{ parseTime(scope.row.bindTime) }}</span>
</template>
</el-table-column>
<el-table-column label="二维码状态" align="center" prop="status">
<template slot-scope="scope">
<!-- 包裹 dict-tag 组件根据状态绑定不同的类名 -->
<span :class="getStatusClass(scope.row.status)">
<dict-tag
:options="dict.type.qrcode_status"
:value="scope.row.status"
/>
</span>
</template>
</el-table-column>
<el-table-column
label="操作"
align="center"
class-name="small-padding fixed-width"
>
<template slot-scope="scope">
<el-button
size="mini"
type="text"
icon="el-icon-edit"
@click="handleUpdate(scope.row)"
v-hasPermi="['system:post:edit']"
>修改</el-button
>
<el-button
size="mini"
type="text"
icon="el-icon-delete"
@click="handleDelete(scope.row)"
v-hasPermi="['system:post:remove']"
>删除</el-button
>
</template>
</el-table-column>
</el-table>
<pagination
v-show="total > 0"
:total="total"
:page.sync="queryParams.pageNum"
:limit.sync="queryParams.pageSize"
@pagination="getList"
/>
<!-- 修改二维码对话框 -->
<el-dialog :title="title" :visible.sync="open" width="700px" append-to-body>
<el-form ref="form" :model="form" :rules="rules" label-width="120px">
<el-row type="flex" justify="center">
<el-col :span="24">
<el-form-item label="二维码序列号" prop="serialNum">
<el-input v-model="form.serialNum" disabled placeholder="" />
</el-form-item>
</el-col>
<!-- <el-col :span="12">
<el-form-item label="绑定时间" prop="bindTime">
<el-date-picker
v-model="form.bindTime"
type="date"
disabled
value-format="yyyy-MM-dd"
placeholder=""
>
</el-date-picker>
</el-form-item>
</el-col> -->
</el-row>
<el-row type="flex" justify="center">
<el-col :span="12">
<el-form-item label="设备名称" prop="deviceLedgerId">
<el-select
v-model="form.deviceLedgerId"
placeholder="请选择设备名称"
clearable
@change="handleDeviceChange"
>
<el-option
v-for="item in devices"
:key="item.id"
:label="item.deviceName"
:value="item.id"
/> </el-select></el-form-item
></el-col>
<el-col :span="12">
<el-form-item label="二维码状态" prop="status">
<el-select
v-model="form.status"
placeholder="请选择状态"
clearable
>
<el-option
v-for="dict in dict.type.qrcode_status"
:key="dict.value"
:label="dict.label"
:value="dict.value"
/>
</el-select>
</el-form-item>
</el-col>
</el-row>
</el-form>
<div slot="footer" class="dialog-footer">
<el-button @click="cancel"> </el-button>
<el-button type="primary" @click="submitForm"> </el-button>
</div>
</el-dialog>
<!-- 二维码预览弹框 -->
<el-dialog
title="二维码预览"
:visible.sync="isCodePreview"
width="500px"
append-to-body
>
<div class="dialog-img">
<img class="qrCodeImg" :src="codePreViewUrl" alt="Base64 Image" />
</div>
</el-dialog>
<!-- 批量生成二维码弹框 -->
<el-dialog
title="批量生成二维码"
:visible.sync="isMoreqrCode"
width="500px"
append-to-body
>
<el-form
ref="qrCodeForm"
:model="qrCodeForm"
:rules="qrCodeForms"
label-width="120px"
>
<el-row type="flex" justify="center">
<el-col :span="24">
<el-form-item label="二维码个数" prop="qrNum">
<el-input
v-model="qrCodeForm.qrNum"
placeholder="请输入小于50的正整数"
/>
</el-form-item>
</el-col>
</el-row>
</el-form>
<div slot="footer" class="dialog-footer">
<el-button @click="isMoreqrCode = false"> </el-button>
<el-button type="primary" @click="submitqrCodeForm"> </el-button>
</div>
</el-dialog>
</div>
</template>
<script>
import {
getCode,
codeList,
delCode,
createCode,
updateCode,
} from "@/api/device/qrCode";
import { ledgerList } from "@/api/device/ledger";
import { imgUrl } from "@/utils/global";
export default {
name: "qrCode",
dicts: ["qrcode_status", "sys_device_type"],
data() {
return {
timeArr: [],
//
loading: true,
//
ids: [],
//
single: true,
//
multiple: true,
//
showSearch: true,
//
total: 0,
//
postList: [],
//
title: "",
//
open: false,
//
queryParams: {
pageNum: 1,
pageSize: 10,
status: "",
},
//
form: {},
//
rules: {
status: [
{ required: true, message: "请选择二维码状态", trigger: "blur" },
],
},
isCodePreview: false, //
imgUrl: "",
codePreViewUrl: "",
isMoreqrCode: false, //
qrCodeForm: {},
qrCodeForms: {
qrNum: [
{ required: true, message: "二维码个数不能为空", trigger: "blur" },
],
},
devices: [], //
};
},
created() {
this.getDevices();
this.getList();
},
methods: {
//
getDevices() {
let data = {
pageNum: 1,
pageSize: 1000000,
};
ledgerList(data).then((response) => {
this.devices = response.rows;
});
},
/** 查询二维码列表 */
getList() {
this.imgUrl = imgUrl;
this.loading = true;
codeList(this.queryParams).then((response) => {
this.postList = response.rows;
this.total = response.total;
this.loading = false;
});
},
//
getStatusClass(status) {
switch (status) {
case 0:
return "status-green";
case 1:
return "status-red";
default:
return "";
}
},
//
cancel() {
this.open = false;
this.reset();
this.form.id = "";
},
handleDeviceChange(selectedValue) {
// value label
const selectedItem = this.devices.find(
(item) => item.id === selectedValue
);
if (selectedItem) {
const selectedLabel = selectedItem.deviceName;
console.log("选中的 value:", selectedValue);
console.log("选中的 label:", selectedLabel);
//
this.form.deviceLedgerId = selectedValue;
this.form.deviceName = selectedLabel;
}
},
//
reset() {
this.form = {
serialNum: "",
picContent: "",
deviceLedgerId: "",
deviceName: "",
bindTime: "",
status: "",
remark: "",
};
this.resetForm("form");
},
/** 搜索按钮操作 */
handleQuery() {
this.queryParams.pageNum = 1;
this.getList();
},
/** 重置按钮操作 */
resetQuery() {
this.resetForm("queryForm");
this.handleQuery();
},
//
handleSelectionChange(selection) {
this.ids = selection.map((item) => item.id);
this.single = selection.length != 1;
this.multiple = !selection.length;
},
/** 新增按钮操作 */
handleAdd() {
this.isMoreqrCode = true;
},
/** 修改按钮操作 */
handleUpdate(row) {
this.reset();
this.form.id = "";
const ledgerId = row.id || this.ids;
console.log("");
getCode(ledgerId).then((response) => {
// this.form = response.data;
this.form = {
id: response.data.id,
serialNum: response.data.serialNum,
picContent: response.data.picContent,
deviceLedgerId: response.data.deviceLedgerId,
deviceName: response.data.deviceName,
bindTime: response.data.bindTime,
status:
response.data.status !== null
? response.data.status.toString()
: null,
remark: response.data.remark,
};
this.open = true;
this.title = "修改二维码信息";
});
},
/** 提交按钮 */
submitForm: function () {
this.$refs["form"].validate((valid) => {
if (valid) {
if (this.form.id != undefined) {
updateCode(this.form).then((response) => {
this.$modal.msgSuccess("修改成功");
this.open = false;
this.getList();
});
} else {
}
}
});
},
//
submitqrCodeForm: function () {
this.$refs["qrCodeForm"].validate((valid) => {
if (valid) {
console.log("新增参数", this.qrCodeForm);
createCode(this.qrCodeForm).then((response) => {
this.$modal.msgSuccess("新增成功");
this.isMoreqrCode = false;
this.getList();
});
}
});
},
/** 删除按钮操作 */
handleDelete(row) {
const qrIds = row.id || this.ids;
this.$modal
.confirm('是否确认删除二维码编号为"' + qrIds + '"的数据项?')
.then(function () {
return delCode(qrIds);
})
.then(() => {
this.getList();
this.$modal.msgSuccess("删除成功");
})
.catch(() => {});
},
/** 导出按钮操作 */
handleExport() {
this.download(
"device/gateway/export",
{
...this.queryParams,
},
`post_${new Date().getTime()}.xlsx`
);
},
//
goPreView(item) {
this.codePreViewUrl = "";
console.log("二维码url", item);
this.isCodePreview = true;
this.codePreViewUrl = this.imgUrl + item;
},
},
};
</script>
<style lang="scss" scoped>
.dialog-img {
width: 100%;
display: flex;
flex-direction: column;
align-items: center;
justify-content: center;
.qrCodeImg {
width: 150px;
height: 150px;
}
}
.status-green {
color: rgb(7, 214, 110);
}
.status-red {
color: red;
}
</style>

461
src/views/device/spare/index.vue

@ -0,0 +1,461 @@
<template>
<div class="app-container">
<div class="btn-condition">
<div class="condition-left" v-show="showSearch">
<el-form
:model="queryParams"
ref="queryForm"
size="small"
:inline="true"
label-width="90px"
>
<el-form-item label="备件序列号" prop="serialNum">
<el-input
v-model="queryParams.serialNum"
placeholder="请输入备件序列号"
clearable
@keyup.enter.native="handleQuery"
/>
</el-form-item>
<el-form-item label="备件名称" prop="spareName">
<el-input
v-model="queryParams.spareName"
placeholder="请输入备件名称"
clearable
@keyup.enter.native="handleQuery"
/>
</el-form-item>
<el-form-item label="日期范围" prop="timeArr">
<el-date-picker
style="width: 220px"
v-model="timeArr"
type="daterange"
unlink-panels
range-separator="~"
start-placeholder="开始日期"
end-placeholder="结束日期"
value-format="yyyy-MM-dd"
@change="dateChange"
>
</el-date-picker>
</el-form-item>
</el-form>
<div class="primary-btn">
<el-button
type="primary"
icon="el-icon-search"
size="mini"
@click="handleQuery"
>搜索</el-button
>
</div>
<div class="cancel-btn">
<el-button
type="cancel"
icon="el-icon-refresh"
size="mini"
@click="resetQuery"
>重置</el-button
>
</div>
</div>
</div>
<el-row :gutter="10" class="mb8">
<el-col :span="1.5">
<div class="primary-btn" v-hasPermi="['system:post:add']">
<el-button
type="primary"
icon="el-icon-plus"
size="mini"
@click="handleAdd"
>新增</el-button
>
</div>
</el-col>
<el-col :span="1.5">
<div class="success-btn" v-hasPermi="['system:post:edit']">
<el-button
type="success"
icon="el-icon-edit"
size="mini"
:disabled="single"
@click="handleUpdate"
>修改</el-button
>
</div>
</el-col>
<el-col :span="1.5">
<div class="delete-btn" v-hasPermi="['system:post:remove']">
<el-button
type="delete"
icon="el-icon-delete"
size="mini"
:disabled="multiple"
@click="handleDelete"
>删除</el-button
>
</div>
</el-col>
<el-col :span="1.5">
<div class="warning-btn" v-hasPermi="['system:post:export']">
<el-button
type="warning"
icon="el-icon-download"
size="mini"
@click="handleExport"
>导出</el-button
>
</div>
</el-col>
<right-toolbar
:showSearch.sync="showSearch"
@queryTable="getList"
></right-toolbar>
</el-row>
<el-table
v-loading="loading"
:data="postList"
@selection-change="handleSelectionChange"
>
<el-table-column type="selection" width="55" align="center" />
<el-table-column label="备件序列号" align="center" prop="serialNum" />
<el-table-column label="备件名称" align="center" prop="spareName" />
<el-table-column label="规格与型号" align="center" prop="modelSpecs" />
<el-table-column label="设备类型Id" align="center" prop="deviceTypeId" />
<el-table-column label="库存数量" align="center" prop="inventoryLevels" />
<el-table-column
label="最低库存"
align="center"
prop="minInventoryLevels"
/>
<el-table-column label="使用年限" align="center" prop="serviceLife" />
<el-table-column label="单价" align="center" prop="unitPrice" />
<el-table-column
label="更新时间"
align="center"
prop="updateTime"
width="180"
>
<template slot-scope="scope">
<span>{{ parseTime(scope.row.updateTime) }}</span>
</template>
</el-table-column>
<el-table-column
label="操作"
align="center"
class-name="small-padding fixed-width"
>
<template slot-scope="scope">
<el-button
size="mini"
type="text"
icon="el-icon-edit"
@click="handleUpdate(scope.row)"
v-hasPermi="['system:post:edit']"
>修改</el-button
>
<el-button
size="mini"
type="text"
icon="el-icon-delete"
@click="handleDelete(scope.row)"
v-hasPermi="['system:post:remove']"
>删除</el-button
>
</template>
</el-table-column>
</el-table>
<pagination
v-show="total > 0"
:total="total"
:page.sync="queryParams.pageNum"
:limit.sync="queryParams.pageSize"
@pagination="getList"
/>
<!-- 添加或修改备件库存对话框 -->
<el-dialog :title="title" :visible.sync="open" width="700px" append-to-body>
<el-form ref="form" :model="form" :rules="rules" label-width="95px">
<el-row type="flex" justify="center">
<el-col :span="12">
<el-form-item label="设备序列号" prop="serialNum">
<el-input
v-model="form.serialNum"
placeholder="请输入设备序列号"
/>
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item label="设备名称" prop="spareName">
<el-input
v-model="form.spareName"
placeholder="请输入设备名称"
clearable
/>
</el-form-item>
</el-col>
</el-row>
<el-row type="flex" justify="center">
<el-col :span="12">
<el-form-item label="规格与型号" prop="modelSpecs">
<el-input
v-model="form.modelSpecs"
placeholder="请输入规格与型号"
clearable
/> </el-form-item
></el-col>
<el-col :span="12">
<el-form-item label="设备类型Id" prop="deviceTypeId">
<el-input
v-model="form.deviceTypeId"
placeholder="请输入设备类型Id"
clearable
/> </el-form-item
></el-col>
</el-row>
<el-row type="flex" justify="center">
<el-col :span="12">
<el-form-item label="库存数量" prop="inventoryLevels">
<el-input
v-model="form.inventoryLevels"
placeholder="请输入库存数量"
clearable
/>
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item label="最低库存" prop="minInventoryLevels">
<el-input
v-model="form.minInventoryLevels"
placeholder="请输入最低库存"
clearable
/> </el-form-item
></el-col>
</el-row>
<el-row type="flex" justify="center">
<el-col :span="12">
<el-form-item label="使用年限" prop="serviceLife">
<el-input
v-model="form.serviceLife"
placeholder="请输入使用年限"
clearable
/>
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item label="单价" prop="unitPrice">
<el-input
v-model="form.unitPrice"
placeholder="请输入单价"
clearable
/> </el-form-item
></el-col>
</el-row>
</el-form>
<div slot="footer" class="dialog-footer">
<el-button @click="cancel"> </el-button>
<el-button type="primary" @click="submitForm"> </el-button>
</div>
</el-dialog>
</div>
</template>
<script>
import {
spareList,
getSpare,
delSpare,
addSpare,
updateSpare,
} from "@/api/device/spare";
export default {
name: "spare",
data() {
return {
timeArr: [],
//
loading: true,
//
ids: [],
//
single: true,
//
multiple: true,
//
showSearch: true,
//
total: 0,
//
postList: [],
//
title: "",
//
open: false,
//
queryParams: {
pageNum: 1,
pageSize: 10,
serialNum: "",
spareName: "",
beginTime: "",
endTime: "",
},
//
form: {},
//
rules: {
serialNum: [
{ required: true, message: "设备序列号不能为空", trigger: "blur" },
],
spareName: [
{ required: true, message: "备件名称不能为空", trigger: "blur" },
],
},
};
},
created() {
this.getList();
},
methods: {
//
dateChange() {
// console.log("", this.timeArr);
if (!this.timeArr) {
this.$nextTick(() => {
this.timeArr = [];
this.queryParams.beginTime = "";
this.queryParams.endTime = "";
});
} else {
this.queryParams.beginTime = this.timeArr[0];
this.queryParams.endTime = this.timeArr[1];
}
},
/** 查询设备件库存列表 */
getList() {
this.loading = true;
spareList(this.queryParams).then((response) => {
this.postList = response.rows;
this.total = response.total;
this.loading = false;
});
},
//
cancel() {
this.open = false;
this.reset();
this.form.id = "";
},
//
reset() {
this.form = {
serialNum: "",
spareName: "",
modelSpecs: "",
deviceTypeId: "",
inventoryLevels: "",
minInventoryLevels: "",
serviceLife: "",
unitPrice: "",
remark: "",
};
this.resetForm("form");
},
/** 搜索按钮操作 */
handleQuery() {
this.queryParams.pageNum = 1;
this.getList();
},
/** 重置按钮操作 */
resetQuery() {
this.resetForm("queryForm");
this.handleQuery();
},
//
handleSelectionChange(selection) {
this.ids = selection.map((item) => item.id);
this.single = selection.length != 1;
this.multiple = !selection.length;
},
/** 新增按钮操作 */
handleAdd() {
this.reset();
this.open = true;
this.title = "添加备件库存";
},
/** 修改按钮操作 */
handleUpdate(row) {
this.reset();
this.form.id = "";
const gwId = row.id || this.ids;
console.log("");
getSpare(gwId).then((response) => {
// this.form = response.data;
this.form = {
id: response.data.id,
serialNum: response.data.serialNum,
spareName: response.data.spareName,
modelSpecs: response.data.modelSpecs,
deviceTypeId: response.data.deviceTypeId,
inventoryLevels: response.data.inventoryLevels,
minInventoryLevels: response.data.minInventoryLevels,
serviceLife: response.data.serviceLife,
unitPrice: response.data.unitPrice,
remark: response.data.remark,
};
this.open = true;
this.title = "修改备件库存";
});
},
/** 提交按钮 */
submitForm: function () {
this.$refs["form"].validate((valid) => {
if (valid) {
if (this.form.id != undefined) {
updateSpare(this.form).then((response) => {
this.$modal.msgSuccess("修改成功");
this.open = false;
this.getList();
});
} else {
console.log("新增参数", this.form);
addSpare(this.form).then((response) => {
this.$modal.msgSuccess("新增成功");
this.open = false;
this.getList();
});
}
}
});
},
/** 删除按钮操作 */
handleDelete(row) {
const Ids = row.id || this.ids;
this.$modal
.confirm('是否确认删除备件编号为"' + Ids + '"的数据项?')
.then(function () {
return delSpare(Ids);
})
.then(() => {
this.getList();
this.$modal.msgSuccess("删除成功");
})
.catch(() => {});
},
/** 导出按钮操作 */
handleExport() {
this.download(
"device/gateway/export",
{
...this.queryParams,
},
`post_${new Date().getTime()}.xlsx`
);
},
},
};
</script>

436
src/views/device/spareInOut/index.vue

@ -0,0 +1,436 @@
<template>
<div class="app-container">
<div class="btn-condition">
<div class="condition-left" v-show="showSearch">
<el-form
:model="queryParams"
ref="queryForm"
size="small"
:inline="true"
label-width="90px"
>
<el-form-item label="备件序列号" prop="serialNum">
<el-input
v-model="queryParams.serialNum"
placeholder="请输入备件序列号"
clearable
@keyup.enter.native="handleQuery"
/>
</el-form-item>
<el-form-item label="备件名称" prop="spareName">
<el-input
v-model="queryParams.spareName"
placeholder="请输入备件名称"
clearable
@keyup.enter.native="handleQuery"
/>
</el-form-item>
<el-form-item label="操作类型" prop="operaType">
<el-select
v-model="queryParams.operaType"
placeholder="请选择操作类型"
clearable
>
<el-option
v-for="dict in dict.type.sys_inout_type"
:key="dict.value"
:label="dict.label"
:value="dict.value"
/>
</el-select>
</el-form-item>
<el-form-item label="日期范围" prop="timeArr">
<el-date-picker
style="width: 220px"
v-model="timeArr"
type="daterange"
unlink-panels
range-separator="~"
start-placeholder="开始日期"
end-placeholder="结束日期"
value-format="yyyy-MM-dd"
@change="dateChange"
>
</el-date-picker>
</el-form-item>
</el-form>
<div class="primary-btn">
<el-button
type="primary"
icon="el-icon-search"
size="mini"
@click="handleQuery"
>搜索</el-button
>
</div>
<div class="cancel-btn">
<el-button
type="cancel"
icon="el-icon-refresh"
size="mini"
@click="resetQuery"
>重置</el-button
>
</div>
</div>
</div>
<el-row :gutter="10" class="mb8">
<el-col :span="1.5">
<div class="primary-btn" v-hasPermi="['system:post:add']">
<el-button type="primary" size="mini" @click="handleOut"
><svg-icon
icon-class="Outbound"
style="margin-right: 5px; font-size: 13px"
/></el-button
>
</div>
</el-col>
<el-col :span="1.5">
<div class="primary-btn" v-hasPermi="['system:post:add']">
<el-button type="primary" size="mini" @click="handleIn"
><svg-icon
icon-class="Inbound"
style="margin-right: 5px; font-size: 13px"
/></el-button
>
</div>
</el-col>
<el-col :span="1.5">
<div class="warning-btn" v-hasPermi="['system:post:export']">
<el-button
type="warning"
icon="el-icon-download"
size="mini"
@click="handleExport"
>导出</el-button
>
</div>
</el-col>
<right-toolbar
:showSearch.sync="showSearch"
@queryTable="getList"
></right-toolbar>
</el-row>
<el-table v-loading="loading" :data="postList">
<!-- <el-table-column label="库存备件Id" align="center" prop="sparePartsId" /> -->
<el-table-column label="备件名称" align="center" prop="spareName" />
<el-table-column label="出入库操作类型" align="center" prop="operaType">
<template slot-scope="scope">
<dict-tag
:options="dict.type.sys_inout_type"
:value="scope.row.operaType"
/>
</template>
</el-table-column>
<el-table-column label="出入库量" align="center" prop="intOutNum" />
<el-table-column label="库存数量" align="center" prop="inventoryLevels" />
<el-table-column
label="出入库时间"
align="center"
prop="createTime"
width="180"
>
<template slot-scope="scope">
<span>{{ parseTime(scope.row.createTime) }}</span>
</template>
</el-table-column>
</el-table>
<pagination
v-show="total > 0"
:total="total"
:page.sync="queryParams.pageNum"
:limit.sync="queryParams.pageSize"
@pagination="getList"
/>
<!-- 出入库对话框 -->
<el-dialog :title="title" :visible.sync="open" width="700px" append-to-body>
<el-form ref="form" label-width="95px">
<el-table :data="dialogList">
<el-table-column label="备件名称" prop="spareName" width="200">
<template slot-scope="scope">
<el-select
v-model="scope.row.sparePartsId"
@change="handleSpare(scope.row, scope.row.sparePartsId)"
>
<el-option
v-for="item in spares"
:key="item.id"
:label="item.spareName"
:value="item.id"
>
</el-option>
</el-select>
</template>
</el-table-column>
<el-table-column label="数量" width="150">
<template slot-scope="scope">
<el-input
placeholder="请填写"
v-model="scope.row.intOutNum"
@blur="blurColumn(scope.row, scope.$index)"
@input="updateNextRowMes(scope.row, scope.$index)"
></el-input>
</template>
</el-table-column>
<el-table-column label="当前库存" width="150" prop="inventoryLevels">
</el-table-column>
<el-table-column prop="data1" label="操作" width="130">
<template slot-scope="scope">
<div class="table-btn">
<div class="delete-btn">
<el-button
size="mini"
type="delete"
icon="el-icon-delete"
@click="delectList(scope.row)"
>删除</el-button
>
</div>
</div>
</template>
</el-table-column>
</el-table>
<div class="success-btn" style="margin-top: 10px">
<el-button type="success" size="mini" @click="addPriceSet"
>添加设置</el-button
>
</div>
</el-form>
<div slot="footer" class="dialog-footer">
<el-button @click="cancel"> </el-button>
<el-button type="primary" @click="submitForm"> </el-button>
</div>
</el-dialog>
</div>
</template>
<script>
import { spareInOutList, addSpareInOut } from "@/api/device/spareInOut";
import { spareList } from "@/api/device/spare";
export default {
name: "spareInOut",
dicts: ["sys_inout_type"],
data() {
return {
timeArr: [],
//
loading: true,
//
ids: [],
//
showSearch: true,
//
total: 0,
//
postList: [],
//
title: "",
//
open: false,
//
queryParams: {
pageNum: 1,
pageSize: 10,
serialNum: "",
spareName: "",
beginTime: "",
endTime: "",
operaType: "",
},
dialogList: [], //
sparesList: [], //
spares: [],
};
},
created() {
this.getList();
this.getSparesList();
},
methods: {
//
dateChange() {
// console.log("", this.timeArr);
if (!this.timeArr) {
this.$nextTick(() => {
this.timeArr = [];
this.queryParams.beginTime = "";
this.queryParams.endTime = "";
});
} else {
this.queryParams.beginTime = this.timeArr[0];
this.queryParams.endTime = this.timeArr[1];
}
},
/** 查询出入库列表 */
getList() {
this.loading = true;
spareInOutList(this.queryParams).then((response) => {
this.postList = response.rows;
this.total = response.total;
this.loading = false;
});
},
//
cancel() {
this.open = false;
},
/** 搜索按钮操作 */
handleQuery() {
this.queryParams.pageNum = 1;
this.getList();
},
/** 重置按钮操作 */
resetQuery() {
this.resetForm("queryForm");
this.handleQuery();
},
/** 出库按钮操作 */
handleOut() {
this.open = true;
this.title = "出库";
this.dialogList = [];
},
/** 入库按钮操作 */
handleIn() {
this.open = true;
this.title = "入库";
this.dialogList = [];
},
/** 提交按钮 */
submitForm: function () {
console.log("出入库参数", this.dialogList);
for (const row of this.dialogList) {
//
const intOutNumValid = this.isValidValue(row.intOutNum);
//
if (!intOutNumValid) {
this.$message.warning(`${this.title}数量不能有空值`);
return;
}
}
addSpareInOut(this.dialogList).then((response) => {
this.$modal.msgSuccess(`${this.title}成功`);
this.open = false;
this.getList();
});
},
//
isValidValue(value) {
if (typeof value === "number" && !isNaN(value)) {
return true;
}
if (typeof value === "string" && value.trim() !== "") {
return true;
}
return false;
},
// column
blurColumn(row, index) {
console.log("blurColumn");
// this.$set(this.dialogList[index], "edit", false);
},
//
updateNextRowMes(row, index) {
// row.intOutNum = Number(row.intOutNum);
if (this.title === "出库" && row.intOutNum > row.inventoryLevels) {
this.$message.warning("出库数量不能大于库存剩余量");
row.intOutNum = "";
}
},
// --
delectList(row) {
const index = this.dialogList.indexOf(row);
if (index > -1) {
//
this.dialogList.splice(index, 1);
}
},
// -select
handleSpare(row, selectedValue) {
console.log("当前行", row);
console.log("当前select选中值", selectedValue);
// value label
const selectedItem = this.spares.find(
(item) => item.id === selectedValue
);
if (selectedItem) {
const selectedLabel = selectedItem.spareName;
console.log("选中的 value:", selectedValue);
console.log("选中的 label:", selectedLabel);
// inventoryLevels
const inventoryLevels = this.sparesList
.filter((item) => item.id === selectedValue)
.map((item) => item.inventoryLevels);
//
const newItem = {
sparePartsId: selectedValue,
spareName: selectedLabel,
intOutNum: "",
inventoryLevels: inventoryLevels[0],
};
console.log("this.dialogList", this.dialogList);
// // dialogList
// this.dialogList.push(newItem);
// row
row.sparePartsId = newItem.sparePartsId;
row.spareName = newItem.spareName;
row.inventoryLevels = newItem.inventoryLevels;
}
},
// --
addPriceSet() {
let sparePartsId = "";
let spareName = "";
let inventoryLevels = "";
let operaType = "";
if (this.title === "出库") {
operaType = 1;
} else if (this.title === "入库") {
operaType = 0;
}
// spares
if (this.spares.length > 0) {
sparePartsId = this.spares[0].id;
spareName = this.spares[0].spareName;
inventoryLevels = this.spares[0].inventoryLevels;
}
//
const newItem = {
sparePartsId: sparePartsId,
spareName: spareName,
intOutNum: "",
inventoryLevels: inventoryLevels,
operaType: operaType,
};
// dialogList
this.dialogList.push(newItem);
},
//
getSparesList() {
let data = {
pageNum: 1,
pageSize: 100000,
};
spareList(data).then((response) => {
this.spares = response.rows;
this.sparesList = response.rows;
//
});
},
/** 导出按钮操作 */
handleExport() {
this.download(
"device/gateway/export",
{
...this.queryParams,
},
`post_${new Date().getTime()}.xlsx`
);
},
},
};
</script>
Loading…
Cancel
Save