Comparer les révisions

...

16 Révisions

Auteur SHA1 Message Date
09cce6c613 Merge pull request '更新自贡' (#345) from projects/zg-zwq into projects/zg-test
Reviewed-on: #345
2024-04-22 16:56:43 +08:00
zwq
07dd135daa 更新自贡 2024-04-22 16:55:59 +08:00
0757d2d47c Merge pull request '更新' (#338) from projects/zg-zwq into projects/zg-test
Reviewed-on: #338
2024-04-15 17:22:40 +08:00
zwq
4fbe72d314 更新 2024-04-15 17:22:10 +08:00
10219fd841 Merge pull request 'projects/line-lb' (#72) from projects/line-lb into projects/line-test
Reviewed-on: #72
2023-11-14 09:22:16 +08:00
lb
74a2a3b8e5 Merge branch 'projects/line-lb' of http://git.picaiba.com/mt-fe-group/yudao-dev into projects/line-lb 2023-11-14 09:15:58 +08:00
lb
c3b4223e5b update login 2023-11-14 09:15:30 +08:00
070e01c2c4 Merge pull request 'projects/line-lb' (#58) from projects/line-lb into projects/line-test
Reviewed-on: #58
2023-10-30 10:53:44 +08:00
lb
2665b6a0b0 Merge branch 'projects/line-test' into projects/line-lb 2023-10-30 10:52:08 +08:00
lb
a71fb90e6a update DialogForm v-model 2023-10-30 10:51:41 +08:00
ac85c83cf9 Merge pull request 'update' (#50) from projects/line-lb into projects/line-test
Reviewed-on: #50
2023-10-19 17:07:10 +08:00
lb
c2e987aee4 update 2023-10-19 17:06:15 +08:00
0e4ed597cd Merge pull request 'update ui' (#49) from projects/line-lb into projects/line-test
Reviewed-on: #49
2023-10-18 09:15:36 +08:00
lb
3e7914ac91 update ui 2023-10-17 17:02:33 +08:00
9c19a6197a Merge pull request 'update dashboard' (#48) from projects/line-lb into projects/line-test
Reviewed-on: #48
2023-10-17 09:44:37 +08:00
lb
074b35b6a6 update dashboard 2023-10-17 09:43:44 +08:00
94 fichiers modifiés avec 8717 ajouts et 1575 suppressions

BIN
public/static/videos/login.webm Fichier normal

Fichier binaire non affiché.

Voir le fichier

@@ -0,0 +1,86 @@
/*
* @Author: zwq
* @Date: 2024-04-11 15:00:03
* @LastEditors: zwq
* @LastEditTime: 2024-04-12 10:25:30
* @Description:
*/
import request from '@/utils/request'
// 获得分页数据
export function energyQuantityManualPage(query) {
return request({
url: '/base/energy-quantity-manual/page',
method: 'get',
params: query
})
}
// 创建
export function energyQuantityManualCreate(data) {
return request({
url: '/base/energy-quantity-manual/create',
method: 'post',
data: data
})
}
// 更新
export function energyQuantityManualUpdate(data) {
return request({
url: '/base/energy-quantity-manual/update',
method: 'put',
data: data
})
}
//获得能源抄表(手动)
export function energyQuantityManualGet(query) {
return request({
url: '/base/energy-quantity-manual/get',
method: 'get',
params: query
})
}
//删除
export function energyQuantityManualDelete(query) {
return request({
url: '/base/energy-quantity-manual/delete',
method: 'delete',
params: query
})
}
//导出
export function energyQuantityManualExport(query) {
return request({
url: '/base/energy-quantity-manual/export-excel',
method: 'get',
params: query,
responseType: 'blob'
})
}
// 获得能源表名配置分页
export function energyTablePage() {
return request({
url: '/base/energy-type-meter-bind/list',
method: 'get',
})
}
// 获得能源表名配置
export function energyTableGet(query) {
return request({
url: '/base/energy-type-meter-bind/list',
method: 'get',
params: query
})
}
// 更新能源表名配置
export function energyTableUpdate(data) {
return request({
url: '/base/energy-type-meter-bind/update',
method: 'put',
data: data
})
}

75
src/api/base/material.js Fichier normal
Voir le fichier

@@ -0,0 +1,75 @@
/*
* @Author: zwq
* @Date: 2024-04-09 16:42:19
* @LastEditors: zwq
* @LastEditTime: 2024-04-10 14:33:52
* @Description:
*/
import request from '@/utils/request'
// 创建原料
export function createMaterial(data) {
return request({
url: '/base/material/create',
method: 'post',
data: data
})
}
// 更新原料
export function updateMaterial(data) {
return request({
url: '/base/material/update',
method: 'put',
data: data
})
}
// 获取code
export function getCode() {
return request({
url: '/base/material/autoCode',
method: 'POST'
})
}
// 删除原料
export function deleteMaterial(id) {
return request({
url: '/base/material/delete?id=' + id,
method: 'delete'
})
}
// 获得原料
export function getMaterial(id) {
return request({
url: '/base/material/get?id=' + id,
method: 'get'
})
}
// 获得原料分页
export function getMaterialPage(query) {
return request({
url: '/base/material/page',
method: 'get',
params: query
})
}
// 获得原料列表
export function getMaterialList() {
return request({
url: '/base/material/list',
method: 'get',
})
}
// 导出原料 Excel
export function exportMaterialExcel(query) {
return request({
url: '/base/material/export-excel',
method: 'get',
params: query,
responseType: 'blob'
})
}

Voir le fichier

@@ -0,0 +1,68 @@
/*
* @Author: zwq
* @Date: 2024-04-09 16:42:19
* @LastEditors: zwq
* @LastEditTime: 2024-04-10 14:31:46
* @Description:
*/
import request from '@/utils/request'
// 创建原料
export function createMaterialPricing(data) {
return request({
url: '/base/material-pricing/create',
method: 'post',
data: data
})
}
// 更新原料
export function updateMaterialPricing(data) {
return request({
url: '/base/material-pricing/update',
method: 'put',
data: data
})
}
// 获取code
export function getCode() {
return request({
url: '/base/material-pricing/autoCode',
method: 'POST'
})
}
// 删除原料
export function deleteMaterialPricing(id) {
return request({
url: '/base/material-pricing/delete?id=' + id,
method: 'delete'
})
}
// 获得原料
export function getMaterialPricing(id) {
return request({
url: '/base/material-pricing/get?id=' + id,
method: 'get'
})
}
// 获得原料分页
export function getMaterialPricingPage(query) {
return request({
url: '/base/material-pricing/page',
method: 'get',
params: query
})
}
// 导出原料 Excel
export function exportMaterialPricingExcel(query) {
return request({
url: '/base/material-pricing/export-excel',
method: 'get',
params: query,
responseType: 'blob'
})
}

34
src/api/cost/costEnergy.js Fichier normal
Voir le fichier

@@ -0,0 +1,34 @@
/*
* @Author: zwq
* @Date: 2024-04-18 16:53:17
* @LastEditors: zwq
* @LastEditTime: 2024-04-19 16:11:19
* @Description:
*/
import request from '@/utils/request'
// 更新原片能源历史
export function updateEnergyHis(data) {
return request({
url: '/monitoring/cost-energy-his/update',
method: 'put',
data: data
})
}
// 获得原片能源历史分页
export function getEnergyHisPage(query) {
return request({
url: '/monitoring/cost-energy-his/page',
method: 'get',
params: query
})
}
// 获得原片能源-成本查询分页
export function getEnergyRealtimePage(query) {
return request({
url: '/monitoring/cost-energy-realtime/page',
method: 'get',
params: query
})
}

34
src/api/cost/costEnergyDeep.js Fichier normal
Voir le fichier

@@ -0,0 +1,34 @@
/*
* @Author: zwq
* @Date: 2024-04-18 16:53:17
* @LastEditors: zwq
* @LastEditTime: 2024-04-22 14:51:14
* @Description:
*/
import request from '@/utils/request'
// 更新深加工能源历史
export function updateEnergyHis(data) {
return request({
url: '/monitoring/cost-deep-energy-his/update',
method: 'put',
data: data
})
}
// 获得深加工能源历史分页
export function getEnergyHisPage(query) {
return request({
url: '/monitoring/cost-deep-energy-his/page',
method: 'get',
params: query
})
}
// 获得深加工能源-成本查询分页
export function getEnergyRealtimePage(query) {
return request({
url: '/monitoring/cost-deep-energy-realtime/page',
method: 'get',
params: query
})
}

34
src/api/cost/costMaterial.js Fichier normal
Voir le fichier

@@ -0,0 +1,34 @@
/*
* @Author: zwq
* @Date: 2024-04-18 16:53:17
* @LastEditors: zwq
* @LastEditTime: 2024-04-19 16:12:14
* @Description:
*/
import request from '@/utils/request'
// 更新原料成本-历史
export function updateMaterialHis(data) {
return request({
url: '/monitoring/cost-material-his/update',
method: 'put',
data: data
})
}
// 获得原料成本-历史分页
export function getMaterialHisPage(query) {
return request({
url: '/monitoring/cost-material-his/page',
method: 'get',
params: query
})
}
// 获得原料成本-成本查询分页
export function getMaterialRealtimePage(query) {
return request({
url: '/monitoring/cost-material-realtime/page',
method: 'get',
params: query
})
}

Voir le fichier

@@ -0,0 +1,26 @@
/*
* @Author: zwq
* @Date: 2024-04-18 16:53:17
* @LastEditors: zwq
* @LastEditTime: 2024-04-22 10:53:55
* @Description:
*/
import request from '@/utils/request'
// 更新原片良品率
export function updatecostOriginRatioHis(data) {
return request({
url: '/monitoring/cost-origin-ratio-his/update',
method: 'put',
data: data
})
}
// 获得原片良品率
export function getcostOriginRatioHisPage(query) {
return request({
url: '/monitoring/cost-origin-ratio-his/page',
method: 'get',
params: query
})
}

Voir le fichier

@@ -0,0 +1,34 @@
/*
* @Author: zwq
* @Date: 2024-04-18 16:53:17
* @LastEditors: zwq
* @LastEditTime: 2024-04-19 14:24:17
* @Description:
*/
import request from '@/utils/request'
// 更新原片其他成本-历史
export function updateRawOthercostHis(data) {
return request({
url: '/monitoring/cost-othercost-his/update',
method: 'put',
data: data
})
}
// 获得原片其他成本-历史分页
export function getRawOthercostHisPage(query) {
return request({
url: '/monitoring/cost-othercost-his/page',
method: 'get',
params: query
})
}
// 获得原片其他成本-成本查询分页
export function getRawOthercostSunPage(query) {
return request({
url: '/monitoring/cost-othercost-log/page-sum',
method: 'get',
params: query
})
}

Voir le fichier

@@ -0,0 +1,34 @@
/*
* @Author: zwq
* @Date: 2024-04-18 16:53:17
* @LastEditors: zwq
* @LastEditTime: 2024-04-22 15:15:18
* @Description:
*/
import request from '@/utils/request'
// 更新深加工其他成本-历史
export function updateRawOthercostHis(data) {
return request({
url: '/monitoring/cost-deep-othercost-his/update',
method: 'put',
data: data
})
}
// 获得深加工其他成本-历史分页
export function getRawOthercostHisPage(query) {
return request({
url: '/monitoring/cost-deep-othercost-his/page',
method: 'get',
params: query
})
}
// 获得深加工其他成本-成本查询分页
export function getRawOthercostSunPage(query) {
return request({
url: '/monitoring/cost-deep-othercost-log/page-sum',
method: 'get',
params: query
})
}

Voir le fichier

@@ -0,0 +1,68 @@
/*
* @Author: zwq
* @Date: 2024-04-15 17:01:20
* @LastEditors: zwq
* @LastEditTime: 2024-04-18 15:40:27
* @Description:
*/
import request from '@/utils/request'
// 创建原片其他成本-记录
export function createRawOthercostLog(data) {
return request({
url: '/monitoring/cost-othercost-log/create',
method: 'post',
data: data
})
}
// 更新原片其他成本-记录
export function updateRawOthercostLog(data) {
return request({
url: '/monitoring/cost-othercost-log/update',
method: 'put',
data: data
})
}
// 删除原片其他成本-记录
export function deleteRawOthercostLog(id) {
return request({
url: '/monitoring/cost-othercost-log/delete?id=' + id,
method: 'delete'
})
}
// 获得原片其他成本-记录
export function getRawOthercostLog(id) {
return request({
url: '/monitoring/cost-othercost-log/get?id=' + id,
method: 'get'
})
}
// 获得原片其他成本-记录分页
export function getRawOthercostLogPage(query) {
return request({
url: '/monitoring/cost-othercost-log/page',
method: 'get',
params: query
})
}
// 导出原片其他成本-记录 Excel
export function exportRawOthercostLogExcel(query) {
return request({
url: '/monitoring/cost-othercost-log/export-excel',
method: 'get',
params: query,
responseType: 'blob'
})
}
// 获得所有原片其他成本-记录列表
export function getRawOthercostLogAll() {
return request({
url: '/monitoring/cost-othercost-log/listAll',
method: 'get'
})
}

Voir le fichier

@@ -0,0 +1,68 @@
/*
* @Author: zwq
* @Date: 2024-04-15 17:01:20
* @LastEditors: zwq
* @LastEditTime: 2024-04-22 14:59:35
* @Description:
*/
import request from '@/utils/request'
// 创建深加工其他成本-记录
export function createRawOthercostLog(data) {
return request({
url: '/monitoring/cost-deep-othercost-log/create',
method: 'post',
data: data
})
}
// 更新深加工其他成本-记录
export function updateRawOthercostLog(data) {
return request({
url: '/monitoring/cost-deep-othercost-log/update',
method: 'put',
data: data
})
}
// 删除深加工其他成本-记录
export function deleteRawOthercostLog(id) {
return request({
url: '/monitoring/cost-deep-othercost-log/delete?id=' + id,
method: 'delete'
})
}
// 获得深加工其他成本-记录
export function getRawOthercostLog(id) {
return request({
url: '/monitoring/cost-deep-othercost-log/get?id=' + id,
method: 'get'
})
}
// 获得深加工其他成本-记录分页
export function getRawOthercostLogPage(query) {
return request({
url: '/monitoring/cost-deep-othercost-log/page',
method: 'get',
params: query
})
}
// 导出深加工其他成本-记录 Excel
export function exportRawOthercostLogExcel(query) {
return request({
url: '/monitoring/cost-deep-othercost-log/export-excel',
method: 'get',
params: query,
responseType: 'blob'
})
}
// 获得所有深加工其他成本-记录列表
export function getRawOthercostLogAll() {
return request({
url: '/monitoring/cost-deep-othercost-log/listAll',
method: 'get'
})
}

Voir le fichier

@@ -0,0 +1,68 @@
/*
* @Author: zwq
* @Date: 2024-04-15 17:01:20
* @LastEditors: zwq
* @LastEditTime: 2024-04-22 14:55:00
* @Description:
*/
import request from '@/utils/request'
// 创建深加工其他成本-配置
export function createRawOthercostRule(data) {
return request({
url: '/monitoring/cost-deep-othercost-rule/create',
method: 'post',
data: data
})
}
// 更新深加工其他成本-配置
export function updateRawOthercostRule(data) {
return request({
url: '/monitoring/cost-deep-othercost-rule/update',
method: 'put',
data: data
})
}
// 删除深加工其他成本-配置
export function deleteRawOthercostRule(id) {
return request({
url: '/monitoring/cost-deep-othercost-rule/delete?id=' + id,
method: 'delete'
})
}
// 获得深加工其他成本-配置
export function getRawOthercostRule(id) {
return request({
url: '/monitoring/cost-deep-othercost-rule/get?id=' + id,
method: 'get'
})
}
// 获得深加工其他成本-配置分页
export function getRawOthercostRulePage(query) {
return request({
url: '/monitoring/cost-deep-othercost-rule/page',
method: 'get',
params: query
})
}
// 导出深加工其他成本-配置 Excel
export function exportRawOthercostRuleExcel(query) {
return request({
url: '/monitoring/cost-deep-othercost-rule/export-excel',
method: 'get',
params: query,
responseType: 'blob'
})
}
// 获得所有深加工其他成本-配置列表
export function getRawOthercostRuleAll() {
return request({
url: '/monitoring/cost-deep-othercost-rule/listAll',
method: 'get'
})
}

Voir le fichier

@@ -0,0 +1,68 @@
/*
* @Author: zwq
* @Date: 2024-04-15 17:01:20
* @LastEditors: zwq
* @LastEditTime: 2024-04-18 15:39:12
* @Description:
*/
import request from '@/utils/request'
// 创建原片其他成本-配置
export function createRawOthercostRule(data) {
return request({
url: '/monitoring/cost-othercost-rule/create',
method: 'post',
data: data
})
}
// 更新原片其他成本-配置
export function updateRawOthercostRule(data) {
return request({
url: '/monitoring/cost-othercost-rule/update',
method: 'put',
data: data
})
}
// 删除原片其他成本-配置
export function deleteRawOthercostRule(id) {
return request({
url: '/monitoring/cost-othercost-rule/delete?id=' + id,
method: 'delete'
})
}
// 获得原片其他成本-配置
export function getRawOthercostRule(id) {
return request({
url: '/monitoring/cost-othercost-rule/get?id=' + id,
method: 'get'
})
}
// 获得原片其他成本-配置分页
export function getRawOthercostRulePage(query) {
return request({
url: '/monitoring/cost-othercost-rule/page',
method: 'get',
params: query
})
}
// 导出原片其他成本-配置 Excel
export function exportRawOthercostRuleExcel(query) {
return request({
url: '/monitoring/cost-othercost-rule/export-excel',
method: 'get',
params: query,
responseType: 'blob'
})
}
// 获得所有原片其他成本-配置列表
export function getRawOthercostRuleAll() {
return request({
url: '/monitoring/cost-othercost-rule/listAll',
method: 'get'
})
}

Voir le fichier

@@ -43,6 +43,14 @@ export function getEnergyOverlimitLogPage(data) {
})
}
// 获得手动抄表记录分页
export function getEnergyManualLogPage(data) {
return request({
url: '/monitoring/energy-overlimit-log/pageManual',
method: 'post',
data: data
})
}
// 导出能源超限记录 Excel
export function exportEnergyOverlimitLogExcel(query) {
return request({

Voir le fichier

@@ -0,0 +1,14 @@
<?xml version="1.0" encoding="UTF-8"?>
<svg width="14px" height="14px" viewBox="0 0 14 14" version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink">
<title>上传</title>
<g id="组件" stroke="none" stroke-width="1" fill="none" fill-rule="evenodd" opacity="0.65">
<g id="上传_Resources/Button" transform="translate(-12.000000, -9.000000)">
<g id="上传" transform="translate(12.000000, 9.000000)">
<g id="upload" transform="translate(0.875000, 0.875000)" fill="currentColor" fill-rule="nonzero">
<path d="M5.80371094,0.138085937 C5.8953125,0.046484375 6.01699219,0 6.13867188,0 C6.26035156,0 6.38066406,0.046484375 6.47363281,0.138085937 L8.60371094,2.26953125 C8.78828125,2.45410156 8.78828125,2.75351562 8.60371094,2.93808594 C8.51484375,3.02695312 8.39589844,3.07617188 8.27011719,3.07617188 C8.14433594,3.07617188 8.02539062,3.02695312 7.93652344,2.93808594 L6.61171875,1.61328125 L6.61171875,9.51289062 C6.61171875,9.77402344 6.39980469,9.9859375 6.13867188,9.9859375 C5.87753906,9.9859375 5.665625,9.77402344 5.665625,9.51289062 L5.665625,1.61328125 L4.34082031,2.93808594 C4.15625,3.12265625 3.85683594,3.12265625 3.67363281,2.93808594 C3.4890625,2.75351562 3.4890625,2.45410156 3.67226563,2.26953125 L5.80371094,0.138085937 Z M11.7769531,7.88046875 C11.5158203,7.88046875 11.3039063,8.09238281 11.3039063,8.35351563 L11.3039063,11.025 C11.3039063,11.1794922 11.178125,11.3066406 11.0222656,11.3066406 L1.22636719,11.3066406 C1.071875,11.3066406 0.944726562,11.1808594 0.944726562,11.025 L0.944726562,8.35214844 C0.944726562,8.09101563 0.7328125,7.87910156 0.471679688,7.87910156 C0.210546875,7.87910156 0,8.09238281 0,8.35214844 L0,11.3996094 C0,11.8685547 0.381445313,12.2486328 0.849023437,12.2486328 L11.4009766,12.2486328 C11.8699219,12.2486328 12.25,11.8671875 12.25,11.3996094 L12.25,8.35214844 C12.25,8.09238281 12.0380859,7.88046875 11.7769531,7.88046875 Z" id="Shape"></path>
</g>
<rect id="Rectangle-49" x="0" y="0" width="14" height="14"></rect>
</g>
</g>
</g>
</svg>

Après

Largeur:  |  Hauteur:  |  Taille: 2.1 KiB

BIN
src/assets/images/login-bg.png Fichier normal

Fichier binaire non affiché.

Après

Largeur:  |  Hauteur:  |  Taille: 137 KiB

BIN
src/assets/logo/cnbm.png Fichier normal

Fichier binaire non affiché.

Après

Largeur:  |  Hauteur:  |  Taille: 1.9 KiB

Voir le fichier

@@ -1,10 +1,13 @@
/* ===== PC DESIGN ===== */
$W: 1000;
$W: 1080;
$H: 1920;
$picW: 438;
$picH: 560;
$formW: 320;
// $picW: 438;
// $picH: 560;
$picW: 1080;
$picH: 1118;
$formW: 420;
$tabW: $formW / 2;
// $rowH: 56;
$rowH: 56;
$buttonH: 50;
@@ -15,6 +18,7 @@ $containerBgImage: '../assets/images/bg.png';
$logoWidth: 417px;
$logoHeight: 64px;
$logoImage: '../assets/logo/login-logo.png';
$cnbmLogo: '../assets/logo/cnbm.png';
// container-content
$contentWidth: round($W / $H * 100) * 1vw;
$contentHeight: round($picH / $W * 100) / 100 * $contentWidth;
@@ -22,7 +26,8 @@ $contentBgColor: #ffffff;
// container-content-pic
$picWidth: round($picW / $H * 100) * 1vw;
$picHeight: inherit;
$picImage: '../assets/images/pic.png';
// $picImage: '../assets/images/pic.png';
$picImage: '../assets/images/login-bg.png';
// container-content-field
$fieldWidth: $contentWidth - $picWidth;
$fieldHeight: inherit;
@@ -40,7 +45,9 @@ $buttonHeight: $buttonH * 1px;
float: right;
img {
cursor: pointer;
width:100%;max-width:100px; height:auto;
width: 100%;
max-width: 100px;
height: auto;
vertical-align: middle;
}
}
@@ -50,7 +57,7 @@ $buttonHeight: $buttonH * 1px;
min-width: 1080px;
min-height: 620px;
background-color: $containerBgColor;
background-image: url($containerBgImage);
// background-image: url($containerBgImage);
background-size: cover;
// 定位
position: relative;
@@ -75,49 +82,87 @@ $buttonHeight: $buttonH * 1px;
}
.content {
// 元素
width: $contentWidth;
height: $contentHeight;
// width: $contentWidth;
// height: $contentHeight;
width: 100%;
height: 100%;
background-color: #ffffff;
box-shadow: 0px 16px 40px rgba(0, 0, 0, 0.07);
border-radius: 20px;
// box-shadow: 0px 16px 40px rgba(0, 0, 0, 0.07);
// border-radius: 20px;
// 定位
position: relative;
display: flex;
.pic {
// 元素
width: $picWidth;
height: $picHeight;
background-image: url($picImage);
background-repeat: no-repeat;
background-size: cover;
border-radius: 20px 0 0 20px;
// 定位
background-size: 100% 100%;
background-position: 0 0;
position: relative;
&::after {
content: '';
position: absolute;
top: 0;
left: 0;
width: 100%;
height: 100%;
// background: #f003;
display: inline-block;
}
}
.field {
width: $fieldWidth;
height: $fieldHeight;
// 定位
position: absolute;
top: 0;
left: $picWidth;
display:flex;
justify-content: center;
// background: #ccc3;
position: relative;
padding-top: 196px;
flex: 1;
display: flex;
flex-direction: column;
// justify-content: center;
align-items: center;
.pc-title{ width: 100%; clear: both;}
.pc-title {
width: 100%;
text-align: center;
clear: both;
position: relative;
top: -36px;
// h3.title {
// position: relative;
// &::before {
// content: '';
// background: url($cnbmLogo) 100% / 100% no-repeat;
// height: 48px;
// width: 48px;
// position: absolute;
// left: 0px;
// top: 4px;
// display: inline-block;
// }
// }
}
.mobile-title,
.mobile-switch {
display: none;
}
.form {
margin-top: 32px;
box-sizing: border-box;
width: $formWidth;
// width: $formWidth;
width: 100%;
// - - - tab
:deep(.el-tabs__nav) {
// background: #f0f3;
}
:deep(.el-tabs__content) {
padding: 20px 0 0;
}
:deep(.el-tabs__item) {
user-select: none;
// 元素
width: $tabWidth;
height: $rowHeight;
@@ -125,10 +170,13 @@ $buttonHeight: $buttonH * 1px;
// 文字
line-height: $rowHeight;
color: #666666;
font-size: 18px;
font-weight: 400;
text-align: center;
}
:deep(.el-tabs__item.is-active) {
font-weight: bold;
color: #2F53EB;
font-weight: 500;
color: #2f53eb;
}
:deep(.el-tabs__active-bar) {
height: 3px;
@@ -152,22 +200,26 @@ $buttonHeight: $buttonH * 1px;
// 文字
text-align: left;
}
:deep(.el-input__inner::-webkit-input-placeholder) { /* WebKit browsers */
:deep(.el-input__inner::-webkit-input-placeholder) {
/* WebKit browsers */
font-weight: 400;
color: #8C8C8C;
color: #8c8c8c;
}
:deep(.el-input__inner:-moz-placeholder) { /* Mozilla Firefox 4 to 18 */
:deep(.el-input__inner:-moz-placeholder) {
/* Mozilla Firefox 4 to 18 */
font-weight: 400;
color: #8C8C8C;
color: #8c8c8c;
}
:deep(.el-input__inner::-moz-placeholder) { /* Mozilla Firefox 19+ */
:deep(.el-input__inner::-moz-placeholder) {
/* Mozilla Firefox 19+ */
font-weight: 400;
color: #8C8C8C;
opacity:1;
color: #8c8c8c;
opacity: 1;
}
:deep(.el-input__inner:-ms-input-placeholder) { /* Internet Explorer 10+ */
:deep(.el-input__inner:-ms-input-placeholder) {
/* Internet Explorer 10+ */
font-weight: 400;
color: #8C8C8C !important;
color: #8c8c8c !important;
}
:deep(.el-form-item) {
position: relative;
@@ -185,10 +237,10 @@ $buttonHeight: $buttonH * 1px;
font-size: 14px;
font-family: PingFang SC;
font-weight: 400;
color: #2F53EB;
color: #2f53eb;
span {
padding-left: 15px;
border-left: 2px solid #D9D9D9;
border-left: 2px solid #d9d9d9;
}
}
}
@@ -205,16 +257,36 @@ $buttonHeight: $buttonH * 1px;
// 文字
line-height: 26px;
font-size: 20px;
color: #FFFFFF;
color: #ffffff;
}
.button-active {
background: #2F53EB;
background: #2f53eb;
box-shadow: 0px 2px 8px rgba(0, 80, 184, 0.2);
}
}
}
}
.login-form {
* {
user-select: none;
}
// - - - input
:deep(.el-input__inner) {
// 元素
width: 420px;
height: 66px;
color: #262626;
font-size: 18px;
}
:deep(.el-checkbox__label) {
font-size: 18px;
line-height: 14px;
}
}
.footer {
user-select: none;
// 元素
height: 16px;
line-height: 16px;
@@ -235,17 +307,30 @@ $buttonHeight: $buttonH * 1px;
// - - - - - PC 最小尺寸设置
@media screen and (min-width: 599px) and (max-width: 1366px) {
.container {
min-width: 599px;
.content {
width: 710px;
height: 397px;
// width: 710px;
// height: 397px;
width: 100%;
height: 100%;
.pic {
width: 314px;
// width: 314px;
display: none;
}
.field {
width: calc(710px - 314px);
left: 314px;
// width: calc(710px - 314px);
// left: 314px;
// justify-content: center;
width: 100%;
.pc-title {
h3 {
font-size: 2.4rem !important;
}
}
.form {
width: 320px;
// width: 320px;
:deep(.el-input__inner) {
width: 320px;
height: 56px;
@@ -259,7 +344,6 @@ $buttonHeight: $buttonH * 1px;
}
}
/* ===== MOBILE DESIGN ===== */
$mobileW: 375;
$mobileH: 812;
@@ -273,9 +357,10 @@ $mobileButtonH: 48;
$mobileContainerBgImage: '../assets/images/bg-mobile.png';
// container-content
$mobileContentWidth: round($mobileContentW / $mobileW * 100) * 1vw;
$mobileContentHeight: round($mobileContentH / $mobileW * 100) / 100 * $mobileContentWidth;
$mobileContentHeight: round($mobileContentH / $mobileW * 100) / 100 *
$mobileContentWidth;
// container-content-field-form
$mobileFormWidth: round($mobileFormW / $mobileW *100) * 1vw;
$mobileFormWidth: round($mobileFormW / $mobileW * 100) * 1vw;
$mobileRowHeight: $mobileRowH * 1px;
$mobileButtonHeight: $mobileButtonH * 1px;
$iconBgImage: '../assets/images/icon.png';
@@ -288,13 +373,17 @@ $iconBgImage: '../assets/images/icon.png';
min-width: 280px;
min-height: 568px;
// 文字
font-size: 17px;
font-size: 14px;
font-family: PingFang SC;
font-weight: bold;
.logo {
display: none;
}
.pc-title {
display: none;
}
.content {
// 元素
width: $mobileContentWidth;
@@ -309,6 +398,7 @@ $iconBgImage: '../assets/images/icon.png';
display: none;
}
.field {
padding: 0;
// 元素
width: inherit;
min-height: inherit;
@@ -316,12 +406,15 @@ $iconBgImage: '../assets/images/icon.png';
left: 0;
display: flex;
flex-direction: column;
.mobile-title {
// 元素
margin: 0 0 20px;
margin: 0;
display: block;
}
.form {
margin: 0;
width: $mobileFormWidth;
// - - - tab
:deep(.el-tabs__header) {
@@ -347,7 +440,25 @@ $iconBgImage: '../assets/images/icon.png';
.button {
height: $mobileButtonHeight;
line-height: 24px;
color: #FFFFFF;
color: #ffffff;
}
}
.login-form {
:deep(.el-input__inner) {
height: $mobileRowHeight;
line-height: 24px;
// 文字
text-align: center;
color: #262626;
}
:deep(#button-form-item) {
margin: 0 !important;
button {
// 元素
height: $mobileRowHeight;
}
}
}
.mobile-switch {
@@ -370,6 +481,7 @@ $iconBgImage: '../assets/images/icon.png';
}
}
}
.footer {
// 元素
font-size: 12px;
@@ -379,9 +491,8 @@ $iconBgImage: '../assets/images/icon.png';
color: #333333;
opacity: 0.6;
// 定位
position: absolute;
bottom: 20px;
// position: absolute;
bottom: -32px;
}
}
}

Voir le fichier

@@ -83,6 +83,9 @@
:on-success="handleUploadSuccess"
v-bind="col.bind">
<el-button size="mini" :disabled="col.bind?.disabled || false">
<svg-icon
icon-class="icon-upload"
style="color: inherit"></svg-icon>
上传文件
</el-button>
<div class="el-upload__tip" slot="tip" v-if="col.uploadTips">
@@ -94,6 +97,7 @@
class="file"
v-for="file in form[col.prop] || []"
:file="file"
:key="file.fileUrl"
@delete="handleDeleteFile(file)" />
</div>
</el-form-item>
@@ -132,7 +136,6 @@ const uploadedFile = {
},
methods: {
handleDelete() {
console.log('emit delete event')
this.$emit('delete', this.file);
},
},
@@ -187,6 +190,10 @@ export default {
type: Boolean,
default: false,
},
hasFile: {
type: Boolean,
default: false,
},
labelPosition: {
type: String,
default: 'right',
@@ -219,7 +226,6 @@ export default {
watch: {
rows: {
handler() {
console.log('watch triggered!');
this.$nextTick(() => {
this.handleOptions('watch');
});
@@ -230,6 +236,9 @@ export default {
dataForm: {
handler(val) {
this.form = JSON.parse(JSON.stringify(val));
if (this.hasFile) {
this.form.files = this.form.files ?? [];
}
},
deep: true,
immediate: true,
@@ -367,7 +376,9 @@ export default {
},
handleDeleteFile(file) {
this.form.files = this.form.files.filter(item => item.fileUrl != file.fileUrl);
this.form.files = this.form.files.filter(
(item) => item.fileUrl != file.fileUrl
);
this.$emit('update', this.form);
},
},

83
src/filter/code-filter.js Fichier normal
Voir le fichier

@@ -0,0 +1,83 @@
/*
* @Date: 2020-12-29 16:49:28
* @LastEditors: zwq
* @LastEditTime: 2023-12-07 10:00:51
* @FilePath: \basic-admin\src\filters\basicData\index.js
* @Description:
*/
const table = {
lineStatus: {
1: '生产中',
2: '停止',
3: '未知',
},
deactivate: {
1: '启用',
0: '停用',
},
wareType: {
1: '缓存',
2: '活动',
3: '其它',
},
reportType: {
2: '日',
3: '周',
4: '月',
5: '年',
},
manual: {
1: '手动',
0: '自动',
},
}
// 日期格式化
export function parseTime(time, pattern) {
if (arguments.length === 0 || !time) {
return null
}
const format = pattern || '{y}-{m}-{d} {h}:{i}:{s}'
let date
if (typeof time === 'object') {
date = time
} else {
if ((typeof time === 'string') && (/^[0-9]+$/.test(time))) {
time = parseInt(time)
} else if (typeof time === 'string') {
time = time.replace(new RegExp(/-/gm), '/').replace('T', ' ').replace(new RegExp(/\.\d{3}/gm),'');
}
if ((typeof time === 'number') && (time.toString().length === 10)) {
time = time * 1000
}
date = new Date(time)
}
const formatObj = {
y: date.getFullYear(),
m: date.getMonth() + 1,
d: date.getDate(),
h: date.getHours(),
i: date.getMinutes(),
s: date.getSeconds(),
a: date.getDay()
}
const time_str = format.replace(/{([ymdhisa])+}/g, (result, key) => {
let value = formatObj[key]
// Note: getDay() returns 0 on Sunday
if (key === 'a') {
return ['日', '一', '二', '三', '四', '五', '六'][value]
}
if (result.length > 0 && value < 10) {
value = '0' + value
}
return value || 0
})
return time_str
}
export default function (dictTable) {
return function (val) {
return table?.[dictTable]?.[val]
}
}

122
src/mixins/basic-add.js Fichier normal
Voir le fichier

@@ -0,0 +1,122 @@
/*
* @Author: zwq
* @Date: 2022-08-24 11:19:43
* @LastEditors: zwq
* @LastEditTime: 2024-04-10 15:46:19
* @Description:
*/
import { listData } from "@/api/system/dict/data"; //数据字典接口
export default {
data() {
/* eslint-disable */
return {
urlOptions: {
createURL: '', //新增接口
updateURL: '', //编辑提交接口
infoURL: '', //编辑时获取单条数据接口
codeURL: '', //获取code接口返回结果为dataForm.code字段
optionArrUrl: [], //需要获取下拉框的方法数组
optionArr: {}, //需要获取下拉框的方法数组的返回结果
dictNameList: [], //数据字典name数组
dictArr: {}, //需要获取数据字典的方法数组的返回结果
},
visible: false,
setData: false, // 是否需要【编辑时获取单条数据接口】返回的数据操作
}
},
created() {
},
activated() {
},
methods: {
init(id) {
this.dataForm.id = id || null;
this.visible = true;
if (this.urlOptions.optionArrUrl.length > 0) {
this.getArr()
}
if (this.urlOptions.dictNameList.length > 0) {
this.getDict()
}
this.$nextTick(() => {
this.$refs["dataForm"].resetFields();
if (this.dataForm.id) {
this.urlOptions.infoURL(id).then(response => {
this.dataForm = response.data;
if (this.setData) {
this.setDataForm()
}
});
} else {
if (this.urlOptions.codeURL) {
this.getCode()
}
}
});
},
/** 获取code */
getCode() {
this.urlOptions.codeURL()
.then(({ data: res }) => {
this.dataForm.code = res;
})
.catch(() => {});
},
/** 获取下拉框数组 */
getArr() {
const params = {
pageSize: 100,
pageNo: 1,
}
this.urlOptions.optionArrUrl.forEach((item, index) => {
item(params).then(({ data: res }) => {
this.$set(this.urlOptions.optionArr, `arr${index}`, res.list)
})
.catch(() => {
});
});
},
/** 查询字典数据列表 */
getDict() {
this.urlOptions.dictNameList.forEach((item,index)=>{
const queryParams = {
pageNo: 1,
pageSize: 99,
dictType: item,
}
listData(queryParams).then(response => {
this.$set(this.urlOptions.dictArr, `dict${index}`, response.data.list)
});
})
},
// 表单提交
dataFormSubmit() {
this.$refs["dataForm"].validate((valid) => {
if (!valid) {
return false;
}
// 修改的提交
if (this.dataForm.id) {
this.urlOptions.updateURL(this.dataForm).then(response => {
this.$modal.msgSuccess("修改成功");
this.visible = false;
this.$emit("refreshDataList");
});
return;
}
// 添加的提交
this.urlOptions.createURL(this.dataForm).then(response => {
this.$modal.msgSuccess("新增成功");
this.visible = false;
this.$emit("refreshDataList");
});
});
},
/** 清空form */
formClear() {
if (this.$refs.dataForm!==undefined) {
this.$refs.dataForm.resetFields();
}
}
}
}

128
src/mixins/basic-page.js Fichier normal
Voir le fichier

@@ -0,0 +1,128 @@
/*
* @Author: zwq
* @Date: 2022-08-24 11:19:43
* @LastEditors: zwq
* @LastEditTime: 2024-04-02 09:33:29
* @Description:
*/
export default {
data() {
/* eslint-disable */
return {
urlOptions: {
getDataListURL: '', //获取table接口
deleteURL: '', //删除接口
exportURL: '' //导出接口
},
tableData: [], //table数据
listQuery: { //分页
pageSize: 10,
pageNo: 1,
total: 1,
},
exportLoading: false, //导出完成的加载状态是否开启
dataListLoading: false, //获取table的加载状态是否开启
addOrEditTitle: '', //dialog的title
addOrUpdateVisible: false, //dialog状态
}
},
created() {
},
mounted() {
this.getDataList()
},
methods: {
// 获取数据列表
getDataList() {
this.dataListLoading = true;
this.urlOptions.getDataListURL(this.listQuery).then(response => {
this.tableData = response.data.list;
this.listQuery.total = response.data.total;
this.dataListLoading = false;
});
},
// 每页数
sizeChangeHandle(val) {
this.listQuery.pageSize = val;
this.listQuery.pageNo = 1;
this.getDataList();
},
// 当前页
currentChangeHandle(val) {
this.listQuery.pageNo = val;
this.getDataList();
},
// 新增
addOrUpdateHandle(id) {
this.addOrEditTitle = "新增";
this.addOrUpdateVisible = true;
this.$nextTick(() => {
this.$refs.addOrUpdate.init(id);
});
},
//tableBtn点击
handleClick(val) {
if (val.type === "edit") {
this.addOrUpdateVisible = true;
this.addOrEditTitle = "编辑";
this.$nextTick(() => {
this.$refs.addOrUpdate.init(val.data.id);
});
} else if (val.type === "delete") {
this.deleteHandle(val.data.id, val.data.name, val.data._pageIndex)
} else {
this.otherMethods(val)
}
},
// 删除
deleteHandle(id, name, index) {
this.$confirm(`是否确认删除${name ? '名称为"' + name + '"' : '序号为"' + index + '"'}的数据项?`, "系统提示", {
confirmButtonText: "确定",
cancelButtonText: "取消",
type: "warning",
})
.then(() => {
this.urlOptions.deleteURL(id).then(({ data }) => {
this.$message({
message: "操作成功",
type: "success",
duration: 1500,
onClose: () => {
this.getDataList();
},
});
});
})
.catch(() => { });
},
// dialog取消
handleCancel() {
this.$refs.addOrUpdate.formClear()
this.addOrUpdateVisible = false
this.addOrEditTitle = ''
},
// dialog确定
handleConfirm() {
this.$refs.addOrUpdate.dataFormSubmit()
},
// dialog的父组件方法this.$emit("refreshDataList");
successSubmit() {
this.handleCancel()
this.getDataList()
},
/** 导出按钮操作 */
handleExport() {
// 处理查询参数
let params = { ...this.queryParams };
params.pageNo = undefined;
params.pageSize = undefined;
this.$modal.confirm('是否确认导出所有数据项?').then(() => {
this.exportLoading = true;
return this.urlOptions.exportURL(params);
}).then(response => {
this.$download.excel(response, '报表.xls');
this.exportLoading = false;
}).catch(() => { });
}
}
}

Voir le fichier

@@ -0,0 +1,20 @@
export default {
data() {
return {
tableH: this.tableHeight(260),
};
},
created() {
this.tableH = this?.heightNum ? this.tableHeight(this.heightNum) : this.tableHeight(260);
window.addEventListener('resize', this._setTableHeight);
},
destroyed() {
window.removeEventListener('resize', this._setTableHeight);
},
methods: {
_setTableHeight() {
this.tableH = this?.heightNum ? this.tableHeight(this.heightNum) : this.tableHeight(260);
// this.tableH = this.tableHeight(260);
},
},
};

Voir le fichier

@@ -70,17 +70,17 @@ export const constantRoutes = [
hidden: true
},
{
path: '/',
path: "",
component: Layout,
redirect: 'core/base/factory',
// children: [{
// path: 'index',
// redirect: 'core/base/factory',
// component: (resolve) => require(['@/views/index'], resolve),
// name: '首页',
// meta: { title: '首页', icon: 'dashboard', affix: true }
// }
// ]
redirect: "index",
children: [
{
path: "index",
component: (resolve) => require(["@/views/index"], resolve),
name: "首页",
meta: { title: "首页", icon: "dashboard", affix: true },
},
],
},
{
path: '/user',

Voir le fichier

@@ -48,6 +48,50 @@ export function parseTime(time, pattern) {
return time_str
}
// 日期格式化(仅适用表格)
export function parseTimeTable(pattern) {
return function(time){
if (arguments.length === 0 || !time) {
return null
}
const format = pattern || '{y}-{m}-{d} {h}:{i}:{s}'
let date
if (typeof time === 'object') {
date = time
} else {
if ((typeof time === 'string') && (/^[0-9]+$/.test(time))) {
time = parseInt(time)
} else if (typeof time === 'string') {
time = time.replace(new RegExp(/-/gm), '/').replace('T', ' ').replace(new RegExp(/\.\d{3}/gm),'');
}
if ((typeof time === 'number') && (time.toString().length === 10)) {
time = time * 1000
}
date = new Date(time)
}
const formatObj = {
y: date.getFullYear(),
m: date.getMonth() + 1,
d: date.getDate(),
h: date.getHours(),
i: date.getMinutes(),
s: date.getSeconds(),
a: date.getDay()
}
const time_str = format.replace(/{([ymdhisa])+}/g, (result, key) => {
let value = formatObj[key]
// Note: getDay() returns 0 on Sunday
if (key === 'a') {
return ['日', '一', '二', '三', '四', '五', '六'][value]
}
if (result.length > 0 && value < 10) {
value = '0' + value
}
return value || 0
})
return time_str
}
}
// 表单重置
export function resetForm(refName) {
if (this.$refs[refName]) {

Voir le fichier

@@ -6,7 +6,9 @@
-->
<template>
<div ref="dataBoard" class=""></div>
<div ref="dataBoard" class="data-board">
<el-button type="text" @click="goback" class="go-back--btn">返回</el-button>
</div>
</template>
<script>
@@ -24,39 +26,42 @@ export default {
mainFooter: null, // dom
};
},
mounted() {
this.$nextTick(() => {
this.modify();
});
},
activated() {
this.modify();
},
deactivated() {
this.recover();
},
beforeDestroy() {
this.recover();
},
// mounted() {
// this.$nextTick(() => {
// this.modify();
// });
// },
// activated() {
// this.modify();
// },
// deactivated() {
// this.recover();
// },
// beforeDestroy() {
// this.recover();
// },
methods: {
modify() {
// 在这个页面临时修改下父类的margin结束时需还原
this.appMain = document.querySelector('.app-main');
// this.appMain.style.minHeight = 'calc(100vh - 90px)';
this.appMain.style.margin = 0;
// 在这个页面临时删除 main-footer 元素,结束时需还原
// this.mainFooter = document.querySelector('.main-footer').cloneNode(true);
// document.querySelector('.main-footer').remove();
this.$refs.dataBoard.classList.add('data-board');
},
recover() {
this.$refs.dataBoard.classList.remove('data-board');
this.$nextTick(() => {
this.appMain.style.margin = this.parentStyle.margin;
// this.appMain.style.minHeight = this.parentStyle.minHeight;
// this.appMain.insertAdjacentElement('afterend', this.mainFooter);
});
},
// modify() {
// // 在这个页面临时修改下父类的margin结束时需还原
// this.appMain = document.querySelector('.app-main');
// // this.appMain.style.minHeight = 'calc(100vh - 90px)';
// this.appMain.style.margin = 0;
// // 在这个页面临时删除 main-footer 元素,结束时需还原
// // this.mainFooter = document.querySelector('.main-footer').cloneNode(true);
// // document.querySelector('.main-footer').remove();
// this.$refs.dataBoard.classList.add('data-board');
// },
// recover() {
// this.$refs.dataBoard.classList.remove('data-board');
// this.$nextTick(() => {
// this.appMain.style.margin = this.parentStyle.margin;
// // this.appMain.style.minHeight = this.parentStyle.minHeight;
// // this.appMain.insertAdjacentElement('afterend', this.mainFooter);
// });
// },
goback() {
this.$router.go(-1);
}
},
};
</script>
@@ -71,4 +76,25 @@ export default {
background: url('../../../assets/images/DataBoard.png') 100% 100% / contain
no-repeat;
}
.go-back--btn {
position: fixed;
top: 28px;
left: 24px;
color: #fff;
font-size: 18px;
letter-spacing: 6px;
&:hover {
text-decoration: underline;
}
&::after {
content: "\2BAA";
position: absolute;
top: 6px;
right: -26px;
font-size: 24px;
}
}
</style>

Voir le fichier

@@ -38,7 +38,7 @@
@close="cancel"
@cancel="cancel"
@confirm="submitForm">
<DialogForm v-if="open" ref="form" :dataForm="form" :rows="rows" />
<DialogForm v-if="open" ref="form" v-model="form" :rows="rows" />
</base-dialog>
<!-- 抽屉 详情 -->

Voir le fichier

@@ -36,7 +36,7 @@
v-if="showForm"
ref="form"
:disabled="mode.includes('detail')"
:dataForm="form"
v-model="form"
:rows="formRows" />
</div>

Voir le fichier

@@ -38,7 +38,7 @@
@close="cancel"
@cancel="cancel"
@confirm="submitForm">
<DialogForm v-if="open" ref="form" :dataForm="form" :rows="rows" />
<DialogForm v-if="open" ref="form" v-model="form" :rows="rows"/>
</base-dialog>
<!-- 抽屉 详情 -->

Voir le fichier

@@ -38,7 +38,7 @@
@close="cancel"
@cancel="cancel"
@confirm="submitForm">
<DialogForm v-if="open" ref="form" :dataForm="form" :rows="rows" />
<DialogForm v-if="open" ref="form" v-model="form" :rows="rows" />
</base-dialog>
</div>
</template>

Voir le fichier

@@ -36,7 +36,7 @@
v-if="showForm"
ref="form"
:disabled="mode.includes('detail')"
:dataForm="form"
v-model="form"
:rows="formRows" />
</div>

Voir le fichier

@@ -38,7 +38,7 @@
@close="cancel"
@cancel="cancel"
@confirm="submitForm">
<DialogForm v-if="open" ref="form" :dataForm="form" :rows="rows" />
<DialogForm v-if="open" ref="form" v-model="form" :rows="rows" />
</base-dialog>
<!-- 抽屉 详情 -->

Voir le fichier

@@ -38,7 +38,7 @@
@close="cancel"
@cancel="cancel"
@confirm="submitForm">
<DialogForm v-if="open" ref="form" :dataForm="form" :rows="rows" />
<DialogForm v-if="open" ref="form" v-model="form" :rows="rows" />
</base-dialog>
</div>
</template>

Voir le fichier

@@ -0,0 +1,94 @@
<!--
* @Author: zwq
* @Date: 2023-08-01 13:52:10
* @LastEditors: zwq
* @LastEditTime: 2024-04-10 09:30:06
* @Description:
-->
<template>
<el-form
:model="dataForm"
:rules="dataRule"
ref="dataForm"
v-if="visible"
@keyup.enter.native="dataFormSubmit()"
label-width="100px"
label-position="top">
<el-row :gutter="20">
<el-col :span="12">
<el-form-item label="原料名称" prop="name">
<el-input v-model="dataForm.name" clearable
placeholder="请输入原料名称" />
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item label="原料等级" prop="level">
<el-input v-model="dataForm.level" clearable
placeholder="请输入原料等级" />
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item label="原料编码" prop="code">
<el-input v-model="dataForm.code" readonly />
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item label="单位" prop="unit">
<el-select
v-model="dataForm.unit"
filterable
clearable
:style="{ width: '100%' }"
placeholder="请选择单位">
<el-option
v-for="item in urlOptions.dictArr.dict0"
:key="item.id"
:label="item.label"
:value="item.value"></el-option>
</el-select>
</el-form-item>
</el-col>
</el-row>
</el-form>
</template>
<script>
import basicAdd from '@/mixins/basic-add';
import {
createMaterial,
updateMaterial,
getMaterial,
getCode
} from '@/api/base/material';
export default {
mixins: [basicAdd],
data() {
return {
urlOptions: {
createURL: createMaterial,
updateURL: updateMaterial,
infoURL: getMaterial,
codeURL: getCode, //获取code接口返回结果为dataForm.code字段
dictNameList: ['unit_dict'], //数据字典name数组
},
dataForm: {
id: undefined,
code: '',
name: '',
unit: '',
level: '',
},
dataRule: {
name: [
{ required: true, message: '原料不能为空', trigger: 'blur' },
],
code: [{ required: true, message: '编码不能为空', trigger: 'blur' }],
},
};
},
created() {},
methods: {
},
};
</script>

Voir le fichier

@@ -0,0 +1,180 @@
<template>
<div class="app-container">
<!-- 搜索工作栏 -->
<search-bar
:formConfigs="formConfig"
ref="searchBarForm"
@headBtnClick="buttonClick" />
<!-- 列表 -->
<base-table
v-loading="dataListLoading"
:table-props="tableProps"
:page="listQuery.pageNo"
:limit="listQuery.pageSize"
:table-data="tableData">
<method-btn
v-if="tableBtn.length"
slot="handleBtn"
:width="90"
label="操作"
:method-list="tableBtn"
@clickBtn="handleClick" />
</base-table>
<pagination
:limit.sync="listQuery.pageSize"
:page.sync="listQuery.pageNo"
:total="listQuery.total"
@pagination="getDataList" />
<!-- 对话框(添加 / 修改) -->
<base-dialog
:dialogTitle="addOrEditTitle"
:dialogVisible="addOrUpdateVisible"
@cancel="handleCancel"
@confirm="handleConfirm"
:before-close="handleCancel"
width="40%">
<add-or-update
ref="addOrUpdate"
@refreshDataList="successSubmit"></add-or-update>
</base-dialog>
</div>
</template>
<script>
import AddOrUpdate from './add-or-updata';
import basicPage from '@/mixins/basic-page';
import { parseTime } from '@/filter/code-filter';
import { publicFormatter } from "@/utils/dict";
import {
deleteMaterial,
getMaterialPage,
} from '@/api/base/material';
const tableProps = [
{
prop: 'createTime',
label: '添加时间',
filter: parseTime,
minWidth: 150
},
{
prop: 'name',
label: '原料名称',
},
{
prop: 'code',
label: '原料编码',
width: 180,
},
{
prop: 'unit',
label: '单位',
filter: publicFormatter('unit_dict'),
},
];
export default {
mixins: [basicPage],
data() {
return {
urlOptions: {
getDataListURL: getMaterialPage,
deleteURL: deleteMaterial,
},
tableProps,
tableBtn: [
this.$auth.hasPermi(`base:material:update`)
? {
type: 'edit',
btnName: '编辑',
}
: undefined,
this.$auth.hasPermi(`base:material:delete`)
? {
type: 'delete',
btnName: '删除',
}
: undefined,
].filter((v) => v),
tableData: [],
formConfig: [
{
type: 'input',
label: '原料名称',
placeholder: '原料名称',
param: 'name'
},
{
type: 'input',
label: '原料编码',
placeholder: '原料编码',
param: 'code'
},
{
type: this.$auth.hasPermi('base:material:query')
? 'button'
: '',
btnName: '查询',
name: 'search',
color: 'primary',
},
{
type:
this.$auth.hasPermi('base:material:create') &&
this.$auth.hasPermi('base:material:query')
? 'separate'
: '',
},
{
type: this.$auth.hasPermi('base:material:create')
? 'button'
: '',
btnName: '新增',
name: 'add',
color: 'success',
plain: true,
},
],
};
},
components: {
AddOrUpdate,
},
created() {
},
methods: {
buttonClick(val) {
switch (val.btnName) {
case 'search':
this.listQuery.pageNo = 1;
this.listQuery.pageSize = 10;
this.listQuery.name = val.name;
this.listQuery.code = val.code;
this.getDataList();
break;
case 'reset':
this.$refs.searchBarForm.resetForm();
this.listQuery = {
pageSize: 20,
pageNo: 1,
total: 1,
};
this.getDataList();
break;
case 'add':
this.addOrEditTitle = '新增';
this.addOrUpdateVisible = true;
this.addOrUpdateHandle();
break;
case 'export':
this.handleExport();
break;
default:
console.log(val);
}
},
},
};
</script>

Voir le fichier

@@ -0,0 +1,156 @@
<!--
* @Author: zwq
* @Date: 2023-08-01 13:52:10
* @LastEditors: zwq
* @LastEditTime: 2024-04-11 09:05:16
* @Description:
-->
<template>
<el-form
:model="dataForm"
:rules="dataRule"
ref="dataForm"
v-if="visible"
@keyup.enter.native="dataFormSubmit()"
label-width="100px"
label-position="top">
<el-row :gutter="20">
<el-col :span="12">
<el-form-item label="原料名称" prop="materialId">
<el-select
v-model="dataForm.materialId"
filterable
@change="setCode"
:style="{ width: '100%' }"
placeholder="请选择原料名称">
<el-option
v-for="item in MaterialList"
:key="item.id"
:label="item.name"
:value="item.id"></el-option>
</el-select>
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item label="原料编码" prop="code">
<el-input v-model="dataForm.code" clearable readonly />
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item label="生效开始时间" prop="startTime">
<el-date-picker
v-model="dataForm.startTime"
type="date"
value-format="timestamp"
:style="{ width: '100%' }"
placeholder="选择开始时间"></el-date-picker>
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item label="生效结束时间" prop="endTime">
<el-date-picker
v-model="dataForm.endTime"
type="date"
value-format="timestamp"
:style="{ width: '100%' }"
placeholder="选择结束时间"></el-date-picker>
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item label="单价" prop="price">
<el-input-number
:min="0"
style="width: 75%"
v-model="dataForm.price"
clearable
placeholder="请输入允许留存时间" />
{{ unit }}
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item label="备注" prop="remark">
<el-input
v-model="dataForm.remark"
clearable
placeholder="请输入备注" />
</el-form-item>
</el-col>
</el-row>
</el-form>
</template>
<script>
import basicAdd from '@/mixins/basic-add';
import {
createMaterialPricing,
updateMaterialPricing,
getMaterialPricing,
} from '@/api/base/materialPricing';
import { getMaterialPage } from '@/api/base/material';
export default {
mixins: [basicAdd],
data() {
return {
urlOptions: {
createURL: createMaterialPricing,
updateURL: updateMaterialPricing,
infoURL: getMaterialPricing,
optionArrUrl: [getMaterialPage], //需要获取下拉框的方法数组
dictNameList: ['unit_dict'], //数据字典name数组
},
dataForm: {
id: null,
code: '',
materialId: '',
price: '',
startTime: new Date().getTime(),
endTime: null,
remark: '',
},
setData: true,
MaterialList: [],
unit: '元/吨',
dataRule: {
materialId: [
{ required: true, message: '原料不能为空', trigger: 'blur' },
],
price: [{ required: true, message: '单价不能为空', trigger: 'blur' }],
startTime: [
{
required: true,
message: '生效开始时间不能为空',
trigger: 'change',
},
],
},
};
},
created() {},
methods: {
getArr() {
getMaterialPage({ pageSize: 100, pageNo: 1 }).then((response) => {
this.MaterialList = response.data.list;
});
},
setDataForm() {
if (this.MaterialList.length > 0) {
this.setCode();
} else {
setTimeout(this.setCode(), 1000);
}
},
setCode() {
this.MaterialList.forEach((item) => {
if (item.id === this.dataForm.materialId) {
this.dataForm.code = item.code;
this.unit =
'元/' +
this.urlOptions.dictArr.dict0.find((d) => d.value === item.unit)
.label;
}
});
},
},
};
</script>

Voir le fichier

@@ -0,0 +1,23 @@
<!--
* @Author: zwq
* @Date: 2023-12-05 13:45:59
* @LastEditors: zwq
* @LastEditTime: 2024-04-10 15:20:11
* @Description
-->
<template>
<div>
<span>{{ parseTime(injectData.startTime,'{y}年{m}月{d}日') + '-' + (parseTime(injectData.endTime)?parseTime(injectData.endTime,'{y}年{m}月{d}日'):'永久') }}</span>
</div>
</template>
<script>
export default {
name: '',
props: {
injectData: {
type: Object,
default: () => ({}),
},
},
};
</script>

Voir le fichier

@@ -0,0 +1,182 @@
<template>
<div class="app-container">
<!-- 搜索工作栏 -->
<search-bar
:formConfigs="formConfig"
ref="searchBarForm"
@headBtnClick="buttonClick" />
<!-- 列表 -->
<base-table
v-loading="dataListLoading"
:table-props="tableProps"
:page="listQuery.pageNo"
:limit="listQuery.pageSize"
:table-data="tableData">
<method-btn
v-if="tableBtn.length"
slot="handleBtn"
:width="90"
label="操作"
:method-list="tableBtn"
@clickBtn="handleClick" />
</base-table>
<pagination
:limit.sync="listQuery.pageSize"
:page.sync="listQuery.pageNo"
:total="listQuery.total"
@pagination="getDataList" />
<!-- 对话框(添加 / 修改) -->
<base-dialog
:dialogTitle="addOrEditTitle"
:dialogVisible="addOrUpdateVisible"
@cancel="handleCancel"
@confirm="handleConfirm"
:before-close="handleCancel"
width="40%">
<add-or-update
ref="addOrUpdate"
@refreshDataList="successSubmit"></add-or-update>
</base-dialog>
</div>
</template>
<script>
import AddOrUpdate from './add-or-updata';
import connectTime from './connectTime';
import basicPage from '@/mixins/basic-page';
import { parseTime } from '@/filter/code-filter';
import {
deleteMaterialPricing,
getMaterialPricingPage,
} from '@/api/base/materialPricing';
import { getMaterialPage } from '@/api/base/material';
const tableProps = [
{
prop: 'name',
label: '原料名称',
},
{
prop: 'code',
label: '原料编码',
width: 180,
},
{
prop: 'price',
label: '单价(元/吨)',
align: 'right',
},
{
prop: 'createTime',
label: '生效时间',
width: 235,
subcomponent: connectTime,
},
{
prop: 'remark',
label: '备注',
},
];
export default {
mixins: [basicPage],
data() {
return {
urlOptions: {
getDataListURL: getMaterialPricingPage,
deleteURL: deleteMaterialPricing,
},
tableProps,
tableBtn: [
this.$auth.hasPermi(`base:material-pricing:update`)
? {
type: 'edit',
btnName: '编辑',
}
: undefined,
this.$auth.hasPermi(`base:material-pricing:delete`)
? {
type: 'delete',
btnName: '删除',
}
: undefined,
].filter((v) => v),
tableData: [],
formConfig: [
{
type: 'select',
label: '原料名称',
selectOptions: [],
param: 'name',
filterable: true,
},
{
type: this.$auth.hasPermi('base:material-pricing:query')
? 'button'
: '',
btnName: '查询',
name: 'search',
color: 'primary',
},
{
type:
this.$auth.hasPermi('base:material-pricing:create') &&
this.$auth.hasPermi('base:material-pricing:query')
? 'separate'
: '',
},
{
type: this.$auth.hasPermi('base:material-pricing:create')
? 'button'
: '',
btnName: '新增',
name: 'add',
color: 'success',
plain: true,
},
],
};
},
components: {
AddOrUpdate,
},
created() {
getMaterialPage({ pageSize: 100, pageNo: 1 }).then((response) => {
this.formConfig[0].selectOptions = response.data.list;
});
},
methods: {
buttonClick(val) {
switch (val.btnName) {
case 'search':
this.listQuery.pageNo = 1;
this.listQuery.pageSize = 10;
this.listQuery.materialId = val.name;
this.getDataList();
break;
case 'reset':
this.$refs.searchBarForm.resetForm();
this.listQuery = {
pageSize: 20,
pageNo: 1,
total: 1,
};
this.getDataList();
break;
case 'add':
this.addOrEditTitle = '新增';
this.addOrUpdateVisible = true;
this.addOrUpdateHandle();
break;
case 'export':
this.handleExport();
break;
default:
console.log(val);
}
},
},
};
</script>

Voir le fichier

@@ -18,9 +18,16 @@
预览
</div> -->
</section>
<section class="file-area">
<section
class="file-area"
:style="{
height: expand ? 'auto' : isPicMode ? '180px' : '152px',
gap: isPicMode ? '0 24px' : '24px',
gridAutoRows: isPicMode ? '180px' : '152px',
}">
<el-upload
class="equipment-upload"
:style="{ marginBottom: isPicMode ? '48px' : '24px' }"
:disabled="disabled"
drag
:action="uploadUrl"
@@ -56,7 +63,6 @@
v-for="(file, index) in files"
:key="file.fileName"
:style="{
display: index > 3 && !expand ? 'none' : 'block',
background: isPicMode
? `url(${file.fileUrl}) no-repeat`
: `url(${defaultBg}) no-repeat`,
@@ -226,7 +232,7 @@ export default {
clearTimeout(this.updateTimer);
}
this.updateTimer = setTimeout(() => {
console.log('[AssetsUpload] 更新上传列表');
// console.log('[AssetsUpload] 更新上传列表');
this.emitFilelist();
clearTimeout(this.updateTimer);
this.updateTimer = null;
@@ -314,7 +320,6 @@ export default {
}
:deep(.equipment-upload) {
background: #ccc4;
.el-upload-dragger {
width: 188px;
height: 128px;
@@ -346,6 +351,10 @@ export default {
}
}
.equipment-upload {
margin-bottom: 24px;
}
.file-list {
padding: 12px;
border: 1px solid #ccc;
@@ -354,13 +363,14 @@ export default {
// custom
.file-area {
display: grid;
grid-template-columns: repeat(5, 188px);
grid-auto-rows: 128px;
gap: 24px 18px;
place-content: center;
grid-template-columns: repeat(auto-fill, 188px);
grid-auto-rows: 152px;
gap: 48px 24px;
overflow: hidden;
}
.file-list__item {
height: 128px;
background-color: #fff;
border: 1px dashed #d9d9d9;
border-radius: 6px;

Voir le fichier

@@ -1,32 +0,0 @@
<!--
filename: EquipmentAssets.vue
author: liubin
date: 2023-08-22 11:11:18
description: 设备资产
-->
<template>
<div class="equipment-assets"></div>
</template>
<script>
export default {
name: "EquipmentAssets",
components: {},
props: {},
data() {
return {}
},
computed: {},
methods: {},
}
</script>
<style scoped lang="scss">
.equipment-assets {
background: #f1f1f1;
padding: 12px;
min-height: 128px;
margin-top: 8px;
}
</style>

Voir le fichier

@@ -1,111 +0,0 @@
<!--
filename: EquipmentPics.vue
author: liubin
date: 2023-08-18 16:29:39
description:
-->
<template>
<div class="equipment-pics">
<div v-for="(url, idx) in images" :key="url">
<img :src="url" :alt="url" />
<figure class="big-img" :style="inlineStyle">
<img :src="url" :alt="url" />
<figcaption>{{ desc[idx] }}</figcaption>
</figure>
</div>
</div>
</template>
<script>
export default {
name: 'EquipmentPics',
components: {},
props: {
inlineStyle: {
type: Object,
default: () => ({}),
},
},
data() {
return {
desc: [
'车间设备 - 1',
'车间设备 - 2',
'车间设备 - 3',
'车间设备 - 4',
'车间设备 - 5',
'车间设备 - 6',
'车间设备 - 7',
'车间设备 - 8',
'车间设备 - 9',
'车间设备 - 10',
'车间设备 - 11',
'车间设备 - 12',
],
images: Array(10)
.fill(1)
.map((_, index) => require(`../assets/eq${index + 1}.jpg`)),
};
},
methods: {},
};
</script>
<style scoped lang="scss">
.equipment-pics {
// background: #cfcfcf;
padding: 12px;
// margin: 8px;
display: flex;
overflow-x: auto;
}
.equipment-pics > div {
height: 100px;
position: relative;
cursor: pointer;
}
.equipment-pics > div:not(:last-child) {
margin-right: 12px;
}
.equipment-pics > div > img {
height: 95%;
}
.equipment-pics > div > figure {
display: none;
position: fixed;
// inset: 0;
// margin: auto;
top: 0;
right: 0;
// width: 640px;
// height: 480px;
background: #000;
overflow: hidden;
padding: 8px 8px 0;
}
.equipment-pics > div:hover > figure {
margin: 0;
display: flex;
flex-direction: column;
align-items: center;
justify-content: center;
}
.equipment-pics > div > figure > img {
flex: 1;
}
.equipment-pics > div > figure > figcaption {
height: 24px;
margin-top: 8px;
font-size: 18px;
line-height: 1;
color: #fff;
}
</style>

Voir le fichier

@@ -44,8 +44,9 @@
ref="form"
label-position="top"
size="small"
:dataForm="form"
:rows="computedRows" />
v-model="form"
:rows="computedRows"
:has-file="true" />
</base-dialog>
<!-- 设备 详情 - 编辑 -->
@@ -105,9 +106,6 @@
<script>
import moment from 'moment';
import basicPageMixin from '@/mixins/lb/basicPageMixin';
import { getAccessToken } from '@/utils/auth';
import EquipmentPics from './components/EquipmentPics';
import EquipmentAssets from './components/EquipmentAssets';
import EquipmentDrawer from './components/EquipmentDrawer';
import {
@@ -132,6 +130,12 @@ export default {
return {
searchBarKeys: ['name', 'code'],
tableBtn: [
this.$auth.hasPermi(`base:equipment:update`)
? {
type: 'detail',
btnName: '详情',
}
: undefined,
this.$auth.hasPermi('base:equipment:update')
? {
type: 'edit',
@@ -144,12 +148,6 @@ export default {
btnName: '删除',
}
: undefined,
this.$auth.hasPermi(`base:equipment:update`)
? {
type: 'detail',
btnName: '详情',
}
: undefined,
].filter((v) => v),
tableProps: [
{
@@ -213,6 +211,13 @@ export default {
{
type: 'separate',
},
{
type: this.$auth.hasPermi('base:equipment:export') ? 'button' : '',
btnName: '导出',
name: 'export',
plain: true,
color: 'primary',
},
{
type: this.$auth.hasPermi('base:equipment:create') ? 'button' : '',
btnName: '新增',
@@ -220,12 +225,6 @@ export default {
plain: true,
color: 'success',
},
{
type: this.$auth.hasPermi('base:equipment:export') ? 'button' : '',
btnName: '导出',
name: 'export',
color: 'warning',
},
],
rows: [
[

Voir le fichier

@@ -37,7 +37,12 @@
@close="cancel"
@cancel="cancel"
@confirm="submitForm">
<DialogForm v-if="open" ref="form" v-model="form" :rows="rows" />
<DialogForm
v-if="open"
ref="form"
v-model="form"
:rows="rows"
:has-file="true" />
</base-dialog>
</div>
</template>
@@ -207,8 +212,6 @@ export default {
name: undefined,
parentId: undefined,
remark: undefined,
fileNames: [],
fileUrls: [],
};
this.resetForm('form');
},

Voir le fichier

@@ -1,8 +1,8 @@
<!--
* @Author: zwq
* @Date: 2023-08-01 13:52:10
* @LastEditors: DY
* @LastEditTime: 2023-09-21 15:45:07
* @LastEditors: zwq
* @LastEditTime: 2024-04-10 16:31:51
* @Description:
-->
<template>
@@ -65,6 +65,21 @@
placeholder="请输入额外编码" />
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item prop="pdType" label="产线类型">
<el-select
v-model="dataForm.pdType"
filterable
clearable
placeholder="请选择产线类型">
<el-option
v-for="item in pdTypeArr"
:key="item.id"
:label="item.name"
:value="item.id"></el-option>
</el-select>
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item label="备注" prop="remark">
<el-input
@@ -120,7 +135,18 @@ export default {
externalCode: undefined,
remark: undefined,
description: undefined,
pdType: undefined,
},
pdTypeArr: [
{
id: 0,
name: '深加工'
},
{
id: 1,
name: '原片'
}
],
dataRule: {
code: [
{ required: true, message: '产线编码不能为空', trigger: 'blur' },

Voir le fichier

@@ -13,7 +13,7 @@
<method-btn
v-if="tableBtn.length"
slot="handleBtn"
:width="120"
:width="90"
label="操作"
:method-list="tableBtn"
@clickBtn="handleClick" />
@@ -52,7 +52,8 @@ import {
const tableProps = [
{
prop: 'code',
label: '产线编码'
label: '产线编码',
width: 160,
},
{
prop: 'name',
@@ -66,6 +67,11 @@ const tableProps = [
prop: 'externalCode',
label: '额外编码'
},
{
prop: 'pdType',
label: '产线类型',
filter: codeFilter('pdType'),
},
{
prop: 'status',
label: '当前状态',
@@ -73,16 +79,19 @@ const tableProps = [
},
{
prop: 'description',
label: '描述'
label: '描述',
showOverflowtooltip: true,
},
{
prop: 'remark',
label: '备注'
label: '备注',
showOverflowtooltip: true,
},
{
prop: 'createTime',
label: '创建时间',
filter: parseTime
filter: parseTime,
width: 160,
},
];

Voir le fichier

@@ -17,7 +17,11 @@ const table = {
1: '日',
2: '周',
3: '月'
}
},
pdType: {
1: '原片',
0: '深加工',
},
}
// 日期格式化

Voir le fichier

@@ -0,0 +1,113 @@
<!--
* @Author: zwq
* @Date: 2021-11-18 14:16:25
* @LastEditors: zwq
* @LastEditTime: 2024-04-22 14:51:30
* @Description:
-->
<template>
<el-form
:model="dataForm"
:rules="dataRule"
ref="dataForm"
@keyup.enter.native="dataFormSubmit()"
label-width="80px">
<el-row :gutter="20">
<el-col :span="12">
<el-form-item label="能源类型" prop="energyTypeName">
<el-input
v-model="dataForm.energyTypeName"
disabled
placeholder="请输入能源类型" />
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item label="日期" prop="recTime">
<el-date-picker
v-model="dataForm.recTime"
type="date"
value-format="timestamp"
:style="{ width: '100%' }"
readonly
placeholder="选择日期"></el-date-picker>
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item label="总价" prop="price">
<el-input-number
:min="0"
style="width: 80%"
v-model="dataForm.price"
clearable
placeholder="请输入总价" />
()
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item label="累计用量" prop="quantity">
<el-input-number
:min="0"
style="width: 100%"
v-model="dataForm.quantity"
clearable
placeholder="请输入累计用量" />
</el-form-item>
</el-col>
</el-row>
</el-form>
</template>
<script>
import basicAdd from '@/mixins/basic-add';
import { updateEnergyHis } from '@/api/cost/costEnergyDeep';
export default {
mixins: [basicAdd],
data() {
return {
urlOptions: {
updateURL: updateEnergyHis,
},
dataForm: {
id: undefined,
price: undefined,
quantity: undefined,
energyTypeName: undefined,
recTime: undefined,
},
dataRule: {
price: [{ required: true, message: '总价不能为空', trigger: 'blur' }],
quantity: [
{ required: true, message: '累计用量不能为空', trigger: 'blur' },
],
},
};
},
methods: {
init(val, statisticType) {
this.visible = true;
this.$nextTick(() => {
this.$refs['dataForm'].resetFields();
this.dataForm = JSON.parse(JSON.stringify(val));
this.dataForm.statisticType = statisticType;
});
},
// 表单提交
dataFormSubmit() {
this.$refs['dataForm'].validate((valid) => {
if (!valid) {
return false;
}
this.dataForm.modifyPrice = this.dataForm.price;
this.dataForm.modifyQuantity = this.dataForm.quantity;
// 修改的提交
this.urlOptions.updateURL(this.dataForm).then((response) => {
this.$modal.msgSuccess('修改成功');
this.visible = false;
this.$emit('refreshDataList');
});
});
},
},
};
</script>

Voir le fichier

@@ -0,0 +1,347 @@
<template>
<div class="app-container energyOverlimitLog">
<div v-show="activeName === 'his'">
<!-- 搜索工作栏 -->
<search-bar
:formConfigs="formConfig"
ref="searchBarForm"
@headBtnClick="buttonClick" />
</div>
<div v-show="activeName === 'now'">
<!-- 搜索工作栏 -->
<search-bar
:formConfigs="formConfig2"
ref="searchBarForm2"
@headBtnClick="buttonClick" />
</div>
<el-tabs v-model="activeName" @tab-click="toggleTab">
<el-tab-pane label="历史成本" name="his"></el-tab-pane>
<el-tab-pane label="成本查询" name="now"></el-tab-pane>
</el-tabs>
<!-- 列表 -->
<div v-if="activeName === 'his'">
<base-table
:page="listQuery.pageNo"
:limit="listQuery.pageSize"
:table-props="tableProps"
:table-data="tableData"
:max-height="tableH">
<method-btn
v-if="tableBtn.length"
slot="handleBtn"
:width="80"
label="操作"
:method-list="tableBtn"
@clickBtn="handleClick" />
</base-table>
</div>
<div v-if="activeName === 'now'">
<base-table
:page="listQuery.pageNo"
:limit="listQuery.pageSize"
:table-props="tableProps2"
:table-data="tableData2"
:max-height="tableH" />
</div>
<pagination
:page.sync="listQuery.pageNo"
:limit.sync="listQuery.pageSize"
:total="listQuery.total"
@pagination="getDataList" />
<base-dialog
:dialogTitle="addOrEditTitle"
:dialogVisible="addOrUpdateVisible"
@cancel="handleCancel"
@confirm="handleConfirm"
:before-close="handleCancel"
width="50%">
<add-or-update
ref="addOrUpdate"
@refreshDataList="successSubmit"></add-or-update>
</base-dialog>
</div>
</template>
<script>
import AddOrUpdate from './add-or-updata';
import basicPage from '@/mixins/basic-page';
import { getEnergyTypePage } from '@/api/base/energyType';
import { getEnergyHisPage, getEnergyRealtimePage } from '@/api/cost/costEnergyDeep';
import { parseTime } from '@/filter/code-filter';
import tableHeightMixin from '@/mixins/lb/tableHeightMixin';
const tableProps = [
{
prop: 'recTime',
label: '日期',
filter: (val) => parseTime(val, '{y}年{m}月{d}日'),
},
{
prop: 'energyTypeName',
label: '能源类型',
},
{
prop: 'bindObjectName',
label: '监控对象',
filter: (val) => (val != null ? val : '--'),
},
{
prop: 'meterName',
label: '抄表名',
filter: (val) => (val != null ? val : '--'),
},
{
prop: 'quantity',
label: '累计使用量',
},
{
prop: 'price',
label: '总价(元)',
align: 'right',
},
];
const tableProps2 = [
{
prop: 'energyTypeName',
label: '能源类型',
},
{
prop: 'bindObjectName',
label: '监控对象',
filter: (val) => (val != null ? val : '--'),
},
{
prop: 'meter',
label: '抄表名',
filter: (val) => (val != null ? val : '--'),
},
{
prop: 'quantity',
label: '累计使用量',
},
{
prop: 'price',
label: '总价(元)',
align: 'right',
},
];
export default {
name: 'costEnergy',
mixins: [basicPage, tableHeightMixin],
data() {
return {
urlOptions: {
getDataListURL: getEnergyHisPage,
},
formConfig: [
{
type: 'select',
label: '维度',
selectOptions: [
{ id: 1, name: '日' },
{ id: 2, name: '周' },
{ id: 3, name: '月' },
],
param: 'statisticType',
defaultSelect: 1, // 默认值,
clearable: false,
},
{
type: 'select',
label: '能源类型',
selectOptions: [],
param: 'name',
labelField: 'name',
filterable: true,
},
{
type: 'datePicker',
label: '时间范围',
dateType: 'daterange',
format: 'yyyy-MM-dd',
valueFormat: 'yyyy-MM-dd HH:mm:ss',
rangeSeparator: '-',
startPlaceholder: '开始时间',
endPlaceholder: '结束时间',
param: 'searchTime',
},
{
type: 'button',
btnName: '查询',
name: 'search',
color: 'primary',
},
],
formConfig2: [
{
type: 'select',
label: '能源类型',
selectOptions: [],
param: 'name',
labelField: 'name',
filterable: true,
},
{
type: 'datePicker',
label: '时间范围',
dateType: 'daterange',
format: 'yyyy-MM-dd',
valueFormat: 'yyyy-MM-dd HH:mm:ss',
rangeSeparator: '-',
startPlaceholder: '开始时间',
endPlaceholder: '结束时间',
param: 'searchTime',
},
{
type: 'button',
btnName: '查询',
name: 'search',
color: 'primary',
},
],
listQuery: {
statisticType: 1,
},
activeName: 'his',
tableProps,
tableProps2,
tableBtn: [
this.$auth.hasPermi(`monitoring:cost-deep-energy-his:update`)
? {
type: 'edit',
btnName: '编辑',
}
: undefined,
].filter((v) => v),
tableData: [],
tableData2: [],
};
},
components: {
AddOrUpdate,
},
created() {
const params = {
pageNo: 1,
pageSize: 100,
};
getEnergyTypePage(params).then((response) => {
this.formConfig[1].selectOptions = response.data.list;
this.formConfig2[0].selectOptions = response.data.list;
});
},
methods: {
buttonClick(val) {
switch (val.btnName) {
case 'search':
this.listQuery.pageNo = 1;
this.listQuery.pageSize = 10;
this.listQuery.energyTypeId = val.name || null;
this.listQuery.statisticType = val.statisticType || 1;
this.listQuery.startTime = val.searchTime ? val.searchTime[0] : null;
this.listQuery.endTime = val.searchTime
? val.searchTime[1].substr(0, 10) + ' 23:59:59'
: null;
if (this.activeName === 'his') {
this.getDataList();
} else {
this.getDataList2();
}
break;
case 'add':
this.addOrUpdateHandle();
break;
case 'export':
this.listQuery.pageNo = 1;
this.listQuery.pageSize = 10;
this.listQuery.energyTypeId = val.name;
this.listQuery.startTime = val.searchTime ? val.searchTime[0] : null;
this.listQuery.endTime = val.searchTime
? val.searchTime[1].substr(0, 10) + ' 23:59:59'
: null;
this.handleExport();
break;
default:
console.log(val);
}
},
toggleTab() {
if (this.activeName === 'his') {
this.$refs.searchBarForm.resetForm();
this.listQuery.name = null;
this.listQuery.startTime = null;
this.listQuery.endTime = null;
this.listQuery.statisticType = 1;
this.listQuery.pageNo = 1;
this.getDataList();
} else {
this.$refs.searchBarForm2.resetForm();
this.listQuery.name = null;
this.listQuery.startTime = null;
this.listQuery.endTime = null;
this.listQuery.pageNo = 1;
this.getDataList2();
}
},
// 获取数据2列表
getDataList2() {
if (this.listQuery.startTime) {
getEnergyRealtimePage(this.listQuery).then((response) => {
this.tableData2 = response.data.list;
this.listQuery.total = response.data.total;
});
} else {
this.$message.warning('请选择时间范围');
}
},
//tableBtn点击
handleClick(val) {
if (val.type === 'edit') {
this.addOrUpdateVisible = true;
this.addOrEditTitle = '编辑';
this.$nextTick(() => {
this.$refs.addOrUpdate.init(val.data, this.listQuery.statisticType);
});
} else {
this.otherMethods(val);
}
},
},
};
</script>
<style lang="scss">
.energyOverlimitLog {
.el-tabs__nav::after {
content: '';
position: absolute;
left: 0;
bottom: 0;
width: 100%;
height: 2px;
background-color: #e4e7ed;
}
.el-tabs__nav-wrap::after {
width: 0;
}
.el-tabs__item {
padding: 0 10px;
}
.el-tabs__item:hover {
color: rgba(0, 0, 0, 0.85);
}
.el-tabs__item.is-active {
color: rgba(0, 0, 0, 0.85);
}
.el-tabs__item {
color: rgba(0, 0, 0, 0.45);
}
.searchBarBox {
margin-bottom: 0;
}
}
</style>

Voir le fichier

@@ -0,0 +1,115 @@
<!--
* @Author: zwq
* @Date: 2021-11-18 14:16:25
* @LastEditors: zwq
* @LastEditTime: 2024-04-19 16:29:30
* @Description:
-->
<template>
<el-form
:model="dataForm"
:rules="dataRule"
ref="dataForm"
@keyup.enter.native="dataFormSubmit()"
label-width="80px">
<el-row :gutter="20">
<el-col :span="12">
<el-form-item label="成本名称" prop="name">
<el-select
v-model="dataForm.name"
disabled
:style="{ width: '100%' }"
placeholder="请选择成本名称">
<el-option
v-for="item in nameArr"
:key="item.name"
:label="item.label"
:value="item.name"></el-option>
</el-select>
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item label="总价" prop="price">
<el-input-number
:min="0"
style="width: 80%"
v-model="dataForm.price"
clearable
placeholder="请输入总价" />
()
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item label="所属日期" prop="recTime">
<el-date-picker
v-model="dataForm.recTime"
type="date"
value-format="timestamp"
:style="{ width: '100%' }"
readonly
placeholder="选择所属日期"></el-date-picker>
</el-form-item>
</el-col>
</el-row>
</el-form>
</template>
<script>
import basicAdd from '@/mixins/basic-add';
import {
updateRawOthercostHis,
} from '@/api/cost/costOthercostHisDeep';
export default {
mixins: [basicAdd],
props: {
nameArr: {
type: Array,
default: () => [],
},
},
data() {
return {
urlOptions: {
updateURL: updateRawOthercostHis,
},
dataForm: {
id: undefined,
price: undefined,
name: undefined,
recTime: undefined,
},
dataRule: {
price: [
{ required: true, message: '总价不能为空', trigger: 'blur' },
],
},
};
},
methods: {
init(val,statisticType) {
this.visible = true;
this.$nextTick(() => {
this.$refs["dataForm"].resetFields();
this.dataForm = JSON.parse(JSON.stringify(val))
this.dataForm.statisticType = statisticType
});
},
// 表单提交
dataFormSubmit() {
this.$refs['dataForm'].validate((valid) => {
if (!valid) {
return false;
}
this.dataForm.modifyPrice = this.dataForm.price
// 修改的提交
this.urlOptions.updateURL(this.dataForm).then((response) => {
this.$modal.msgSuccess('修改成功');
this.visible = false;
this.$emit('refreshDataList');
});
});
},
},
};
</script>

Voir le fichier

@@ -0,0 +1,321 @@
<template>
<div class="app-container energyOverlimitLog">
<div v-show="activeName === 'his'">
<!-- 搜索工作栏 -->
<search-bar
:formConfigs="formConfig"
ref="searchBarForm"
@headBtnClick="buttonClick" />
</div>
<div v-show="activeName === 'now'">
<!-- 搜索工作栏 -->
<search-bar
:formConfigs="formConfig2"
ref="searchBarForm2"
@headBtnClick="buttonClick" />
</div>
<el-tabs v-model="activeName" @tab-click="toggleTab">
<el-tab-pane label="历史成本" name="his"></el-tab-pane>
<el-tab-pane label="成本查询" name="now"></el-tab-pane>
</el-tabs>
<!-- 列表 -->
<div v-if="activeName === 'his'">
<base-table
:page="listQuery.pageNo"
:limit="listQuery.pageSize"
:table-props="tableProps"
:table-data="tableData"
:max-height="tableH">
<method-btn
v-if="tableBtn.length"
slot="handleBtn"
:width="80"
label="操作"
:method-list="tableBtn"
@clickBtn="handleClick" />
</base-table>
</div>
<div v-if="activeName === 'now'">
<base-table
:page="listQuery.pageNo"
:limit="listQuery.pageSize"
:table-props="tableProps2"
:table-data="tableData2"
:max-height="tableH" />
</div>
<pagination
:page.sync="listQuery.pageNo"
:limit.sync="listQuery.pageSize"
:total="listQuery.total"
@pagination="getDataList" />
<base-dialog
:dialogTitle="addOrEditTitle"
:dialogVisible="addOrUpdateVisible"
@cancel="handleCancel"
@confirm="handleConfirm"
:before-close="handleCancel"
width="50%">
<add-or-update
ref="addOrUpdate"
:name-arr="formConfig[1].selectOptions"
@refreshDataList="successSubmit"></add-or-update>
</base-dialog>
</div>
</template>
<script>
import AddOrUpdate from './add-or-updata';
import basicPage from '@/mixins/basic-page';
import { getRawOthercostRulePage } from '@/api/cost/deepOthercostRule';
import {
getRawOthercostHisPage,
getRawOthercostSunPage,
} from '@/api/cost/costOthercostHisDeep';
import { parseTime } from '@/filter/code-filter';
import tableHeightMixin from '@/mixins/lb/tableHeightMixin';
const tableProps = [
{
prop: 'recTime',
label: '日期',
filter: (val) => parseTime(val, '{y}年{m}月{d}日'),
},
{
prop: 'otherCostName',
label: '成本名称',
},
{
prop: 'price',
label: '总价(元)',
align: 'right',
},
];
const tableProps2 = [
{
prop: 'otherCostName',
label: '成本名称',
},
{
prop: 'price',
label: '总价(元)',
align: 'right',
},
];
export default {
name: 'costOthercostHis',
mixins: [basicPage, tableHeightMixin],
data() {
return {
urlOptions: {
getDataListURL: getRawOthercostHisPage,
},
formConfig: [
{
type: 'select',
label: '维度',
selectOptions: [
{ id: 1, name: '日' },
{ id: 2, name: '周' },
{ id: 3, name: '月' },
],
param: 'statisticType',
defaultSelect: 1, // 默认值,
clearable: false,
},
{
type: 'select',
label: '成本名称',
selectOptions: [],
param: 'name',
labelField: 'label',
valueField: 'name',
filterable: true,
},
{
type: 'datePicker',
label: '时间范围',
dateType: 'daterange',
format: 'yyyy-MM-dd',
valueFormat: 'yyyy-MM-dd HH:mm:ss',
rangeSeparator: '-',
startPlaceholder: '开始时间',
endPlaceholder: '结束时间',
param: 'searchTime',
},
{
type: 'button',
btnName: '查询',
name: 'search',
color: 'primary',
},
],
formConfig2: [
{
type: 'select',
label: '成本名称',
selectOptions: [],
param: 'name',
labelField: 'label',
valueField: 'name',
filterable: true,
},
{
type: 'datePicker',
label: '时间范围',
dateType: 'daterange',
format: 'yyyy-MM-dd',
valueFormat: 'yyyy-MM-dd HH:mm:ss',
rangeSeparator: '-',
startPlaceholder: '开始时间',
endPlaceholder: '结束时间',
param: 'searchTime',
},
{
type: 'button',
btnName: '查询',
name: 'search',
color: 'primary',
},
],
listQuery: {
statisticType: 1,
},
activeName: 'his',
tableProps,
tableProps2,
tableBtn: [
this.$auth.hasPermi(`monitoring:cost-deep-othercost-his:update`)
? {
type: 'edit',
btnName: '编辑',
}
: undefined,
].filter((v) => v),
tableData: [],
tableData2: [],
};
},
components: {
AddOrUpdate,
},
created() {
const params = {
pageNo: 1,
pageSize: 100,
};
getRawOthercostRulePage(params).then((response) => {
this.formConfig[1].selectOptions = response.data.list;
this.formConfig2[0].selectOptions = response.data.list;
});
},
methods: {
buttonClick(val) {
switch (val.btnName) {
case 'search':
this.listQuery.pageNo = 1;
this.listQuery.pageSize = 10;
this.listQuery.name = val.name || null;
this.listQuery.statisticType = val.statisticType || 1;
this.listQuery.startTime = val.searchTime ? val.searchTime[0] : null;
this.listQuery.endTime = val.searchTime
? val.searchTime[1].substr(0, 10) + ' 23:59:59'
: null;
if (this.activeName === 'his') {
this.getDataList();
} else {
this.getDataList2();
}
break;
case 'add':
this.addOrUpdateHandle();
break;
case 'export':
this.listQuery.pageNo = 1;
this.listQuery.pageSize = 10;
this.listQuery.name = val.name;
this.listQuery.startTime = val.searchTime ? val.searchTime[0] : null;
this.listQuery.endTime = val.searchTime
? val.searchTime[1].substr(0, 10) + ' 23:59:59'
: null;
this.handleExport();
break;
default:
console.log(val);
}
},
toggleTab() {
if (this.activeName === 'his') {
this.$refs.searchBarForm.resetForm();
this.listQuery.name = null;
this.listQuery.startTime = null;
this.listQuery.endTime = null;
this.listQuery.statisticType = 1;
this.listQuery.pageNo = 1;
this.getDataList();
} else {
this.$refs.searchBarForm2.resetForm();
this.listQuery.name = null;
this.listQuery.startTime = null;
this.listQuery.endTime = null;
this.listQuery.pageNo = 1;
this.getDataList2();
}
},
// 获取数据2列表
getDataList2() {
getRawOthercostSunPage(this.listQuery).then((response) => {
this.tableData2 = response.data.list;
this.listQuery.total = response.data.total;
});
},
//tableBtn点击
handleClick(val) {
if (val.type === 'edit') {
this.addOrUpdateVisible = true;
this.addOrEditTitle = '编辑';
this.$nextTick(() => {
this.$refs.addOrUpdate.init(val.data, this.listQuery.statisticType);
});
} else {
this.otherMethods(val);
}
},
},
};
</script>
<style lang="scss">
.energyOverlimitLog {
.el-tabs__nav::after {
content: '';
position: absolute;
left: 0;
bottom: 0;
width: 100%;
height: 2px;
background-color: #e4e7ed;
}
.el-tabs__nav-wrap::after {
width: 0;
}
.el-tabs__item {
padding: 0 10px;
}
.el-tabs__item:hover {
color: rgba(0, 0, 0, 0.85);
}
.el-tabs__item.is-active {
color: rgba(0, 0, 0, 0.85);
}
.el-tabs__item {
color: rgba(0, 0, 0, 0.45);
}
.searchBarBox {
margin-bottom: 0;
}
}
</style>

Voir le fichier

@@ -0,0 +1,123 @@
<!--
* @Author: zwq
* @Date: 2021-11-18 14:16:25
* @LastEditors: zwq
* @LastEditTime: 2024-04-22 14:59:49
* @Description:
-->
<template>
<el-form
:model="dataForm"
:rules="dataRule"
ref="dataForm"
@keyup.enter.native="dataFormSubmit()"
label-width="80px">
<el-row :gutter="20">
<el-col :span="12">
<el-form-item label="成本名称" prop="name">
<el-select
v-model="dataForm.name"
filterable
clearable
:style="{ width: '100%' }"
@change="setLabel"
placeholder="请选择成本名称">
<el-option
v-for="item in nameArr"
:key="item.name"
:label="item.label"
:value="item.name"></el-option>
</el-select>
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item label="成本金额" prop="price">
<el-input-number
:min="0"
style="width: 80%"
v-model="dataForm.price"
clearable
placeholder="请输入成本金额" />
()
</el-form-item>
</el-col>
</el-row>
<el-row :gutter="20">
<el-col :span="12">
<el-form-item label="所属日期" prop="recTime">
<el-date-picker
v-model="dataForm.recTime"
type="date"
value-format="timestamp"
:style="{ width: '100%' }"
placeholder="选择所属日期"></el-date-picker>
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item label="备注" prop="remark">
<el-input
v-model="dataForm.remark"
clearable
placeholder="请输入备注" />
</el-form-item>
</el-col>
</el-row>
</el-form>
</template>
<script>
import basicAdd from '@/mixins/basic-add';
import {
createRawOthercostLog,
updateRawOthercostLog,
getRawOthercostLog,
} from '@/api/cost/costOthercostLogDeep';
import moment from 'moment';
const nowData = moment().format('YYYY-MM-DD').valueOf()
export default {
mixins: [basicAdd],
props: {
nameArr: {
type: Array,
default: () => [],
},
},
data() {
return {
urlOptions: {
createURL: createRawOthercostLog,
updateURL: updateRawOthercostLog,
infoURL: getRawOthercostLog,
},
dataForm: {
id: undefined,
price: undefined,
name: undefined,
recTime: new Date().getTime(),
remark: undefined,
},
dataRule: {
price: [
{ required: true, message: '成本金额不能为空', trigger: 'blur' },
],
name: [
{ required: true, message: ' 成本名称不能为空', trigger: 'blur' },
],
recTime: [
{
required: true,
message: '所属日期不能为空',
trigger: 'change',
},
],
},
};
},
methods: {
setLabel(val){
this.dataForm.label = this.nameArr.find(item=>item.name===val).label
}
},
};
</script>

Voir le fichier

@@ -0,0 +1,208 @@
<template>
<div class="app-container">
<search-bar
:formConfigs="formConfig"
ref="searchBarForm"
@headBtnClick="buttonClick" />
<base-table
v-loading="dataListLoading"
:table-props="tableProps"
:page="listQuery.pageNo"
:limit="listQuery.pageSize"
:max-height="tableH"
:table-data="tableData">
<method-btn
v-if="tableBtn.length"
slot="handleBtn"
:width="120"
label="操作"
:method-list="tableBtn"
@clickBtn="handleClick" />
</base-table>
<pagination
:limit.sync="listQuery.pageSize"
:page.sync="listQuery.pageNo"
:total="listQuery.total"
@pagination="getDataList" />
<base-dialog
:dialogTitle="addOrEditTitle"
:dialogVisible="addOrUpdateVisible"
@cancel="handleCancel"
@confirm="handleConfirm"
:before-close="handleCancel"
width="50%">
<add-or-update
ref="addOrUpdate"
:name-arr="formConfig[0].selectOptions"
@refreshDataList="successSubmit"></add-or-update>
</base-dialog>
</div>
</template>
<script>
import AddOrUpdate from './add-or-updata';
import basicPage from '@/mixins/basic-page';
import tableHeightMixin from '@/mixins/lb/tableHeightMixin';
import { parseTime } from '@/filter/code-filter';
import {
deleteRawOthercostLog,
getRawOthercostLogPage,
exportRawOthercostLogExcel,
} from '@/api/cost/costOthercostLogDeep';
import { getRawOthercostRulePage } from '@/api/cost/deepOthercostRule';
const tableProps = [
{
prop: 'otherCostName',
label: '成本名称',
},
{
prop: 'recTime',
label: '日期',
filter: (val) => parseTime(val, '{y}年{m}月{d}日'),
},
{
prop: 'price',
label: '成本金额',
align: 'right',
},
{
prop: 'remark',
label: '备注',
},
];
export default {
mixins: [basicPage, tableHeightMixin],
data() {
return {
urlOptions: {
getDataListURL: getRawOthercostLogPage,
deleteURL: deleteRawOthercostLog,
exportURL: exportRawOthercostLogExcel,
},
tableProps,
tableBtn: [
this.$auth.hasPermi(`monitoring:cost-deep-othercost-log:update`)
? {
type: 'edit',
btnName: '编辑',
}
: undefined,
this.$auth.hasPermi(`monitoring:cost-deep-othercost-log:delete`)
? {
type: 'delete',
btnName: '删除',
}
: undefined,
].filter((v) => v),
tableData: [],
formConfig: [
{
type: 'select',
label: '成本名称',
selectOptions: [],
param: 'name',
labelField: 'label',
valueField: 'name',
filterable: true,
},
{
type: 'datePicker',
label: '时间范围',
dateType: 'daterange',
format: 'yyyy-MM-dd',
valueFormat: 'yyyy-MM-dd HH:mm:ss',
rangeSeparator: '-',
startPlaceholder: '开始时间',
endPlaceholder: '结束时间',
param: 'searchTime',
},
{
type: 'button',
btnName: '搜索',
name: 'search',
color: 'primary',
},
{
type: this.$auth.hasPermi('monitoring:cost-deep-othercost-log:create')
? 'separate'
: '',
},
{
type: this.$auth.hasPermi('monitoring:cost-deep-othercost-log:create')
? 'button'
: '',
btnName: '新增',
name: 'add',
color: 'success',
plain: true,
},
// {
// type: this.$auth.hasPermi('monitoring:cost-othercost-log:create') ? 'separate' : '',
// },
// {
// type: this.$auth.hasPermi('monitoring:cost-othercost-log:export') ? 'button' : '',
// btnName: '导出',
// name: 'export',
// color: 'warning',
// },
],
};
},
components: {
AddOrUpdate,
},
created() {
const params = {
pageNo: 1,
pageSize: 100,
};
getRawOthercostRulePage(params).then((response) => {
this.formConfig[0].selectOptions = response.data.list;
});
},
methods: {
buttonClick(val) {
switch (val.btnName) {
case 'search':
this.listQuery.pageNo = 1;
this.listQuery.pageSize = 10;
this.listQuery.name = val.name||null;
this.listQuery.startTime = val.searchTime ? val.searchTime[0] : null;
this.listQuery.endTime = val.searchTime
? val.searchTime[1].substr(0, 10) + ' 23:59:59'
: null;
this.getDataList();
break;
case 'add':
this.addOrUpdateHandle();
break;
case 'export':
this.listQuery.pageNo = 1;
this.listQuery.pageSize = 10;
this.listQuery.name = val.name;
this.listQuery.recTime = val.searchTime;
this.handleExport();
break;
default:
console.log(val);
}
},
//tableBtn点击
handleClick(val) {
if (val.type === "edit") {
this.addOrUpdateVisible = true;
this.addOrEditTitle = "编辑";
this.$nextTick(() => {
this.$refs.addOrUpdate.init(val.data.id);
});
} else if (val.type === "delete") {
this.deleteHandle(val.data.id, val.data.otherCostName, val.data._pageIndex)
} else {
this.otherMethods(val)
}
},
},
};
</script>

Voir le fichier

@@ -0,0 +1,159 @@
<!--
* @Author: zwq
* @Date: 2023-08-01 13:52:10
* @LastEditors: zwq
* @LastEditTime: 2024-04-22 14:56:17
* @Description:
-->
<template>
<el-form
:model="dataForm"
:rules="dataRule"
ref="dataForm"
v-if="visible"
@keyup.enter.native="dataFormSubmit()"
label-width="100px"
label-position="top">
<el-row :gutter="20">
<el-col :span="12">
<el-form-item label="成本名称" prop="label">
<el-input v-model="dataForm.label" clearable readonly />
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item label="自动计算策略" prop="type">
<el-radio-group v-model="dataForm.type" @input="setType">
<el-radio :label="1">每天等价</el-radio>
<el-radio :label="2">折旧</el-radio>
</el-radio-group>
</el-form-item>
</el-col>
<el-col :span="12" v-if="dataForm.type === 1" key="one">
<el-form-item label="价格" prop="price">
<el-input-number
:min="0"
style="width: 80%"
v-model="dataForm.price"
clearable />
()
</el-form-item>
</el-col>
<el-col :span="12" v-if="dataForm.type === 2" key="two">
<el-form-item label="总价" prop="price">
<el-input-number
:min="0"
style="width: 80%"
v-model="dataForm.price"
clearable />
()
</el-form-item>
</el-col>
<el-col :span="12" v-if="dataForm.type === 2" key="three">
<el-form-item label="折旧率" prop="ratio">
<el-input-number
:min="0"
style="width: 80%"
v-model="dataForm.ratio"
clearable />
(%)
</el-form-item>
</el-col>
<el-col :span="12" v-if="dataForm.type === 2" key="four">
<el-form-item label="折旧年限" prop="timeLimit">
<el-input-number
:min="0"
style="width: 80%"
v-model="dataForm.timeLimit"
clearable />
()
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item label="备注" prop="remark">
<el-input
@input="$forceUpdate()"
v-model="dataForm.remark"
clearable
placeholder="请输入备注" />
</el-form-item>
</el-col>
</el-row>
</el-form>
</template>
<script>
import {
updateRawOthercostRule,
getRawOthercostRule,
} from '@/api/cost/deepOthercostRule';
export default {
data() {
return {
urlOptions: {
updateURL: updateRawOthercostRule,
infoURL: getRawOthercostRule,
},
dataForm: {
label: undefined,
type: 1,
price: 0,
ratio: 0,
timeLimit: 1,
remark: '',
},
visible: false,
dataRule: {
price: [{ required: true, message: '价格不能为空', trigger: 'blur' }],
ratio: [{ required: true, message: '折旧率不能为空', trigger: 'blur' }],
timeLimit: [
{ required: true, message: '折旧年限不能为空', trigger: 'blur' },
],
},
};
},
created() {},
methods: {
init(val) {
this.dataForm = {
label: undefined,
type: 1,
price: 0,
ratio: 0,
timeLimit: 1,
remark: '',
};
this.visible = true;
this.$nextTick(() => {
this.$refs['dataForm'].resetFields();
this.dataForm = JSON.parse(JSON.stringify(val));
});
},
setType(val) {
if (val === 1) {
} else {
}
},
// 表单提交
dataFormSubmit() {
this.$refs['dataForm'].validate((valid) => {
if (!valid) {
return false;
}
// 修改的提交
this.urlOptions.updateURL(this.dataForm).then((response) => {
this.$modal.msgSuccess('修改成功');
this.visible = false;
this.$emit('refreshDataList');
});
});
},
/** 清空form */
formClear() {
if (this.$refs.dataForm !== undefined) {
this.$refs.dataForm.resetFields();
}
},
},
};
</script>

Voir le fichier

@@ -0,0 +1,109 @@
<!--
* @Author: zwq
* @Date: 2024-04-15 16:52:38
* @LastEditors: zwq
* @LastEditTime: 2024-04-22 16:46:26
* @Description:
-->
<template>
<div class="app-container">
<!-- 列表 -->
<base-table
v-loading="dataListLoading"
:table-props="tableProps"
:page="listQuery.pageNo"
:limit="listQuery.pageSize"
:max-height="tableH"
:table-data="tableData">
<method-btn
v-if="tableBtn.length"
slot="handleBtn"
:width="80"
label="操作"
:method-list="tableBtn"
@clickBtn="handleClick" />
</base-table>
<pagination
:limit.sync="listQuery.pageSize"
:page.sync="listQuery.pageNo"
:total="listQuery.total"
@pagination="getDataList" />
<!-- 对话框(添加 / 修改) -->
<base-dialog
:dialogTitle="addOrEditTitle"
:dialogVisible="addOrUpdateVisible"
@cancel="handleCancel"
@confirm="handleConfirm"
:before-close="handleCancel"
width="40%">
<add-or-update
ref="addOrUpdate"
@refreshDataList="successSubmit"></add-or-update>
</base-dialog>
</div>
</template>
<script>
import AddOrUpdate from './add-or-updata';
import basicPage from '@/mixins/basic-page';
import typeRule from './typeRule';
import {
getRawOthercostRulePage,
} from '@/api/cost/deepOthercostRule';
import tableHeightMixin from '@/mixins/lb/tableHeightMixin';
const tableProps = [
{
prop: 'label',
label: '成本名称',
},
{
prop: 'type',
label: '自动计算方式',
subcomponent: typeRule,
},
{
prop: 'remark',
label: '备注',
},
];
export default {
mixins: [basicPage,tableHeightMixin],
data() {
return {
urlOptions: {
getDataListURL: getRawOthercostRulePage,
},
tableProps,
tableBtn: [
this.$auth.hasPermi(`monitoring:cost-deep-othercost-rule:update`)
? {
type: 'edit',
btnName: '编辑',
}
: undefined,
].filter((v) => v),
tableData: [],
};
},
components: {
AddOrUpdate,
},
created() {
},
methods: {
//tableBtn点击
handleClick(val) {
if (val.type === "edit") {
this.addOrUpdateVisible = true;
this.addOrEditTitle = "编辑";
this.$nextTick(() => {
this.$refs.addOrUpdate.init(val.data);
});
}
},
},
};
</script>

Voir le fichier

@@ -0,0 +1,31 @@
<!--
* @Author: zwq
* @Date: 2023-12-05 13:45:59
* @LastEditors: zwq
* @LastEditTime: 2024-04-15 17:12:03
* @Description
-->
<template>
<div>
<span>
{{
injectData.type == 1
? `每天等价,${injectData.price}`
: injectData.type == 2
? `总价${injectData.price}元,年折旧率${injectData.ratio}%,折旧年限${injectData.timeLimit}`
: '-'
}}
</span>
</div>
</template>
<script>
export default {
name: '',
props: {
injectData: {
type: Object,
default: () => ({}),
},
},
};
</script>

Voir le fichier

@@ -0,0 +1,113 @@
<!--
* @Author: zwq
* @Date: 2021-11-18 14:16:25
* @LastEditors: zwq
* @LastEditTime: 2024-04-19 16:45:32
* @Description:
-->
<template>
<el-form
:model="dataForm"
:rules="dataRule"
ref="dataForm"
@keyup.enter.native="dataFormSubmit()"
label-width="80px">
<el-row :gutter="20">
<el-col :span="12">
<el-form-item label="能源类型" prop="energyTypeName">
<el-input
v-model="dataForm.energyTypeName"
disabled
placeholder="请输入能源类型" />
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item label="日期" prop="recTime">
<el-date-picker
v-model="dataForm.recTime"
type="date"
value-format="timestamp"
:style="{ width: '100%' }"
readonly
placeholder="选择日期"></el-date-picker>
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item label="总价" prop="price">
<el-input-number
:min="0"
style="width: 80%"
v-model="dataForm.price"
clearable
placeholder="请输入总价" />
()
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item label="累计用量" prop="quantity">
<el-input-number
:min="0"
style="width: 100%"
v-model="dataForm.quantity"
clearable
placeholder="请输入累计用量" />
</el-form-item>
</el-col>
</el-row>
</el-form>
</template>
<script>
import basicAdd from '@/mixins/basic-add';
import { updateEnergyHis } from '@/api/cost/costEnergy';
export default {
mixins: [basicAdd],
data() {
return {
urlOptions: {
updateURL: updateEnergyHis,
},
dataForm: {
id: undefined,
price: undefined,
quantity: undefined,
energyTypeName: undefined,
recTime: undefined,
},
dataRule: {
price: [{ required: true, message: '总价不能为空', trigger: 'blur' }],
quantity: [
{ required: true, message: '累计用量不能为空', trigger: 'blur' },
],
},
};
},
methods: {
init(val, statisticType) {
this.visible = true;
this.$nextTick(() => {
this.$refs['dataForm'].resetFields();
this.dataForm = JSON.parse(JSON.stringify(val));
this.dataForm.statisticType = statisticType;
});
},
// 表单提交
dataFormSubmit() {
this.$refs['dataForm'].validate((valid) => {
if (!valid) {
return false;
}
this.dataForm.modifyPrice = this.dataForm.price;
this.dataForm.modifyQuantity = this.dataForm.quantity;
// 修改的提交
this.urlOptions.updateURL(this.dataForm).then((response) => {
this.$modal.msgSuccess('修改成功');
this.visible = false;
this.$emit('refreshDataList');
});
});
},
},
};
</script>

Voir le fichier

@@ -0,0 +1,347 @@
<template>
<div class="app-container energyOverlimitLog">
<div v-show="activeName === 'his'">
<!-- 搜索工作栏 -->
<search-bar
:formConfigs="formConfig"
ref="searchBarForm"
@headBtnClick="buttonClick" />
</div>
<div v-show="activeName === 'now'">
<!-- 搜索工作栏 -->
<search-bar
:formConfigs="formConfig2"
ref="searchBarForm2"
@headBtnClick="buttonClick" />
</div>
<el-tabs v-model="activeName" @tab-click="toggleTab">
<el-tab-pane label="历史成本" name="his"></el-tab-pane>
<el-tab-pane label="成本查询" name="now"></el-tab-pane>
</el-tabs>
<!-- 列表 -->
<div v-if="activeName === 'his'">
<base-table
:page="listQuery.pageNo"
:limit="listQuery.pageSize"
:table-props="tableProps"
:table-data="tableData"
:max-height="tableH">
<method-btn
v-if="tableBtn.length"
slot="handleBtn"
:width="80"
label="操作"
:method-list="tableBtn"
@clickBtn="handleClick" />
</base-table>
</div>
<div v-if="activeName === 'now'">
<base-table
:page="listQuery.pageNo"
:limit="listQuery.pageSize"
:table-props="tableProps2"
:table-data="tableData2"
:max-height="tableH" />
</div>
<pagination
:page.sync="listQuery.pageNo"
:limit.sync="listQuery.pageSize"
:total="listQuery.total"
@pagination="getDataList" />
<base-dialog
:dialogTitle="addOrEditTitle"
:dialogVisible="addOrUpdateVisible"
@cancel="handleCancel"
@confirm="handleConfirm"
:before-close="handleCancel"
width="50%">
<add-or-update
ref="addOrUpdate"
@refreshDataList="successSubmit"></add-or-update>
</base-dialog>
</div>
</template>
<script>
import AddOrUpdate from './add-or-updata';
import basicPage from '@/mixins/basic-page';
import { getEnergyTypePage } from '@/api/base/energyType';
import { getEnergyHisPage, getEnergyRealtimePage } from '@/api/cost/costEnergy';
import { parseTime } from '@/filter/code-filter';
import tableHeightMixin from '@/mixins/lb/tableHeightMixin';
const tableProps = [
{
prop: 'recTime',
label: '日期',
filter: (val) => parseTime(val, '{y}年{m}月{d}日'),
},
{
prop: 'energyTypeName',
label: '能源类型',
},
{
prop: 'bindObjectName',
label: '监控对象',
filter: (val) => (val != null ? val : '--'),
},
{
prop: 'meterName',
label: '抄表名',
filter: (val) => (val != null ? val : '--'),
},
{
prop: 'quantity',
label: '累计使用量',
},
{
prop: 'price',
label: '总价(元)',
align: 'right',
},
];
const tableProps2 = [
{
prop: 'energyTypeName',
label: '能源类型',
},
{
prop: 'bindObjectName',
label: '监控对象',
filter: (val) => (val != null ? val : '--'),
},
{
prop: 'meter',
label: '抄表名',
filter: (val) => (val != null ? val : '--'),
},
{
prop: 'quantity',
label: '累计使用量',
},
{
prop: 'price',
label: '总价(元)',
align: 'right',
},
];
export default {
name: 'costEnergy',
mixins: [basicPage, tableHeightMixin],
data() {
return {
urlOptions: {
getDataListURL: getEnergyHisPage,
},
formConfig: [
{
type: 'select',
label: '维度',
selectOptions: [
{ id: 1, name: '日' },
{ id: 2, name: '周' },
{ id: 3, name: '月' },
],
param: 'statisticType',
defaultSelect: 1, // 默认值,
clearable: false,
},
{
type: 'select',
label: '能源类型',
selectOptions: [],
param: 'name',
labelField: 'name',
filterable: true,
},
{
type: 'datePicker',
label: '时间范围',
dateType: 'daterange',
format: 'yyyy-MM-dd',
valueFormat: 'yyyy-MM-dd HH:mm:ss',
rangeSeparator: '-',
startPlaceholder: '开始时间',
endPlaceholder: '结束时间',
param: 'searchTime',
},
{
type: 'button',
btnName: '查询',
name: 'search',
color: 'primary',
},
],
formConfig2: [
{
type: 'select',
label: '能源类型',
selectOptions: [],
param: 'name',
labelField: 'name',
filterable: true,
},
{
type: 'datePicker',
label: '时间范围',
dateType: 'daterange',
format: 'yyyy-MM-dd',
valueFormat: 'yyyy-MM-dd HH:mm:ss',
rangeSeparator: '-',
startPlaceholder: '开始时间',
endPlaceholder: '结束时间',
param: 'searchTime',
},
{
type: 'button',
btnName: '查询',
name: 'search',
color: 'primary',
},
],
listQuery: {
statisticType: 1,
},
activeName: 'his',
tableProps,
tableProps2,
tableBtn: [
this.$auth.hasPermi(`monitoring:cost-energy-his:update`)
? {
type: 'edit',
btnName: '编辑',
}
: undefined,
].filter((v) => v),
tableData: [],
tableData2: [],
};
},
components: {
AddOrUpdate,
},
created() {
const params = {
pageNo: 1,
pageSize: 100,
};
getEnergyTypePage(params).then((response) => {
this.formConfig[1].selectOptions = response.data.list;
this.formConfig2[0].selectOptions = response.data.list;
});
},
methods: {
buttonClick(val) {
switch (val.btnName) {
case 'search':
this.listQuery.pageNo = 1;
this.listQuery.pageSize = 10;
this.listQuery.energyTypeId = val.name || null;
this.listQuery.statisticType = val.statisticType || 1;
this.listQuery.startTime = val.searchTime ? val.searchTime[0] : null;
this.listQuery.endTime = val.searchTime
? val.searchTime[1].substr(0, 10) + ' 23:59:59'
: null;
if (this.activeName === 'his') {
this.getDataList();
} else {
this.getDataList2();
}
break;
case 'add':
this.addOrUpdateHandle();
break;
case 'export':
this.listQuery.pageNo = 1;
this.listQuery.pageSize = 10;
this.listQuery.energyTypeId = val.name;
this.listQuery.startTime = val.searchTime ? val.searchTime[0] : null;
this.listQuery.endTime = val.searchTime
? val.searchTime[1].substr(0, 10) + ' 23:59:59'
: null;
this.handleExport();
break;
default:
console.log(val);
}
},
toggleTab() {
if (this.activeName === 'his') {
this.$refs.searchBarForm.resetForm();
this.listQuery.name = null;
this.listQuery.startTime = null;
this.listQuery.endTime = null;
this.listQuery.statisticType = 1;
this.listQuery.pageNo = 1;
this.getDataList();
} else {
this.$refs.searchBarForm2.resetForm();
this.listQuery.name = null;
this.listQuery.startTime = null;
this.listQuery.endTime = null;
this.listQuery.pageNo = 1;
this.getDataList2();
}
},
// 获取数据2列表
getDataList2() {
if (this.listQuery.startTime) {
getEnergyRealtimePage(this.listQuery).then((response) => {
this.tableData2 = response.data.list;
this.listQuery.total = response.data.total;
});
} else {
this.$message.warning('请选择时间范围');
}
},
//tableBtn点击
handleClick(val) {
if (val.type === 'edit') {
this.addOrUpdateVisible = true;
this.addOrEditTitle = '编辑';
this.$nextTick(() => {
this.$refs.addOrUpdate.init(val.data, this.listQuery.statisticType);
});
} else {
this.otherMethods(val);
}
},
},
};
</script>
<style lang="scss">
.energyOverlimitLog {
.el-tabs__nav::after {
content: '';
position: absolute;
left: 0;
bottom: 0;
width: 100%;
height: 2px;
background-color: #e4e7ed;
}
.el-tabs__nav-wrap::after {
width: 0;
}
.el-tabs__item {
padding: 0 10px;
}
.el-tabs__item:hover {
color: rgba(0, 0, 0, 0.85);
}
.el-tabs__item.is-active {
color: rgba(0, 0, 0, 0.85);
}
.el-tabs__item {
color: rgba(0, 0, 0, 0.45);
}
.searchBarBox {
margin-bottom: 0;
}
}
</style>

Voir le fichier

@@ -0,0 +1,114 @@
<!--
* @Author: zwq
* @Date: 2021-11-18 14:16:25
* @LastEditors: zwq
* @LastEditTime: 2024-04-19 16:59:45
* @Description:
-->
<template>
<el-form
:model="dataForm"
:rules="dataRule"
ref="dataForm"
@keyup.enter.native="dataFormSubmit()"
label-width="80px">
<el-row :gutter="20">
<el-col :span="12">
<el-form-item label="原料名称" prop="materialName">
<el-input
v-model="dataForm.materialName"
disabled
placeholder="请输入原料名称" />
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item label="单价" prop="matPrice">
<el-input
v-model="dataForm.matPrice"
disabled
style="width: 70%"
placeholder="请输入单价" />
(/)
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item label="总价" prop="price">
<el-input-number
:min="0"
style="width: 80%"
v-model="dataForm.price"
clearable
placeholder="请输入总价" />
()
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item label="累计用量" prop="quantity">
<el-input-number
:min="0"
style="width: 80%"
v-model="dataForm.quantity"
clearable
placeholder="请输入累计用量" />
()
</el-form-item>
</el-col>
</el-row>
</el-form>
</template>
<script>
import basicAdd from '@/mixins/basic-add';
import { updateMaterialHis } from '@/api/cost/costMaterial';
export default {
mixins: [basicAdd],
data() {
return {
urlOptions: {
updateURL: updateMaterialHis,
},
dataForm: {
id: undefined,
price: undefined,
quantity: undefined,
matPrice: undefined,
materialName: undefined,
recTime: undefined,
},
dataRule: {
price: [{ required: true, message: '总价不能为空', trigger: 'blur' }],
quantity: [
{ required: true, message: '累计用量不能为空', trigger: 'blur' },
],
},
};
},
methods: {
init(val, statisticType) {
this.visible = true;
this.$nextTick(() => {
this.$refs['dataForm'].resetFields();
this.dataForm = JSON.parse(JSON.stringify(val));
this.dataForm.statisticType = statisticType;
});
},
// 表单提交
dataFormSubmit() {
this.$refs['dataForm'].validate((valid) => {
if (!valid) {
return false;
}
this.dataForm.modifyPrice = this.dataForm.price;
this.dataForm.modifyQuantity = this.dataForm.quantity;
// 修改的提交
this.urlOptions.updateURL(this.dataForm).then((response) => {
this.$modal.msgSuccess('修改成功');
this.visible = false;
this.$emit('refreshDataList');
});
});
},
},
};
</script>

Voir le fichier

@@ -0,0 +1,346 @@
<template>
<div class="app-container energyOverlimitLog">
<div v-show="activeName === 'his'">
<!-- 搜索工作栏 -->
<search-bar
:formConfigs="formConfig"
ref="searchBarForm"
@headBtnClick="buttonClick" />
</div>
<div v-show="activeName === 'now'">
<!-- 搜索工作栏 -->
<search-bar
:formConfigs="formConfig2"
ref="searchBarForm2"
@headBtnClick="buttonClick" />
</div>
<el-tabs v-model="activeName" @tab-click="toggleTab">
<el-tab-pane label="历史成本" name="his"></el-tab-pane>
<el-tab-pane label="成本查询" name="now"></el-tab-pane>
</el-tabs>
<!-- 列表 -->
<div v-if="activeName === 'his'">
<base-table
:page="listQuery.pageNo"
:limit="listQuery.pageSize"
:table-props="tableProps"
:table-data="tableData"
:max-height="tableH">
<method-btn
v-if="tableBtn.length"
slot="handleBtn"
:width="80"
label="操作"
:method-list="tableBtn"
@clickBtn="handleClick" />
</base-table>
</div>
<div v-if="activeName === 'now'">
<base-table
:page="listQuery.pageNo"
:limit="listQuery.pageSize"
:table-props="tableProps2"
:table-data="tableData2"
:max-height="tableH" />
</div>
<pagination
:page.sync="listQuery.pageNo"
:limit.sync="listQuery.pageSize"
:total="listQuery.total"
@pagination="getDataList" />
<base-dialog
:dialogTitle="addOrEditTitle"
:dialogVisible="addOrUpdateVisible"
@cancel="handleCancel"
@confirm="handleConfirm"
:before-close="handleCancel"
width="50%">
<add-or-update
ref="addOrUpdate"
@refreshDataList="successSubmit"></add-or-update>
</base-dialog>
</div>
</template>
<script>
import AddOrUpdate from './add-or-updata';
import basicPage from '@/mixins/basic-page';
import { getMaterialPage } from '@/api/base/material';
import {
getMaterialHisPage,
getMaterialRealtimePage,
} from '@/api/cost/costMaterial';
import { parseTime } from '@/filter/code-filter';
import tableHeightMixin from '@/mixins/lb/tableHeightMixin';
import typeRule from './typeRule';
const tableProps = [
{
prop: 'recTime',
label: '日期',
filter: (val) => parseTime(val, '{y}年{m}月{d}日'),
},
{
prop: 'materialName',
label: '原料名称',
},
{
prop: 'matPrice',
label: '单价(元/吨)',
align: 'right',
},
{
prop: 'quantity',
label: '累计使用量(吨)',
},
{
prop: 'price',
label: '总价(元)',
align: 'right',
},
];
const tableProps2 = [
{
prop: 'materialName',
label: '原料名称',
},
{
prop: 'matPrice',
label: '单价(元/吨)',
align: 'right',
},
{
prop: 'time',
label: '单价生效时间',
subcomponent: typeRule,
},
{
prop: 'quantity',
label: '累计使用量(吨)',
},
{
prop: 'price',
label: '总价(元)',
align: 'right',
},
];
export default {
name: 'costMaterial',
mixins: [basicPage, tableHeightMixin],
data() {
return {
urlOptions: {
getDataListURL: getMaterialHisPage,
},
formConfig: [
{
type: 'select',
label: '维度',
selectOptions: [
{ id: 1, name: '日' },
{ id: 2, name: '周' },
{ id: 3, name: '月' },
],
param: 'statisticType',
defaultSelect: 1, // 默认值,
clearable: false,
},
{
type: 'select',
label: '原料名称',
selectOptions: [],
param: 'name',
labelField: 'name',
filterable: true,
},
{
type: 'datePicker',
label: '时间范围',
dateType: 'daterange',
format: 'yyyy-MM-dd',
valueFormat: 'yyyy-MM-dd HH:mm:ss',
rangeSeparator: '-',
startPlaceholder: '开始时间',
endPlaceholder: '结束时间',
param: 'searchTime',
},
{
type: 'button',
btnName: '查询',
name: 'search',
color: 'primary',
},
],
formConfig2: [
{
type: 'select',
label: '原料名称',
selectOptions: [],
param: 'name',
labelField: 'name',
filterable: true,
},
{
type: 'datePicker',
label: '时间范围',
dateType: 'daterange',
format: 'yyyy-MM-dd',
valueFormat: 'yyyy-MM-dd HH:mm:ss',
rangeSeparator: '-',
startPlaceholder: '开始时间',
endPlaceholder: '结束时间',
param: 'searchTime',
},
{
type: 'button',
btnName: '查询',
name: 'search',
color: 'primary',
},
],
listQuery: {
statisticType: 1,
},
activeName: 'his',
tableProps,
tableProps2,
tableBtn: [
this.$auth.hasPermi(`monitoring:cost-material-his:update`)
? {
type: 'edit',
btnName: '编辑',
}
: undefined,
].filter((v) => v),
tableData: [],
tableData2: [],
};
},
components: {
AddOrUpdate,
},
created() {
const params = {
pageNo: 1,
pageSize: 100,
};
getMaterialPage(params).then((response) => {
this.formConfig[1].selectOptions = response.data.list;
this.formConfig2[0].selectOptions = response.data.list;
});
},
methods: {
buttonClick(val) {
switch (val.btnName) {
case 'search':
this.listQuery.pageNo = 1;
this.listQuery.pageSize = 10;
this.listQuery.materialId = val.name || null;
this.listQuery.statisticType = val.statisticType || 1;
this.listQuery.startTime = val.searchTime ? val.searchTime[0] : null;
this.listQuery.endTime = val.searchTime
? val.searchTime[1].substr(0, 10) + ' 23:59:59'
: null;
if (this.activeName === 'his') {
this.getDataList();
} else {
this.getDataList2();
}
break;
case 'add':
this.addOrUpdateHandle();
break;
case 'export':
this.listQuery.pageNo = 1;
this.listQuery.pageSize = 10;
this.listQuery.name = val.name;
this.listQuery.startTime = val.searchTime ? val.searchTime[0] : null;
this.listQuery.endTime = val.searchTime
? val.searchTime[1].substr(0, 10) + ' 23:59:59'
: null;
this.handleExport();
break;
default:
console.log(val);
}
},
toggleTab() {
if (this.activeName === 'his') {
this.$refs.searchBarForm.resetForm();
this.listQuery.name = null;
this.listQuery.startTime = null;
this.listQuery.endTime = null;
this.listQuery.statisticType = 1;
this.listQuery.pageNo = 1;
this.getDataList();
} else {
this.$refs.searchBarForm2.resetForm();
this.listQuery.name = null;
this.listQuery.startTime = null;
this.listQuery.endTime = null;
this.listQuery.pageNo = 1;
this.getDataList2();
}
},
// 获取数据2列表
getDataList2() {
if (this.listQuery.startTime) {
getMaterialRealtimePage(this.listQuery).then((response) => {
this.tableData2 = response.data.list;
this.listQuery.total = response.data.total;
});
} else {
this.$message.warning('请选择时间范围');
}
},
//tableBtn点击
handleClick(val) {
if (val.type === 'edit') {
this.addOrUpdateVisible = true;
this.addOrEditTitle = '编辑';
this.$nextTick(() => {
this.$refs.addOrUpdate.init(val.data, this.listQuery.statisticType);
});
} else {
this.otherMethods(val);
}
},
},
};
</script>
<style lang="scss">
.energyOverlimitLog {
.el-tabs__nav::after {
content: '';
position: absolute;
left: 0;
bottom: 0;
width: 100%;
height: 2px;
background-color: #e4e7ed;
}
.el-tabs__nav-wrap::after {
width: 0;
}
.el-tabs__item {
padding: 0 10px;
}
.el-tabs__item:hover {
color: rgba(0, 0, 0, 0.85);
}
.el-tabs__item.is-active {
color: rgba(0, 0, 0, 0.85);
}
.el-tabs__item {
color: rgba(0, 0, 0, 0.45);
}
.searchBarBox {
margin-bottom: 0;
}
}
</style>

Voir le fichier

@@ -0,0 +1,23 @@
<!--
* @Author: zwq
* @Date: 2023-12-05 13:45:59
* @LastEditors: zwq
* @LastEditTime: 2024-04-15 17:12:03
* @Description
-->
<template>
<div>
<span>{{ parseTime(injectData.startTime,'{y}年{m}月{d}日') + '-' + (parseTime(injectData.endTime)?parseTime(injectData.endTime,'{y}年{m}月{d}日'):'永久') }}</span>
</div>
</template>
<script>
export default {
name: '',
props: {
injectData: {
type: Object,
default: () => ({}),
},
},
};
</script>

Voir le fichier

@@ -0,0 +1,171 @@
<!--
* @Author: zwq
* @Date: 2021-11-18 14:16:25
* @LastEditors: zwq
* @LastEditTime: 2024-04-22 11:12:58
* @Description:
-->
<template>
<el-form
:model="dataForm"
:rules="dataRule"
ref="dataForm"
@keyup.enter.native="dataFormSubmit()"
label-width="80px">
<el-row :gutter="20">
<el-col :span="12">
<el-form-item label="产线" prop="bindObjectName">
<el-input
style="width: 100%"
v-model="dataForm.bindObjectName"
readonly />
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item label="厚度" prop="thick">
<el-input-number
:min="0"
style="width: 100%"
v-model="dataForm.thick"
clearable
placeholder="请输入厚度" />
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item label="在线速度" prop="speed">
<el-input-number
:min="0"
style="width: 100%"
v-model="dataForm.speed"
clearable
placeholder="请输入在线速度" />
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item label="掰边宽度" prop="width">
<el-input-number
:min="0"
style="width: 100%"
v-model="dataForm.width"
clearable
placeholder="请输入掰边宽度" />
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item label="拉引量" prop="inArea">
<el-input-number
:min="0"
style="width: 80%"
v-model="dataForm.inArea"
clearable
placeholder="请输入拉引量" />
(/m²)
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item label="下片面积" prop="outArea">
<el-input-number
:min="0"
style="width: 80%"
v-model="dataForm.outArea"
clearable
placeholder="请输入下片面积" />
(/m²)
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item label="良品率" prop="ratio">
<el-input-number
:min="0"
style="width: 80%"
v-model="dataForm.ratio"
clearable
placeholder="请输入良品率" />
(%)
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item label="所属日期" prop="recTime">
<el-date-picker
v-model="dataForm.recTime"
type="date"
value-format="timestamp"
:style="{ width: '100%' }"
readonly
placeholder="选择所属日期"></el-date-picker>
</el-form-item>
</el-col>
</el-row>
</el-form>
</template>
<script>
import basicAdd from '@/mixins/basic-add';
import { updatecostOriginRatioHis } from '@/api/cost/costOriginRatioHis';
export default {
mixins: [basicAdd],
props: {
nameArr: {
type: Array,
default: () => [],
},
},
data() {
return {
urlOptions: {
updateURL: updatecostOriginRatioHis,
},
dataForm: {
id: undefined,
bindObjectName: undefined,
thick: undefined,
speed: undefined,
width: undefined,
inArea: undefined,
outArea: undefined,
ratio: undefined,
recTime: undefined,
},
dataRule: {},
};
},
methods: {
init(val, statisticType) {
this.visible = true;
this.$nextTick(() => {
this.$refs['dataForm'].resetFields();
this.dataForm = JSON.parse(JSON.stringify(val));
this.dataForm.statisticType = statisticType;
this.dataForm.ratio =
this.dataForm.ratio >= 0 ? this.dataForm.ratio * 100 : '';
});
},
// 表单提交
dataFormSubmit() {
this.$refs['dataForm'].validate((valid) => {
if (!valid) {
return false;
}
const udata = {
id: this.dataForm.id,
statisticType: this.dataForm.statisticType,
modifyThick: this.dataForm.thick,
modifySpeed: this.dataForm.speed,
modifyWidth: this.dataForm.width,
modifyInArea: this.dataForm.inArea,
modifyOutArea: this.dataForm.outArea,
modifyRatio:
this.dataForm.ratio >= 0 ? this.dataForm.ratio / 100 : '',
};
// 修改的提交
this.urlOptions.updateURL(udata).then((response) => {
this.$modal.msgSuccess('修改成功');
this.visible = false;
this.$emit('refreshDataList');
});
});
},
},
};
</script>

Voir le fichier

@@ -0,0 +1,237 @@
<template>
<div class="app-container energyOverlimitLog">
<!-- 搜索工作栏 -->
<search-bar
:formConfigs="formConfig"
ref="searchBarForm"
@headBtnClick="buttonClick" />
<!-- 列表 -->
<base-table
:page="listQuery.pageNo"
:limit="listQuery.pageSize"
:table-props="tableProps"
:table-data="tableData"
:max-height="tableH">
<method-btn
v-if="tableBtn.length"
slot="handleBtn"
:width="80"
label="操作"
:method-list="tableBtn"
@clickBtn="handleClick" />
</base-table>
<pagination
:page.sync="listQuery.pageNo"
:limit.sync="listQuery.pageSize"
:total="listQuery.total"
@pagination="getDataList" />
<base-dialog
:dialogTitle="addOrEditTitle"
:dialogVisible="addOrUpdateVisible"
@cancel="handleCancel"
@confirm="handleConfirm"
:before-close="handleCancel"
width="50%">
<add-or-update
ref="addOrUpdate"
:name-arr="formConfig[1].selectOptions"
@refreshDataList="successSubmit"></add-or-update>
</base-dialog>
</div>
</template>
<script>
import AddOrUpdate from './add-or-updata';
import basicPage from '@/mixins/basic-page';
import { getLineAll } from '@/api/base/productionLine';
import { getcostOriginRatioHisPage } from '@/api/cost/costOriginRatioHis';
import { parseTime } from '@/filter/code-filter';
import tableHeightMixin from '@/mixins/lb/tableHeightMixin';
const tableProps = [
{
prop: 'recTime',
label: '日期',
filter: (val) => parseTime(val, '{y}年{m}月{d}日'),
},
{
prop: 'bindObjectName',
label: '产线',
},
{
prop: 'thick',
label: '厚度',
},
{
prop: 'speed',
label: '在线速度',
},
{
prop: 'width',
label: '掰边宽度',
},
{
prop: 'inArea',
label: '拉引量/m²',
},
{
prop: 'outArea',
label: '下片面积/m²',
},
{
prop: 'ratio',
label: '良品率',
filter: (val) => (val ? val * 100 + '%' : '-'),
},
];
export default {
name: 'costOriginRatioHis',
mixins: [basicPage, tableHeightMixin],
data() {
return {
urlOptions: {
getDataListURL: getcostOriginRatioHisPage,
},
formConfig: [
{
type: 'select',
label: '维度',
selectOptions: [
{ id: 1, name: '日' },
{ id: 2, name: '周' },
{ id: 3, name: '月' },
],
param: 'statisticType',
defaultSelect: 1, // 默认值,
clearable: false,
},
{
type: 'select',
label: '产线',
selectOptions: [],
param: 'name',
filterable: true,
},
{
type: 'datePicker',
label: '时间范围',
dateType: 'daterange',
format: 'yyyy-MM-dd',
valueFormat: 'yyyy-MM-dd HH:mm:ss',
rangeSeparator: '-',
startPlaceholder: '开始时间',
endPlaceholder: '结束时间',
param: 'searchTime',
},
{
type: 'button',
btnName: '查询',
name: 'search',
color: 'primary',
},
],
listQuery: {
statisticType: 1,
},
tableProps,
tableBtn: [
this.$auth.hasPermi(`monitoring:cost-origin-ratio-his:update`)
? {
type: 'edit',
btnName: '编辑',
}
: undefined,
].filter((v) => v),
tableData: [],
};
},
components: {
AddOrUpdate,
},
created() {
getLineAll().then((response) => {
this.formConfig[1].selectOptions = response.data;
});
},
methods: {
buttonClick(val) {
switch (val.btnName) {
case 'search':
this.listQuery.pageNo = 1;
this.listQuery.pageSize = 10;
this.listQuery.bindObjectId = val.name || null;
this.listQuery.statisticType = val.statisticType || 1;
this.listQuery.startTime = val.searchTime ? val.searchTime[0] : null;
this.listQuery.endTime = val.searchTime
? val.searchTime[1].substr(0, 10) + ' 23:59:59'
: null;
this.getDataList();
break;
case 'add':
this.addOrUpdateHandle();
break;
case 'export':
this.listQuery.pageNo = 1;
this.listQuery.pageSize = 10;
this.listQuery.name = val.name;
this.listQuery.startTime = val.searchTime ? val.searchTime[0] : null;
this.listQuery.endTime = val.searchTime
? val.searchTime[1].substr(0, 10) + ' 23:59:59'
: null;
this.handleExport();
break;
default:
console.log(val);
}
},
//tableBtn点击
handleClick(val) {
if (val.type === 'edit') {
this.addOrUpdateVisible = true;
this.addOrEditTitle = '编辑';
this.$nextTick(() => {
this.$refs.addOrUpdate.init(val.data, this.listQuery.statisticType);
});
} else {
this.otherMethods(val);
}
},
},
};
</script>
<style lang="scss">
.energyOverlimitLog {
.el-tabs__nav::after {
content: '';
position: absolute;
left: 0;
bottom: 0;
width: 100%;
height: 2px;
background-color: #e4e7ed;
}
.el-tabs__nav-wrap::after {
width: 0;
}
.el-tabs__item {
padding: 0 10px;
}
.el-tabs__item:hover {
color: rgba(0, 0, 0, 0.85);
}
.el-tabs__item.is-active {
color: rgba(0, 0, 0, 0.85);
}
.el-tabs__item {
color: rgba(0, 0, 0, 0.45);
}
.searchBarBox {
margin-bottom: 0;
}
}
</style>

Voir le fichier

@@ -0,0 +1,115 @@
<!--
* @Author: zwq
* @Date: 2021-11-18 14:16:25
* @LastEditors: zwq
* @LastEditTime: 2024-04-19 16:29:30
* @Description:
-->
<template>
<el-form
:model="dataForm"
:rules="dataRule"
ref="dataForm"
@keyup.enter.native="dataFormSubmit()"
label-width="80px">
<el-row :gutter="20">
<el-col :span="12">
<el-form-item label="成本名称" prop="name">
<el-select
v-model="dataForm.name"
disabled
:style="{ width: '100%' }"
placeholder="请选择成本名称">
<el-option
v-for="item in nameArr"
:key="item.name"
:label="item.label"
:value="item.name"></el-option>
</el-select>
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item label="总价" prop="price">
<el-input-number
:min="0"
style="width: 80%"
v-model="dataForm.price"
clearable
placeholder="请输入总价" />
()
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item label="所属日期" prop="recTime">
<el-date-picker
v-model="dataForm.recTime"
type="date"
value-format="timestamp"
:style="{ width: '100%' }"
readonly
placeholder="选择所属日期"></el-date-picker>
</el-form-item>
</el-col>
</el-row>
</el-form>
</template>
<script>
import basicAdd from '@/mixins/basic-add';
import {
updateRawOthercostHis,
} from '@/api/cost/costOthercostHis';
export default {
mixins: [basicAdd],
props: {
nameArr: {
type: Array,
default: () => [],
},
},
data() {
return {
urlOptions: {
updateURL: updateRawOthercostHis,
},
dataForm: {
id: undefined,
price: undefined,
name: undefined,
recTime: undefined,
},
dataRule: {
price: [
{ required: true, message: '总价不能为空', trigger: 'blur' },
],
},
};
},
methods: {
init(val,statisticType) {
this.visible = true;
this.$nextTick(() => {
this.$refs["dataForm"].resetFields();
this.dataForm = JSON.parse(JSON.stringify(val))
this.dataForm.statisticType = statisticType
});
},
// 表单提交
dataFormSubmit() {
this.$refs['dataForm'].validate((valid) => {
if (!valid) {
return false;
}
this.dataForm.modifyPrice = this.dataForm.price
// 修改的提交
this.urlOptions.updateURL(this.dataForm).then((response) => {
this.$modal.msgSuccess('修改成功');
this.visible = false;
this.$emit('refreshDataList');
});
});
},
},
};
</script>

Voir le fichier

@@ -0,0 +1,321 @@
<template>
<div class="app-container energyOverlimitLog">
<div v-show="activeName === 'his'">
<!-- 搜索工作栏 -->
<search-bar
:formConfigs="formConfig"
ref="searchBarForm"
@headBtnClick="buttonClick" />
</div>
<div v-show="activeName === 'now'">
<!-- 搜索工作栏 -->
<search-bar
:formConfigs="formConfig2"
ref="searchBarForm2"
@headBtnClick="buttonClick" />
</div>
<el-tabs v-model="activeName" @tab-click="toggleTab">
<el-tab-pane label="历史成本" name="his"></el-tab-pane>
<el-tab-pane label="成本查询" name="now"></el-tab-pane>
</el-tabs>
<!-- 列表 -->
<div v-if="activeName === 'his'">
<base-table
:page="listQuery.pageNo"
:limit="listQuery.pageSize"
:table-props="tableProps"
:table-data="tableData"
:max-height="tableH">
<method-btn
v-if="tableBtn.length"
slot="handleBtn"
:width="80"
label="操作"
:method-list="tableBtn"
@clickBtn="handleClick" />
</base-table>
</div>
<div v-if="activeName === 'now'">
<base-table
:page="listQuery.pageNo"
:limit="listQuery.pageSize"
:table-props="tableProps2"
:table-data="tableData2"
:max-height="tableH" />
</div>
<pagination
:page.sync="listQuery.pageNo"
:limit.sync="listQuery.pageSize"
:total="listQuery.total"
@pagination="getDataList" />
<base-dialog
:dialogTitle="addOrEditTitle"
:dialogVisible="addOrUpdateVisible"
@cancel="handleCancel"
@confirm="handleConfirm"
:before-close="handleCancel"
width="50%">
<add-or-update
ref="addOrUpdate"
:name-arr="formConfig[1].selectOptions"
@refreshDataList="successSubmit"></add-or-update>
</base-dialog>
</div>
</template>
<script>
import AddOrUpdate from './add-or-updata';
import basicPage from '@/mixins/basic-page';
import { getRawOthercostRulePage } from '@/api/cost/rawOthercostRule';
import {
getRawOthercostHisPage,
getRawOthercostSunPage,
} from '@/api/cost/costOthercostHis';
import { parseTime } from '@/filter/code-filter';
import tableHeightMixin from '@/mixins/lb/tableHeightMixin';
const tableProps = [
{
prop: 'recTime',
label: '日期',
filter: (val) => parseTime(val, '{y}年{m}月{d}日'),
},
{
prop: 'otherCostName',
label: '成本名称',
},
{
prop: 'price',
label: '总价(元)',
align: 'right',
},
];
const tableProps2 = [
{
prop: 'otherCostName',
label: '成本名称',
},
{
prop: 'price',
label: '总价(元)',
align: 'right',
},
];
export default {
name: 'costOthercostHis',
mixins: [basicPage, tableHeightMixin],
data() {
return {
urlOptions: {
getDataListURL: getRawOthercostHisPage,
},
formConfig: [
{
type: 'select',
label: '维度',
selectOptions: [
{ id: 1, name: '日' },
{ id: 2, name: '周' },
{ id: 3, name: '月' },
],
param: 'statisticType',
defaultSelect: 1, // 默认值,
clearable: false,
},
{
type: 'select',
label: '成本名称',
selectOptions: [],
param: 'name',
labelField: 'label',
valueField: 'name',
filterable: true,
},
{
type: 'datePicker',
label: '时间范围',
dateType: 'daterange',
format: 'yyyy-MM-dd',
valueFormat: 'yyyy-MM-dd HH:mm:ss',
rangeSeparator: '-',
startPlaceholder: '开始时间',
endPlaceholder: '结束时间',
param: 'searchTime',
},
{
type: 'button',
btnName: '查询',
name: 'search',
color: 'primary',
},
],
formConfig2: [
{
type: 'select',
label: '成本名称',
selectOptions: [],
param: 'name',
labelField: 'label',
valueField: 'name',
filterable: true,
},
{
type: 'datePicker',
label: '时间范围',
dateType: 'daterange',
format: 'yyyy-MM-dd',
valueFormat: 'yyyy-MM-dd HH:mm:ss',
rangeSeparator: '-',
startPlaceholder: '开始时间',
endPlaceholder: '结束时间',
param: 'searchTime',
},
{
type: 'button',
btnName: '查询',
name: 'search',
color: 'primary',
},
],
listQuery: {
statisticType: 1,
},
activeName: 'his',
tableProps,
tableProps2,
tableBtn: [
this.$auth.hasPermi(`monitoring:cost-othercost-his:update`)
? {
type: 'edit',
btnName: '编辑',
}
: undefined,
].filter((v) => v),
tableData: [],
tableData2: [],
};
},
components: {
AddOrUpdate,
},
created() {
const params = {
pageNo: 1,
pageSize: 100,
};
getRawOthercostRulePage(params).then((response) => {
this.formConfig[1].selectOptions = response.data.list;
this.formConfig2[0].selectOptions = response.data.list;
});
},
methods: {
buttonClick(val) {
switch (val.btnName) {
case 'search':
this.listQuery.pageNo = 1;
this.listQuery.pageSize = 10;
this.listQuery.name = val.name || null;
this.listQuery.statisticType = val.statisticType || 1;
this.listQuery.startTime = val.searchTime ? val.searchTime[0] : null;
this.listQuery.endTime = val.searchTime
? val.searchTime[1].substr(0, 10) + ' 23:59:59'
: null;
if (this.activeName === 'his') {
this.getDataList();
} else {
this.getDataList2();
}
break;
case 'add':
this.addOrUpdateHandle();
break;
case 'export':
this.listQuery.pageNo = 1;
this.listQuery.pageSize = 10;
this.listQuery.name = val.name;
this.listQuery.startTime = val.searchTime ? val.searchTime[0] : null;
this.listQuery.endTime = val.searchTime
? val.searchTime[1].substr(0, 10) + ' 23:59:59'
: null;
this.handleExport();
break;
default:
console.log(val);
}
},
toggleTab() {
if (this.activeName === 'his') {
this.$refs.searchBarForm.resetForm();
this.listQuery.name = null;
this.listQuery.startTime = null;
this.listQuery.endTime = null;
this.listQuery.statisticType = 1;
this.listQuery.pageNo = 1;
this.getDataList();
} else {
this.$refs.searchBarForm2.resetForm();
this.listQuery.name = null;
this.listQuery.startTime = null;
this.listQuery.endTime = null;
this.listQuery.pageNo = 1;
this.getDataList2();
}
},
// 获取数据2列表
getDataList2() {
getRawOthercostSunPage(this.listQuery).then((response) => {
this.tableData2 = response.data.list;
this.listQuery.total = response.data.total;
});
},
//tableBtn点击
handleClick(val) {
if (val.type === 'edit') {
this.addOrUpdateVisible = true;
this.addOrEditTitle = '编辑';
this.$nextTick(() => {
this.$refs.addOrUpdate.init(val.data, this.listQuery.statisticType);
});
} else {
this.otherMethods(val);
}
},
},
};
</script>
<style lang="scss">
.energyOverlimitLog {
.el-tabs__nav::after {
content: '';
position: absolute;
left: 0;
bottom: 0;
width: 100%;
height: 2px;
background-color: #e4e7ed;
}
.el-tabs__nav-wrap::after {
width: 0;
}
.el-tabs__item {
padding: 0 10px;
}
.el-tabs__item:hover {
color: rgba(0, 0, 0, 0.85);
}
.el-tabs__item.is-active {
color: rgba(0, 0, 0, 0.85);
}
.el-tabs__item {
color: rgba(0, 0, 0, 0.45);
}
.searchBarBox {
margin-bottom: 0;
}
}
</style>

Voir le fichier

@@ -0,0 +1,123 @@
<!--
* @Author: zwq
* @Date: 2021-11-18 14:16:25
* @LastEditors: zwq
* @LastEditTime: 2024-04-18 16:32:56
* @Description:
-->
<template>
<el-form
:model="dataForm"
:rules="dataRule"
ref="dataForm"
@keyup.enter.native="dataFormSubmit()"
label-width="80px">
<el-row :gutter="20">
<el-col :span="12">
<el-form-item label="成本名称" prop="name">
<el-select
v-model="dataForm.name"
filterable
clearable
:style="{ width: '100%' }"
@change="setLabel"
placeholder="请选择成本名称">
<el-option
v-for="item in nameArr"
:key="item.name"
:label="item.label"
:value="item.name"></el-option>
</el-select>
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item label="成本金额" prop="price">
<el-input-number
:min="0"
style="width: 80%"
v-model="dataForm.price"
clearable
placeholder="请输入成本金额" />
()
</el-form-item>
</el-col>
</el-row>
<el-row :gutter="20">
<el-col :span="12">
<el-form-item label="所属日期" prop="recTime">
<el-date-picker
v-model="dataForm.recTime"
type="date"
value-format="timestamp"
:style="{ width: '100%' }"
placeholder="选择所属日期"></el-date-picker>
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item label="备注" prop="remark">
<el-input
v-model="dataForm.remark"
clearable
placeholder="请输入备注" />
</el-form-item>
</el-col>
</el-row>
</el-form>
</template>
<script>
import basicAdd from '@/mixins/basic-add';
import {
createRawOthercostLog,
updateRawOthercostLog,
getRawOthercostLog,
} from '@/api/cost/costOthercostLog';
import moment from 'moment';
const nowData = moment().format('YYYY-MM-DD').valueOf()
export default {
mixins: [basicAdd],
props: {
nameArr: {
type: Array,
default: () => [],
},
},
data() {
return {
urlOptions: {
createURL: createRawOthercostLog,
updateURL: updateRawOthercostLog,
infoURL: getRawOthercostLog,
},
dataForm: {
id: undefined,
price: undefined,
name: undefined,
recTime: new Date().getTime(),
remark: undefined,
},
dataRule: {
price: [
{ required: true, message: '成本金额不能为空', trigger: 'blur' },
],
name: [
{ required: true, message: ' 成本名称不能为空', trigger: 'blur' },
],
recTime: [
{
required: true,
message: '所属日期不能为空',
trigger: 'change',
},
],
},
};
},
methods: {
setLabel(val){
this.dataForm.label = this.nameArr.find(item=>item.name===val).label
}
},
};
</script>

Voir le fichier

@@ -0,0 +1,208 @@
<template>
<div class="app-container">
<search-bar
:formConfigs="formConfig"
ref="searchBarForm"
@headBtnClick="buttonClick" />
<base-table
v-loading="dataListLoading"
:table-props="tableProps"
:page="listQuery.pageNo"
:limit="listQuery.pageSize"
:max-height="tableH"
:table-data="tableData">
<method-btn
v-if="tableBtn.length"
slot="handleBtn"
:width="120"
label="操作"
:method-list="tableBtn"
@clickBtn="handleClick" />
</base-table>
<pagination
:limit.sync="listQuery.pageSize"
:page.sync="listQuery.pageNo"
:total="listQuery.total"
@pagination="getDataList" />
<base-dialog
:dialogTitle="addOrEditTitle"
:dialogVisible="addOrUpdateVisible"
@cancel="handleCancel"
@confirm="handleConfirm"
:before-close="handleCancel"
width="50%">
<add-or-update
ref="addOrUpdate"
:name-arr="formConfig[0].selectOptions"
@refreshDataList="successSubmit"></add-or-update>
</base-dialog>
</div>
</template>
<script>
import AddOrUpdate from './add-or-updata';
import basicPage from '@/mixins/basic-page';
import tableHeightMixin from '@/mixins/lb/tableHeightMixin';
import { parseTime } from '@/filter/code-filter';
import {
deleteRawOthercostLog,
getRawOthercostLogPage,
exportRawOthercostLogExcel,
} from '@/api/cost/costOthercostLog';
import { getRawOthercostRulePage } from '@/api/cost/rawOthercostRule';
const tableProps = [
{
prop: 'otherCostName',
label: '成本名称',
},
{
prop: 'recTime',
label: '日期',
filter: (val) => parseTime(val, '{y}年{m}月{d}日'),
},
{
prop: 'price',
label: '成本金额',
align: 'right',
},
{
prop: 'remark',
label: '备注',
},
];
export default {
mixins: [basicPage, tableHeightMixin],
data() {
return {
urlOptions: {
getDataListURL: getRawOthercostLogPage,
deleteURL: deleteRawOthercostLog,
exportURL: exportRawOthercostLogExcel,
},
tableProps,
tableBtn: [
this.$auth.hasPermi(`monitoring:cost-othercost-log:update`)
? {
type: 'edit',
btnName: '编辑',
}
: undefined,
this.$auth.hasPermi(`monitoring:cost-othercost-log:delete`)
? {
type: 'delete',
btnName: '删除',
}
: undefined,
].filter((v) => v),
tableData: [],
formConfig: [
{
type: 'select',
label: '成本名称',
selectOptions: [],
param: 'name',
labelField: 'label',
valueField: 'name',
filterable: true,
},
{
type: 'datePicker',
label: '时间范围',
dateType: 'daterange',
format: 'yyyy-MM-dd',
valueFormat: 'yyyy-MM-dd HH:mm:ss',
rangeSeparator: '-',
startPlaceholder: '开始时间',
endPlaceholder: '结束时间',
param: 'searchTime',
},
{
type: 'button',
btnName: '搜索',
name: 'search',
color: 'primary',
},
{
type: this.$auth.hasPermi('monitoring:cost-othercost-log:create')
? 'separate'
: '',
},
{
type: this.$auth.hasPermi('monitoring:cost-othercost-log:create')
? 'button'
: '',
btnName: '新增',
name: 'add',
color: 'success',
plain: true,
},
// {
// type: this.$auth.hasPermi('monitoring:cost-othercost-log:create') ? 'separate' : '',
// },
// {
// type: this.$auth.hasPermi('monitoring:cost-othercost-log:export') ? 'button' : '',
// btnName: '导出',
// name: 'export',
// color: 'warning',
// },
],
};
},
components: {
AddOrUpdate,
},
created() {
const params = {
pageNo: 1,
pageSize: 100,
};
getRawOthercostRulePage(params).then((response) => {
this.formConfig[0].selectOptions = response.data.list;
});
},
methods: {
buttonClick(val) {
switch (val.btnName) {
case 'search':
this.listQuery.pageNo = 1;
this.listQuery.pageSize = 10;
this.listQuery.name = val.name||null;
this.listQuery.startTime = val.searchTime ? val.searchTime[0] : null;
this.listQuery.endTime = val.searchTime
? val.searchTime[1].substr(0, 10) + ' 23:59:59'
: null;
this.getDataList();
break;
case 'add':
this.addOrUpdateHandle();
break;
case 'export':
this.listQuery.pageNo = 1;
this.listQuery.pageSize = 10;
this.listQuery.name = val.name;
this.listQuery.recTime = val.searchTime;
this.handleExport();
break;
default:
console.log(val);
}
},
//tableBtn点击
handleClick(val) {
if (val.type === "edit") {
this.addOrUpdateVisible = true;
this.addOrEditTitle = "编辑";
this.$nextTick(() => {
this.$refs.addOrUpdate.init(val.data.id);
});
} else if (val.type === "delete") {
this.deleteHandle(val.data.id, val.data.otherCostName, val.data._pageIndex)
} else {
this.otherMethods(val)
}
},
},
};
</script>

Voir le fichier

@@ -0,0 +1,159 @@
<!--
* @Author: zwq
* @Date: 2023-08-01 13:52:10
* @LastEditors: zwq
* @LastEditTime: 2024-04-17 16:59:58
* @Description:
-->
<template>
<el-form
:model="dataForm"
:rules="dataRule"
ref="dataForm"
v-if="visible"
@keyup.enter.native="dataFormSubmit()"
label-width="100px"
label-position="top">
<el-row :gutter="20">
<el-col :span="12">
<el-form-item label="成本名称" prop="label">
<el-input v-model="dataForm.label" clearable readonly />
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item label="自动计算策略" prop="type">
<el-radio-group v-model="dataForm.type" @input="setType">
<el-radio :label="1">每天等价</el-radio>
<el-radio :label="2">折旧</el-radio>
</el-radio-group>
</el-form-item>
</el-col>
<el-col :span="12" v-if="dataForm.type === 1" key="one">
<el-form-item label="价格" prop="price">
<el-input-number
:min="0"
style="width: 80%"
v-model="dataForm.price"
clearable />
()
</el-form-item>
</el-col>
<el-col :span="12" v-if="dataForm.type === 2" key="two">
<el-form-item label="总价" prop="price">
<el-input-number
:min="0"
style="width: 80%"
v-model="dataForm.price"
clearable />
()
</el-form-item>
</el-col>
<el-col :span="12" v-if="dataForm.type === 2" key="three">
<el-form-item label="折旧率" prop="ratio">
<el-input-number
:min="0"
style="width: 80%"
v-model="dataForm.ratio"
clearable />
(%)
</el-form-item>
</el-col>
<el-col :span="12" v-if="dataForm.type === 2" key="four">
<el-form-item label="折旧年限" prop="timeLimit">
<el-input-number
:min="0"
style="width: 80%"
v-model="dataForm.timeLimit"
clearable />
()
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item label="备注" prop="remark">
<el-input
@input="$forceUpdate()"
v-model="dataForm.remark"
clearable
placeholder="请输入备注" />
</el-form-item>
</el-col>
</el-row>
</el-form>
</template>
<script>
import {
updateRawOthercostRule,
getRawOthercostRule,
} from '@/api/cost/rawOthercostRule';
export default {
data() {
return {
urlOptions: {
updateURL: updateRawOthercostRule,
infoURL: getRawOthercostRule,
},
dataForm: {
label: undefined,
type: 1,
price: 0,
ratio: 0,
timeLimit: 1,
remark: '',
},
visible: false,
dataRule: {
price: [{ required: true, message: '价格不能为空', trigger: 'blur' }],
ratio: [{ required: true, message: '折旧率不能为空', trigger: 'blur' }],
timeLimit: [
{ required: true, message: '折旧年限不能为空', trigger: 'blur' },
],
},
};
},
created() {},
methods: {
init(val) {
this.dataForm = {
label: undefined,
type: 1,
price: 0,
ratio: 0,
timeLimit: 1,
remark: '',
};
this.visible = true;
this.$nextTick(() => {
this.$refs['dataForm'].resetFields();
this.dataForm = JSON.parse(JSON.stringify(val));
});
},
setType(val) {
if (val === 1) {
} else {
}
},
// 表单提交
dataFormSubmit() {
this.$refs['dataForm'].validate((valid) => {
if (!valid) {
return false;
}
// 修改的提交
this.urlOptions.updateURL(this.dataForm).then((response) => {
this.$modal.msgSuccess('修改成功');
this.visible = false;
this.$emit('refreshDataList');
});
});
},
/** 清空form */
formClear() {
if (this.$refs.dataForm !== undefined) {
this.$refs.dataForm.resetFields();
}
},
},
};
</script>

Voir le fichier

@@ -0,0 +1,109 @@
<!--
* @Author: zwq
* @Date: 2024-04-15 16:52:38
* @LastEditors: zwq
* @LastEditTime: 2024-04-17 17:01:26
* @Description:
-->
<template>
<div class="app-container">
<!-- 列表 -->
<base-table
v-loading="dataListLoading"
:table-props="tableProps"
:page="listQuery.pageNo"
:limit="listQuery.pageSize"
:max-height="tableH"
:table-data="tableData">
<method-btn
v-if="tableBtn.length"
slot="handleBtn"
:width="80"
label="操作"
:method-list="tableBtn"
@clickBtn="handleClick" />
</base-table>
<pagination
:limit.sync="listQuery.pageSize"
:page.sync="listQuery.pageNo"
:total="listQuery.total"
@pagination="getDataList" />
<!-- 对话框(添加 / 修改) -->
<base-dialog
:dialogTitle="addOrEditTitle"
:dialogVisible="addOrUpdateVisible"
@cancel="handleCancel"
@confirm="handleConfirm"
:before-close="handleCancel"
width="40%">
<add-or-update
ref="addOrUpdate"
@refreshDataList="successSubmit"></add-or-update>
</base-dialog>
</div>
</template>
<script>
import AddOrUpdate from './add-or-updata';
import basicPage from '@/mixins/basic-page';
import typeRule from './typeRule';
import {
getRawOthercostRulePage,
} from '@/api/cost/rawOthercostRule';
import tableHeightMixin from '@/mixins/lb/tableHeightMixin';
const tableProps = [
{
prop: 'label',
label: '成本名称',
},
{
prop: 'type',
label: '自动计算方式',
subcomponent: typeRule,
},
{
prop: 'remark',
label: '备注',
},
];
export default {
mixins: [basicPage,tableHeightMixin],
data() {
return {
urlOptions: {
getDataListURL: getRawOthercostRulePage,
},
tableProps,
tableBtn: [
this.$auth.hasPermi(`monitoring:cost-othercost-rule:update`)
? {
type: 'edit',
btnName: '编辑',
}
: undefined,
].filter((v) => v),
tableData: [],
};
},
components: {
AddOrUpdate,
},
created() {
},
methods: {
//tableBtn点击
handleClick(val) {
if (val.type === "edit") {
this.addOrUpdateVisible = true;
this.addOrEditTitle = "编辑";
this.$nextTick(() => {
this.$refs.addOrUpdate.init(val.data);
});
}
},
},
};
</script>

Voir le fichier

@@ -0,0 +1,31 @@
<!--
* @Author: zwq
* @Date: 2023-12-05 13:45:59
* @LastEditors: zwq
* @LastEditTime: 2024-04-15 17:12:03
* @Description
-->
<template>
<div>
<span>
{{
injectData.type == 1
? `每天等价,${injectData.price}`
: injectData.type == 2
? `总价${injectData.price}元,年折旧率${injectData.ratio}%,折旧年限${injectData.timeLimit}`
: '-'
}}
</span>
</div>
</template>
<script>
export default {
name: '',
props: {
injectData: {
type: Object,
default: () => ({}),
},
},
};
</script>

Voir le fichier

@@ -2,14 +2,17 @@
<div class="app-container contrastAnalysisBox" id="contrastAnalysisBox">
<!-- 搜索工作栏 -->
<search-area :isFold="isFold" @submit="getList"/>
<el-tabs v-model="activeName" @tab-click="switchChart" v-show='chartData.length'>
<el-tab-pane label="柱状图" name="bar">
<bar-chart ref="analysisBarChart" :chartData="chartData" :timeDim="timeDim" />
</el-tab-pane>
<el-tab-pane label="折线图" name="line">
<line-chart ref="analysisLineChart" :chartData="chartData" :timeDim="timeDim"/>
</el-tab-pane>
</el-tabs>
<div v-show="chartData.length">
<bar-chart
ref="analysisBarChart"
:chartData="chartData"
:timeDim="timeDim" />
<base-table
:table-props="tableProps"
:table-data="list"
:max-height="tableH"
class="contrast-out-table" />
</div>
<!-- 没有数据 -->
<div class="no-data-bg" v-show='!chartData.length'></div>
</div>
@@ -18,17 +21,22 @@
import { getCompare } from "@/api/analysis/energyAnalysis"
import SearchArea from "./components/searchArea"
import BarChart from "./components/barChart"
import LineChart from "./components/lineChart"
import tableHeightMixin from '@/mixins/lb/tableHeightMixin';
import FileSaver from 'file-saver';
import * as XLSX from 'xlsx/xlsx.mjs';
// import moment from 'moment'
export default {
name: 'ContrastAnalysis',
components: { SearchArea, BarChart, LineChart },
components: { SearchArea, BarChart },
mixins: [tableHeightMixin],
data() {
return {
isFold: false,
activeName: 'bar',
chartData: [],
timeDim: ''
timeDim: '',
tableProps: [],
list: [],
tableH: this.tableHeight(250) / 2,
}
},
mounted() {
@@ -40,28 +48,69 @@ export default {
this.isFold = this.searchBarWidth('contrastAnalysisBox', 1310)
},
methods: {
_setTableHeight() {
this.tableH = this.tableHeight(250) / 2;
},
getList(params) {
this.timeDim = params.timeDim
getCompare({ ...params }).then((res) => {
console.log(res)
if (res.code === 0) {
this.chartData = res.data || []
this.getTableList(res.data || []);
this.chartData = res.data || [];
} else {
this.chartData = []
}
})
},
switchChart() {
if (this.activeName === 'bar') {
this.$nextTick((res) => {
this.$refs.analysisBarChart.getChart()
})
getTableList(arr) {
this.tableProps = [];
this.list = [];
let tempX = [];
let timeArr = arr[0].trendRespVOList || [];
this.list = timeArr.map((item) => {
return { time: item.time };
});
for (let i = 0; i < arr.length; i++) {
let obj = {};
obj.prop = arr[i].objId;
obj.label = arr[i].objName;
obj.minWidth = 100;
tempX.push(obj);
let tiemList = arr[i].trendRespVOList;
for (let j = 0; j < tiemList.length; j++) {
this.list[j][arr[i].objId] = tiemList[j].useNum
? tiemList[j].useNum.toFixed(2)
: null;
}
}
this.tableProps = [{ prop: 'time', label: '时间' }].concat(tempX);
},
// 导出
exportExl() {
if (this.list.length > 0) {
var wb = XLSX.utils.table_to_book(
document.querySelector('.contrast-out-table')
);
let fileName = '对比分析.xlsx';
var wbout = XLSX.write(wb, {
bookType: 'xlsx',
bookSST: true,
type: 'array',
});
try {
FileSaver.saveAs(
new Blob([wbout], { type: 'application/octet-stream' }),
fileName
);
this.$message.success('导出成功');
} catch (e) {
if (typeof console !== 'undefined') console.log(e, wbout);
}
return wbout;
} else {
this.$nextTick((res) => {
this.$refs.analysisLineChart.getChart()
})
}
this.$modal.msgWarning('暂无数据导出');
}
},
}
}
</script>

Voir le fichier

@@ -128,7 +128,18 @@
</div>
</el-form-item>
<el-form-item>
<el-button type="primary" size="small" @click="search">查询</el-button>
<el-button type="primary" size="small" @click="search('search')">查询</el-button>
<!-- <span
class="separateStyle"
v-hasPermi="['analysis:energy-analysis:query']"></span>
<el-button
v-hasPermi="['analysis:energy-analysis:query']"
type="primary"
size="small"
plain
@click="search('exportBtn')">
导出
</el-button> -->
</el-form-item>
</el-form>
<span v-if="isFold" class="foldClass" @click='switchMode'>
@@ -288,7 +299,7 @@ export default {
}
},
// 查询
search() {
search(val) {
if (!this.queryParams.energyTypeId) {
this.$modal.msgError('请选择能源类型')
return false
@@ -358,7 +369,11 @@ export default {
}
this.queryParams.startTime = this.queryParams.startTime + ''
this.queryParams.endTime = this.queryParams.endTime + ''
this.$emit('submit', this.queryParams)
if (val === 'search') {
this.$emit('submit', this.queryParams);
} else {
this.$emit('export', this.queryParams);
}
},
transformTime(timeStamp) {// 本月最后一天
let year = moment(timeStamp).format('YYYY')

Voir le fichier

@@ -1,34 +1,43 @@
<!--
* @Author: zwq
* @Date: 2024-03-27 15:49:55
* @LastEditors: zwq
* @LastEditTime: 2024-04-15 15:47:17
* @Description:
-->
<template>
<div class="app-container trendAnalysisBox" id="trendAnalysisBox">
<!-- 搜索工作栏 -->
<search-area :isFold="isFold" @submit="getList"/>
<el-tabs v-model="activeName" @tab-click="switchChart" v-show='chartData.length'>
<el-tab-pane label="柱状图" name="bar">
<bar-chart ref="analysisBarChart" :chartData="chartData" :timeDim="timeDim"/>
</el-tab-pane>
<el-tab-pane label="折线图" name="line">
<line-chart ref="analysisLineChart" :chartData="chartData" :timeDim="timeDim"/>
</el-tab-pane>
</el-tabs>
<search-area :isFold="isFold" @submit="getList" @export="exportExl"/>
<div v-show="chartData.length">
<base-table
:table-props="tableProps"
:table-data="list"
class="trend-out-table" />
<line-chart
ref="analysisLineChart"
:chartData="chartData"
:timeDim="timeDim" />
</div>
<!-- 没有数据 -->
<div class="no-data-bg" v-show='!chartData.length'></div>
</div>
</template>
<script>
import { getEnergyTrend } from "@/api/analysis/energyAnalysis"
import { getEnergyTrend, exportTrend } from "@/api/analysis/energyAnalysis"
import SearchArea from "./components/searchArea"
import BarChart from "./components/barChart"
import LineChart from "./components/lineChart"
// import moment from 'moment'
export default {
name: 'TrendAnalysis',
components: { SearchArea, BarChart, LineChart },
components: { SearchArea, LineChart },
data() {
return {
isFold: false,
activeName: 'bar',
chartData: [],
timeDim: ''
timeDim: '',
tableProps: [],
list: [],
}
},
mounted() {
@@ -43,52 +52,51 @@ export default {
this.timeDim = params.timeDim
getEnergyTrend({ ...params }).then((res) => {
if (res.code === 0) {
this.chartData = res.data
this.getTableList(res.data || []);
this.chartData = res.data || [];
} else {
this.chartData = []
}
})
},
switchChart() {
if (this.activeName === 'bar') {
this.$nextTick((res) => {
this.$refs.analysisBarChart.getChart()
})
getTableList(arr) {
this.tableProps = [];
this.list = [];
let tempX = [];
let listObj = { useNum: '消耗量' }; // 数据
for (let i = 0; i < arr.length; i++) {
let obj = {};
if (this.timeDim === '3') {
let fName = arr[i].time.slice(0, 4);
let lName = arr[i].time.slice(4, 6);
obj.label = fName + ' 第 ' + lName + ' 周';
} else {
this.$nextTick((res) => {
this.$refs.analysisLineChart.getChart()
obj.label = arr[i].time;
}
obj.prop = arr[i].time;
obj.minWidth = 100;
tempX.push(obj);
listObj[arr[i].time] = arr[i].useNum || null;
}
this.tableProps = [{ prop: 'useNum', label: '时间' }].concat(tempX);
this.list.push(listObj);
},
// 导出excel
exportExl(params) {
exportTrend({ ...params })
.then((response) => {
this.$download.excel(response, '走势分析.xls');
this.$message.success('导出成功');
})
}
}
.catch(() => {});
},
}
}
</script>
<style lang='scss'>
.trendAnalysisBox {
.el-tabs__nav::after {
content: "";
position: absolute;
left: 0;
bottom: 0;
width: 100%;
height: 2px;
background-color: #e4e7ed;
/* z-index: 1; */
}
.el-tabs__nav-wrap::after {
width: 0;
}
.el-tabs__item {
padding: 0 10px;
}
.el-tabs__item:hover {
color: rgba(0, 0, 0, 0.85);
}
.el-tabs__item.is-active {
color: rgba(0, 0, 0, 0.85);
}
.el-tabs__item {
color: rgba(0, 0, 0, 0.45);
.trend-out-table {
margin-bottom: 15px;
}
}
</style>

Voir le fichier

@@ -16,7 +16,6 @@
v-model="objIds"
:options="objList"
:props="{ checkStrictly: true, value: 'id', label: 'name' }"
popper-class="cascaderParent"
@change="selectObj"
clearable></el-cascader>
</el-form-item>

Voir le fichier

@@ -193,7 +193,6 @@ export default {
});
},
handleClick(val) {
console.log(val)
switch (val.type) {
case 'edit':
this.addOrEditTitle = '编辑'

Voir le fichier

@@ -0,0 +1,141 @@
<template>
<div class="energyQuantityManualAddTable">
<el-table
:data="renderData"
border
style="width: 100%"
:header-cell-style="{
background: '#F2F4F9',
color: '#606266',
}">
<el-table-column prop="meter" label="表名*">
<template slot-scope="scope">
<div class="tableInner">
<el-select
v-model="scope.row.meter"
placeholder="请选择"
style="width: 100%"
:disabled="isEdit"
@change="changeSelect(scope.row, 'meter')">
<el-option
v-for="item in tableNameList"
:key="item.value"
:label="item.label"
:value="item.value"></el-option>
</el-select>
</div>
</template>
</el-table-column>
<el-table-column prop="readingQuantity" label="抄表数*">
<template slot-scope="scope">
<div class="tableInner">
<el-input-number
v-model="scope.row.readingQuantity"
:min="0"
:max="999999999"
style="width: 100%"
:controls="false"
@change="changeInput(scope.row, 'readingQuantity')"
:precision="2"></el-input-number>
</div>
</template>
</el-table-column>
</el-table>
<el-button
v-show="!isEdit"
class="addButton"
icon="el-icon-plus"
@click="emitButtonClick">
新增
</el-button>
</div>
</template>
<script>
export default {
name: 'AddTable',
props: {
tableData: {
type: Array,
required: true,
default: () => {
return [];
},
},
tableNameList: {
type: Array,
required: true,
default: () => {
return [];
},
},
isEdit: {
type: Boolean,
default: false,
},
},
data() {
return {};
},
computed: {
renderData() {
return this.tableData.map((item, index) => {
return {
...item,
_pageIndex: index + 1,
};
});
},
},
methods: {
emitButtonClick() {
this.$emit('emitButtonClick');
},
changeInput(val1, val2) {
val1.prop = val2;
this.$emit('emitFun', val1);
},
changeSelect(val1, val2) {
val1.prop = val2;
this.$emit('emitFun', val1);
},
},
};
</script>
<style lang="scss" scoped>
.energyQuantityManualAddTable {
.el-table .el-table__cell {
padding: 0;
height: 35px;
}
.addButton {
width: 100%;
height: 35px;
border-top: none;
color: #0b58ff;
border-color: #ebeef5;
border-radius: 0;
}
.addButton:hover {
color: #0b58ff;
border-color: #ebeef5;
background-color: #fff;
}
.addButton:focus {
border-color: #ebeef5;
background-color: #fff;
}
.tableInner .el-input__inner {
border: none;
padding: 0;
height: 33px;
}
}
</style>
<style lang="scss">
.energyQuantityManualAddTable {
.el-table .el-table__cell {
padding: 0;
height: 35px;
}
}
</style>

Voir le fichier

@@ -0,0 +1,215 @@
<template>
<el-form
ref="energyQuantityManualForm"
:rules="rules"
label-width="90px"
:model="form">
<el-row :gutter="20">
<el-col :span="12">
<el-form-item label="能源类型" prop="energyTypeId">
<el-select
v-model="form.energyTypeId"
placeholder="请选择"
style="width: 100%"
@change="selEnergyType"
:disabled="isEdit"
filterable>
<el-option
v-for="item in this.energyTypeList"
:key="item.id"
:label="item.name"
:value="item.id"></el-option>
</el-select>
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item label="抄表日期" prop="recordTime">
<el-date-picker
v-model="form.recordTime"
type="date"
format="yyyy-MM-dd"
value-format="timestamp"
placeholder="选择日期"
style="width: 100%"></el-date-picker>
</el-form-item>
</el-col>
</el-row>
<el-row :gutter="20">
<el-col :span="24">
<add-table
:table-data="tableData"
:table-name-list="tableNameList"
:isEdit="isEdit"
@emitFun="inputChange"
@emitButtonClick="emitButtonClick" />
</el-col>
</el-row>
</el-form>
</template>
<script>
import {
energyQuantityManualCreate,
energyQuantityManualUpdate,
energyQuantityManualGet,
} from '@/api/base/energyQuantityManual';
import moment from 'moment';
import AddTable from './AddTable';
import { energyTableGet } from '@/api/base/energyQuantityManual';
export default {
name: 'EnergyQuantityManualAdd',
props: {
energyTypeList: {
type: Array,
required: true,
default: () => {
return [];
},
},
},
data() {
return {
tableData: [],
tableNameList: [], //表名list
addButtonShow: '新增',
form: {
id: '',
energyTypeId: '',
unit: '',
recordTime: '',
},
rules: {
energyTypeId: [
{ required: true, message: '能源类型不能为空', trigger: 'change' },
],
recordTime: [
{ required: true, message: '抄表日期不能为空', trigger: 'change' },
],
},
isEdit: false,
meterArr: [],
};
},
components: { AddTable },
methods: {
init(params) {
this.form.recordTime = moment().valueOf();
this.meterArr = this.getDictDatas('meter');
if (params.type === 'add') {
this.isEdit = false;
} else if (params.type === 'meterReading') {
this.isEdit = false;
this.form.energyTypeId = params.energyTypeId;
this.selEnergyType(this.form.energyTypeId);
let obj = {};
obj.meter = params.meter + '';
obj.readingQuantity = 0;
this.tableData.push(obj);
} else {
this.isEdit = true;
this.form.id = params.id;
this.addButtonShow = '';
energyQuantityManualGet({ id: this.form.id }).then((res) => {
if (res.code === 0) {
this.form.energyTypeId = res.data.energyTypeId;
this.selEnergyType(this.form.energyTypeId);
this.form.recordTime = res.data.recordTime
? res.data.recordTime
: null;
let obj = {};
obj.meter = res.data.meter ? res.data.meter + '' : '';
obj.readingQuantity = res.data.readingQuantity;
this.tableData.push(obj);
}
});
}
},
inputChange(val) {
this.tableData[val._pageIndex - 1][val.prop] = val[val.prop];
},
emitButtonClick() {
if (!this.form.energyTypeId) {
this.$modal.msgWarning('请先选择能源类型');
return false;
}
let obj = {};
obj.meter = '';
obj.readingQuantity = 0;
this.tableData.push(obj);
},
selEnergyType(id) {
// 切换能源类型
this.tableData = [];
this.tableNameList = [];
energyTableGet({ energyTypeId: id }).then((res) => {
if (res.data.length === 0) {
this.$modal.msgWarning(
'当前能源类型暂无配置表名,请先到《表名配置》页面配置'
);
return;
}
res.data[0].meters.forEach((meter) => {
this.tableNameList.push(this.meterArr.find((i) => i.value === meter));
});
});
},
submitForm() {
this.$refs['energyQuantityManualForm'].validate((valid) => {
if (valid) {
// 校验表格
if (this.tableData.length === 0) {
this.$modal.msgError('抄表数据不能为空');
return false;
} else {
for (let item of this.tableData) {
if (
!item.meter ||
(!item.readingQuantity && item.readingQuantity !== 0)
) {
this.$modal.msgError('抄表数据有空值,请检查');
return false;
}
}
}
if (this.isEdit) {
// 编辑
energyQuantityManualUpdate({
id: this.form.id,
recordTime: this.form.recordTime,
readingQuantity: this.tableData[0].readingQuantity,
}).then((res) => {
if (res.code === 0) {
this.$modal.msgSuccess('操作成功');
this.$emit('successSubmit');
}
});
} else {
let obj = {};
this.tableData.forEach((item) => {
obj[item.meter] = item.readingQuantity;
});
energyQuantityManualCreate({
energyTypeId: this.form.energyTypeId,
recordTime: this.form.recordTime,
meters: obj,
}).then((res) => {
if (res.code === 0) {
this.$modal.msgSuccess('操作成功');
this.$emit('successSubmit');
}
});
}
} else {
return false;
}
});
},
formClear() {
this.$refs.energyQuantityManualForm.resetFields();
this.form.unit = '';
this.isEdit = false;
this.addButtonShow = '新增';
this.tableData = [];
},
},
};
</script>

Voir le fichier

@@ -0,0 +1,332 @@
<template>
<div class="app-container">
<!-- 搜索工作栏 -->
<search-bar
:formConfigs="formConfig"
ref="searchBarForm"
@headBtnClick="buttonClick" />
<!-- 列表 -->
<base-table
:page="queryParams.pageNo"
:limit="queryParams.pageSize"
:table-props="tableProps"
:table-data="list"
:max-height="tableH"
@selection-change="selectChange">
<method-btn
v-if="tableBtn.length"
slot="handleBtn"
:width="120"
label="操作"
:method-list="tableBtn"
@clickBtn="handleClick" />
</base-table>
<pagination
:page.sync="queryParams.pageNo"
:limit.sync="queryParams.pageSize"
:total="total"
@pagination="getList" />
<!-- 新增 -->
<base-dialog
:dialogTitle="addOrEditTitle"
:dialogVisible="centervisible"
@cancel="handleCancel"
@confirm="handleConfirm"
:before-close="handleCancel">
<energy-quantity-manual-add
ref="energyQuantityManualAdd"
:energyTypeList="energyTypeList"
@successSubmit="successSubmit" />
</base-dialog>
</div>
</template>
<script>
import {
energyQuantityManualPage,
energyQuantityManualDelete,
energyQuantityManualExport,
} from '@/api/base/energyQuantityManual';
import { getEnergyTypeListAll } from '@/api/base/energyType';
import { publicFormatter } from '@/utils/dict';
import { parseTimeTable } from '@/utils/ruoyi';
import EnergyQuantityManualAdd from './components/energyQuantityManualAdd';
import moment from 'moment';
import tableHeightMixin from '@/mixins/lb/tableHeightMixin';
const tableProps = [
{
prop: 'energyType',
label: '能源类型',
minWidth: 110,
showOverflowtooltip: true,
},
{
prop: 'unit',
label: '单位',
filter: publicFormatter('unit_dict'),
minWidth: 110,
},
{
prop: 'meter',
label: '能源表名',
filter: publicFormatter('meter'),
minWidth: 110,
showOverflowtooltip: true,
},
{
prop: 'recordTime',
label: '抄表日期',
filter: parseTimeTable('{y}-{m}-{d}'),
minWidth: 110,
},
{
prop: 'readingQuantity',
label: '抄表值',
},
{
prop: 'usingQuantity',
label: '差值',
},
];
export default {
name: 'EnergyQuantityManual',
data() {
return {
formConfig: [
{
type: 'select',
label: '能源类型',
labelField: 'name',
selectOptions: [],
param: 'energyTypeId',
filterable: true,
},
{
type: 'datePicker',
label: '抄表日期',
dateType: 'daterange',
format: 'yyyy-MM-dd',
rangeSeparator: '-',
startPlaceholder: '开始时间',
endPlaceholder: '结束时间',
valueFormat:"yyyy-MM-dd HH:mm:ss",
param: 'timeVal',
defaultSelect: [],
},
{
type: this.$auth.hasPermi('base:energy-quantity-manual:query')
? 'button'
: '',
btnName: '查询',
name: 'search',
color: 'primary',
},
{
type: this.$auth.hasPermiOr([
'base:energy-quantity-manual:export',
'base:energy-quantity-manual:create',
])
? 'separate'
: '',
},
// {
// type: this.$auth.hasPermi('base:energy-quantity-manual:export')
// ? 'button'
// : '',
// btnName: '导出',
// name: 'export',
// color: 'primary',
// plain: true,
// },
{
type: this.$auth.hasPermi('base:energy-quantity-manual:create')
? 'button'
: '',
btnName: '新增',
name: 'add',
color: 'success',
plain: true,
},
],
tableProps,
// 总条数
total: 0,
// 班次基础信息列表
list: [],
tableBtn: [
this.$auth.hasPermiAnd([
'base:energy-quantity-manual:query',
'base:energy-quantity-manual:create',
])
? {
type: 'meterReading',
btnName: '抄表',
}
: undefined,
this.$auth.hasPermiAnd([
'base:energy-quantity-manual:update',
'base:energy-quantity-manual:query',
])
? {
type: 'edit',
btnName: '编辑',
}
: undefined,
this.$auth.hasPermi('base:energy-quantity-manual:delete')
? {
type: 'delete',
btnName: '删除',
}
: undefined,
].filter((v) => v),
// 查询参数
queryParams: {
pageNo: 1,
pageSize: 20,
energyTypeId: '',
startTime: '',
endTime: '',
},
energyTypeList: [],
exportList: [],
addOrEditTitle: '',
centervisible: false,
};
},
components: { EnergyQuantityManualAdd },
mixins: [tableHeightMixin],
created() {
let end = moment().format('YYYY-MM-DD 23:59:59').valueOf();
let start = moment().subtract(7, 'days').format('YYYY-MM-DD 00:00:00').valueOf();
this.formConfig[1].defaultSelect = [start, end];
this.queryParams.startTime = start;
this.queryParams.endTime = end;
this.getList();
this.getTypeList();
},
methods: {
buttonClick(val) {
console.log(val.timeVal)
this.queryParams.pageNo = 1;
this.queryParams.energyTypeId = val.energyTypeId;
this.queryParams.startTime = val.timeVal
? val.timeVal[0]
: null;
this.queryParams.endTime = val.timeVal
? val.timeVal[1].substr(0, 10) + " 23:59:59"
: null;
switch (val.btnName) {
case 'search':
this.getList();
break;
case 'add':
this.addOrEditTitle = '新增';
this.centervisible = true;
let params = {};
params.type = 'add';
this.$nextTick(() => {
this.$refs.energyQuantityManualAdd.init(params);
});
break;
default:
this.$modal
.confirm('是否确认导出')
.then(() => {
return energyQuantityManualExport({
energyTypeId: this.queryParams.energyTypeId,
startTime: this.queryParams.startTime,
endTime: this.queryParams.endTime,
});
})
.then((response) => {
this.$download.excel(response, '能源报表.xls');
})
.catch(() => {});
}
},
/** 查询列表 */
getList() {
energyQuantityManualPage(this.queryParams).then((response) => {
let arr = response.data.list || [];
arr &&
arr.map((item) => {
item.amount = item.amount
? !isNaN(parseFloat(item.amount)) && isFinite(item.amount)
? item.amount.toFixed(2)
: ''
: '';
});
this.list = arr;
this.total = response.data.total;
this.exportList = [];
});
},
getTypeList() {
getEnergyTypeListAll().then((res) => {
this.formConfig[0].selectOptions = res.data || [];
this.energyTypeList = res.data || [];
});
},
selectChange(val) {
console.log(val);
this.exportList = val;
},
handleClick(val) {
console.log(val);
switch (val.type) {
case 'edit':
this.addOrEditTitle = '编辑';
this.centervisible = true;
let paramA = {};
paramA.type = 'edit';
paramA.id = val.data.id;
this.$nextTick(() => {
this.$refs.energyQuantityManualAdd.init(paramA);
});
break;
case 'meterReading':
this.addOrEditTitle = '新增';
this.centervisible = true;
let paramB = {};
paramB.type = 'meterReading';
paramB.energyTypeId = val.data.energyTypeId;
paramB.meter = val.data.meter;
this.$nextTick(() => {
this.$refs.energyQuantityManualAdd.init(paramB);
});
break;
default:
this.handleDelete(val.data);
}
},
// 新增
handleCancel() {
this.$refs.energyQuantityManualAdd.formClear();
this.centervisible = false;
this.addOrEditTitle = '';
},
handleConfirm() {
this.$refs.energyQuantityManualAdd.submitForm();
},
successSubmit() {
this.handleCancel();
this.getList();
},
/** 删除按钮操作 */
handleDelete(row) {
console.log(row.id);
this.$modal
.confirm('是否确认删除能源类型为"' + row.energyType + '"的数据项?')
.then(function () {
return energyQuantityManualDelete({ id: row.id });
})
.then(() => {
this.queryParams.pageNo = 1;
this.getList();
this.$modal.msgSuccess('删除成功');
})
.catch(() => {});
},
},
};
</script>

Voir le fichier

@@ -163,7 +163,6 @@ export default {
})
},
selectChange(val) {
console.log(val)
this.exportList = val
},
// 勾选导出

Voir le fichier

@@ -0,0 +1,85 @@
<!--
* @Author: zwq
* @Date: 2024-04-11 14:57:57
* @LastEditors: zwq
* @LastEditTime: 2024-04-12 08:53:41
* @Description:
-->
<template>
<el-form ref="form" label-width="100px" :model="form" :rules="rules">
<el-form-item label="能源类型" prop="energyType">
<el-input v-model="form.energyType"></el-input>
</el-form-item>
<el-form-item label="能源表名" prop="meters">
<el-select
v-model="form.meters"
placeholder="请选择"
style="width: 100%"
:multiple="true"
filterable>
<el-option
v-for="dict in getDictDatas('meter')"
:key="dict.id"
:label="dict.label"
:value="dict.value" />
</el-select>
</el-form-item>
</el-form>
</template>
<script>
import {
energyTableGet,
energyTableUpdate,
} from '@/api/base/energyQuantityManual';
export default {
name: 'TableNameConfigUpdate',
data() {
return {
form: {
energyType: '',
energyTypeId: '',
meters: [],
},
rules: {
meters: [
{ required: true, message: '能源表名不能为空', trigger: 'change' },
],
},
};
},
methods: {
init(id) {
energyTableGet({ energyTypeId: id }).then((res) => {
if (res.data.length > 0) {
this.form.energyType = res.data[0].energyType || '';
this.form.energyTypeId = res.data[0].energyTypeId || '';
this.form.meters =
res.data[0].meters &&
res.data[0].meters.map((item) => {
return item;
});
}
});
},
submitForm() {
this.$refs['form'].validate((valid) => {
if (valid) {
// 编辑
energyTableUpdate({ ...this.form }).then((res) => {
if (res.code === 0) {
this.$modal.msgSuccess('操作成功');
this.$emit('successSubmit');
}
});
}
});
},
formClear() {
this.form.energyType = '';
this.form.energyTypeId = '';
this.form.meters = [];
this.isEdit = false;
},
},
};
</script>

Voir le fichier

@@ -0,0 +1,118 @@
<template>
<div class="app-container">
<!-- 列表 -->
<base-table
:page="queryParams.pageNo"
:limit="queryParams.pageSize"
:table-props="tableProps"
:table-data="list"
:max-height="tableH">
<method-btn
v-if="tableBtn.length"
slot="handleBtn"
:width="80"
label="操作"
:method-list="tableBtn"
@clickBtn="handleClick" />
</base-table>
<!-- 新增 -->
<base-dialog
dialogTitle="编辑"
:dialogVisible="centervisible"
@cancel="handleCancel"
@confirm="handleConfirm"
:before-close="handleCancel">
<table-name-config-update
ref="tableNameConfigU"
@successSubmit="successSubmit" />
</base-dialog>
</div>
</template>
<script>
import { energyTablePage } from '@/api/base/energyQuantityManual';
import tableNameConfigUpdate from './components/tableNameConfigUpdate.vue';
import tableHeightMixin from '@/mixins/lb/tableHeightMixin';
const tableProps = [
{
prop: 'energyType',
label: '能源类型',
width: 200,
},
{
prop: 'tableName',
label: '能源表名',
},
];
export default {
name: 'TableNameConfig',
components: { tableNameConfigUpdate },
data() {
return {
tableProps,
tableBtn: [
this.$auth.hasPermiAnd(['base:energy-table:update'])
? {
type: 'edit',
btnName: '编辑',
}
: undefined,
].filter((v) => v),
list: [],
queryParams: {
pageNo: 1,
pageSize: 100,
},
heightNum: 165,
centervisible: false,
meterArr: [],
};
},
mixins: [tableHeightMixin],
created() {
this.meterArr = this.getDictDatas('meter');
this.$nextTick(() => {
this.getList();
});
},
methods: {
getList() {
energyTablePage().then((res) => {
let temp = res.data || [];
this.list = temp.map((item) => {
let meters = [];
item.meters.forEach((meter) => {
meters.push(
this.meterArr.find((i) =>
i.value === meter
).label
);
});
return {
energyType: item.energyType,
energyTypeId: item.energyTypeId,
tableName: meters.join('、'),
};
});
});
},
handleClick(val) {
console.log('编辑');
this.centervisible = true;
this.$nextTick(() => {
this.$refs.tableNameConfigU.init(val.data.energyTypeId);
});
},
handleCancel() {
this.$refs.tableNameConfigU.formClear();
this.centervisible = false;
},
handleConfirm() {
this.$refs.tableNameConfigU.submitForm();
},
successSubmit() {
this.handleCancel();
this.getList();
},
},
};
</script>

Voir le fichier

@@ -1,3 +1,10 @@
<!--
* @Author: zwq
* @Date: 2024-03-27 15:49:55
* @LastEditors: zwq
* @LastEditTime: 2024-04-12 15:16:48
* @Description:
-->
<template>
<div class="tableInner">
<el-input-number v-model="list[itemProp]" @blur="changeInput" :min="0" :max="100000000" style="width: 100%" :controls='false'></el-input-number>

Voir le fichier

@@ -1,3 +1,10 @@
<!--
* @Author: zwq
* @Date: 2024-03-27 15:49:55
* @LastEditors: zwq
* @LastEditTime: 2024-04-12 15:16:56
* @Description:
-->
<template>
<div class="tableInner">
<el-time-picker

Voir le fichier

@@ -2,75 +2,130 @@
<el-form ref="form" :rules="rules" label-width="110px" :model="form">
<el-row>
<el-col :span="12">
<el-form-item label="抄表方式" prop="manual">
<el-select
v-model="form.manual"
placeholder="请选择"
style="width: 100%"
@change="changeMethod,$forceUpdate">
<el-option
v-for="item in manualArr"
:key="item.value"
:label="item.label"
:value="item.value"></el-option>
</el-select>
</el-form-item>
</el-col>
<el-col :span="12" v-if="form.manual == 0">
<el-form-item label="监控对象" prop="objectId">
<el-cascader
style='width: 100%;'
style="width: 100%"
v-model="objIds"
:options="objList"
:props="{ checkStrictly: true, value: 'id', label: 'name' }"
popper-class="cascaderParent"
@change="selectObj"
clearable></el-cascader>
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item label="能源类型" prop="energyTypeId">
<el-select v-model="form.energyTypeId" placeholder="请选择" style="width: 100%;" @change="toggleType">
<el-form-item label="监控能源类型" prop="energyTypeId">
<el-select
v-model="form.energyTypeId"
placeholder="请选择"
style="width: 100%"
filterable
@change="toggleType">
<el-option
v-for="item in this.energyTypeList"
:key="item.id"
:label="item.name"
:value="item.id">
</el-option>
:value="item.id"></el-option>
</el-select>
</el-form-item>
</el-col>
</el-row>
<el-row>
<el-col :span="12">
<el-col :span="12" v-if="form.manual == 1">
<el-form-item label="能源表名" prop="meter">
<el-select
v-model="form.meter"
placeholder="请选择"
style="width: 100%"
@change="$forceUpdate()">
<el-option
v-for="item in tableNameList"
:key="item.value"
:label="item.label"
:value="item.value"></el-option>
</el-select>
</el-form-item>
</el-col>
<el-col :span="12" v-if="form.manual == 0">
<el-form-item label="监控模式" prop="type">
<el-select v-model="form.type" placeholder="请选择" style="width: 100%;" @change="typeChange">
<el-option label="合并" :value= "1" ></el-option>
<el-option label="详细" :value= "2" ></el-option>
<el-select
v-model="form.type"
placeholder="请选择"
style="width: 100%"
@change="typeChange">
<el-option label="合并" :value="1"></el-option>
<el-option label="详细" :value="2"></el-option>
</el-select>
</el-form-item>
</el-col>
<el-col :span="12">
<el-col :span="12" v-if="form.manual == 0">
<el-form-item label="监控详细参数" prop="type" v-if="form.type === 2">
<el-select v-model="form.plcParamId" placeholder="请选择" style="width: 100%;" @change="selectDetail">
<el-select
v-model="form.plcParamId"
placeholder="请选择"
style="width: 100%"
@change="selectDetail">
<el-option
v-for="item in detailList"
:key="item.id"
:label="item.name"
:value="item.id">
</el-option>
:value="item.id"></el-option>
</el-select>
</el-form-item>
</el-col>
</el-row>
<el-row>
<el-col :span="12">
<el-form-item label="指标类型" prop="limitType">
<el-select v-model="form.limitType" placeholder="请选择" style="width: 100%;">
<el-select
v-model="form.limitType"
placeholder="请选择"
style="width: 100%"
:disabled="form.manual == 1"
@change="$forceUpdate()">
<el-option
v-for="item in getDictDatas(DICT_TYPE.MONITOR_INDEX_TYPE)"
:key="item.value"
:label="item.label"
:value="item.value">
</el-option>
:value="item.value"></el-option>
</el-select>
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item label="消耗量阈值" prop="limitValue">
<el-input-number v-model="form.limitValue" :min="0" :max="10000000000000000" style="width: 100%;"></el-input-number>
<el-form-item label="消耗量阈值">
<el-input-number
v-model="form.downValue"
placeholder="最小值"
:max="9999999"
style="width: 50%"></el-input-number>
<el-input-number
v-model="form.upValue"
placeholder="最大值"
:max="9999999"
style="width: 50%"></el-input-number>
</el-form-item>
</el-col>
</el-row>
</el-form>
</template>
<script>
import { getEnergyLimit, updateEnergyLimit, createEnergyLimit, getEnergyParamList } from '@/api/monitoring/energyLimit'
import {
getEnergyLimit,
updateEnergyLimit,
createEnergyLimit,
getEnergyParamList,
} from '@/api/monitoring/energyLimit';
import { energyTableGet } from '@/api/base/energyQuantityManual';
export default {
name: 'energyLimitAdd',
props: {
@@ -78,160 +133,228 @@ export default {
type: Array,
required: true,
default: () => {
return []
}
return [];
},
},
objList: {
type: Array,
default: () => []
}
default: () => [],
},
},
data() {
return {
form: {
id: '',
manual: '0',
objectId: '',
objectType: '',
energyTypeId: '',
type: '',
plcParamId: '',
limitType: '',
limitValue: ''
downValue: 0,
upValue: 0,
meter: '',
},
objIds: [],// 回显数组
objIds: [], // 回显数组
tableNameList: [],
isEdit: false, //是否是编辑
rules: {
objectId: [{ required: true, message: '对象不能为空', trigger: 'change' }],
energyTypeId: [{ required: true, message: '能源类型不能为空', trigger: 'change' }],
type: [{ required: true, message: '监控模式不能为空', trigger: 'change' }]
manualArr: [
{
value: '1',
label: '手动',
},
detailList: []
}
{
value: '0',
label: '自动',
},
],
rules: {
manual: [
{ required: true, message: '抄表方式不能为空', trigger: 'change' },
],
objectId: [
{ required: true, message: '监控对象不能为空', trigger: 'change' },
],
energyTypeId: [
{ required: true, message: '能源类型不能为空', trigger: 'change' },
],
type: [
{ required: true, message: '监控模式不能为空', trigger: 'change' },
],
limitType: [
{ required: true, message: '指标类型不能为空', trigger: 'change' },
],
},
detailList: [],
meterArr: [],
};
},
methods: {
init(id) {
this.meterArr = this.getDictDatas('meter');
if (id) {
this.isEdit = true
this.form.id = id
getEnergyLimit( id ).then((res) => {
this.isEdit = true;
this.form.id = id;
getEnergyLimit(id).then((res) => {
if (res.code === 0) {
this.form = res.data
this.form.plcParamId = res.data.plcParamId || ''
this.form.limitType = this.form.limitType ? this.form.limitType + '' : ''
this.objIds = this.changeDetSelect(this.form.objectId, this.objList)
this.form = res.data;
this.form.plcParamId = res.data.plcParamId || '';
this.form.meter = this.form.meter ? this.form.meter + '' : '';
this.form.manual =
this.form.manual >= 0 ? this.form.manual + '' : '';
this.form.limitType = this.form.limitType
? this.form.limitType + ''
: '';
this.objIds = this.changeDetSelect(
this.form.objectId,
this.objList
);
if (this.form.type === 2) {
this.getDetailList()
this.getDetailList();
}
if (this.form.energyTypeId) {
this.getTableNameList(this.form.energyTypeId);
}
}
})
});
} else {
this.isEdit = false
this.form.id = ''
this.isEdit = false;
this.form.id = '';
}
},
// 切换方式
changeMethod() {
if (this.form.manual === '1') {
this.form.limitType = '2';
} else {
this.form.limitType = '';
}
},
// 监控详细参数
getDetailList() {
getEnergyParamList({
objId: this.form.objectId,
energyTypeId: this.form.energyTypeId
energyTypeId: this.form.energyTypeId,
}).then((res) => {
if (res.code === 0) {
this.detailList = res.data
this.detailList = res.data;
} else {
this.detailList = []
this.detailList = [];
}
})
});
},
typeChange(val) {
console.log(this.form)
this.form.plcParamId = ''
this.form.plcParamId = '';
if (val === 2) {
if (this.form.objectId && this.form.energyTypeId) {
this.getDetailList()
this.getDetailList();
}
}
},
toggleType() {
if (this.form.energyTypeId && this.form.type) {
this.getDetailList()
this.form.plcParamId = ''
if (this.form.energyTypeId && this.form.manual == 1) {
this.form.meter = '';
this.getTableNameList(this.form.energyTypeId);
}
},
// 获取能源表名list
getTableNameList(id) {
// 切换能源类型
this.tableNameList = [];
energyTableGet({ energyTypeId: id }).then((res) => {
if (res.data.length === 0) {
this.$modal.msgWarning(
'当前能源类型暂无配置表名,请先到《表名配置》页面配置'
);
return;
}
res.data[0].meters.forEach((meter) => {
this.tableNameList.push(this.meterArr.find((i) => i.value === meter));
});
});
},
// 递归处理分类回显问题
changeDetSelect(key, treeData) {
let arr = [] // 递归时操作的数组
let returnArr = [] // 存放结果的数组
let depth = 0 // 定义全局层级
let arr = []; // 递归时操作的数组
let returnArr = []; // 存放结果的数组
let depth = 0; // 定义全局层级
// 定义递归函数
function childrenEach(childrendData, depthN) {
for (var j = 0; j < childrendData.length; j++) {
depth = depthN
arr[depthN] = childrendData[j].id
depth = depthN;
arr[depthN] = childrendData[j].id;
if (childrendData[j].id == key) {
returnArr = arr.slice(0, depthN + 1)
break
returnArr = arr.slice(0, depthN + 1);
break;
} else {
if (childrendData[j].children) {
depth++
childrenEach(childrendData[j].children, depth)
depth++;
childrenEach(childrendData[j].children, depth);
}
}
}
return returnArr
return returnArr;
}
return childrenEach(treeData, depth)
return childrenEach(treeData, depth);
},
selectObj(val) {
this.form.objectId = val[val.length-1]
this.form.objectType = val.length-1
this.form.objectId = val[val.length - 1];
this.form.objectType = val.length;
if (this.form.energyTypeId && this.form.type) {
this.getDetailList()
this.form.plcParamId = ''
this.getDetailList();
this.form.plcParamId = '';
}
},
selectDetail() {
this.$forceUpdate()
this.$forceUpdate();
},
submitForm() {
this.$refs['form'].validate((valid) => {
if (valid) {
if (this.form.type === 2 && !this.form.plcParamId) {
this.$modal.msgError("监控模式为详细时,详细参数为必填");
return false
this.$modal.msgError('监控模式为详细时,详细参数为必填');
return false;
}
// this.form.limitType = Number(this.form.limitType)
if (this.form.downValue && this.form.upValue) {
if (this.form.downValue > this.form.upValue) {
this.$modal.msgError('消耗量阈值,最小值不能大于最大值');
return false;
}
}
this.form.downValue = this.form.downValue || 0;
this.form.upValue = this.form.upValue || 0;
if (this.isEdit) {
// 编辑
updateEnergyLimit({...this.form}).then((res) => {
updateEnergyLimit({ ...this.form }).then((res) => {
if (res.code === 0) {
this.$modal.msgSuccess("操作成功");
this.$emit('successSubmit')
this.$modal.msgSuccess('操作成功');
this.$emit('successSubmit');
}
})
});
} else {
createEnergyLimit({...this.form}).then((res) => {
createEnergyLimit({ ...this.form }).then((res) => {
if (res.code === 0) {
this.$modal.msgSuccess("操作成功");
this.$emit('successSubmit')
this.$modal.msgSuccess('操作成功');
this.$emit('successSubmit');
}
})
});
}
} else {
return false
return false;
}
})
});
},
formClear() {
this.$refs.form.resetFields()
this.objIds = ''
this.detailList = []
this.isEdit = false
}
}
}
this.$refs.form.resetFields();
this.form.type = '';
this.form.plcParamId = '';
this.form.downValue = null;
this.form.upValue = null;
this.objIds = '';
this.detailList = [];
this.isEdit = false;
},
},
};
</script>
<style>
.cascaderParent .el-cascader-panel .el-scrollbar:first-child .el-radio {
display: none;
}
</style>

Voir le fichier

@@ -49,15 +49,33 @@ import { getEnergyTypeListAll } from "@/api/base/energyType";
import { getTree } from '@/api/base/factory'
import { publicFormatter } from '@/utils/dict'
import EnergyLimitAdd from './components/energyLimitAdd'
import codeFilter from '@/filter/code-filter';
import tableHeightMixin from '@/mixins/lb/tableHeightMixin';
const tableProps = [
{
prop: 'manual',
label: '抄表方式',
filter: codeFilter('manual'),
},
{
prop: 'objName',
label: '监控对象'
},
{
prop: 'objectType',
label: '对象备注',
filter: publicFormatter('object_type')
prop: 'objCode',
label: '对象编码',
minWidth: 140,
showOverflowtooltip: true,
},
// {
// prop: 'objectType',
// label: '对象备注',
// filter: publicFormatter('object_type')
// },
{
prop: 'meter',
label: '能源表名',
filter: publicFormatter('meter'),
},
{
prop: 'energyType',
@@ -85,6 +103,7 @@ const tableProps = [
export default {
name: "EnergyLimit",
components: { EnergyLimitAdd },
mixins: [tableHeightMixin],
data() {
return {
formConfig: [
@@ -159,9 +178,6 @@ export default {
};
},
created() {
window.addEventListener('resize', () => {
this.tableH = this.tableHeight(260)
})
this.getList();
this.getTypeList()
// 获取对象树形结构
@@ -200,6 +216,15 @@ export default {
item.type = i.label
}
})
if (item.downValue && item.upValue) {
item.limitValue = item.downValue + '-' + item.upValue;
} else if (item.downValue) {
item.limitValue = '最小值' + item.downValue;
} else if (item.upValue) {
item.limitValue = '最大值' + item.upValue;
} else {
item.limitValue = '-';
}
})
this.list = arr
this.total = response.data.total;
@@ -232,7 +257,7 @@ export default {
},
/** 删除按钮操作 */
handleDelete(row) {
this.$modal.confirm('是否确认删除监控对象为"' + row.objName + '"的数据项?').then(function() {
this.$modal.confirm('是否确认删除"' + row._pageInde + '"的数据项?').then(function() {
return deleteEnergyLimit(row.id);
}).then(() => {
this.queryParams.pageNo = 1;

Voir le fichier

@@ -1,82 +1,137 @@
<template>
<div class="app-container">
<div class="app-container energyOverlimitLog">
<!-- 搜索工作栏 -->
<search-bar
:formConfigs="formConfig"
ref="searchBarForm"
@headBtnClick="buttonClick"
/>
@headBtnClick="buttonClick" />
<el-tabs
v-model="activeName"
@tab-click="toggleTab">
<el-tab-pane
label="自动抄表"
name="auto"></el-tab-pane>
<el-tab-pane
label="手动抄表"
name="manual"></el-tab-pane>
</el-tabs>
<!-- 列表 -->
<div v-if="activeName === 'auto'">
<base-table
:page="queryParams.pageNo"
:limit="queryParams.pageSize"
:table-props="tableProps"
:table-data="list"
:max-height="tableH"
/>
:max-height="tableH" />
</div>
<div v-if="activeName === 'manual'">
<base-table
:page="queryParams.pageNo"
:limit="queryParams.pageSize"
:table-props="tableProps2"
:table-data="list2"
:max-height="tableH" />
</div>
<pagination
:page.sync="queryParams.pageNo"
:limit.sync="queryParams.pageSize"
:total="total"
@pagination="getList"
/>
@pagination="getList" />
</div>
</template>
<script>
import { getEnergyOverlimitLogPage } from "@/api/monitoring/energyOverlimitLog";
import { getEnergyTypeListAll } from "@/api/base/energyType";
import { publicFormatter } from '@/utils/dict'
import { getEnergyOverlimitLogPage,getEnergyManualLogPage } from '@/api/monitoring/energyOverlimitLog';
import { getEnergyTypeListAll } from '@/api/base/energyType';
import { publicFormatter } from '@/utils/dict';
import { parseTime } from '@/utils/ruoyi';
import tableHeightMixin from '@/mixins/lb/tableHeightMixin';
const tableProps = [
{
prop: 'objName',
label: '监控对象'
label: '监控对象',
},
{
prop: 'objRemark',
label: '对象备注'
prop: 'objCode',
label: '对象编码',
},
{
prop: 'energyType',
label: '能源类型'
label: '能源类型',
},
{
prop: 'type',
label: '监控模式'
label: '监控模式',
},
{
prop: 'paramName',
label: '监控参数'
label: '监控参数',
},
{
prop: 'limitType',
label: '指标类型',
filter: publicFormatter('monitor_index_type')
filter: publicFormatter('monitor_index_type'),
},
{
prop: 'realityValue',
label: '实际值'
label: '实际值',
},
{
prop: 'limitValue',
label: '阈值'
label: '阈值',
},
{
prop: 'overValue',
label: '超出值'
}
]
label: '超出值',
},
{
prop: 'time',
label: '提醒时间',
filter: parseTime,
minWidth: 160,
},
];
const tableProps2 = [
{
prop: 'energyType',
label: '能源类型',
},
{
prop: 'limitType',
label: '指标类型',
filter: publicFormatter('monitor_index_type'),
},
{
prop: 'realityValue',
label: '实际值',
},
{
prop: 'limitValue',
label: '阈值',
},
{
prop: 'overValue',
label: '超出值',
},
{
prop: 'time',
label: '提醒时间',
filter: parseTime,
minWidth: 160,
},
];
export default {
name: "EnergyOverlimitLog",
name: 'EnergyOverlimitLog',
mixins: [tableHeightMixin],
data() {
return {
formConfig: [
{
type: 'select',
label: '能源类型',
labelField: 'labelName',
selectOptions: [],
param: 'energyTypeId'
param: 'energyTypeId',
},
{
type: 'select',
@@ -84,69 +139,130 @@ export default {
selectOptions: this.getDictDatas(this.DICT_TYPE.MONITOR_INDEX_TYPE),
labelField: 'label',
valueField: 'value',
param: 'indexType'
param: 'indexType',
},
{
type: 'button',
btnName: '查询',
name: 'search',
color: 'primary'
}
color: 'primary',
},
],
activeName: 'auto',
tableProps,
tableH: this.tableHeight(260),
// 总条数
tableProps2,
total: 0,
// 班次基础信息列表
list: [],
list2: [],
heightNum: 300,
// 查询参数
queryParams: {
pageNo: 1,
pageSize: 20,
energyTypeId: '',
indexType: ''
indexType: '',
method: '1',
},
typeList: [
{id: 1, name: '合并'},
{id: 2, name: '详细'}
]
{ id: 1, name: '合并' },
{ id: 2, name: '详细' },
],
};
},
created() {
window.addEventListener('resize', () => {
this.tableH = this.tableHeight(260)
})
this.getList();
this.getTypeList()
this.getTypeList();
},
methods: {
buttonClick(val) {
this.queryParams.pageNo = 1;
this.queryParams.energyTypeId = val.energyTypeId
this.queryParams.indexType = val.indexType
this.getList()
this.queryParams.energyTypeId = val.energyTypeId;
this.queryParams.indexType = val.indexType;
this.getList();
},
/** 查询列表 */
getList() {
getEnergyOverlimitLogPage(this.queryParams).then(response => {
(this.queryParams.method === '1'?getEnergyOverlimitLogPage:getEnergyManualLogPage)(this.queryParams).then((response) => {
let arr = response.data.list || [];
arr&&arr.map((item) => {
arr &&
arr.map((item) => {
this.typeList.map((i) => {
if (item.type === i.id) {
item.type = i.name
item.type = i.name;
}
});
if (item.downValue && item.upValue) {
item.limitValue = item.downValue + '-' + item.upValue;
} else if (item.downValue) {
item.limitValue = '最小值' + item.downValue;
} else if (item.upValue) {
item.limitValue = '最大值' + item.upValue;
} else {
item.limitValue = '';
}
});
if (this.queryParams.method === '1') {
this.list = arr;
this.list2 = [];
} else {
this.list2 = arr;
this.list1 = [];
}
})
})
this.list = arr
this.total = response.data.total;
});
},
getTypeList() {
getEnergyTypeListAll().then((res) => {
console.log(res)
this.formConfig[0].selectOptions = res.data || []
})
}
console.log(res);
this.formConfig[0].selectOptions = res.data || [];
});
},
toggleTab() {
if (this.activeName === 'auto') {
this.queryParams.method = '1';
} else {
this.queryParams.method = '2';
}
this.queryParams.pageNo = 1;
this.getList();
},
},
};
</script>
<style lang='scss'>
.energyOverlimitLog {
.el-tabs__nav::after {
content: '';
position: absolute;
left: 0;
bottom: 0;
width: 100%;
height: 2px;
background-color: #e4e7ed;
}
.el-tabs__nav-wrap::after {
width: 0;
}
.el-tabs__item {
padding: 0 10px;
}
.el-tabs__item:hover {
color: rgba(0, 0, 0, 0.85);
}
.el-tabs__item.is-active {
color: rgba(0, 0, 0, 0.85);
}
.el-tabs__item {
color: rgba(0, 0, 0, 0.45);
}
.searchBarBox {
margin-bottom: 0;
}
}
</style>

Voir le fichier

@@ -4,70 +4,227 @@
<!-- 登录区域 -->
<div class="content">
<!-- 配图 -->
<div class="pic"></div>
<div class="pic">
<div
class="welcome"
style="
position: absolute;
top: 15%;
left: 20%;
user-select: none;
display: flex;
flex-direction: column;
align-items: flex-start;
">
<strong
style="
letter-spacing: 1px;
font-family: Arial, Helvetica, sans-serif;
font-weight: 500;
font-size: 88px;
">
<span style="color: #26b9de">Wel</span>
<span style="color: #fff">come</span>
</strong>
<p
style="
margin: 0;
font-size: 26px;
letter-spacing: 1px;
color: #26b9de;
opacity: 75%;
">
<span
style="
display: inline-block;
height: 20px;
width: 20px;
margin-left: 8px;
margin-right: 12px;
border-radius: 100%;
background: #26b9de;
"></span>
产线生产监控系统
</p>
</div>
<video
src="/static/videos/login.webm"
muted
autoplay
loop
style="
user-select: none;
position: absolute;
top: 28%;
width: 100%;
height: 70%;
"></video>
</div>
<!-- 表单 -->
<div class="field">
<!-- [移动端]标题 -->
<h2 class="mobile-title">
<h3 class="title">芋道后台管理系统</h3>
<h3 class="title">中建材智能自动化研究院有限公司</h3>
</h2>
<h2 class="pc-title" style="">
<h3
class="title"
style="
margin: 0;
margin-left: 32px;
font-weight: 400;
user-select: none;
color: #000;
font-size: 36px;
line-height: 54px;
letter-spacing: 2px;
">
<img
src="../assets/logo/cnbm.png"
alt="cnbm_logo"
style="
height: 48px;
width: 48px;
position: relative;
top: 12px;
right: 8px;
" />
<span>中建材智能自动化研究院有限公司</span>
</h3>
<h3
class="sub-title"
style="
margin: 0;
margin-left: 32px;
font-weight: 400;
user-select: none;
color: #000;
font-size: 36px;
line-height: 54px;
letter-spacing: 2px;
">
产线生产监控系统
</h3>
</h2>
<!-- 表单 -->
<div class="form-cont">
<el-tabs class="form" v-model="loginForm.loginType" style=" float:none;">
<el-tab-pane label="账号密码登录" name="uname">
</el-tab-pane>
<el-tab-pane label="短信验证码登录" name="sms">
</el-tab-pane>
<el-tabs
class="form"
v-model="loginForm.loginType"
style="float: none">
<el-tab-pane label="账号密码登录" name="uname"></el-tab-pane>
<el-tab-pane label="短信验证码登录" name="sms"></el-tab-pane>
</el-tabs>
<div>
<el-form ref="loginForm" :model="loginForm" :rules="LoginRules" class="login-form">
<div style="">
<el-form
ref="loginForm"
:model="loginForm"
:rules="LoginRules"
class="login-form">
<el-form-item prop="tenantName" v-if="tenantEnable">
<el-input v-model="loginForm.tenantName" type="text" auto-complete="off" placeholder='租户'>
<svg-icon slot="prefix" icon-class="tree" class="el-input__icon input-icon" />
<el-input
v-model="loginForm.tenantName"
type="text"
auto-complete="off"
placeholder="租户">
<!-- <svg-icon
slot="prefix"
icon-class="tree"
class="el-input__icon input-icon" /> -->
</el-input>
</el-form-item>
<!-- 账号密码登录 -->
<div v-if="loginForm.loginType === 'uname'">
<el-form-item prop="username">
<el-input v-model="loginForm.username" type="text" auto-complete="off" placeholder="账号">
<svg-icon slot="prefix" icon-class="user" class="el-input__icon input-icon" />
<el-input
v-model="loginForm.username"
type="text"
auto-complete="off"
placeholder="账号">
<!-- <svg-icon
slot="prefix"
icon-class="user"
class="el-input__icon input-icon" /> -->
</el-input>
</el-form-item>
<el-form-item prop="password">
<el-input v-model="loginForm.password" type="password" auto-complete="off" placeholder="密码"
<el-input
v-model="loginForm.password"
type="password"
auto-complete="off"
placeholder="密码"
@keyup.enter.native="getCode">
<svg-icon slot="prefix" icon-class="password" class="el-input__icon input-icon" />
<!-- <svg-icon
slot="prefix"
icon-class="password"
class="el-input__icon input-icon" /> -->
</el-input>
</el-form-item>
<el-checkbox v-model="loginForm.rememberMe" style="margin:0 0 25px 0;">记住密码</el-checkbox>
<el-checkbox
v-model="loginForm.rememberMe"
style="margin: 0 0 25px 0">
记住密码
</el-checkbox>
</div>
<!-- 短信验证码登录 -->
<div v-if="loginForm.loginType === 'sms'">
<el-form-item prop="mobile">
<el-input v-model="loginForm.mobile" type="text" auto-complete="off" placeholder="请输入手机号">
<svg-icon slot="prefix" icon-class="phone" class="el-input__icon input-icon" />
<el-input
v-model="loginForm.mobile"
type="text"
auto-complete="off"
placeholder="请输入手机号">
<!-- <svg-icon
slot="prefix"
icon-class="phone"
class="el-input__icon input-icon" /> -->
</el-input>
</el-form-item>
<el-form-item prop="mobileCode">
<el-input v-model="loginForm.mobileCode" type="text" auto-complete="off" placeholder="短信验证码"
class="sms-login-mobile-code-prefix" @keyup.enter.native="handleLogin">
<template>
<svg-icon slot="prefix" icon-class="password" class="el-input__icon input-icon" />
</template>
<template slot="append">
<span v-if="mobileCodeTimer <= 0" class="getMobileCode" @click="getSmsCode"
style="cursor: pointer;">获取验证码</span>
<span v-if="mobileCodeTimer > 0" class="getMobileCode">{{ mobileCodeTimer }}秒后可重新获取</span>
<el-input
v-model="loginForm.mobileCode"
type="text"
auto-complete="off"
placeholder="短信验证码"
class="sms-login-mobile-code-prefix"
@keyup.enter.native="handleLogin">
<!-- <template>
<svg-icon
slot="prefix"
icon-class="password"
class="el-input__icon input-icon" />
</template> -->
<template slot="suffix">
<span
v-if="mobileCodeTimer <= 0"
class="getMobileCode"
@click="getSmsCode"
style="
cursor: pointer;
color: #0b58ff;
font-size: 18px;
line-height: 66px;
padding-right: 12px;
">
获取验证码
</span>
<span v-if="mobileCodeTimer > 0" class="getMobileCode">
{{ mobileCodeTimer }}秒后可重新获取
</span>
</template>
</el-input>
</el-form-item>
</div>
<!-- 下方的登录按钮 -->
<el-form-item style="width:100%;">
<el-button :loading="loading" size="medium" type="primary" style="width:100%;"
<el-form-item id="button-form-item" style="width: 100%; margin-top: 32px">
<el-button
:loading="loading"
size="medium"
type="primary"
style="width: 100%; height: 66px; font-size: 18px;"
@click.native.prevent="getCode">
<span v-if="!loading"> </span>
<span v-else> 中...</span>
@@ -86,99 +243,113 @@
</el-form>
</div>
</div>
</div>
</div>
<!-- 图形验证码 -->
<Verify ref="verify" :captcha-type="'blockPuzzle'" :img-size="{ width: '400px', height: '200px' }"
@success="handleLogin" />
<!-- footer -->
<div class="footer">
Copyright © 2023 中建材智能自动化院 All Rights Reserved.
</div>
</div>
</div>
<!-- 图形验证码 -->
<Verify
ref="verify"
:captcha-type="'blockPuzzle'"
:img-size="{ width: '400px', height: '200px' }"
@success="handleLogin" />
</div>
</template>
<script>
import { sendSmsCode, socialAuthRedirect } from "@/api/login";
import { getTenantIdByName } from "@/api/system/tenant";
import { SystemUserSocialTypeEnum } from "@/utils/constants";
import { getCaptchaEnable, getTenantEnable } from "@/utils/ruoyi";
import { sendSmsCode, socialAuthRedirect } from '@/api/login';
import { getTenantIdByName } from '@/api/system/tenant';
import { SystemUserSocialTypeEnum } from '@/utils/constants';
import { getCaptchaEnable, getTenantEnable } from '@/utils/ruoyi';
import {
getPassword,
getRememberMe, getTenantName,
getRememberMe,
getTenantName,
getUsername,
removePassword, removeRememberMe, removeTenantName,
removePassword,
removeRememberMe,
removeTenantName,
removeUsername,
setPassword, setRememberMe, setTenantId, setTenantName,
setUsername
} from "@/utils/auth";
setPassword,
setRememberMe,
setTenantId,
setTenantName,
setUsername,
} from '@/utils/auth';
import Verify from '@/components/Verifition/Verify';
import { resetUserPwd } from "@/api/system/user";
import { resetUserPwd } from '@/api/system/user';
export default {
name: "Login",
name: 'Login',
components: {
Verify
Verify,
},
data() {
return {
codeUrl: "",
codeUrl: '',
captchaEnable: true,
tenantEnable: true,
mobileCodeTimer: 0,
loginForm: {
loginType: "uname",
username: "admin",
password: "admin123",
captchaVerification: "",
mobile: "",
mobileCode: "",
loginType: 'uname',
username: 'admin',
password: 'admin123',
captchaVerification: '',
mobile: '',
mobileCode: '',
rememberMe: false,
tenantName: "技术中心",
tenantName: '技术中心',
},
scene: 21,
LoginRules: {
username: [
{ required: true, trigger: "blur", message: "用户名不能为空" }
{ required: true, trigger: 'blur', message: '用户名不能为空' },
],
password: [
{ required: true, trigger: "blur", message: "密码不能为空" }
{ required: true, trigger: 'blur', message: '密码不能为空' },
],
mobile: [
{ required: true, trigger: "blur", message: "手机号不能为空" },
{ required: true, trigger: 'blur', message: '手机号不能为空' },
{
validator: function (rule, value, callback) {
if (/^(?:(?:\+|00)86)?1(?:3[\d]|4[5-79]|5[0-35-9]|6[5-7]|7[0-8]|8[\d]|9[189])\d{8}$/.test(value) === false) {
callback(new Error("手机号格式错误"));
if (
/^(?:(?:\+|00)86)?1(?:3[\d]|4[5-79]|5[0-35-9]|6[5-7]|7[0-8]|8[\d]|9[189])\d{8}$/.test(
value
) === false
) {
callback(new Error('手机号格式错误'));
} else {
callback();
}
}, trigger: "blur"
}
},
trigger: 'blur',
},
],
tenantName: [
{ required: true, trigger: "blur", message: "租户不能为空" },
{ required: true, trigger: 'blur', message: '租户不能为空' },
{
validator: (rule, value, callback) => {
// debugger
getTenantIdByName(value).then(res => {
getTenantIdByName(value).then((res) => {
const tenantId = res.data;
if (tenantId && tenantId >= 0) {
// 设置租户
setTenantId(tenantId)
setTenantId(tenantId);
callback();
} else {
callback('租户不存在');
}
});
},
trigger: 'blur'
}
]
trigger: 'blur',
},
],
},
loading: false,
redirect: undefined,
@@ -190,30 +361,33 @@ export default {
// 租户开关
this.tenantEnable = getTenantEnable();
if (this.tenantEnable) {
getTenantIdByName(this.loginForm.tenantName).then(res => { // 设置租户
getTenantIdByName(this.loginForm.tenantName).then((res) => {
// 设置租户
const tenantId = res.data;
if (tenantId && tenantId >= 0) {
setTenantId(tenantId)
setTenantId(tenantId);
}
});
}
// 验证码开关
this.captchaEnable = getCaptchaEnable();
// 重定向地址
this.redirect = this.$route.query.redirect ? decodeURIComponent(this.$route.query.redirect) : undefined;
this.redirect = this.$route.query.redirect
? decodeURIComponent(this.$route.query.redirect)
: undefined;
this.getCookie();
},
methods: {
getCode() {
// 情况一,未开启:则直接登录
if (!this.captchaEnable) {
this.handleLogin({})
this.handleLogin({});
return;
}
// 情况二,已开启:则展示验证码;只有完成验证码的情况,才进行登录
// 弹出验证码
this.$refs.verify.show()
this.$refs.verify.show();
},
getCookie() {
const username = getUsername();
@@ -229,28 +403,34 @@ export default {
};
},
handleLogin(captchaParams) {
this.$refs.loginForm.validate(valid => {
this.$refs.loginForm.validate((valid) => {
if (valid) {
this.loading = true;
// 设置 Cookie
if (this.loginForm.rememberMe) {
setUsername(this.loginForm.username)
setPassword(this.loginForm.password)
setRememberMe(this.loginForm.rememberMe)
setTenantName(this.loginForm.tenantName)
setUsername(this.loginForm.username);
setPassword(this.loginForm.password);
setRememberMe(this.loginForm.rememberMe);
setTenantName(this.loginForm.tenantName);
} else {
removeUsername()
removePassword()
removeRememberMe()
removeTenantName()
removeUsername();
removePassword();
removeRememberMe();
removeTenantName();
}
this.loginForm.captchaVerification = captchaParams.captchaVerification
this.loginForm.captchaVerification =
captchaParams.captchaVerification;
// 发起登陆
// console.log("发起登录", this.loginForm);
this.$store.dispatch(this.loginForm.loginType === "sms" ? "SmsLogin" : "Login", this.loginForm).then(() => {
this.$router.push({ path: this.redirect || "/" }).catch(() => {
});
}).catch(() => {
this.$store
.dispatch(
this.loginForm.loginType === 'sms' ? 'SmsLogin' : 'Login',
this.loginForm
)
.then(() => {
this.$router.push({ path: this.redirect || '/' }).catch(() => {});
})
.catch(() => {
this.loading = false;
});
}
@@ -261,34 +441,46 @@ export default {
this.loading = true;
let tenant = false;
if (this.tenantEnable) {
await this.$prompt('请输入租户名称', "提示", {
confirmButtonText: "确定",
cancelButtonText: "取消"
}).then(async ({ value }) => {
await getTenantIdByName(value).then(res => {
await this.$prompt('请输入租户名称', '提示', {
confirmButtonText: '确定',
cancelButtonText: '取消',
})
.then(async ({ value }) => {
await getTenantIdByName(value).then((res) => {
const tenantId = res.data;
tenant = true
tenant = true;
if (tenantId && tenantId >= 0) {
setTenantId(tenantId)
setTenantId(tenantId);
}
});
}).catch(() => {
})
.catch(() => {
// 取消登录按钮 loading状态
this.loading = false;
return false
return false;
});
} else {
tenant = true
tenant = true;
}
if (tenant) {
// 计算 redirectUri
const redirectUri = location.origin + '/social-login?'
+ encodeURIComponent('type=' + socialTypeEnum.type + '&redirect=' + (this.redirect || "/")); // 重定向不能丢
const redirectUri =
location.origin +
'/social-login?' +
encodeURIComponent(
'type=' +
socialTypeEnum.type +
'&redirect=' +
(this.redirect || '/')
); // 重定向不能丢
// const redirectUri = 'http://127.0.0.1:48080/api/gitee/callback';
// const redirectUri = 'http://127.0.0.1:48080/api/dingtalk/callback';
// 进行跳转
socialAuthRedirect(socialTypeEnum.type, encodeURIComponent(redirectUri)).then((res) => {
socialAuthRedirect(
socialTypeEnum.type,
encodeURIComponent(redirectUri)
).then((res) => {
// console.log(res.url);
window.location.href = res.data;
});
@@ -297,10 +489,15 @@ export default {
/** ========== 以下为升级短信登录 ========== */
getSmsCode() {
if (this.mobileCodeTimer > 0) return;
this.$refs.loginForm.validate(valid => {
this.$refs.loginForm.validate((valid) => {
if (!valid) return;
sendSmsCode(this.loginForm.mobile, this.scene, this.loginForm.uuid, this.loginForm.code).then(res => {
this.$modal.msgSuccess("获取验证码成功")
sendSmsCode(
this.loginForm.mobile,
this.scene,
this.loginForm.uuid,
this.loginForm.code
).then((res) => {
this.$modal.msgSuccess('获取验证码成功');
this.mobileCodeTimer = 60;
let msgTimer = setInterval(() => {
this.mobileCodeTimer = this.mobileCodeTimer - 1;
@@ -310,13 +507,12 @@ export default {
}, 1000);
});
});
}
}
},
},
};
</script>
<style lang="scss" scoped>
@import "~@/assets/styles/login.scss";
@import '~@/assets/styles/login.scss';
.oauth-login {
display: flex;
@@ -344,4 +540,5 @@ export default {
:deep(.el-input__prefix) {
top: 22%;
}
}</style>
}
</style>

Voir le fichier

@@ -77,7 +77,6 @@ export default {
label: '设备名称',
},
{
width: 128,
prop: 'equipmentCode',
label: '设备编码',
},
@@ -117,6 +116,7 @@ export default {
{
_action: 'params-monitor',
label: '操作',
width: 56,
subcomponent: {
props: ['injectData'],
render: function (h) {
@@ -124,10 +124,10 @@ export default {
return h(
'el-button',
{
class: 'iconfont icon-detail',
props: { type: 'text' },
on: {
click: function () {
console.log('inejctdata', _this.injectData);
_this.$emit('emitData', {
action: _this.injectData._action,
// value: _this.injectData.id,
@@ -135,8 +135,8 @@ export default {
});
},
},
},
'查看详情'
}
// '查看详情'
);
},
},

Voir le fichier

@@ -42,7 +42,7 @@
<DialogForm
v-if="open"
ref="form"
:dataForm="form"
v-model="form"
:rows="[
[
{

Voir le fichier

@@ -40,7 +40,7 @@
<DialogForm
v-if="open"
ref="form"
:dataForm="form"
v-model="form"
:rows="[
[
{

Voir le fichier

@@ -64,6 +64,7 @@ export default {
name: item.inspectionContent,
type: 'bar',
barCategoryGap: 12,
barWidth: 20,
data: [],
};

Voir le fichier

@@ -207,9 +207,9 @@
<el-select v-model="form.roleIds" multiple placeholder="请选择">
<el-option
v-for="item in roleOptions"
:key="parseInt(item.id)"
:key="item.id"
:label="item.name"
:value="parseInt(item.id)"
:value="item.id"
></el-option>
</el-select>
</el-form-item>

418
yarn.lock
Voir le fichier

@@ -1979,21 +1979,16 @@
"resolved" "https://registry.npmmirror.com/acorn-walk/-/acorn-walk-7.2.0.tgz"
"version" "7.2.0"
"acorn@^6.0.0 || ^7.0.0 || ^8.0.0", "acorn@^6.4.1":
"acorn@^6.0.0 || ^7.0.0 || ^8.0.0", "acorn@^7.1.1", "acorn@^7.4.0":
"integrity" "sha512-nQyp0o1/mNdbTO1PO6kHkwSrmgZ0MT/jCCpNiwbUjGoRN4dlBhqJtoQuCnEOKzgTVwg0ZWiCoQy6SxMebQVh8A=="
"resolved" "https://registry.npmmirror.com/acorn/-/acorn-7.4.1.tgz"
"version" "7.4.1"
"acorn@^6.4.1":
"integrity" "sha512-XtGIhXwF8YM8bJhGxG5kXgjkEuNGLTkoYqVE+KMR+aspr4KGYmKYg7yUe3KghyQ9yheNwLnjmzh/7+gfDBmHCQ=="
"resolved" "https://registry.npmmirror.com/acorn/-/acorn-6.4.2.tgz"
"version" "6.4.2"
"acorn@^7.1.1":
"integrity" "sha512-nQyp0o1/mNdbTO1PO6kHkwSrmgZ0MT/jCCpNiwbUjGoRN4dlBhqJtoQuCnEOKzgTVwg0ZWiCoQy6SxMebQVh8A=="
"resolved" "https://registry.npmmirror.com/acorn/-/acorn-7.4.1.tgz"
"version" "7.4.1"
"acorn@^7.4.0":
"integrity" "sha512-nQyp0o1/mNdbTO1PO6kHkwSrmgZ0MT/jCCpNiwbUjGoRN4dlBhqJtoQuCnEOKzgTVwg0ZWiCoQy6SxMebQVh8A=="
"resolved" "https://registry.npmmirror.com/acorn/-/acorn-7.4.1.tgz"
"version" "7.4.1"
"acorn@^8.8.2":
"integrity" "sha512-F0SAmZ8iUtS//m8DmCTA0jlh6TDKkHQyK6xc6V4KDTyZKA9dnvX9/3sRTVQrWm79glUAZbnmmNcdYwUIHWVybw=="
"resolved" "https://registry.npmmirror.com/acorn/-/acorn-8.10.0.tgz"
@@ -2014,7 +2009,7 @@
"resolved" "https://registry.npmmirror.com/adler-32/-/adler-32-1.3.1.tgz"
"version" "1.3.1"
"aes-decrypter@^4.0.1":
"aes-decrypter@^4.0.1", "aes-decrypter@4.0.1":
"integrity" "sha512-H1nh/P9VZXUf17AA5NQfJML88CFjVBDuGkp5zDHa7oEhYN9TTpNLJknRY1ie0iSKWlDf6JRnJKaZVDSQdPy6Cg=="
"resolved" "https://registry.npmmirror.com/aes-decrypter/-/aes-decrypter-4.0.1.tgz"
"version" "4.0.1"
@@ -2041,16 +2036,6 @@
"global" "^4.4.0"
"pkcs7" "^1.0.4"
"aes-decrypter@4.0.1":
"integrity" "sha512-H1nh/P9VZXUf17AA5NQfJML88CFjVBDuGkp5zDHa7oEhYN9TTpNLJknRY1ie0iSKWlDf6JRnJKaZVDSQdPy6Cg=="
"resolved" "https://registry.npmmirror.com/aes-decrypter/-/aes-decrypter-4.0.1.tgz"
"version" "4.0.1"
dependencies:
"@babel/runtime" "^7.12.5"
"@videojs/vhs-utils" "^3.0.5"
"global" "^4.4.0"
"pkcs7" "^1.0.4"
"aggregate-error@^3.0.0":
"integrity" "sha512-4I7Td01quW/RpocfNayFdFVk1qSuoh0E7JrbRJ16nH01HhKFQ88INq9Sd+nd72zqRySlr9BmDA8xlEJ6vJMrYA=="
"resolved" "https://registry.npmmirror.com/aggregate-error/-/aggregate-error-3.1.0.tgz"
@@ -2089,11 +2074,6 @@
"resolved" "https://registry.npmmirror.com/ansi-colors/-/ansi-colors-3.2.4.tgz"
"version" "3.2.4"
"ansi-colors@^4.1.1":
"integrity" "sha512-/6w/C21Pm1A7aZitlI5Ni/2J6FFQN8i1Cvz3kHABAAbw93v/NlvKdVOqz7CCWz/3iv/JplRSEEZ83XION15ovw=="
"resolved" "https://registry.npmmirror.com/ansi-colors/-/ansi-colors-4.1.3.tgz"
"version" "4.1.3"
"ansi-escapes@^4.2.1", "ansi-escapes@^4.3.0":
"integrity" "sha512-gKXj5ALrKWQLsYG9jlTRmR/xKluxHV+Z9QEwNIgCfM1/uwPMCuzVVnh5mwTd+OuBZcwSIMbqssNWRm1lE51QaQ=="
"resolved" "https://registry.npmmirror.com/ansi-escapes/-/ansi-escapes-4.3.2.tgz"
@@ -2131,21 +2111,28 @@
"resolved" "https://registry.npmmirror.com/ansi-styles/-/ansi-styles-2.2.1.tgz"
"version" "2.2.1"
"ansi-styles@^3.1.0", "ansi-styles@^3.2.0", "ansi-styles@^3.2.1":
"ansi-styles@^3.1.0":
"integrity" "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA=="
"resolved" "https://registry.npmmirror.com/ansi-styles/-/ansi-styles-3.2.1.tgz"
"version" "3.2.1"
dependencies:
"color-convert" "^1.9.0"
"ansi-styles@^4.0.0":
"integrity" "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg=="
"resolved" "https://registry.npmmirror.com/ansi-styles/-/ansi-styles-4.3.0.tgz"
"version" "4.3.0"
"ansi-styles@^3.2.0":
"integrity" "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA=="
"resolved" "https://registry.npmmirror.com/ansi-styles/-/ansi-styles-3.2.1.tgz"
"version" "3.2.1"
dependencies:
"color-convert" "^2.0.1"
"color-convert" "^1.9.0"
"ansi-styles@^4.1.0":
"ansi-styles@^3.2.1":
"integrity" "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA=="
"resolved" "https://registry.npmmirror.com/ansi-styles/-/ansi-styles-3.2.1.tgz"
"version" "3.2.1"
dependencies:
"color-convert" "^1.9.0"
"ansi-styles@^4.0.0", "ansi-styles@^4.1.0":
"integrity" "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg=="
"resolved" "https://registry.npmmirror.com/ansi-styles/-/ansi-styles-4.3.0.tgz"
"version" "4.3.0"
@@ -2834,7 +2821,28 @@
"resolved" "https://registry.npmmirror.com/bytes/-/bytes-3.1.2.tgz"
"version" "3.1.2"
"cacache@^12.0.2", "cacache@^12.0.3":
"cacache@^12.0.2":
"integrity" "sha512-a0tMB40oefvuInr4Cwb3GerbL9xTj1D5yg0T5xrjGCGyfvbxseIXX7BAO/u/hIXdafzOI5JC3wDwHyf24buOAQ=="
"resolved" "https://registry.npmmirror.com/cacache/-/cacache-12.0.4.tgz"
"version" "12.0.4"
dependencies:
"bluebird" "^3.5.5"
"chownr" "^1.1.1"
"figgy-pudding" "^3.5.1"
"glob" "^7.1.4"
"graceful-fs" "^4.1.15"
"infer-owner" "^1.0.3"
"lru-cache" "^5.1.1"
"mississippi" "^3.0.0"
"mkdirp" "^0.5.1"
"move-concurrently" "^1.0.1"
"promise-inflight" "^1.0.1"
"rimraf" "^2.6.3"
"ssri" "^6.0.1"
"unique-filename" "^1.1.1"
"y18n" "^4.0.0"
"cacache@^12.0.3":
"integrity" "sha512-a0tMB40oefvuInr4Cwb3GerbL9xTj1D5yg0T5xrjGCGyfvbxseIXX7BAO/u/hIXdafzOI5JC3wDwHyf24buOAQ=="
"resolved" "https://registry.npmmirror.com/cacache/-/cacache-12.0.4.tgz"
"version" "12.0.4"
@@ -3327,7 +3335,14 @@
"map-visit" "^1.0.0"
"object-visit" "^1.0.0"
"color-convert@^1.9.0", "color-convert@^1.9.3":
"color-convert@^1.9.0":
"integrity" "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg=="
"resolved" "https://registry.npmmirror.com/color-convert/-/color-convert-1.9.3.tgz"
"version" "1.9.3"
dependencies:
"color-name" "1.1.3"
"color-convert@^1.9.3":
"integrity" "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg=="
"resolved" "https://registry.npmmirror.com/color-convert/-/color-convert-1.9.3.tgz"
"version" "1.9.3"
@@ -3341,16 +3356,16 @@
dependencies:
"color-name" "~1.1.4"
"color-name@^1.0.0", "color-name@1.1.3":
"integrity" "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw=="
"resolved" "https://registry.npmmirror.com/color-name/-/color-name-1.1.3.tgz"
"version" "1.1.3"
"color-name@~1.1.4":
"color-name@^1.0.0", "color-name@~1.1.4":
"integrity" "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA=="
"resolved" "https://registry.npmmirror.com/color-name/-/color-name-1.1.4.tgz"
"version" "1.1.4"
"color-name@1.1.3":
"integrity" "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw=="
"resolved" "https://registry.npmmirror.com/color-name/-/color-name-1.1.3.tgz"
"version" "1.1.3"
"color-string@^1.6.0":
"integrity" "sha512-shrVawQFojnZv6xM40anx4CkoDP+fZsw/ZerEMsW/pyzsRbElpsL/DBVW7q3ExxwusdNXI3lXpuhEZkzs8p5Eg=="
"resolved" "https://registry.npmmirror.com/color-string/-/color-string-1.9.1.tgz"
@@ -3379,7 +3394,22 @@
dependencies:
"delayed-stream" "~1.0.0"
"commander@*", "commander@^2.18.0", "commander@^2.19.0", "commander@^2.20.0":
"commander@*", "commander@2.17.x":
"integrity" "sha512-wPMUt6FnH2yzG95SA6mzjQOEKUU3aLaDEmzs1ti+1E9h+CsrZghRlqEM/EJ4KscsQVG8uNN4uVreUeT8+drlgg=="
"resolved" "https://registry.npmmirror.com/commander/-/commander-2.17.1.tgz"
"version" "2.17.1"
"commander@^2.18.0":
"integrity" "sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ=="
"resolved" "https://registry.npmmirror.com/commander/-/commander-2.20.3.tgz"
"version" "2.20.3"
"commander@^2.19.0":
"integrity" "sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ=="
"resolved" "https://registry.npmmirror.com/commander/-/commander-2.20.3.tgz"
"version" "2.20.3"
"commander@^2.20.0":
"integrity" "sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ=="
"resolved" "https://registry.npmmirror.com/commander/-/commander-2.20.3.tgz"
"version" "2.20.3"
@@ -3394,11 +3424,6 @@
"resolved" "https://registry.npmmirror.com/commander/-/commander-2.19.0.tgz"
"version" "2.19.0"
"commander@2.17.x":
"integrity" "sha512-wPMUt6FnH2yzG95SA6mzjQOEKUU3aLaDEmzs1ti+1E9h+CsrZghRlqEM/EJ4KscsQVG8uNN4uVreUeT8+drlgg=="
"resolved" "https://registry.npmmirror.com/commander/-/commander-2.17.1.tgz"
"version" "2.17.1"
"commondir@^1.0.1":
"integrity" "sha512-W9pAhw0ja1Edb5GVdIF1mjZw/ASI0AlShXM83UUGe2DVr5TdAPEA1OA8m/g8zWp9x6On7gqufY+FatDbC3MDQg=="
"resolved" "https://registry.npmmirror.com/commondir/-/commondir-1.0.1.tgz"
@@ -4285,7 +4310,7 @@
"resolved" "https://registry.npmmirror.com/domready/-/domready-1.0.8.tgz"
"version" "1.0.8"
"domutils@^1.5.1", "domutils@^1.7.0":
"domutils@^1.5.1":
"integrity" "sha512-Lgd2XcJ/NjEw+7tFvfKxOzCYKZsdct5lczQ2ZaQY8Djz7pfAD3Gbp8ySJWtreII/vDlMVmxwa6pHmdxIYgttDg=="
"resolved" "https://registry.npmmirror.com/domutils/-/domutils-1.7.0.tgz"
"version" "1.7.0"
@@ -4293,16 +4318,15 @@
"dom-serializer" "0"
"domelementtype" "1"
"domutils@^2.5.2":
"integrity" "sha512-w96Cjofp72M5IIhpjgobBimYEfoPjx1Vx0BSX9P30WBdZW2WIKU0T1Bd0kz2eNZ9ikjKgHbEyKx8BB6H1L3h3A=="
"resolved" "https://registry.npmmirror.com/domutils/-/domutils-2.8.0.tgz"
"version" "2.8.0"
"domutils@^1.7.0":
"integrity" "sha512-Lgd2XcJ/NjEw+7tFvfKxOzCYKZsdct5lczQ2ZaQY8Djz7pfAD3Gbp8ySJWtreII/vDlMVmxwa6pHmdxIYgttDg=="
"resolved" "https://registry.npmmirror.com/domutils/-/domutils-1.7.0.tgz"
"version" "1.7.0"
dependencies:
"dom-serializer" "^1.0.1"
"domelementtype" "^2.2.0"
"domhandler" "^4.2.0"
"dom-serializer" "0"
"domelementtype" "1"
"domutils@^2.8.0":
"domutils@^2.5.2", "domutils@^2.8.0":
"integrity" "sha512-w96Cjofp72M5IIhpjgobBimYEfoPjx1Vx0BSX9P30WBdZW2WIKU0T1Bd0kz2eNZ9ikjKgHbEyKx8BB6H1L3h3A=="
"resolved" "https://registry.npmmirror.com/domutils/-/domutils-2.8.0.tgz"
"version" "2.8.0"
@@ -4486,14 +4510,6 @@
"memory-fs" "^0.5.0"
"tapable" "^1.0.0"
"enquirer@>= 2.3.0 < 3":
"integrity" "sha512-ehu97t6FTYK2I3ZYtnp0BZ9vt0mvEL/cnHBds7Ct6jo9VX1VIkiFhOvVRWh6eblQqd7KOoICIQV+syZ3neXO/Q=="
"resolved" "https://registry.npmmirror.com/enquirer/-/enquirer-2.4.0.tgz"
"version" "2.4.0"
dependencies:
"ansi-colors" "^4.1.1"
"strip-ansi" "^6.0.1"
"entities@^1.1.1":
"integrity" "sha512-f2LZMYl1Fzu7YSBKg+RoROelpOaNrcGmE9AZubeDfrCEia483oW4MI4VyFd5VNHIgQ/7qm1I0wUHK1eJnn2y2w=="
"resolved" "https://registry.npmmirror.com/entities/-/entities-1.1.2.tgz"
@@ -4525,7 +4541,7 @@
dependencies:
"stackframe" "^1.3.4"
"es-abstract@^1.17.2", "es-abstract@^1.19.0", "es-abstract@^1.20.4", "es-abstract@^1.21.2":
"es-abstract@^1.19.0", "es-abstract@^1.20.4", "es-abstract@^1.21.2":
"integrity" "sha512-ioRRcXMO6OFyRpyzV3kE1IIBd4WG5/kltnzdxSCqoP8CMGs/Li+M1uF5o7lOkZVFjDs+NLesthnF66Pg/0q0Lw=="
"resolved" "https://registry.npmmirror.com/es-abstract/-/es-abstract-1.22.1.tgz"
"version" "1.22.1"
@@ -5131,6 +5147,11 @@
"resolved" "https://registry.npmmirror.com/file-saver/-/file-saver-2.0.5.tgz"
"version" "2.0.5"
"file-uri-to-path@1.0.0":
"integrity" "sha512-0Zt+s3L7Vf1biwWZ29aARiVYLx7iMGnEUl9x33fbB/j3jR81u/O2LbqK+Bm1CDSNDKVtJ/YjwY7TUd5SkeLQLw=="
"resolved" "https://registry.npmmirror.com/file-uri-to-path/-/file-uri-to-path-1.0.0.tgz"
"version" "1.0.0"
"filesize@^3.6.1":
"integrity" "sha512-7KjR1vv6qnicaPMi1iiTcI85CyYwRO/PSFCu6SvqL8jN2Wjt/NIYQTFtFs7fSDCYOstUkEWIQGFUg5YZQfjlcg=="
"resolved" "https://registry.npmmirror.com/filesize/-/filesize-3.6.1.tgz"
@@ -5473,7 +5494,14 @@
"is-glob" "^3.1.0"
"path-dirname" "^1.0.0"
"glob-parent@^5.0.0", "glob-parent@~5.1.2":
"glob-parent@^5.0.0":
"integrity" "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow=="
"resolved" "https://registry.npmmirror.com/glob-parent/-/glob-parent-5.1.2.tgz"
"version" "5.1.2"
dependencies:
"is-glob" "^4.0.1"
"glob-parent@~5.1.2":
"integrity" "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow=="
"resolved" "https://registry.npmmirror.com/glob-parent/-/glob-parent-5.1.2.tgz"
"version" "5.1.2"
@@ -5676,7 +5704,7 @@
"resolved" "https://registry.npmmirror.com/has-proto/-/has-proto-1.0.1.tgz"
"version" "1.0.1"
"has-symbols@^1.0.1", "has-symbols@^1.0.2", "has-symbols@^1.0.3":
"has-symbols@^1.0.2", "has-symbols@^1.0.3":
"integrity" "sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A=="
"resolved" "https://registry.npmmirror.com/has-symbols/-/has-symbols-1.0.3.tgz"
"version" "1.0.3"
@@ -6315,16 +6343,7 @@
"is-data-descriptor" "^0.1.4"
"kind-of" "^5.0.0"
"is-descriptor@^1.0.0":
"integrity" "sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg=="
"resolved" "https://registry.npmmirror.com/is-descriptor/-/is-descriptor-1.0.2.tgz"
"version" "1.0.2"
dependencies:
"is-accessor-descriptor" "^1.0.0"
"is-data-descriptor" "^1.0.0"
"kind-of" "^6.0.2"
"is-descriptor@^1.0.2":
"is-descriptor@^1.0.0", "is-descriptor@^1.0.2":
"integrity" "sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg=="
"resolved" "https://registry.npmmirror.com/is-descriptor/-/is-descriptor-1.0.2.tgz"
"version" "1.0.2"
@@ -6348,6 +6367,11 @@
"resolved" "https://registry.npmmirror.com/is-extendable/-/is-extendable-0.1.1.tgz"
"version" "0.1.1"
"is-extendable@^0.1.1":
"integrity" "sha512-5BMULNob1vgFX6EjQw5izWDxrecWK9AM72rugNr0TFldMOi0fj6Jk+zeKIt0xGj4cEfQIJth4w3OKWOJ4f+AFw=="
"resolved" "https://registry.npmmirror.com/is-extendable/-/is-extendable-0.1.1.tgz"
"version" "0.1.1"
"is-extendable@^1.0.1":
"integrity" "sha512-arnXMxT1hhoKo9k1LZdmlNyJdDDfy2v0fXjFlmok4+i8ul/6WlbVge9bhM74OpNPQPMGUToDtz+KXa1PneJxOA=="
"resolved" "https://registry.npmmirror.com/is-extendable/-/is-extendable-1.0.1.tgz"
@@ -6549,7 +6573,7 @@
dependencies:
"is-docker" "^2.0.0"
"isarray@^1.0.0", "isarray@~1.0.0", "isarray@1.0.0":
"isarray@^1.0.0":
"integrity" "sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ=="
"resolved" "https://registry.npmmirror.com/isarray/-/isarray-1.0.0.tgz"
"version" "1.0.0"
@@ -6559,6 +6583,16 @@
"resolved" "https://registry.npmmirror.com/isarray/-/isarray-2.0.5.tgz"
"version" "2.0.5"
"isarray@~1.0.0":
"integrity" "sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ=="
"resolved" "https://registry.npmmirror.com/isarray/-/isarray-1.0.0.tgz"
"version" "1.0.0"
"isarray@1.0.0":
"integrity" "sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ=="
"resolved" "https://registry.npmmirror.com/isarray/-/isarray-1.0.0.tgz"
"version" "1.0.0"
"isexe@^2.0.0":
"integrity" "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw=="
"resolved" "https://registry.npmmirror.com/isexe/-/isexe-2.0.0.tgz"
@@ -6767,14 +6801,7 @@
"resolved" "https://registry.npmmirror.com/killable/-/killable-1.0.1.tgz"
"version" "1.0.1"
"kind-of@^3.0.2":
"integrity" "sha512-NOW9QQXMoZGg/oqnVNoNTTIFEIid1627WCffUBJEdMxYApq7mNE7CpzucIPc+ZQg25Phej7IJSmX3hO+oblOtQ=="
"resolved" "https://registry.npmmirror.com/kind-of/-/kind-of-3.2.2.tgz"
"version" "3.2.2"
dependencies:
"is-buffer" "^1.1.5"
"kind-of@^3.0.3":
"kind-of@^3.0.2", "kind-of@^3.0.3":
"integrity" "sha512-NOW9QQXMoZGg/oqnVNoNTTIFEIid1627WCffUBJEdMxYApq7mNE7CpzucIPc+ZQg25Phej7IJSmX3hO+oblOtQ=="
"resolved" "https://registry.npmmirror.com/kind-of/-/kind-of-3.2.2.tgz"
"version" "3.2.2"
@@ -7033,7 +7060,23 @@
"resolved" "https://registry.npmmirror.com/lower-case/-/lower-case-1.1.4.tgz"
"version" "1.1.4"
"lru-cache@^4.0.1", "lru-cache@^4.1.2", "lru-cache@^4.1.5":
"lru-cache@^4.0.1":
"integrity" "sha512-sWZlbEP2OsHNkXrMl5GYk/jKk70MBng6UU4YI/qGDYbgf6YbP4EvmqISbXCoJiRKs+1bSpFHVgQxvJ17F2li5g=="
"resolved" "https://registry.npmmirror.com/lru-cache/-/lru-cache-4.1.5.tgz"
"version" "4.1.5"
dependencies:
"pseudomap" "^1.0.2"
"yallist" "^2.1.2"
"lru-cache@^4.1.2":
"integrity" "sha512-sWZlbEP2OsHNkXrMl5GYk/jKk70MBng6UU4YI/qGDYbgf6YbP4EvmqISbXCoJiRKs+1bSpFHVgQxvJ17F2li5g=="
"resolved" "https://registry.npmmirror.com/lru-cache/-/lru-cache-4.1.5.tgz"
"version" "4.1.5"
dependencies:
"pseudomap" "^1.0.2"
"yallist" "^2.1.2"
"lru-cache@^4.1.5":
"integrity" "sha512-sWZlbEP2OsHNkXrMl5GYk/jKk70MBng6UU4YI/qGDYbgf6YbP4EvmqISbXCoJiRKs+1bSpFHVgQxvJ17F2li5g=="
"resolved" "https://registry.npmmirror.com/lru-cache/-/lru-cache-4.1.5.tgz"
"version" "4.1.5"
@@ -7352,18 +7395,7 @@
"component-query" "^0.0.3"
"domify" "^1.3.1"
"min-dom@^3.1.0":
"integrity" "sha512-v6YCmnDzxk4rRJntWTUiwggLupPw/8ZSRqUq0PDaBwVZEO/wYzCH4SKVBV+KkEvf3u0XaWHly5JEosPtqRATZA=="
"resolved" "https://registry.npmmirror.com/min-dom/-/min-dom-3.2.1.tgz"
"version" "3.2.1"
dependencies:
"component-event" "^0.1.4"
"domify" "^1.3.1"
"indexof" "0.0.1"
"matches-selector" "^1.2.0"
"min-dash" "^3.8.1"
"min-dom@^3.1.3":
"min-dom@^3.1.0", "min-dom@^3.1.3":
"integrity" "sha512-v6YCmnDzxk4rRJntWTUiwggLupPw/8ZSRqUq0PDaBwVZEO/wYzCH4SKVBV+KkEvf3u0XaWHly5JEosPtqRATZA=="
"resolved" "https://registry.npmmirror.com/min-dom/-/min-dom-3.2.1.tgz"
"version" "3.2.1"
@@ -7490,38 +7522,22 @@
"for-in" "^1.0.2"
"is-extendable" "^1.0.1"
"mkdirp@^0.5.1":
"mkdirp@^0.5.1", "mkdirp@^0.5.3", "mkdirp@^0.5.6", "mkdirp@~0.5.1":
"integrity" "sha512-FP+p8RB8OWpF3YZBCrP5gtADmtXApB5AMLn+vdyA+PyxCjrCs00mjyUozssO33cwDeT3wNGdLxJ5M//YqtHAJw=="
"resolved" "https://registry.npmmirror.com/mkdirp/-/mkdirp-0.5.6.tgz"
"version" "0.5.6"
dependencies:
"minimist" "^1.2.6"
"mkdirp@^0.5.3":
"integrity" "sha512-FP+p8RB8OWpF3YZBCrP5gtADmtXApB5AMLn+vdyA+PyxCjrCs00mjyUozssO33cwDeT3wNGdLxJ5M//YqtHAJw=="
"resolved" "https://registry.npmmirror.com/mkdirp/-/mkdirp-0.5.6.tgz"
"version" "0.5.6"
dependencies:
"minimist" "^1.2.6"
"mkdirp@^0.5.6":
"integrity" "sha512-FP+p8RB8OWpF3YZBCrP5gtADmtXApB5AMLn+vdyA+PyxCjrCs00mjyUozssO33cwDeT3wNGdLxJ5M//YqtHAJw=="
"resolved" "https://registry.npmmirror.com/mkdirp/-/mkdirp-0.5.6.tgz"
"version" "0.5.6"
dependencies:
"minimist" "^1.2.6"
"mkdirp@^1.0.3", "mkdirp@^1.0.4":
"mkdirp@^1.0.3":
"integrity" "sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw=="
"resolved" "https://registry.npmmirror.com/mkdirp/-/mkdirp-1.0.4.tgz"
"version" "1.0.4"
"mkdirp@~0.5.1":
"integrity" "sha512-FP+p8RB8OWpF3YZBCrP5gtADmtXApB5AMLn+vdyA+PyxCjrCs00mjyUozssO33cwDeT3wNGdLxJ5M//YqtHAJw=="
"resolved" "https://registry.npmmirror.com/mkdirp/-/mkdirp-0.5.6.tgz"
"version" "0.5.6"
dependencies:
"minimist" "^1.2.6"
"mkdirp@^1.0.4":
"integrity" "sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw=="
"resolved" "https://registry.npmmirror.com/mkdirp/-/mkdirp-1.0.4.tgz"
"version" "1.0.4"
"mockjs@^1.1.0":
"integrity" "sha512-eQsKcWzIaZzEZ07NuEyO4Nw65g0hdWAyurVol1IPl1gahRwY+svqzfgfey8U8dahLwG44d6/RwEzuK52rSa/JQ=="
@@ -7924,7 +7940,7 @@
"define-properties" "^1.1.4"
"es-abstract" "^1.20.4"
"object.getownpropertydescriptors@^2.0.3", "object.getownpropertydescriptors@^2.1.0":
"object.getownpropertydescriptors@^2.0.3":
"integrity" "sha512-lq+61g26E/BgHv0ZTFgRvi7NMEPuAxLkFU7rukXjc/AlwH4Am5xXVnIXy3un1bg/JPbXHrixRkK1itUzzPiIjQ=="
"resolved" "https://registry.npmmirror.com/object.getownpropertydescriptors/-/object.getownpropertydescriptors-2.1.6.tgz"
"version" "2.1.6"
@@ -7994,14 +8010,7 @@
dependencies:
"mimic-fn" "^1.0.0"
"onetime@^5.1.0":
"integrity" "sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg=="
"resolved" "https://registry.npmmirror.com/onetime/-/onetime-5.1.2.tgz"
"version" "5.1.2"
dependencies:
"mimic-fn" "^2.1.0"
"onetime@^5.1.2":
"onetime@^5.1.0", "onetime@^5.1.2":
"integrity" "sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg=="
"resolved" "https://registry.npmmirror.com/onetime/-/onetime-5.1.2.tgz"
"version" "5.1.2"
@@ -8742,7 +8751,7 @@
"source-map" "^0.5.6"
"supports-color" "^3.2.3"
"postcss@^7.0.0":
"postcss@^7.0.0", "postcss@^7.0.1", "postcss@^7.0.14", "postcss@^7.0.27", "postcss@^7.0.32", "postcss@^7.0.36", "postcss@^7.0.5", "postcss@^7.0.6", "postcss@>4 <9":
"integrity" "sha512-yioayjNbHn6z1/Bywyb2Y4s3yvDAeXGOyxqD+LnVOinq6Mdmd++SW2wUNVzavyyHxd6+DxzWGIuosg6P1Rj8uA=="
"resolved" "https://registry.npmmirror.com/postcss/-/postcss-7.0.39.tgz"
"version" "7.0.39"
@@ -8750,63 +8759,16 @@
"picocolors" "^0.2.1"
"source-map" "^0.6.1"
"postcss@^7.0.1":
"integrity" "sha512-yioayjNbHn6z1/Bywyb2Y4s3yvDAeXGOyxqD+LnVOinq6Mdmd++SW2wUNVzavyyHxd6+DxzWGIuosg6P1Rj8uA=="
"resolved" "https://registry.npmmirror.com/postcss/-/postcss-7.0.39.tgz"
"version" "7.0.39"
"postcss@^8.1.10":
"integrity" "sha512-gY/ACJtJPSmUFPDCHtX78+01fHa64FaU4zaaWfuh1MhGJISufJAH4cun6k/8fwsHYeK4UQmENQK+tRLCFJE8JQ=="
"resolved" "https://registry.npmmirror.com/postcss/-/postcss-8.4.27.tgz"
"version" "8.4.27"
dependencies:
"picocolors" "^0.2.1"
"source-map" "^0.6.1"
"nanoid" "^3.3.6"
"picocolors" "^1.0.0"
"source-map-js" "^1.0.2"
"postcss@^7.0.14":
"integrity" "sha512-yioayjNbHn6z1/Bywyb2Y4s3yvDAeXGOyxqD+LnVOinq6Mdmd++SW2wUNVzavyyHxd6+DxzWGIuosg6P1Rj8uA=="
"resolved" "https://registry.npmmirror.com/postcss/-/postcss-7.0.39.tgz"
"version" "7.0.39"
dependencies:
"picocolors" "^0.2.1"
"source-map" "^0.6.1"
"postcss@^7.0.27":
"integrity" "sha512-yioayjNbHn6z1/Bywyb2Y4s3yvDAeXGOyxqD+LnVOinq6Mdmd++SW2wUNVzavyyHxd6+DxzWGIuosg6P1Rj8uA=="
"resolved" "https://registry.npmmirror.com/postcss/-/postcss-7.0.39.tgz"
"version" "7.0.39"
dependencies:
"picocolors" "^0.2.1"
"source-map" "^0.6.1"
"postcss@^7.0.32":
"integrity" "sha512-yioayjNbHn6z1/Bywyb2Y4s3yvDAeXGOyxqD+LnVOinq6Mdmd++SW2wUNVzavyyHxd6+DxzWGIuosg6P1Rj8uA=="
"resolved" "https://registry.npmmirror.com/postcss/-/postcss-7.0.39.tgz"
"version" "7.0.39"
dependencies:
"picocolors" "^0.2.1"
"source-map" "^0.6.1"
"postcss@^7.0.36":
"integrity" "sha512-yioayjNbHn6z1/Bywyb2Y4s3yvDAeXGOyxqD+LnVOinq6Mdmd++SW2wUNVzavyyHxd6+DxzWGIuosg6P1Rj8uA=="
"resolved" "https://registry.npmmirror.com/postcss/-/postcss-7.0.39.tgz"
"version" "7.0.39"
dependencies:
"picocolors" "^0.2.1"
"source-map" "^0.6.1"
"postcss@^7.0.5":
"integrity" "sha512-yioayjNbHn6z1/Bywyb2Y4s3yvDAeXGOyxqD+LnVOinq6Mdmd++SW2wUNVzavyyHxd6+DxzWGIuosg6P1Rj8uA=="
"resolved" "https://registry.npmmirror.com/postcss/-/postcss-7.0.39.tgz"
"version" "7.0.39"
dependencies:
"picocolors" "^0.2.1"
"source-map" "^0.6.1"
"postcss@^7.0.6":
"integrity" "sha512-yioayjNbHn6z1/Bywyb2Y4s3yvDAeXGOyxqD+LnVOinq6Mdmd++SW2wUNVzavyyHxd6+DxzWGIuosg6P1Rj8uA=="
"resolved" "https://registry.npmmirror.com/postcss/-/postcss-7.0.39.tgz"
"version" "7.0.39"
dependencies:
"picocolors" "^0.2.1"
"source-map" "^0.6.1"
"postcss@^8.1.10", "postcss@^8.4.14", "postcss@>4 <9":
"postcss@^8.4.14":
"integrity" "sha512-gY/ACJtJPSmUFPDCHtX78+01fHa64FaU4zaaWfuh1MhGJISufJAH4cun6k/8fwsHYeK4UQmENQK+tRLCFJE8JQ=="
"resolved" "https://registry.npmmirror.com/postcss/-/postcss-8.4.27.tgz"
"version" "8.4.27"
@@ -9388,7 +9350,21 @@
"resolved" "https://registry.npmmirror.com/rgbcolor/-/rgbcolor-1.0.1.tgz"
"version" "1.0.1"
"rimraf@^2.5.4", "rimraf@^2.6.1", "rimraf@^2.6.3":
"rimraf@^2.5.4":
"integrity" "sha512-uWjbaKIK3T1OSVptzX7Nl6PvQ3qAGtKEtVRjRuazjfL3Bx5eI409VZSqgND+4UNnmzLVdPj9FqFJNPqBZFve4w=="
"resolved" "https://registry.npmmirror.com/rimraf/-/rimraf-2.7.1.tgz"
"version" "2.7.1"
dependencies:
"glob" "^7.1.3"
"rimraf@^2.6.1":
"integrity" "sha512-uWjbaKIK3T1OSVptzX7Nl6PvQ3qAGtKEtVRjRuazjfL3Bx5eI409VZSqgND+4UNnmzLVdPj9FqFJNPqBZFve4w=="
"resolved" "https://registry.npmmirror.com/rimraf/-/rimraf-2.7.1.tgz"
"version" "2.7.1"
dependencies:
"glob" "^7.1.3"
"rimraf@^2.6.3":
"integrity" "sha512-uWjbaKIK3T1OSVptzX7Nl6PvQ3qAGtKEtVRjRuazjfL3Bx5eI409VZSqgND+4UNnmzLVdPj9FqFJNPqBZFve4w=="
"resolved" "https://registry.npmmirror.com/rimraf/-/rimraf-2.7.1.tgz"
"version" "2.7.1"
@@ -9616,32 +9592,17 @@
dependencies:
"node-forge" "^0.10.0"
"semver@^5.5.0", "semver@^5.6.0", "semver@2 || 3 || 4 || 5":
"semver@^5.5.0":
"integrity" "sha512-cBznnQ9KjJqU67B52RMC65CMarK2600WFnbkcaiwWq3xy/5haFJlshgnpjovMVJ+Hff49d8GEn0b87C5pDQ10g=="
"resolved" "https://registry.npmmirror.com/semver/-/semver-5.7.2.tgz"
"version" "5.7.2"
"semver@^6.0.0":
"integrity" "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA=="
"resolved" "https://registry.npmmirror.com/semver/-/semver-6.3.1.tgz"
"version" "6.3.1"
"semver@^5.6.0":
"integrity" "sha512-cBznnQ9KjJqU67B52RMC65CMarK2600WFnbkcaiwWq3xy/5haFJlshgnpjovMVJ+Hff49d8GEn0b87C5pDQ10g=="
"resolved" "https://registry.npmmirror.com/semver/-/semver-5.7.2.tgz"
"version" "5.7.2"
"semver@^6.1.0":
"integrity" "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA=="
"resolved" "https://registry.npmmirror.com/semver/-/semver-6.3.1.tgz"
"version" "6.3.1"
"semver@^6.1.2":
"integrity" "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA=="
"resolved" "https://registry.npmmirror.com/semver/-/semver-6.3.1.tgz"
"version" "6.3.1"
"semver@^6.3.0":
"integrity" "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA=="
"resolved" "https://registry.npmmirror.com/semver/-/semver-6.3.1.tgz"
"version" "6.3.1"
"semver@^6.3.1":
"semver@^6.0.0", "semver@^6.1.0", "semver@^6.1.2", "semver@^6.3.0", "semver@^6.3.1":
"integrity" "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA=="
"resolved" "https://registry.npmmirror.com/semver/-/semver-6.3.1.tgz"
"version" "6.3.1"
@@ -9667,6 +9628,11 @@
dependencies:
"lru-cache" "^6.0.0"
"semver@2 || 3 || 4 || 5":
"integrity" "sha512-cBznnQ9KjJqU67B52RMC65CMarK2600WFnbkcaiwWq3xy/5haFJlshgnpjovMVJ+Hff49d8GEn0b87C5pDQ10g=="
"resolved" "https://registry.npmmirror.com/semver/-/semver-5.7.2.tgz"
"version" "5.7.2"
"send@0.18.0":
"integrity" "sha512-qqWzuOjSFOuqPjFe4NOsMLafToQQwBSOEpS+FwEt3A2V3vKubTquT3vmLTQpFgMXp8AlFWFuP1qKaJZOtPpVXg=="
"resolved" "https://registry.npmmirror.com/send/-/send-0.18.0.tgz"
@@ -10344,14 +10310,7 @@
dependencies:
"has-flag" "^3.0.0"
"supports-color@^7.0.0":
"integrity" "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw=="
"resolved" "https://registry.npmmirror.com/supports-color/-/supports-color-7.2.0.tgz"
"version" "7.2.0"
dependencies:
"has-flag" "^4.0.0"
"supports-color@^7.1.0":
"supports-color@^7.0.0", "supports-color@^7.1.0":
"integrity" "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw=="
"resolved" "https://registry.npmmirror.com/supports-color/-/supports-color-7.2.0.tgz"
"version" "7.2.0"
@@ -11004,17 +10963,7 @@
"resolved" "https://registry.npmmirror.com/util-deprecate/-/util-deprecate-1.0.2.tgz"
"version" "1.0.2"
"util.promisify@~1.0.0":
"integrity" "sha512-g9JpC/3He3bm38zsLupWryXHoEcS22YHthuPQSJdMy6KNrzIRzWqcsHzD/WUnqe45whVou4VIsPew37DoXWNrA=="
"resolved" "https://registry.npmmirror.com/util.promisify/-/util.promisify-1.0.1.tgz"
"version" "1.0.1"
dependencies:
"define-properties" "^1.1.3"
"es-abstract" "^1.17.2"
"has-symbols" "^1.0.1"
"object.getownpropertydescriptors" "^2.1.0"
"util.promisify@1.0.0":
"util.promisify@~1.0.0", "util.promisify@1.0.0":
"integrity" "sha512-i+6qA2MPhvoKLuxnJNpXAGhg7HphQOSUq2LKMZD0m15EiskXUkMvKdF4Uui0WYeCUGea+o2cw/ZuwehtfsrNkA=="
"resolved" "https://registry.npmmirror.com/util.promisify/-/util.promisify-1.0.0.tgz"
"version" "1.0.0"
@@ -11322,7 +11271,7 @@
dependencies:
"deepmerge" "^4.2.2"
"vue-plugin-hiprint@^0.0.54-fix":
"vue-plugin-hiprint@0.0.54-fix":
"integrity" "sha512-WVUQdTIsxixS1VFr5nNIa0Hztrb9szJgS3z4MPUvu9gdqdu32lU3Jhux8QBTeVYrjIfNGuiNKNn5WUb+A5RK5Q=="
"resolved" "https://registry.npmmirror.com/vue-plugin-hiprint/-/vue-plugin-hiprint-0.0.54-fix.tgz"
"version" "0.0.54-fix"
@@ -11530,7 +11479,7 @@
"source-list-map" "^2.0.0"
"source-map" "~0.6.1"
"webpack@^1.0.0 || ^2.0.0 || ^3.0.0 || ^4.0.0", "webpack@^2.0.0 || ^3.0.0 || ^4.0.0", "webpack@^3.0.0 || ^4.1.0 || ^5.0.0-0", "webpack@^4.0.0", "webpack@^4.0.0 || ^5.0.0", "webpack@^4.36.0 || ^5.0.0", "webpack@^4.4.0", "webpack@>=2", "webpack@>=2.0.0 <5.0.0", "webpack@>=4.0.0":
"webpack@^1.0.0 || ^2.0.0 || ^3.0.0 || ^4.0.0", "webpack@^2.0.0 || ^3.0.0 || ^4.0.0", "webpack@^3.0.0 || ^4.1.0 || ^5.0.0-0", "webpack@^4.0.0", "webpack@^4.0.0 || ^5.0.0", "webpack@^4.1.0 || ^5.0.0-0", "webpack@^4.36.0 || ^5.0.0", "webpack@^4.4.0", "webpack@>=2", "webpack@>=2.0.0 <5.0.0", "webpack@>=4.0.0":
"integrity" "sha512-6jJuJjg8znb/xRItk7bkT0+Q7AHCYjjFnvKIWQPkNIOyRqoCGvkOs0ipeQzrqz4l5FtN5ZI/ukEHroeX/o1/5Q=="
"resolved" "https://registry.npmmirror.com/webpack/-/webpack-4.46.0.tgz"
"version" "4.46.0"
@@ -11680,7 +11629,14 @@
dependencies:
"mkdirp" "^0.5.1"
"ws@^6.0.0", "ws@^6.2.1":
"ws@^6.0.0":
"integrity" "sha512-zmhltoSR8u1cnDsD43TX59mzoMZsLKqUweyYBAIvTngR3shc0W6aOZylZmq/7hqyVxPdi+5Ud2QInblgyE72fw=="
"resolved" "https://registry.npmmirror.com/ws/-/ws-6.2.2.tgz"
"version" "6.2.2"
dependencies:
"async-limiter" "~1.0.0"
"ws@^6.2.1":
"integrity" "sha512-zmhltoSR8u1cnDsD43TX59mzoMZsLKqUweyYBAIvTngR3shc0W6aOZylZmq/7hqyVxPdi+5Ud2QInblgyE72fw=="
"resolved" "https://registry.npmmirror.com/ws/-/ws-6.2.2.tgz"
"version" "6.2.2"