Merge remote-tracking branch 'origin/material-ui' into material-ui

This commit is contained in:
hayu 2025-05-25 10:53:41 +08:00
commit 8b898aada4
141 changed files with 8466 additions and 4104 deletions

View File

@ -4,5 +4,7 @@ VUE_APP_TITLE = 智能机具管理系统
# 生产环境配置
ENV = 'production'
# 智能机具管理系统/生产环境
VUE_APP_BASE_API = '/prod-api'
# 智能机具管理系统/生产环境-公司
# VUE_APP_BASE_API = '/prod-api'
# 智能机具管理系统/宏源环境
VUE_APP_BASE_API = '/iws/jiju-api'

View File

@ -361,6 +361,12 @@ export function getMachineByQrCode(query) {
})
}
// 获取i8工程类型
export function getI8ProjectList(params) {
return request({
url: '/material/bm_project/getProjectList',
method: 'get',
params
})
}

View File

@ -0,0 +1,44 @@
import request from '@/utils/request'
// 获取卡片列表信息
export const getCardListApi = data => {
return request({
url: '/material/mainPage/demandAndSupply',
method: 'get',
params: data
})
}
// 获取第二行卡片列表信息
export const getCardList_2Api = data => {
return request({
url: '/material//mainPage/getMaTypeHomeList',
method: 'get',
params: data
})
}
// 获取饼图1数据信息
export const getPie_1DataApi = data => {
return request({
url: '/material/mainPage/getDemandTotal',
method: 'get',
params: data
})
}
// 获取饼图2数据信息
export const getPie_2DataApi = data => {
return request({
url: '/material/mainPage/getMaTypeStatusTotal',
method: 'get',
params: data
})
}
// 获取柱状图和折线图数据信息
export const getBarAndLineDataApi = data => {
return request({
url: '/material/mainPage/getDemandList',
method: 'get',
params: data
})
}

View File

@ -0,0 +1,19 @@
import request from '@/utils/request';
// 总计数量
export const getRepairHomeTotalListApi = params => {
return request({
url: '/material/repair_audit_details/getRepairHomeTotalList',
method: 'get',
params
});
};
// 列表
export const getRepairHomeListApi = params => {
return request({
url: '/material/repair_audit_details/getRepairHomeList',
method: 'get',
params
});
};

View File

@ -96,3 +96,16 @@ export function getCodeImg() {
timeout: 20000
})
}
// iws登录
export function iwsLogin(data) {
return request({
url: '/auth/iwsLogin',
headers: {
isToken: false,
repeatSubmit: false
},
method: 'post',
data
})
}

View File

@ -71,3 +71,27 @@ export function getProjectList(query) {
})
}
// 设备管理--获取报告编号信息
export function getSynchReportCode(data) {
return request({
url: '/material/ma_machine/getReport',
method: 'post',
data: data,
})
}
// 设备管理--同步检验报告
export function synchReport(data) {
return request({
url: '/material/ma_machine/synchReport',
method: 'post',
data: data,
})
}
export function editAssetsCode(data) {
return request({
url: '/material/ma_machine/editAssetsCode',
method: 'post',
data: data,
})
}

View File

@ -27,7 +27,7 @@ export function bindKeeper(data) {
})
}
// 库管员管理--
// 库管员管理--
export function noBindKeeper(data) {
return request({
url: '/material/ma_type_keeper/unbind',

View File

@ -68,9 +68,14 @@ export function getPurchaseCheckFormByTaskId(taskId) {
})
}
// 验收人查询
export function getCheckUserList(query) {
return request({
url: '/material/purchase_check_info/getCheckUserList',
method: 'get',
params: query
})
}

View File

@ -73,10 +73,11 @@ export function bmNoticeInfo(data) {
//通知-添加人员-未选择人员
export function getListUnSelected() {
export function getListUnSelected(params) {
return request({
url: '/material/purchase_notice_person/listUnSelected',
method: 'get',
params,
})
}
// 通知人员--删除

View File

@ -0,0 +1,18 @@
import request from '@/utils/request'
// 获取列表
export const getTableListApi = data => {
return request({
url: '/material/back_apply_info/selectBackApplyList',
method: 'get',
params: data
})
}
// 获取退料数量详情
export const getReturnNumDetailsApi = data => {
return request({
url: '/material/back_apply_info/selectSecondList',
method: 'get',
params: data
})
}

View File

@ -0,0 +1,10 @@
import request from '@/utils/request'
// 获取列表
export const getTableListApi = data => {
return request({
url: '/material/complex_query/getMaTypeSelectList',
method: 'get',
params: data
})
}

View File

@ -0,0 +1,19 @@
import request from '@/utils/request'
// 获取列表
export const getTableListApi = data => {
return request({
url: '/material/repair/selectRepairPartList',
method: 'get',
params: data
})
}
// 获取使用数量详情
export const getUseNumDetailsApi = data => {
return request({
url: '/material/repair/selectSecondRepairPartList',
method: 'get',
params: data
})
}

View File

@ -25,6 +25,32 @@ export function getPurChaseReportDetailsListApi(query) {
})
}
// 新购入库验收合格报表-弹窗查询
export function getPurChaseReportSuccessListApi(query) {
return request({
url: '/material/bm_report/getPurChaseReportSuccessList',
method: 'get',
params: query
})
}
// 新购入库数量报表-弹窗查询
export function getPurChaseReportInBoundListApi(query) {
return request({
url: '/material/bm_report/getPurChaseReportInBoundList',
method: 'get',
params: query
})
}
// 新购入库数量报表-弹窗查询
export function getPurChaseReportNotInBoundListApi(query) {
return request({
url: '/material/bm_report/getPurChaseReportNotInBoundList',
method: 'get',
params: query
})
}
// 领料出库报表查询
export function getLeaseOutListApi(query) {
@ -126,4 +152,31 @@ export function getRepairInputDetailsListApi(query) {
method: 'get',
params: query
})
}
// 报废报表-列表
export function getScrapListApi(query) {
return request({
url: '/material/bm_report/getScrapList',
method: 'get',
params: query
})
}
// 报废报表-总条数
export function getScrapListNoPageApi(query) {
return request({
url: '/material/bm_report/getScrapListNoPage',
method: 'get',
params: query
})
}
// 报废报表-弹窗查询
export function getScrapDetailsListApi(query) {
return request({
url: '/material/bm_report/getScrapDetailsList',
method: 'get',
params: query
})
}

View File

@ -0,0 +1 @@
<svg t="1742539542068" class="icon" viewBox="0 0 1024 1024" version="1.1" xmlns="http://www.w3.org/2000/svg" p-id="22600" width="200" height="200"><path d="M237.58 740.23L176.66 753 67.24 917.89l20.6 20.49 20.6 20.52 166.14-108.72 12.91-60.48L424.13 654l-49.78-49.53z m595.84-620.88a14.84 14.84 0 0 1 20.92 0 14.5 14.5 0 0 1 0 20.8L614.63 378.23 652 415.38 891.67 177.3a14.87 14.87 0 0 1 21 0 14.5 14.5 0 0 1 0 20.81l-239.7 238 33.57 33.31c0.57-0.53 1.15-0.84 1.72-1.45l25.36-25.17 203.19-201.7a102.4 102.4 0 0 0 0-145.68 104.24 104.24 0 0 0-146.75 0L588.12 295.84l-26.64 26.48c-0.51 0.6-0.9 1.23-1.4 1.76l33.51 33.37zM488.23 312.28a210.73 210.73 0 0 0 2.6-56.88 207 207 0 0 0-60.53-128.57C368.17 65.21 277 50.28 200.7 81.91L324 204.19a47.14 47.14 0 0 1-0.07 66.9l-51.44 51a47.68 47.68 0 0 1-67.14 0L84.78 202.4a207.13 207.13 0 0 0 48.39 219.39 209.7 209.7 0 0 0 115.92 58.33 213.3 213.3 0 0 0 60.66 0.63c128.25 127.44 445 441.9 445 441.9 48.06 47.64 126.14 47.64 174.15 0a121.54 121.54 0 0 0-0.07-172.85zM891 885a64.55 64.55 0 0 1-90.8 0.07 63.5 63.5 0 0 1 0.07-90 64.59 64.59 0 0 1 90.66 0 63.23 63.23 0 0 1 0.07 90z m0 0" fill="#ffffff" p-id="22601"></path></svg>

After

Width:  |  Height:  |  Size: 1.1 KiB

View File

@ -0,0 +1 @@
<svg t="1742539407635" class="icon" viewBox="0 0 1058 1024" version="1.1" xmlns="http://www.w3.org/2000/svg" p-id="18439" width="200" height="200"><path d="M1041.066667 361.813333l-484.693334-341.333333c-3.413333-3.413333-6.826667-6.826667-13.653333-10.24-13.653333-6.826667-34.133333-3.413333-44.373333 13.653333l-481.28 337.92c-13.653333 10.24-17.066667 34.133333-3.413334 51.2s34.133333 23.893333 47.786667 13.653334l34.133333-23.893334v559.786667c0 20.48 17.066667 37.546667 37.546667 37.546667s37.546667-17.066667 37.546667-37.546667v-614.4l358.4-252.586667 365.226666 256v607.573334c0 20.48 17.066667 37.546667 37.546667 37.546666s37.546667-17.066667 37.546667-37.546666v-556.373334l27.306666 17.066667c13.653333 10.24 37.546667 3.413333 47.786667-13.653333 13.653333-13.653333 10.24-34.133333-3.413333-44.373334z m-679.253334 27.306667h-81.92c-30.72 0-37.546667 6.826667-37.546666 37.546667v85.333333c0 30.72 6.826667 37.546667 37.546666 37.546667h81.92c30.72 0 37.546667-6.826667 37.546667-37.546667v-85.333333c0-30.72-6.826667-37.546667-37.546667-37.546667z m0 204.8h-81.92c-30.72 0-37.546667 6.826667-37.546666 37.546667v85.333333c0 30.72 6.826667 37.546667 37.546666 37.546667h81.92c30.72 0 37.546667-6.826667 37.546667-37.546667v-85.333333c0-30.72-6.826667-37.546667-37.546667-37.546667z m0 208.213333h-81.92c-30.72 0-37.546667 6.826667-37.546666 37.546667v85.333333c0 30.72 6.826667 37.546667 37.546666 37.546667h81.92c30.72 0 37.546667-6.826667 37.546667-37.546667v-85.333333c0-34.133333-6.826667-37.546667-37.546667-37.546667z m215.04 0h-81.92c-30.72 0-37.546667 6.826667-37.546666 37.546667v85.333333c0 30.72 6.826667 37.546667 37.546666 37.546667h81.92c30.72 0 37.546667-6.826667 37.546667-37.546667v-85.333333c0-34.133333-6.826667-37.546667-37.546667-37.546667z m215.04 0h-81.92c-30.72 0-37.546667 6.826667-37.546666 37.546667v85.333333c0 30.72 6.826667 37.546667 37.546666 37.546667h81.92c30.72 0 37.546667-6.826667 37.546667-37.546667v-85.333333c3.413333-34.133333-3.413333-37.546667-37.546667-37.546667z m-215.04-208.213333h-81.92c-30.72 0-37.546667 6.826667-37.546666 37.546667v85.333333c0 30.72 6.826667 37.546667 37.546666 37.546667h81.92c30.72 0 37.546667-6.826667 37.546667-37.546667v-85.333333c0-30.72-6.826667-37.546667-37.546667-37.546667z" fill="#ffffff" p-id="18440"></path></svg>

After

Width:  |  Height:  |  Size: 2.3 KiB

View File

@ -0,0 +1 @@
<svg t="1742539490318" class="icon" viewBox="0 0 1024 1024" version="1.1" xmlns="http://www.w3.org/2000/svg" p-id="20926" width="200" height="200"><path d="M910.208 0H113.792A114.304 114.304 0 0 0 0 113.792v796.416A114.048 114.048 0 0 0 113.792 1024h796.416A114.048 114.048 0 0 0 1024 910.208V113.792A114.176 114.176 0 0 0 910.208 0zM256 768H192v-64h64v64z m0-256H192V448h64v64z m78.272-329.6L214.08 302.208l-6.848 6.848-6.784-6.848-80.256-80.704-6.848-6.784 27.904-27.904 6.848 6.848 59.392 59.584 99.136-98.944L313.6 147.2l6.4 7.104 14.464 14.272 6.848 6.784zM896 768H448v-64h448v64z m0-256H448V448h448v64z m0-256H448V192h448v64z m0 0" fill="#ffffff" p-id="20927"></path></svg>

After

Width:  |  Height:  |  Size: 679 B

File diff suppressed because one or more lines are too long

After

Width:  |  Height:  |  Size: 9.4 KiB

View File

@ -0,0 +1 @@
<svg t="1742541057763" class="icon" viewBox="0 0 1024 1024" version="1.1" xmlns="http://www.w3.org/2000/svg" p-id="37262" width="200" height="200"><path d="M771.512499 509.49597 511.614214 959.653483 251.715929 509.49597 414.441057 509.49597 414.441057 64.132646 608.786347 64.132646 608.786347 509.49597Z" p-id="37263" fill="#ffffff"></path></svg>

After

Width:  |  Height:  |  Size: 348 B

View File

@ -0,0 +1 @@
<svg t="1742539612234" class="icon" viewBox="0 0 1024 1024" version="1.1" xmlns="http://www.w3.org/2000/svg" p-id="24591" width="200" height="200"><path d="M886.525028 478.637873v-39.369867L497.811509 141.62926 109.09799 439.204094v550.666833H0.703033V380.660592L497.811509 0l497.108476 380.660592v97.977281z" fill="#ffffff" p-id="24592"></path><path d="M769.118462 740.038447h232.000999v-102.259393H774.678817l54.133566-54.133567-72.284609-72.34852L575.912121 691.91262l72.284608 72.348521 0.255649-0.255649 108.458869 108.394957 72.348521-72.220696-60.077394-60.141306zM192.439396 512.703033h191.736362v191.736363H192.439396zM194.484584 794.619398h191.736362v191.736363h-191.736362zM446.426164 794.875047h191.736363v191.736362h-191.736363z" fill="#ffffff" p-id="24593"></path></svg>

After

Width:  |  Height:  |  Size: 784 B

View File

@ -0,0 +1 @@
<svg t="1742540230283" class="icon" viewBox="0 0 1024 1024" version="1.1" xmlns="http://www.w3.org/2000/svg" p-id="30256" width="200" height="200"><path d="M907.647015 65.802682l-172.019819 0c-18.984377 0-34.403554 15.45397-34.403554 34.403554l0 825.697585c0 18.949584 15.419178 34.403554 34.403554 34.403554l172.019819 0c18.949584 0 34.403554-15.45397 34.403554-34.403554l0-825.697585C942.05057 81.257675 926.5966 65.802682 907.647015 65.802682zM873.242438 891.500267 770.030751 891.500267l0-756.889453 103.211686 0L873.242438 891.500267z" fill="#ffffff" p-id="30257"></path><path d="M598.009909 272.227078l-172.019819 0c-18.984377 0-34.403554 15.45397-34.403554 34.403554l0 619.273189c0 18.949584 15.419178 34.403554 34.403554 34.403554l172.019819 0c18.949584 0 34.404578-15.45397 34.404578-34.403554l0-619.273189C632.414487 287.682072 616.959493 272.227078 598.009909 272.227078z" fill="#ffffff" p-id="30258"></path><path d="M288.373827 478.651474 116.352985 478.651474c-18.984377 0-34.403554 15.45397-34.403554 34.403554l0 412.848793c0 18.949584 15.419178 34.403554 34.403554 34.403554l172.020842 0c18.949584 0 34.403554-15.45397 34.403554-34.403554l0-412.848793C322.777381 494.106468 307.323411 478.651474 288.373827 478.651474z" fill="#ffffff" p-id="30259"></path></svg>

After

Width:  |  Height:  |  Size: 1.2 KiB

View File

@ -0,0 +1 @@
<svg t="1742540367711" class="icon" viewBox="0 0 1024 1024" version="1.1" xmlns="http://www.w3.org/2000/svg" p-id="31467" width="200" height="200"><path d="M512 693.76c301.44 0 464-80.64 464-113.28v-134.4c-107.52 58.24-289.92 85.76-464 85.76S155.52 504.32 48 446.08v134.4c0 32.64 162.56 113.28 464 113.28zM48 704v128c0 138.88 291.84 176 464 176s464-37.12 464-176v-128c-107.52 58.24-289.92 85.76-464 85.76S155.52 762.24 48 704zM512 435.84c301.44 0 464-80.64 464-113.28V192C976 53.12 684.16 16 512 16S48 53.12 48 192v130.56c0 32.64 162.56 113.28 464 113.28z" p-id="31468" fill="#ffffff"></path></svg>

After

Width:  |  Height:  |  Size: 598 B

View File

@ -0,0 +1 @@
<svg t="1742539701402" class="icon" viewBox="0 0 1024 1024" version="1.1" xmlns="http://www.w3.org/2000/svg" p-id="26008" width="200" height="200"><path d="M915.667 959.062H108.333V365.29L512 64.938 915.667 365.29v584.627H835.33V405.651L512 165.074 188.67 405.651v473.074h726.997z" p-id="26009" fill="#ffffff"></path><path d="M689.289 852.614c-21.68 0-47.693-8.67-60.699-26.013L498.52 696.535h-4.336c-17.342 4.333-34.686 8.67-52.025 8.67-13.01 0-26.016 0-39.022-4.336-34.686-8.67-65.035-26.013-91.048-52.026-43.355-43.359-65.035-108.39-52.028-173.424 4.336-17.343 17.342-30.349 30.349-34.686h13.009c13.006 0 21.676 4.336 30.349 13.006l43.355 43.355c4.333 8.673 13.006 13.01 21.676 13.01 8.673 0 17.342-4.337 21.679-8.674 13.007-13.006 13.007-34.686 0-47.692l-47.692-43.355c-8.67-13.007-13.007-30.349-8.67-47.692 4.333-17.343 17.339-26.013 34.682-30.349 13.009-4.336 26.015-4.336 39.022-4.336 52.025 0 99.717 21.679 134.402 56.365 26.013 26.013 43.356 56.362 52.029 91.048 8.67 30.348 4.336 65.034-4.336 91.047v4.336l130.069 130.067C767.33 718.21 776 739.89 776 761.567c0 21.679-8.67 47.692-26.013 60.698-17.342 21.679-39.022 30.349-60.698 30.349zM498.521 640.169c13.007 0 26.013 4.336 30.349 13.007l134.403 134.406c4.336 4.333 13.006 8.67 21.679 8.67 8.67 0 17.343-4.337 21.676-8.67 4.336-4.336 8.673-13.006 8.673-21.679 0-8.67-4.336-17.343-8.673-21.68L576.562 609.82c-13.006-13.006-17.342-30.348-13.006-47.692 8.67-21.676 8.67-47.692 4.333-73.705-4.333-26.013-17.339-47.692-34.682-65.035-26.015-26.013-56.365-39.019-86.714-39.019H429.15l34.686 34.682c17.343 17.343 26.013 39.022 26.013 60.702 0 21.676-8.67 47.688-26.013 60.698-17.342 17.343-43.355 26.013-65.034 26.013-21.676 0-47.693-8.669-60.699-26.013l-34.682-34.686v17.343c0 34.686 17.339 65.035 39.019 86.711 17.342 17.343 43.355 30.349 65.035 39.022 8.67 0 17.342 4.334 30.349 4.334 13.006 0 30.348-4.334 43.355-8.67 4.336-4.336 8.669-4.336 17.342-4.336z m0 0" p-id="26010" fill="#ffffff"></path></svg>

After

Width:  |  Height:  |  Size: 1.9 KiB

View File

@ -0,0 +1 @@
<?xml version="1.0" standalone="no"?><!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd"><svg t="1742881479198" class="icon" viewBox="0 0 1024 1024" version="1.1" xmlns="http://www.w3.org/2000/svg" p-id="6451" xmlns:xlink="http://www.w3.org/1999/xlink" width="256" height="256"><path d="M653 294.8v164.8h-60V380c22.4-33.6 29.2-75.6 17.2-115h12.8c16.6-0.2 30 13.2 30 29.8z m256-42.2l-58.6-112.4c-5.2-10-15.4-16.2-26.6-16.2H558.4l22.2 60h225l42.2 80.8h-80.2c-16.6 0-30 13.4-30 30v155.4h60v-125.4h71c17.6 0 33.6-9.6 41.8-25 8-15 7.4-32.8-1.4-47.2zM427.2 852.4V484.6c0-7.4 3-14.6 8.4-19.6l103.6-98.2c25.2-23.8 33.6-60.2 21.6-92.6l-59.8-161c-4.4-11.8-15.6-19.6-28.2-19.6h-109.4c-16.6 0-30 13.4-30 30v112.8h-32V123.4c0-16.6-13.4-30-30-30H162c-12.6 0-23.8 7.8-28.2 19.6L74.2 274c-12 32.4-3.6 68.8 21.6 92.6l103.6 98.2c5.4 5 8.4 12.2 8.4 19.6v367.8c0 16.6 13.4 30 30 30h159.4c16.4 0.2 30-13.4 30-29.8z m-159.4-367.8c0-23.8-9.8-46.8-27.2-63.2l-103.6-98.2c-7.6-7.2-10.2-18.4-6.6-28.2l52.4-141.4h58.4v112.8c0 16.6 13.4 30 30 30h92c16.6 0 30-13.4 30-30V153.4H452l52.4 141.4c3.6 9.8 1 21-6.6 28.2l-103.6 98.2c-17.2 16.4-27.2 39.4-27.2 63.2v337.8h-99.4V484.6z m425.6 354.2c16.6 0 30-13.4 30-30v-90c0-16.6-13.4-30-30-30s-30 13.4-30 30v90c0 16.6 13.4 30 30 30z m104.4 0c16.6 0 30-13.4 30-30v-90c0-16.6-13.4-30-30-30s-30 13.4-30 30v90c0 16.6 13.4 30 30 30zM955.2 626H928v235.2c0 38.2-31.2 69.4-69.4 69.4h-226c-38.2 0-69.4-31.2-69.4-69.4V626H536v-60h86.8v-45.6c0-16.6 13.4-30 30-30h185.6c16.6 0 30 13.4 30 30V566h86.8v60z m-272.4-60h125.6v-15.6h-125.6v15.6z m185 60H623.4v235.2c0 5.2 4.2 9.4 9.4 9.4h225.8c5.2 0 9.4-4.2 9.4-9.4V626z" p-id="6452" fill="#ffffff"></path></svg>

After

Width:  |  Height:  |  Size: 1.7 KiB

View File

@ -0,0 +1 @@
<svg t="1742539074118" class="icon" viewBox="0 0 1024 1024" version="1.1" xmlns="http://www.w3.org/2000/svg" p-id="11357" width="200" height="200"><path d="M128.365987 896.000012h-18.119998c-15.685998 0-29.059997-12.038999-31.582997-28.430997L0.422 359.333065c-2.844-18.468998 8.991999-35.879996 26.434997-38.891996 1.7-0.293 3.422-0.44 5.148-0.44h12.631999l132.838987-217.129979c5.772999-9.402999 14.179999-15.068999 23.166997-15.616999 8.986999-0.6 17.736998 4.027 24.074998 12.729999l70.742993 96.345991L401.139961 16.364098c5.699999-9.667999 14.144999-15.579998 23.231998-16.261998 9.105999-0.863 18.029998 3.777 24.396997 12.689999L674.331934 320.000069h18.395998c17.672998 0 31.999997 15.169999 31.999997 33.881996 0 1.826-0.14 3.65-0.417 5.451L710.660931 448.000056h151.089985A63.999994 63.999994 0 0 1 914.999911 476.496053l98.24899 147.351986A63.999994 63.999994 0 0 1 1023.9999 659.352036V864.000016c0 17.672998-14.326999 31.999997-31.999997 31.999996h-95.633991c0 70.691993-57.306994 127.999988-127.999987 127.999988-70.691993 0-127.999988-57.307994-127.999988-127.999988h-255.999975c0 70.691993-57.306994 127.999988-127.999987 127.999988-70.691993 0-127.999988-57.307994-127.999988-127.999988z m639.999938-384.015962v191.999981l191.999981 0.016v-44.647995L862.116916 512.00005l-93.750991-0.016z m-470.359954-14.689999c-15.305999-8.837999-34.876997-3.594-43.712996 11.710999l-95.99999 166.276984c-8.836999 15.305999-3.593 34.875997 11.711998 43.712996 15.305999 8.836999 34.876997 3.593 43.712996-11.712999l95.999991-166.276984c8.836999-15.304999 3.593-34.875997-11.712999-43.711996z m255.999975 0c-15.305999-8.837999-34.876997-3.594-43.712996 11.710999l-95.99999 166.276984c-8.836999 15.305999-3.593 34.875997 11.711998 43.712996 15.305999 8.836999 34.876997 3.593 43.712996-11.712999l95.999991-166.276984c8.836999-15.304999 3.593-34.875997-11.712999-43.711996zM768.364925 960.000006c35.346997 0 63.999994-28.653997 63.999994-63.999994 0-35.345997-28.652997-63.999994-63.999994-63.999993-35.345997 0-63.999994 28.653997-63.999994 63.999993 0 35.345997 28.653997 63.999994 63.999994 63.999994z m-511.99995 0c35.346997 0 63.999994-28.653997 63.999994-63.999994 0-35.345997-28.652997-63.999994-63.999994-63.999993-35.345997 0-63.999994 28.653997-63.999994 63.999993 0 35.345997 28.653997 63.999994 63.999994 63.999994z" fill="#ffffff" p-id="11358"></path></svg>

After

Width:  |  Height:  |  Size: 2.3 KiB

View File

@ -0,0 +1 @@
<svg t="1742539321980" class="icon" viewBox="0 0 1024 1024" version="1.1" xmlns="http://www.w3.org/2000/svg" p-id="17386" width="200" height="200"><path d="M202 345.4L69 549.8a21.2 21.2 0 0 0-3.4 11.5V802c0 6.7 5.5 12.2 12.2 12.2h22.9c4.5 58.8 53.2 105.3 113.1 105.3 60 0 108.6-46.5 113.1-105.3h67.5V336.7H218c-6.4 0-12.5 3.3-16 8.7z m28.9 97.5h127.4c2 0 3.6 1.6 3.6 3.6v105.9c0 1.9-1.6 3.5-3.5 3.5H156.5c-1.7 0-2.8-1.9-1.8-3.4l69.2-106c1.6-2.2 4.2-3.6 7-3.6zM726 691.5c-63 0-114 51-114 114s51 114 114 114 114-51 114-114-51.1-114-114-114z" fill="#ffffff" p-id="17387"></path><path d="M899.1 131.4H454.3c-33 0-59.8 26.8-59.8 59.8v623h504.6c33 0 59.8-26.8 59.8-59.8V191.2c0-33-26.7-59.8-59.8-59.8z" fill="#ffffff" p-id="17388"></path></svg>

After

Width:  |  Height:  |  Size: 738 B

View File

@ -0,0 +1 @@
<svg t="1742540424683" class="icon" viewBox="0 0 1024 1024" version="1.1" xmlns="http://www.w3.org/2000/svg" p-id="34260" width="200" height="200"><path d="M512 2.327273C230.4 2.327273 2.327273 230.4 2.327273 512S230.4 1021.672727 512 1021.672727c281.6 0 509.672727-228.072727 509.672727-509.672727S793.6 2.327273 512 2.327273z m139.636364 518.981818v46.545454h-100.072728v44.218182H651.636364v46.545455h-100.072728v90.763636h-81.454545v-90.763636h-100.072727v-46.545455h100.072727v-44.218182h-100.072727v-46.545454h74.472727l-116.363636-209.454546h93.090909v2.327273l88.436363 176.872727 88.436364-179.2h93.090909l-116.363636 209.454546H651.636364z" fill="#ffffff" p-id="34261"></path></svg>

After

Width:  |  Height:  |  Size: 692 B

View File

@ -0,0 +1 @@
<svg t="1742541104200" class="icon" viewBox="0 0 1024 1024" version="1.1" xmlns="http://www.w3.org/2000/svg" p-id="39079" width="200" height="200"><path d="M771.512499 514.290159 511.614214 64.132646 251.715929 514.290159 414.441057 514.290159 414.441057 959.653483 608.786347 959.653483 608.786347 514.290159Z" p-id="39080" fill="#ffffff"></path></svg>

After

Width:  |  Height:  |  Size: 353 B

BIN
src/assets/img/pdf.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 3.4 KiB

View File

@ -95,9 +95,21 @@ export default {
cancelButtonText: '取消',
type: 'warning'
}).then(() => {
this.$store.dispatch('LogOut').then(() => {
location.href = '/index';
})
// this.$store.dispatch('LogOut').then(() => {
// location.href = '/index';
// })
console.log('🚀 ~ process.env.VUE_APP_BASE_API:', process.env.VUE_APP_BASE_API)
if (process.env.VUE_APP_BASE_API == '/iws/jiju-api') {
setTimeout(() => {
window.location.replace(
'http://sgwpdm.ah.sgcc.com.cn/iws/',
)
}, 500)
} else {
this.$store.dispatch('LogOut').then(() => {
location.href = '/login'
})
}
}).catch(() => {});
}
}

View File

@ -52,6 +52,9 @@ Vue.prototype.downloadJson = downloadJson
Vue.prototype.handleTree = handleTree
Vue.prototype.indexContinuation = indexContinuation
Vue.prototype.globalUrl = global_
// 全局设置element-ui Dialog组件的close-on-click-modal close-on-press-escape属性为false
Element.Dialog.props.closeOnClickModal.default = false
Element.Dialog.props.closeOnPressEscape.default = false
// 全局组件挂载
Vue.component('DictTag', DictTag)
Vue.component('Pagination', Pagination)

View File

@ -64,13 +64,14 @@ export const constantRoutes = [
{
path: '',
component: Layout,
redirect: 'index',
redirect: 'home/equipment-supply',
children: [
{
path: 'index',
component: () => import('@/views/index'),
path: 'home/equipment-supply',
component: () => import('@/views/home/equipment-supply/index.vue'),
name: 'Index',
meta: { title: '首页', icon: 'dashboard', affix: true }
meta: { title: '首页', icon: 'dashboard', affix: true },
hidden: true
}
]
},
@ -243,7 +244,8 @@ Router.prototype.replace = function push(location) {
}
export default new Router({
mode: 'history', // 去掉url中的#
// mode: 'history', // 去掉url中的#
mode: process.env.VUE_APP_BASE_API == '/iws/jiju-api' ? 'hash' : 'history', // 宏源: hash
scrollBehavior: () => ({ y: 0 }),
routes: constantRoutes
})

View File

@ -2,7 +2,7 @@ import { getConfig } from '@/api/config';
export function get() {
getConfig()
.then(response => {
console.log(response)
// console.log(response)
localStorage.setItem('systemConfig', JSON.stringify(response.data));
})
.catch(error => {

View File

@ -7,6 +7,8 @@ import { tansParams, blobValidate } from '@/utils/bonus'
import cache from '@/plugins/cache'
import { saveAs } from 'file-saver'
import { decryptWithSM4, encryptWithSM4, hashWithSM3AndSalt } from '@/utils/sm'
import router from '@/router'
const systemConfig = JSON.parse(localStorage.getItem('systemConfig')) || {
requestConfig: { encryptRequest: false, checkIntegrity: false, encryptResponse: false }
};
@ -108,19 +110,24 @@ service.interceptors.response.use(res => {
return res.data
}
if (code === 401) {
if (!isRelogin.show) {
isRelogin.show = true
MessageBox.confirm('登录状态已过期,您可以继续留在该页面,或者重新登录', '系统提示', {
confirmButtonText: '重新登录',
cancelButtonText: '取消',
type: 'warning'
}).then(() => {
isRelogin.show = false
store.dispatch('LogOut').then(() => {
location.href = '/index'
})
console.log('🚀 ~ process.env.VUE_APP_BASE_API:', process.env.VUE_APP_BASE_API)
if (process.env.VUE_APP_BASE_API == '/iws/jiju-api') {
store.dispatch('LogOut').then(() => {
}).catch((err) => {
console.log('🚀 ~ store.dispatch ~ err:', err)
})
setTimeout(() => {
// 'http://sgwpdm.ah.sgcc.com.cn/iws/cas/login?appId=3874dcb953f184dc75450e33d6d6d4fa&service=http://sgwpdm.ah.sgcc.com.cn/iws/mea-view/',
window.location.replace(
'http://sgwpdm.ah.sgcc.com.cn/iws/'
)
}, 500)
} else {
store.dispatch('LogOut').then(() => {
// location.href = '/login'
router.push('/login')
}).catch(() => {
isRelogin.show = false
router.push('/login')
})
}
return Promise.reject('无效的会话,或者会话已过期,请重新登录。')

View File

@ -108,6 +108,7 @@
import { getDirectAuditListApi } from '@/api/business/index'
export default {
name: 'Direct-rotation-apply',
data() {
return {
userId: '',
@ -161,8 +162,8 @@ export default {
try {
const params = {
...this.queryParams,
startTime: this.timeRange[0] || '',
endTime: this.timeRange[1] || ''
startTime: this.timeRange ? this.timeRange[0] : '',
endTime: this.timeRange ? this.timeRange[1] : ''
}
const res = await getDirectAuditListApi(params)
this.tableList = res.rows

View File

@ -223,17 +223,12 @@ export default {
.file-box {
padding: 10px;
display: flex;
flex-wrap: wrap;
box-sizing: border-box;
display: grid;
grid-template-columns: repeat(12, 1fr);
grid-gap: 10px;
div {
width: calc((100% - 110px) / 12);
height: 60px;
margin-right: 10px;
margin-top: 10px;
height: 80px;
text-align: center;
line-height: 60px;
background-color: #19a4a0;
}
& div:nth-child(12n) {

View File

@ -103,8 +103,10 @@
<script>
import { getReceiveApplyApi } from '@/api/receive-apply/index.js'
import { getToken, setToken, setExpiresIn } from '@/utils/auth'
export default {
name: 'Receive-apply',
data() {
return {
total: 0, //
@ -139,9 +141,54 @@ export default {
]
}
},
created() {
this.userId = sessionStorage.getItem('userId')
this.getList()
async created() {
const origin = window.location.href
console.log(origin.split('ticket')[1], 'origin')
const token = getToken()
console.log('🚀 ~ created ~ shh:', token)
if (origin.indexOf('ticket') != -1 && !token) {
this.isIws = true
const loading = this.$loading({
lock: true,
text: '登录中',
})
try {
const res = await iwsLogin({
ticket: origin.split('ticket%3D')[1].split('%26')[0] || origin.split('ticket=')[1].split('&')[0],
sysType: 0
})
console.log('🚀 ~ created ~ res:', res)
if (res.code == 200) {
setToken(res.data.access_token)
this.$store.commit('SET_TOKEN', res.data.access_token)
setExpiresIn(1800)
this.$store.commit('SET_EXPIRES_IN', 1800)
}
// setExpiresIn(res.data.expires_in)
// this.$store.commit('SET_EXPIRES_IN', res.data.expires_in)
loading.close()
setTimeout(() => {
this.$router.push({ path: '/business-examine/receive-apply' })
// this.getList()
}, 300)
} catch (error) {
console.log('🚀 ~ created ~ error:', error)
this.$message({
message: '登录失败, 即将关闭页面',
type: 'error'
})
loading.close()
setTimeout(() => {
//
window.close()
}, 1500)
}
} else {
this.userId = sessionStorage.getItem('userId')
this.getList()
}
},
methods: {
//
@ -161,8 +208,8 @@ export default {
try {
const params = {
...this.queryParams,
startTime: this.timeRange[0] || '',
endTime: this.timeRange[1] || ''
startTime: this.timeRange ? this.timeRange[0] : '',
endTime: this.timeRange ? this.timeRange[1] : ''
}
const res = await getReceiveApplyApi(params)
this.tableList = res.data.rows

View File

@ -37,7 +37,7 @@
<el-table-column prop="num" label="减免数量" align="center" show-overflow-tooltip />
<el-table-column prop="maName" label="机具名称" align="center" show-overflow-tooltip />
<el-table-column prop="maModel" label="规格型号" align="center" show-overflow-tooltip />
<el-table-column prop="reduceNum" label="领料数量" align="center" show-overflow-tooltip />
<el-table-column prop="num" label="领料数量" align="center" show-overflow-tooltip />
<el-table-column prop="startTime" label="领料日期" align="center" show-overflow-tooltip />
<el-table-column prop="endTime" label="退料日期" align="center" show-overflow-tooltip />
<el-table-column
@ -246,17 +246,12 @@ export default {
.file-box {
padding: 10px;
display: flex;
flex-wrap: wrap;
box-sizing: border-box;
display: grid;
grid-template-columns: repeat(12, 1fr);
grid-gap: 10px;
div {
width: calc((100% - 110px) / 12);
height: 60px;
margin-right: 10px;
margin-top: 10px;
height: 80px;
text-align: center;
line-height: 60px;
background-color: #19a4a0;
}
& div:nth-child(12n) {

View File

@ -373,7 +373,7 @@ import Treeselect from '@riophae/vue-treeselect'
import '@riophae/vue-treeselect/dist/vue-treeselect.css'
import { getReceiveApplyApi } from '@/api/reduction-apply/index.js'
export default {
name: '',
name: 'Reduction-apply',
data() {
return {
//

File diff suppressed because it is too large Load Diff

View File

@ -38,7 +38,7 @@
noOptionsText="没有数据"
noResultsText="没有搜索结果"
placeholder="请选择领用工程"
@select="projectChange"
/>
</el-form-item>
<el-form-item label="领料人" prop="leasePerson">
@ -136,11 +136,22 @@
:label="item.fullPath"
:value="item.typeId"
:data-key="item.typeId"
@mouseenter.native="showCustomTooltip(item, $event)"
@mouseleave.native="hideCustomTooltip"
>
<span v-html="highlightText(item.fullPath, searchKeyword)"></span>
<span style="float: right; color: #8492a6; font-size: 13px">库存:{{ item.storageNum }}</span>
</el-option>
</el-select>
<div
v-if="currentTooltipItem"
class="custom-tooltip"
:style="{
left: tooltipPosition.x + 'px',
top: tooltipPosition.y + 'px'
}"
>
<img :src="currentTooltipItem.imageUrl || defaultImage" style="max-width: 200px; max-height: 150px;" @load="imageLoaded" @error="imageLoadError"/>
<p>库存: {{ currentTooltipItem.storageNum }}</p>
</div>
</el-col>
<el-col :span="6">
<el-input
@ -346,6 +357,7 @@
</span>
</el-dialog>
</div>
</template>
<script>
@ -364,6 +376,7 @@ import Treeselect from '@riophae/vue-treeselect'
import '@riophae/vue-treeselect/dist/vue-treeselect.css'
export default {
name: 'Index',
dicts: ['purchase_task_status'],
components: { Treeselect },
data() {
@ -536,7 +549,11 @@ export default {
dialogImageUrl: '',
dialogVisible: false,
uploadKey: Date.now(),
uploadUrl: process.env.VUE_APP_BASE_API + '/file/upload' //
uploadUrl: process.env.VUE_APP_BASE_API + '/file/upload', //
currentTooltipItem: null,
tooltipPosition: { x: 0, y: 0 },
defaultImage: 'https://cube.elemecdn.com/6/94/4d3ea53c084bad6931a56d5158a48jpeg.jpeg',
tooltipTimeout: null
}
},
computed: {
@ -591,6 +608,27 @@ export default {
console.log(this.$route.query, 'this.$route.query')
},
methods: {
showCustomTooltip(item, event) {
clearTimeout(this.tooltipTimeout);
this.tooltipTimeout = setTimeout(() => {
this.currentTooltipItem = item;
this.tooltipPosition = {
x: event.clientX + 15,
y: event.clientY + 15
};
}, 300); // 300ms
},
imageLoaded() {
this.shouldShowTooltip = true; //
},
imageLoadError() {
this.shouldShowTooltip = true; //
},
hideCustomTooltip() {
clearTimeout(this.tooltipTimeout);
this.currentTooltipItem = null;
},
// -tree
async getMaTypeNameOpt() {
try {
@ -746,22 +784,22 @@ export default {
this.isFileFbs = false
this.rules['bmFileInfos'][0].required = false
}
setTimeout(() => {
getListProject({ unitId: this.maForm.unitId }).then(response => {
this.projectList = response.data
this.maForm.projectId = null
})
}, 500)
},
projectChange(val) {
this.maForm.projectName = val.name
setTimeout(() => {
// projectId: this.maForm.projectId
getListUnite({}).then(response => {
this.uniteList = response.data
})
}, 500)
// setTimeout(() => {
// getListProject({ unitId: this.maForm.unitId }).then(response => {
// this.projectList = response.data
// this.maForm.projectId = null
// })
// }, 500)
},
// projectChange(val) {
// this.maForm.projectName = val.name
// setTimeout(() => {
// // projectId: this.maForm.projectId
// getListUnite({}).then(response => {
// this.uniteList = response.data
// })
// }, 500)
// },
async standardConfigChange(val) {
console.log('🚀 ~ standardConfigChange ~ val:', val)
const loading = this.$loading()
@ -992,13 +1030,17 @@ export default {
},
//
async handleConfirm(type) {
await getAgreement({
unitId: this.maForm.unitId,
projectId: this.maForm.projectId
}).then(response => {
this.agreementId = response.data.agreementId
this.maForm.agreementId = this.agreementId
})
// await getAgreement({
// unitId: this.maForm.unitId,
// projectId: this.maForm.projectId
// }).then(response => {
// if(response.msg===""){
// this.maForm.agreementId = null
// }else{
// this.agreementId = response.data.agreementId
// this.maForm.agreementId = this.agreementId
// }
// })
await this.$modal
.confirm(type == 0 ? '是否确认提交' : '是否确认保存')
.then(async () => {
@ -1163,6 +1205,7 @@ export default {
// downloadFileData({ fileName: file.name,fileUrl:file.url })
}
},
//
highlightText(text, keyword) {
if (!keyword) return text
@ -1405,4 +1448,20 @@ export default {
color: #fff;
font-size: 20px;
}
.type-tooltip {
max-width: none !important;
}
.custom-tooltip {
position: fixed;
z-index: 9999;
background: rgb(6, 6, 6);
border: 1px solid #ebeef5;
border-radius: 4px;
padding: 12px;
box-shadow: 0 2px 12px 0 rgba(0, 0, 0, 0.1);
pointer-events: none;
max-width: 250px;
color: white;
}
</style>

View File

@ -116,6 +116,7 @@
import { getReceiveList, receiveDelete } from '@/api/business/index'
export default {
name: 'DirectApplyRecord',
data() {
return {
showSearch: true,

View File

@ -266,6 +266,7 @@ import printJS from 'print-js'
import { getLeaseTaskList, deleteLeaseTask, getLeaseTask, getCodePDF } from '@/api/business/index'
export default {
name: 'Index',
dicts: ['lease_apply_task_status'],
data() {
return {

View File

@ -20,6 +20,7 @@ import PageHeader from '@/components/pageHeader'
import ApplyHome from './component/applyHome.vue'
import ApplyDetail from './component/applyDetail.vue'
export default {
name: 'CostRecord',
components: {
PageHeader,
ApplyHome,

View File

@ -391,7 +391,7 @@ import Treeselect from '@riophae/vue-treeselect'
import Decimal from '@/utils/decimal'
import '@riophae/vue-treeselect/dist/vue-treeselect.css'
export default {
name: '',
name: 'DiscountApply',
data() {
return {
//

View File

@ -29,6 +29,7 @@ import Home from "./component/homeApply.vue"; // 主列表
import AddTools from "./component/addToolsApply.vue"; //
import QueryTools from "./component/queryToolsApply.vue"; //
export default {
name: "LeasePublish",
components: {
Home,
PageHeaderApply,

File diff suppressed because it is too large Load Diff

View File

@ -0,0 +1,168 @@
<template>
<div :class="className" :style="{ height: height, width: width }" />
</template>
<script>
import * as echarts from 'echarts'
require('echarts/theme/macarons') // echarts theme
import resize from '@/views/dashboard/mixins/resize'
const animationDuration = 6000
export default {
mixins: [resize],
props: {
className: {
type: String,
default: 'chart'
},
width: {
type: String,
default: '100%'
},
height: {
type: String,
default: '100%'
},
barAndLineX: {
type: Array,
default: () => ['机具']
},
barY1: {
type: Array,
default: () => ['0']
},
barY2: {
type: Array,
default: () => ['0']
}
},
data() {
return {
chart: null
}
},
mounted() {
this.$nextTick(() => {
this.initChart()
})
},
beforeDestroy() {
if (!this.chart) {
return
}
this.chart.dispose()
this.chart = null
},
watch: {
barAndLineX: {
deep: true,
handler() {
this.initChart()
}
},
barY1: {
deep: true,
handler() {
this.initChart()
}
},
barY2: {
deep: true,
handler() {
this.initChart()
}
}
},
methods: {
initChart() {
this.chart = echarts.init(this.$el, 'macarons')
this.chart.setOption({
tooltip: {
trigger: 'axis',
axisPointer: {
type: 'shadow' //
}
},
legend: {
data: ['需求', '供应'],
icon: 'path://M 0,0 h 16 a 6,6 0 0 1 6,6 v 8 a 6,6 0 0 1 -6,6 h -16 a 6,6 0 0 1 -6,-6 v -8 a 6,6 0 0 1 6,-6 z',
bottom: 10, // x
itemWidth: 20, //
itemHeight: 13, //
itemGap: 10, //
padding: [5, 10], //
textStyle: {
color: '#333', //
lineHeight: 13
}
},
grid: {
top: 10,
left: '2%',
right: '2%',
bottom: '12%', //
containLabel: true
},
xAxis: [
{
type: 'category',
// data: ['5t', '8t', '', '', '1', '2', '13'],
data: this.barAndLineX,
axisTick: {
alignWithLabel: true
},
axisLabel: {
rotate: -15, // x 45°
margin: 30, // 线
color: '#333'
},
axisLine: {
lineStyle: {
color: '#a8a7a7' // x 线
}
}
}
],
yAxis: [
{
type: 'value',
axisTick: {
show: false
},
axisLine: {
lineStyle: {
color: '#a8a7a7' // x 线
}
}
}
],
series: [
{
name: '需求',
type: 'bar',
barWidth: '20%', //
data: this.barY1,
animationDuration: 2000,
itemStyle: {
color: '#26a8ff' //
}
},
{
name: '供应',
type: 'bar',
barWidth: '20%', //
data: this.barY2,
animationDuration: 2000,
itemStyle: {
color: '#ff8e9d' //
}
}
]
})
}
}
}
</script>

View File

@ -0,0 +1,199 @@
<template>
<div :class="className" :style="{ height: height, width: width }" />
</template>
<script>
import * as echarts from 'echarts'
require('echarts/theme/macarons') // echarts theme
import resize from '@/views/dashboard/mixins/resize'
export default {
mixins: [resize],
props: {
className: {
type: String,
default: 'chart'
},
width: {
type: String,
default: '100%'
},
height: {
type: String,
default: '100%'
},
autoResize: {
type: Boolean,
default: true
},
chartData: {
type: Object,
required: true
},
barAndLineX: {
type: Array,
default: () => ['机具']
},
// 线 Y 1
lineY1: {
type: Array,
default: () => {
return []
}
},
// 线 Y 2
lineY2: {
type: Array,
default: () => {
return []
}
}
},
data() {
return {
chart: null
}
},
watch: {
barAndLineX: {
deep: true,
handler() {
this.initChart()
}
},
lineY1: {
deep: true,
handler() {
this.initChart()
}
},
lineY2: {
deep: true,
handler() {
this.initChart()
}
}
},
mounted() {
this.$nextTick(() => {
this.initChart()
})
},
beforeDestroy() {
if (!this.chart) {
return
}
this.chart.dispose()
this.chart = null
},
methods: {
initChart() {
this.chart = echarts.init(this.$el, 'macarons')
this.setOptions(this.chartData)
},
setOptions({ expectedData, actualData } = {}) {
this.chart.setOption({
xAxis: {
type: 'category',
// data: ['5t', '8t', '', '', '1', '2', '13'],
data: this.barAndLineX,
boundaryGap: false, // 线 y
axisTick: {
show: true // 线
},
axisLabel: {
rotate: -15, // x 45°
margin: 30, // 线
padding: [0, 20, 0, 0],
color: '#333'
},
axisLine: {
lineStyle: {
color: '#a8a7a7' // x 线
}
}
},
yAxis: {
axisTick: {
show: false // 线
},
axisLine: {
lineStyle: {
color: '#a8a7a7' // x 线
}
}
},
grid: {
left: 10,
right: 50,
bottom: '12%', //
top: 30,
containLabel: true
},
tooltip: {
trigger: 'axis',
axisPointer: {
type: 'cross' //
},
padding: [5, 10]
},
legend: {
data: ['需求量', '待供应量'],
icon: 'path://M 0,0 h 16 a 6,6 0 0 1 6,6 v 8 a 6,6 0 0 1 -6,6 h -16 a 6,6 0 0 1 -6,-6 v -8 a 6,6 0 0 1 6,-6 z',
bottom: 10, // x
itemWidth: 20, //
itemHeight: 13, //
itemGap: 10, //
padding: [5, 10], //
textStyle: {
color: '#333', //
lineHeight: 13
}
},
series: [
{
name: '需求量',
type: 'line',
smooth: false, // 线
data: this.lineY1, //
itemStyle: {
color: '#33aeff' // 线
},
lineStyle: {
color: '#33aeff', // 线
width: 1 // 线
},
areaStyle: {
color: 'rgba(56, 136, 250, 0.3)' //
},
animationDuration: 2800,
animationEasing: 'cubicInOut',
symbol: 'none', //
showSymbol: false //
},
{
name: '待供应量',
type: 'line',
smooth: false, // 线
data: this.lineY2, //
itemStyle: {
color: '#ff8e9d' // 线
},
lineStyle: {
color: '#ff8e9d', // 线
width: 1 // 线
},
areaStyle: {
color: ' rgba(255, 0, 90, 0.3)' //
},
animationDuration: 2800,
animationEasing: 'quadraticOut',
symbol: 'none', //
showSymbol: false //
}
]
})
}
}
}
</script>

View File

@ -0,0 +1,112 @@
<template>
<div :class="className" :style="{ height: height, width: width }" />
</template>
<script>
import * as echarts from 'echarts'
require('echarts/theme/macarons') // echarts theme
import resize from '@/views/dashboard/mixins/resize'
export default {
mixins: [resize],
props: {
className: {
type: String,
default: 'chart'
},
width: {
type: String,
default: '100%'
},
height: {
type: String,
default: '100%'
},
pie_1Data: {
type: Array,
default: () => {
return [
{ value: 0, name: '计划需求量', itemStyle: { color: '#65dfe0' } },
{ value: 0, name: '已供应量', itemStyle: { color: '#ff8e9d' } },
{ value: 0, name: '待供应量', itemStyle: { color: '#6ccaf6' } }
]
}
}
},
data() {
return {
chart: null
}
},
mounted() {
this.$nextTick(() => {
this.initChart(this.pie_1Data)
})
},
beforeDestroy() {
if (!this.chart) {
return
}
this.chart.dispose()
this.chart = null
},
watch: {
pie_1Data: {
deep: true,
handler(val) {
this.initChart(val)
}
}
},
methods: {
initChart(pie_1Data) {
this.chart = echarts.init(this.$el, 'macarons')
const total = pie_1Data.reduce((sum, item) => sum + item.value, 0)
this.chart.setOption({
tooltip: {
trigger: 'item',
formatter: '{b} : {c} ({d}%)'
// formatter: '{b} {c}'
},
legend: {
left: 'center',
bottom: '0',
icon: 'circle',
data: ['计划需求量', '已供应量', '待供应量']
},
series: [
{
type: 'pie',
// roseType: 'radius', // radius
radius: [0, 95],
center: ['50%', '50%'],
// data: [
// { value: 320, name: '', itemStyle: { color: '#6ccaf6' } },
// { value: 240, name: '', itemStyle: { color: '#65dfe0' } },
// { value: 149, name: '', itemStyle: { color: '#ff8e9d' } }
// ],
data: pie_1Data,
animationEasing: 'cubicInOut',
animationDuration: 2600,
itemStyle: {
borderWidth: 1, // 线
borderColor: '#fff' // 线
},
label: {
show: true, //
// formatter: '{b}: {d}%', // name
formatter: function (params) {
const percent =
params.data.value == 0 ? 0 : ((params.data.value / total) * 100).toFixed(2)
return `${params.name}: ${percent}%`
},
fontSize: 12, //
color: '#333' //
}
}
]
})
}
}
}
</script>

View File

@ -0,0 +1,115 @@
<template>
<div :class="className" :style="{ height: height, width: width }" />
</template>
<script>
import * as echarts from 'echarts'
require('echarts/theme/macarons') // echarts theme
import resize from '@/views/dashboard/mixins/resize'
export default {
mixins: [resize],
props: {
className: {
type: String,
default: 'chart'
},
width: {
type: String,
default: '100%'
},
height: {
type: String,
default: '100%'
},
pie_2Data: {
type: Array,
default: () => {
return [
{ value: 0, name: '在库量', itemStyle: { color: '#26a8ff' } },
{ value: 0, name: '在用量', itemStyle: { color: '#45d8d9' } },
{ value: 0, name: '在修量', itemStyle: { color: '#ff8e9d' } },
{ value: 0, name: '新购待入库量', itemStyle: { color: '#6ccaf6' } },
{ value: 0, name: '修试待入库量', itemStyle: { color: '#ffb667' } }
]
}
}
},
data() {
return {
chart: null
}
},
mounted() {
this.$nextTick(() => {
this.initChart(this.pie_2Data)
})
},
beforeDestroy() {
if (!this.chart) {
return
}
this.chart.dispose()
this.chart = null
},
watch: {
pie_2Data: {
deep: true,
handler(val) {
this.initChart(val)
}
}
},
methods: {
initChart(pie_2Data) {
this.chart = echarts.init(this.$el, 'macarons')
const total = pie_2Data.reduce((sum, item) => sum + item.value, 0)
this.chart.setOption({
tooltip: {
trigger: 'item',
formatter: '{b} : {c} ({d}%)'
},
legend: {
left: 'center',
bottom: '0',
icon: 'circle',
data: ['在库量', '在用量', '在修量', '新购待入库量', '修试待入库量']
},
series: [
{
type: 'pie',
// roseType: 'radius', // radius
radius: [60, 95],
center: ['50%', '50%'],
// data: [
// { value: 320, name: '', itemStyle: { color: '#26a8ff' } },
// { value: 240, name: '', itemStyle: { color: '#45d8d9' } },
// { value: 120, name: '', itemStyle: { color: '#ff8e9d' } },
// { value: 80, name: '', itemStyle: { color: '#6ccaf6' } },
// { value: 90, name: '', itemStyle: { color: '#ffb667' } }
// ],
data: pie_2Data,
animationEasing: 'cubicInOut',
animationDuration: 2600,
itemStyle: {
borderWidth: 1, // 线
borderColor: '#fff' // 线
},
label: {
show: true, //
// formatter: '{b}: {d}%', // name
formatter: function (params) {
const percent =
params.data.value == 0 ? 0 : ((params.data.value / total) * 100).toFixed(2)
return `${params.name}: ${percent}%`
},
fontSize: 12, //
color: '#333' //
}
}
]
})
}
}
}
</script>

View File

@ -0,0 +1,78 @@
<template>
<div class="card-model-space">
<div :style="{ backgroundColor: theme }" class="left-icon">
<svg-icon :icon-class="iconType" class="icon-box" />
</div>
<div class="right-text">
<div>{{ cardNum }}</div>
<div>{{ cardTitle }}</div>
</div>
</div>
</template>
<script>
export default {
props: {
theme: {
type: String,
default: '#ffa94c'
},
cardTitle: {
type: String,
default: '标题'
},
iconType: {
type: String,
default: 'project_num'
},
//
cardNum: {
type: Number,
default: 0
}
}
}
</script>
<style scoped lang="scss">
.card-model-space {
display: flex;
border-radius: 8px;
color: #000;
height: 85%;
background: #fff;
box-shadow: 0 2px 4px rgba(0, 0, 0, 0.4);
.left-icon {
width: 30%;
height: 100%;
border-top-left-radius: 8px;
border-bottom-left-radius: 8px;
display: flex;
align-items: center;
justify-content: center;
.icon-box {
font-size: 28px;
}
}
.right-text {
flex: 1;
display: flex;
flex-direction: column;
justify-content: center;
align-items: flex-start;
padding-left: 6px;
& div:first-child {
font-weight: bold;
font-size: 18px;
}
& div:last-child {
margin-top: 4px;
font-size: 13px;
color: #525252;
}
}
}
</style>

View File

@ -0,0 +1,118 @@
<template>
<div class="card-model" :style="{ backgroundColor: theme }" @click="onHandleViewDetails">
<div class="f-14">
<svg-icon :icon-class="iconType" class="icon-box" />
{{ cardTitle }}
</div>
<div class="f-count-wrapper">
<div class="f-count">{{ cardNum }}</div>
</div>
<!-- <div class="f-14">
较上月{{ isReduce ? '增高' : '降低' }}{{ ratio }}%
<svg-icon v-if="!isReduce" icon-class="down_arrow" />
<svg-icon v-else icon-class="up_arrow" />
</div> -->
</div>
</template>
<script>
export default {
props: {
//
theme: {
type: String,
default: '#ffa94c'
},
//
cardTitle: {
type: String,
default: ''
},
//
iconType: {
type: String,
default: 'demand_count'
},
//
isReduce: {
type: Boolean,
default: true
},
//
cardNum: {
type: Number,
default: 0
},
//
ratio: {
type: Number,
default: 0
}
},
methods: {
onHandleViewDetails() {
console.log('查询二级页面', this.cardTitle)
// 使
// this.$emit('onOpenLevelTwoPages', this.cardTitle)
}
}
}
</script>
<style scoped lang="scss">
.card-model {
width: 100%;
height: 100%;
padding: 6px 0;
display: flex;
flex-direction: column;
align-items: center;
justify-content: center;
border-radius: 12px;
color: #fff;
box-shadow: 0 4px 6px rgba(0, 0, 0, 0.1); /* 初始阴影 */
transition: transform 0.3s ease; /* 添加过渡效果 */
& div {
width: 100%;
// padding-left: 40px;
transform: translateX(40px);
}
.f-14 {
position: relative;
font-size: 14px;
letter-spacing: 1px;
width:100%;
.icon-box {
font-size: 18px;
position: absolute;
transform: translateX(-120%);
}
}
.f-count-wrapper {
width: 100%;
display: flex;
justify-content: center; /* 水平居中 */
align-items: flex-end; /* 垂直靠下 */
margin-top: 10px;
}
.f-count {
margin: 4px 0;
font-size: 18px;
font-weight: bold;
letter-spacing: 2px;
}
}
.card-model:hover {
cursor: pointer;
transform: scale(1.03);
box-shadow: 0 10px 20px rgba(0, 0, 0, 0.2); /* 鼠标移入时更明显的阴影 */
}
</style>

View File

@ -0,0 +1,124 @@
<template>
<div class="chart-model-box">
<div class="chart-title">{{ chartTitle }}</div>
<div class="chart-content">
<!-- <PieChart /> -->
<component
:is="ChartTypeName"
:chartData="chartData"
:pie_1Data="pie_1Data"
:pie_2Data="pie_2Data"
:barAndLineX="barAndLineX"
:barY1="barY1"
:barY2="barY2"
:lineY1="lineY1"
:lineY2="lineY2"
/>
</div>
</div>
</template>
<script>
import PieChart1 from './PieChart_1.vue' // 1
import PieChart2 from './PieChart_2.vue' // 2
import BarChart from './BarChart.vue' //
import LineChart from './LineChart.vue' // 线
export default {
components: {
BarChart,
LineChart,
PieChart1,
PieChart2
},
props: {
chartTitle: {
type: String,
default: '标题'
},
ChartTypeName: {
type: String,
default: 'PieChart'
},
// 1
pie_1Data: {
type: Array,
default: () => {
return []
}
},
// 2
pie_2Data: {
type: Array,
default: () => {
return []
}
},
// 线 X
barAndLineX: {
type: Array,
default: () => {
return []
}
},
// Y 1
barY1: {
type: Array,
default: () => {
return []
}
},
// Y 2
barY2: {
type: Array,
default: () => {
return []
}
},
// 线 Y 1
lineY1: {
type: Array,
default: () => {
return []
}
},
// 线 Y 2
lineY2: {
type: Array,
default: () => {
return []
}
}
},
data() {
return {
chartData: {}
}
}
}
</script>
<style lang="scss" scoped>
.chart-model-box {
width: 100%;
height: 50vh;
display: flex;
flex-direction: column;
border: 1px solid #c0bfbf;
border-radius: 12px;
box-shadow: 0 2px 4px rgba(0, 0, 0, 0.2);
.chart-title {
padding: 12px 0 12px 12px;
font-weight: bold;
color: #333;
font-family: 'Franklin Gothic Medium', 'Arial Narrow', Arial, sans-serif;
background-color: #f9f9f9;
border-top-left-radius: 12px;
border-top-right-radius: 12px;
}
.chart-content {
flex: 1;
}
}
</style>

View File

@ -0,0 +1,44 @@
<template>
<div class="table-container">
<PageHeader :pageContent="levelTwoTitle" @goBack="goBack" />
<el-table>
<el-table-column type="index" width="55" />
<el-table-column align="center" label="占位1" prop="maCode" />
<el-table-column align="center" label="占位2" prop="maCode" />
<el-table-column align="center" label="占位3" prop="maCode" />
<el-table-column align="center" label="占位4" prop="maCode" />
<el-table-column align="center" label="占位5" prop="maCode" />
<el-table-column align="center" label="占位6" prop="maCode" />
<el-table-column align="center" label="占位7" prop="maCode" />
<el-table-column align="center" label="占位8" prop="maCode" />
</el-table>
</div>
</template>
<script>
import PageHeader from '@/components/pageHeader'
export default {
components: {
PageHeader
},
props: {
levelTwoTitle: {
type: String,
default: '详情'
}
},
data() {
return {}
},
methods: {
goBack() {
this.$emit('onCloseLevelTwoPages')
}
}
}
</script>
<style lang="scss" scoped>
.table-container {
}
</style>

View File

@ -0,0 +1,511 @@
<template>
<div class="app-container">
<template v-if="!isHome">
<!-- 机具供应展示 -->
<el-form size="small" :model="queryParams" ref="queryFormRef">
<el-row>
<el-col :span="6">
<el-form-item>
<el-date-picker
v-model="queryDate"
type="daterange"
range-separator="至"
start-placeholder="开始日期"
end-placeholder="结束日期"
value-format="yyyy-MM-dd"
format="yyyy-MM-dd"
style="width: 95%"
/>
</el-form-item>
</el-col>
<el-col :span="6">
<el-form-item prop="unitId">
<treeselect
:options="unitList"
:show-count="true"
style="width: 95%"
:normalizer="normalizer"
noChildrenText="没有数据了"
noOptionsText="没有数据"
placeholder="请选择公司"
noResultsText="没有搜索结果"
v-model="queryParams.unitId"
:disable-branch-nodes="true"
/>
</el-form-item>
</el-col>
<el-col :span="6">
<el-form-item prop="projectId">
<treeselect
style="width: 95%"
:show-count="true"
:options="projectList"
:normalizer="normalizer"
noOptionsText="没有数据"
noChildrenText="没有数据了"
placeholder="请选择领工程"
noResultsText="没有搜索结果"
:disable-branch-nodes="true"
v-model="queryParams.projectId"
/>
</el-form-item>
</el-col>
<el-col :span="6">
<el-form-item>
<el-button type="primary" icon="el-icon-search" @click="onHandleSearch">查询</el-button>
<el-button icon="el-icon-refresh" @click="onHandleReset">重置</el-button>
</el-form-item>
</el-col>
</el-row>
</el-form>
<!-- 卡片区域 -->
<div class="card-box">
<div class="title-card">需求供应</div>
<div class="card-box-content-1">
<div v-for="(card, index) in cardList_1" :key="index">
<CardModel
:ratio="card.ratio"
:theme="card.theme"
:iconType="card.icon"
:cardNum="card.cardNum"
:cardTitle="card.title"
:isReduce="card.isReduce"
@onOpenLevelTwoPages="onOpenLevelTwoPages"
/>
</div>
<div class="card-box-space-last">
<CardModelSpace
:key="index"
:theme="card.theme"
:iconType="card.icon"
:cardTitle="card.title"
:cardNum="card.cardNum"
v-for="(card, index) in cardList_3"
/>
</div>
</div>
</div>
<div class="card-box">
<div class="title-card">仓储状态</div>
<div class="card-box-content">
<div v-for="(card, index) in cardList_2" :key="index">
<CardModel
:theme="card.theme"
:iconType="card.icon"
:cardTitle="card.title"
:isReduce="card.isReduce"
:cardNum="card.cardNum"
:ratio="card.ratio"
@onOpenLevelTwoPages="onOpenLevelTwoPages"
/>
</div>
</div>
</div>
<!-- 图表区域 -->
<div class="chart-box">
<div :key="index" v-for="(chart, index) in chartList">
<ChartModelBox
:chartTitle="chart.title"
:ChartTypeName="chart.type"
:pie_1Data="pie_1Data"
:pie_2Data="pie_2Data"
:barAndLineX="barAndLineX"
:barY1="barY1"
:barY2="barY2"
:lineY1="lineY1"
:lineY2="lineY2"
/>
</div>
</div>
</template>
<template v-else>
<TableModel @onCloseLevelTwoPages="onCloseLevelTwoPages" :levelTwoTitle="levelTwoTitle" />
</template>
</div>
</template>
<script>
import CardModel from './components/card-model' //
import CardModelSpace from './components/card-model-space' //
import ChartModelBox from './components/chart-model-box' //
import TableModel from './components/table-model' //
import Treeselect from '@riophae/vue-treeselect'
import '@riophae/vue-treeselect/dist/vue-treeselect.css'
import {
getCardListApi,
getPie_1DataApi,
getPie_2DataApi,
getCardList_2Api,
getBarAndLineDataApi
} from '@/api/home/equipment-supply.js'
import { getListProject, getListUnite } from '@/api/lease/apply'
export default {
components: {
CardModel,
CardModelSpace,
ChartModelBox,
TableModel,
Treeselect
},
data() {
return {
//
isHome: false,
//
levelTwoTitle: '',
//
unitList: [],
//
projectList: [],
//
queryDate: [],
//
queryParams: {
startTime: '',
endTime: '',
unitId: undefined,
projectId: undefined
},
cardList_1: [
{
title: '需求量',
theme: '#ffa94c',
icon: 'demand_count',
isReduce: false,
cardNum: 0,
ratio: 0
},
{
title: '已供应量',
theme: '#027db4',
icon: 'supply_ready',
isReduce: false,
cardNum: 0,
ratio: 0
},
{
title: '待供应量',
theme: '#fb6260',
icon: 'supply_to_be',
isReduce: true,
cardNum: 0,
ratio: 0
}
],
cardList_2: [
{
title: '在库量',
theme: '#5ad55a',
icon: 'In_the_library',
isReduce: false,
cardNum: 0,
ratio: 0
},
{
title: '在用量',
theme: '#0099ff',
icon: 'In_use',
isReduce: true,
cardNum: 0,
ratio: 0
},
{
title: '在修量',
theme: '#8167f5',
icon: 'In_repair',
isReduce: false,
cardNum: 0,
ratio: 0
},
{
title: '修试待入库量',
theme: '#b8741a',
icon: 'repair_store',
isReduce: true,
cardNum: 0,
ratio: 0
},
{
title: '新购待入库量',
theme: '#bfbf00',
icon: 'penning_store',
isReduce: true,
cardNum: 0,
ratio: 0
},
],
cardList_3: [
{
title: '工程总数量(个)',
theme: '#ffa94c',
icon: 'project_num',
cardNum: 0
},
{
title: '供应总件数(件)',
theme: '#52c1f5',
icon: 'quantity_num',
cardNum: 0
},
{
title: '供应总价值(万元)',
theme: '#73a0fa',
icon: 'total_price',
cardNum: 0
}
],
//
chartList: [
{
title: '需求供应情况统计',
type: 'PieChart1'
},
{
title: '机具状态统计',
type: 'PieChart2'
},
{
title: '机具需求占比',
type: 'BarChart'
},
{
title: '待供应占比统计',
type: 'LineChart'
}
],
pie_1Data: [],
pie_2Data: [],
barAndLineX: [],
barY1: [],
lineY1: [],
barY2: [],
lineY2: []
}
},
methods: {
//
async getCardListFun() {
const queryParams = {
...this.queryParams,
startTime: this.queryDate && this.queryDate.length > 0 ? this.queryDate[0] : '',
endTime: this.queryDate && this.queryDate.length > 0 ? this.queryDate[1] : ''
}
const { data: res } = await getCardListApi(queryParams)
const {
demandNum,
// demandIncrease,
suppliedQuantityNum,
// suppliedQuantityIncrease,
suppliedToBeQuantityNum,
// suppliedToBeQuantityIncrease,
projectNum,
suppliedQuantityAllNum,
suppliedQuantityPrice
} = res
this.cardList_1[0].cardNum = demandNum
// this.cardList_1[0].ratio = Math.abs(demandIncrease)
// demandIncrease > 0 ? (this.cardList_1[0].isReduce = true) : (this.cardList_1[0].isReduce = false)
this.cardList_1[1].cardNum = suppliedQuantityNum
// this.cardList_1[1].ratio = Math.abs(suppliedQuantityIncrease)
// suppliedQuantityIncrease > 0 ? (this.cardList_1[1].isReduce = true) : (this.cardList_1[1].isReduce = false)
this.cardList_1[2].cardNum = suppliedToBeQuantityNum
// this.cardList_1[2].ratio = Math.abs(suppliedToBeQuantityIncrease)
// suppliedToBeQuantityIncrease > 0
// ? (this.cardList_1[2].isReduce = true)
// : (this.cardList_1[2].isReduce = false)
this.cardList_3[0].cardNum = projectNum
this.cardList_3[1].cardNum = suppliedQuantityAllNum || 0
this.cardList_3[2].cardNum = suppliedQuantityPrice || 0
//
const { data: result } = await getCardList_2Api(queryParams)
const {
inStockNum,
// inStockIncrease,
inUseNum,
// inUseIncrease,
inRepairNum,
// inRepairIncrease,
newPurchaseNum,
// newPurchaseIncrease,
newRepairNum,
// newRepairIncrease
} = result
this.cardList_2[0].cardNum = inStockNum
// this.cardList_2[0].ratio = Math.abs(inStockIncrease)
// inStockIncrease > 0 ? (this.cardList_2[0].isReduce = true) : (this.cardList_2[0].isReduce = false)
this.cardList_2[1].cardNum = inUseNum
// this.cardList_2[1].ratio = Math.abs(inUseIncrease)
// inUseIncrease > 0 ? (this.cardList_2[1].isReduce = true) : (this.cardList_2[1].isReduce = false)
this.cardList_2[2].cardNum = inRepairNum
// this.cardList_2[2].ratio = Math.abs(inRepairIncrease)
// inRepairIncrease > 0 ? (this.cardList_2[2].isReduce = true) : (this.cardList_2[2].isReduce = false)
this.cardList_2[3].cardNum = newPurchaseNum
// this.cardList_2[3].ratio = Math.abs(newPurchaseIncrease)
// newPurchaseIncrease > 0 ? (this.cardList_2[3].isReduce = true) : (this.cardList_2[3].isReduce = false)
this.cardList_2[4].cardNum = newRepairNum
// this.cardList_2[4].ratio = Math.abs(newRepairIncrease)
// newRepairIncrease > 0 ? (this.cardList_2[4].isReduce = true) : (this.cardList_2[4].isReduce = false)
this.pie_2Data = [
{ value: inStockNum, name: '在库量', itemStyle: { color: '#26a8ff' } },
{ value: inUseNum, name: '在用量', itemStyle: { color: '#45d8d9' } },
{ value: inRepairNum, name: '在修量', itemStyle: { color: '#ff8e9d' } },
{ value: newPurchaseNum, name: '新购待入库量', itemStyle: { color: '#6ccaf6' } },
{ value: newRepairNum, name: '修试待入库量', itemStyle: { color: '#ffb667' } }
]
//
const { data: barAndLine } = await getBarAndLineDataApi(queryParams)
const { typeNameList, demandNumList, suppliedQuantityNumList, suppliedToBeQuantityNumList } = barAndLine
this.barAndLineX = typeNameList
this.barY1 = demandNumList
this.lineY1 = demandNumList
this.barY2 = suppliedQuantityNumList
this.lineY2 = suppliedToBeQuantityNumList
console.log('barAndLine', barAndLine)
},
//
async getPie_1DataFun() {
const queryParams = {
...this.queryParams,
startTime: this.queryDate && this.queryDate.length > 0 ? this.queryDate[0] : '',
endTime: this.queryDate && this.queryDate.length > 0 ? this.queryDate[1] : ''
}
const { data: pie1 } = await getPie_1DataApi(queryParams)
const { demandNum, suppliedQuantityNum, suppliedToBeQuantityNum } = pie1
this.pie_1Data = [
// { value: demandNum, name: '', itemStyle: { color: '#65dfe0' } },
{ value: suppliedQuantityNum, name: '已供应量', itemStyle: { color: '#ff8e9d' } },
{ value: suppliedToBeQuantityNum, name: '待供应量', itemStyle: { color: '#6ccaf6' } }
]
},
//
async getCompanyAndProjectFun() {
const comRes = await getListUnite({ projectId: null })
this.unitList = comRes.data
const proRes = await getListProject({ unitId: null })
this.projectList = proRes.data
},
//
onHandleSearch() {
this.getCardListFun()
this.getPie_1DataFun()
},
//
onHandleReset() {
this.queryDate = this.getDefaultDateRange()
this.$refs.queryFormRef.resetFields()
this.getCardListFun()
this.getPie_1DataFun()
},
//
onOpenLevelTwoPages(title) {
this.levelTwoTitle = title
this.isHome = true
},
//
onCloseLevelTwoPages() {
this.isHome = false
},
//
normalizer(node) {
if (node.children && !node.children.length) {
delete node.children
}
return {
id: node.id,
label: node.name,
children: node.children
}
},
//
getDefaultDateRange() {
const today = new Date()
//
const lastMonth = new Date(today)
lastMonth.setMonth(today.getMonth() - 1)
//
if (lastMonth.getDate() !== today.getDate()) {
lastMonth.setDate(0) //
}
const formatDate = date => {
const y = date.getFullYear()
const m = String(date.getMonth() + 1).padStart(2, '0')
const d = String(date.getDate()).padStart(2, '0')
return `${y}-${m}-${d}`
}
return [formatDate(lastMonth), formatDate(today)]
}
},
created() {
this.queryDate = this.getDefaultDateRange()
this.getCompanyAndProjectFun()
this.getCardListFun()
this.getPie_1DataFun()
}
}
</script>
<style scoped lang="scss">
//
.card-box {
display: flex;
.title-card {
padding: 16px 0;
margin-right: 14px;
writing-mode: vertical-rl;
letter-spacing: 4px;
font-size: 14px;
}
.card-box-content-1 {
flex: 1;
display: grid;
grid-template-columns: repeat(5, 1fr);
gap: 12px;
margin-right: -12px;
.card-box-space-last {
grid-column: span 2;
display: grid;
grid-template-columns: repeat(3, 1fr);
align-items: center;
gap: 6px;
margin-right: -6px;
}
}
.card-box-content {
flex: 1;
display: grid;
grid-template-columns: repeat(5, 1fr);
gap: 12px;
margin-right: -18px;
}
}
//
.chart-box {
width: 100%;
display: grid;
grid-template-columns: repeat(2, 1fr);
gap: 12px;
}
::v-deep .vue-treeselect__control {
height: 30px;
}
</style>

View File

@ -0,0 +1,89 @@
<template>
<div class="card-model" :style="{ backgroundColor: state.theme }" @click="onHandleViewDetails">
<div class="f-14">
<svg-icon :icon-class="state.icon" class="icon-box" />
{{ state.title }}
</div>
<div class="f-count">{{ state.count }}</div>
<!-- <div class="f-14">
<span v-if="!state.isIncrease">
较上月降低
<span style="color: red">{{ state.increase || 0 }}</span>
%
</span>
<span v-else>较上月增长 {{ state.increase || 0 }} %</span>
<svg-icon v-if="!state.isIncrease" icon-class="down_arrow" />
<svg-icon v-else icon-class="up_arrow" />
</div> -->
</div>
</template>
<script>
export default {
props: {
state: {
type: Object,
default: {}
}
},
mounted() {
// console.log('card-model', this.state)
},
methods: {
onHandleViewDetails() {
// console.log('', this.cardTitle)
// 使
// this.$emit('onOpenLevelTwoPages', this.cardTitle)
}
}
}
</script>
<style scoped lang="scss">
.card-model {
width: 100%;
height: 100%;
padding: 6px 0;
display: flex;
flex-direction: column;
align-items: center;
justify-content: space-around;
border-radius: 12px;
color: #fff;
box-shadow: 0 4px 6px rgba(0, 0, 0, 0.1); /* 初始阴影 */
transition: transform 0.3s ease; /* 添加过渡效果 */
& div {
width: 100%;
// padding-left: 40px;
transform: translateX(40px);
}
.f-14 {
position: relative;
font-size: 14px;
letter-spacing: 1px;
.icon-box {
font-size: 18px;
position: absolute;
transform: translateX(-120%);
}
}
.f-count {
margin: 4px 0;
font-size: 18px;
font-weight: bold;
letter-spacing: 2px;
}
}
.card-model:hover {
cursor: pointer;
transform: scale(1.03);
box-shadow: 0 10px 20px rgba(0, 0, 0, 0.2); /* 鼠标移入时更明显的阴影 */
}
</style>

View File

@ -0,0 +1,283 @@
<template>
<div class="app-container">
<!-- 机具供应展示 -->
<el-form v-show="showSearch" size="small" :model="queryParams" ref="queryFormRef" inline @submit.native.prevent>
<el-row>
<el-col :span="6">
<el-form-item>
<el-date-picker
v-model="queryDate"
type="daterange"
range-separator="至"
start-placeholder="开始日期"
end-placeholder="结束日期"
value-format="yyyy-MM-dd"
style="width: 100%"
:picker-options="pickerOptions"
/>
</el-form-item>
</el-col>
<el-form-item prop="keyWord">
<el-input
v-model="queryParams.keyWord"
placeholder="请输入关键词检索"
clearable
style="width: 250px"
@keyup.enter.native="onHandleSearch"
/>
</el-form-item>
<el-form-item>
<el-button type="primary" icon="el-icon-search" @click="onHandleSearch">查询</el-button>
<el-button icon="el-icon-refresh" @click="onHandleReset">重置</el-button>
<el-button type="warning" plain icon="el-icon-download" size="mini" @click="handleExport">导出数据</el-button>
</el-form-item>
</el-row>
</el-form>
<div class="card-box">
<div class="card-box-content">
<div v-for="(card, index) in cardList_2" :key="index">
<CardModel :state="card" />
</div>
</div>
</div>
<el-row :gutter="10" class="mb8">
<right-toolbar :showSearch.sync="showSearch" @queryTable="getList"></right-toolbar>
</el-row>
<el-table :data="tableList" fit highlight-current-row style="width: 100%">
<!-- 多选 -->
<!-- <el-table-column type="selection" width="55" align="center" /> -->
<el-table-column
type="index"
width="55"
label="序号"
align="center"
:index="indexContinuation(queryParams.pageNum, queryParams.pageSize)"
/>
<el-table-column
v-for="(column, index) in tableColumns"
show-overflow-tooltip
:key="index"
:label="column.label"
:prop="column.prop"
:width="column.width"
align="center"
></el-table-column>
</el-table>
<!-- 分页 -->
<pagination
v-show="total > 0"
:total="total"
:page.sync="queryParams.pageNum"
:limit.sync="queryParams.pageSize"
@pagination="getList"
/>
</div>
</template>
<script>
import { getRepairHomeTotalListApi, getRepairHomeListApi } from '@/api/home/maintain-balance'
import CardModel from './components/card-model' //
export default {
components: {
CardModel
},
data() {
return {
showSearch: true,
total: 0,
//
queryParams: {
pageNum: 1,
pageSize: 10,
startTime: '',
endTime: '',
keyWord: ''
},
//
queryDate: [], //
cardList_2: [
{
title: '总接收量',
theme: '#5ad55a',
icon: 'In_the_library',
isIncrease: true,
increase: 0,
count: 0
},
{
title: '已修数量',
theme: '#0099ff',
icon: 'In_use',
isIncrease: true,
increase: 0,
count: 0
},
{
title: '在修数量',
theme: '#8167f5',
icon: 'In_repair',
isIncrease: true,
increase: 0,
count: 0
},
{
title: '报废数量',
theme: '#bfbf00',
icon: 'scrapped',
isIncrease: true,
increase: 0,
count: 0
},
{
title: '试验数量',
theme: '#b8741a',
icon: 'repair_store',
isIncrease: true,
increase: 0,
count: 0
}
],
pickerOptions: {
// disabledDate
disabledDate(time) {
return time.getTime() > Date.now()
}
},
tableList: [],
tableColumns: [
{ label: '类型名称', prop: 'typeName' },
{ label: '规格型号', prop: 'typeModelName' },
{ label: '维修单号', prop: 'repairCode', width: '150' },
{ label: '单位', prop: 'unitName' },
{ label: '总接收数量', prop: 'backNum' },
{ label: '已修数量', prop: 'repairedNum' },
{ label: '在修数量', prop: 'repairingNum' },
{ label: '报废数量', prop: 'scrapNum' },
{ label: '试验数量', prop: 'testNum' },
{ label: '更换配件量', prop: 'changePartNum' },
{ label: '收费配件金额(元)', prop: 'amountPartPrice' },
{ label: '不收费配件金额(元)', prop: 'noAmountPartPrice' }
]
}
},
created() {
this.queryDate = this.getDefaultDateRange()
this.getList()
},
methods: {
async getList() {
if (this.queryDate) {
this.queryParams.startTime = this.queryDate[0]
this.queryParams.endTime = this.queryDate[1]
} else {
this.queryParams.startTime = ''
this.queryParams.endTime = ''
}
const loading = this.$loading({ text: '加载中...' })
// console.log('🚀 ~ getList ~ this.queryParams:', this.queryParams)
try {
const res = await getRepairHomeListApi(this.queryParams)
// console.log('🚀 ~ getList ~ res:', res)
this.tableList = res.data.rows
this.total = res.data.total
const res2 = await getRepairHomeTotalListApi(this.queryParams)
if (res2.code === 200 && res2.data) {
res2.data.forEach((item, index) => {
this.cardList_2[index].increase = item.increase
this.cardList_2[index].isIncrease = item.isIncrease
if (index === 0) {
this.cardList_2[0].count = item.backNum
} else if (index === 1) {
this.cardList_2[1].count = item.repairedNum
} else if (index === 2) {
this.cardList_2[2].count = item.repairingNum
} else if (index === 3) {
this.cardList_2[3].count = item.scrapNum
} else if (index === 4) {
this.cardList_2[4].count = item.testNum
}
})
}
loading.close()
} catch (error) {
console.log('🚀 ~ getList ~ error:', error)
loading.close()
}
},
//
onHandleSearch() {
this.queryParams.pageNum = 1
this.getList()
},
//
onHandleReset() {
this.queryDate = this.getDefaultDateRange()
this.$refs.queryFormRef.resetFields()
this.getList()
},
//
getDefaultDateRange() {
const today = new Date()
//
const lastMonth = new Date(today)
lastMonth.setMonth(today.getMonth() - 1)
//
if (lastMonth.getDate() !== today.getDate()) {
lastMonth.setDate(0) //
}
const formatDate = date => {
const y = date.getFullYear()
const m = String(date.getMonth() + 1).padStart(2, '0')
const d = String(date.getDate()).padStart(2, '0')
return `${y}-${m}-${d}`
}
return [formatDate(lastMonth), formatDate(today)]
},
//
handleExport() {
if (this.queryDate) {
this.queryParams.startTime = this.queryDate[0]
this.queryParams.endTime = this.queryDate[1]
} else {
this.queryParams.startTime = ''
this.queryParams.endTime = ''
}
try {
let fileName = `修试平衡表_${new Date().getTime()}.xLsx`
let url = '/material/repair_audit_details/exportRepairHomeList'
const params = { ...this.queryParams }
console.log('🚀 ~ 导出 ~ params:', params)
this.download(url, params, fileName)
} catch (error) {
console.log('导出数据失败', error)
}
}
}
}
</script>
<style scoped lang="scss">
//
.card-box {
display: flex;
height: 110px;
.card-box-content {
flex: 1;
display: grid;
grid-template-columns: repeat(5, 1fr);
gap: 12px;
margin-right: -12px;
}
}
</style>

View File

@ -46,6 +46,7 @@
<el-table-column show-overflow-tooltip align="center" prop="scrapNum" label="(退库)报废数量" />
<!-- <el-table-column show-overflow-tooltip align="center" prop="description" label="描述" />-->
<el-table-column show-overflow-tooltip align="center" prop="postStoreNum" label="操作后库存" />
<el-table-column show-overflow-tooltip align="center" prop="creator" label="操作人" />
<el-table-column show-overflow-tooltip align="center" prop="createTime" label="日期" />
<el-table-column align="center" label="状态">
<template slot-scope="{ row }">

File diff suppressed because it is too large Load Diff

View File

@ -187,12 +187,12 @@
:action="upload.url" style="width: 100%;" :file-list="fileList"
:on-success="handleSuccess" :on-error="handleError" :on-remove="handleFileRemove"
:before-upload="beforeUpload"
accept="image/*,.pdf,.doc,.docx"
accept="image/*,.pdf,.doc,.docx,video/*"
>
<i class="el-icon-upload"></i>
<div class="el-upload__text">将文件拖到此处<em>点击上传</em></div>
<div class="el-upload__tip text-center" slot="tip">
<span>按住Ctrl可同时多选支持上传图PDFWord格式文件单个文件不能超过5M</span>
<span>按住Ctrl可同时多选支持上传图视频PDFWord格式文件单个文件不能超过20MB</span>
</div>
</el-upload>
<div slot="footer" class="dialog-footer">
@ -269,7 +269,7 @@ import { imgUpLoad, fileUpLoad } from "@/api/system/upload";
import { downloadFile } from "@/utils/download";
import { getToken } from '@/utils/auth'
export default {
name: "ToolsType",
name: "Archives",
components: { Treeselect },
data() {
return {
@ -598,14 +598,30 @@ export default {
},
beforeUpload(file) {
const isRarOrZip = ['.rar', '.zip'].some(ext => file.name.toLowerCase().endsWith(ext));
if (!isRarOrZip) {
this.$message.error('仅支持上传 rar 或 zip 格式的文件');
// const isRarOrZip = ['.rar', '.zip'].some(ext => file.name.toLowerCase().endsWith(ext));
// if (!isRarOrZip) {
// this.$message.error(' rar zip ');
// return false;
// }
const validExtensions = ['.pdf', '.doc', '.docx'];
const validTypes = ['image/', 'video/'];
const fileName = file.name.toLowerCase();
const fileType = file.type;
//
const hasValidExtension = validExtensions.some(ext => fileName.endsWith(ext));
// MIME
const hasValidType = validTypes.some(type => fileType.startsWith(type));
if (!hasValidExtension && !hasValidType) {
this.$message.error('仅支持上传图片、视频、PDF、Word格式文件');
return false;
}
const isLt5M = file.size / 1024 / 1024 < 5;
const isLt5M = file.size / 1024 / 1024 < 20;
if (!isLt5M) {
this.$message.error('单个文件大小不能超过 5MB');
this.$message.error('单个文件大小不能超过 20MB');
return false;
}
return true;

View File

@ -750,7 +750,6 @@ export default {
searchKey: path.join('').toLowerCase(),
num: node.num || 0,
maTypeName: parents[parents.length - 1] || '',
specificationType: node.typeName,
unitName: node.unitName,
unitValue: node.unitValue,
manageType: node.manageType
@ -802,7 +801,7 @@ export default {
...typeData,
preNum: 0,
typeModel: typeData.typeName,
typeName: typeData.specificationType,
typeName: typeData.maTypeName,
apDetection: '',
remark: '',
maCodeList: [],
@ -866,6 +865,9 @@ export default {
//
async GetViewByApply(params) {
const res = await getBackApplyInfo(this.rowId)
if (res.msg && res.msg != '操作成功') {
this.$message.warning(res.msg)
}
console.log(res)
const data = res.data
this.queryParams.unitId = data.backApplyInfo.unitId
@ -1103,6 +1105,7 @@ export default {
typeId: typeId
}
await getMachineById(param).then(res => {
console.log('🚀 ~ awaitgetMachineById ~ res.data:', res.data)
this.machineList = res.data
this.machineList.forEach(item => {
item.bmFileInfos = []
@ -1119,21 +1122,16 @@ export default {
console.log(this.maCodeList)
console.log(this.machineList)
if (this.rowId != '') {
// //
this.rowData.tempMaCodeList.forEach(item => {
this.machineList.unshift(item) //
// this.$nextTick(() => {
// this.$refs.codeTableList.toggleRowSelection(item, true)
// })
})
this.maCodeList = this.rowData.maCodeList
console.log('🚀 ~ 编辑 ~ this.maCodeList:', this.maCodeList)
this.machineList.forEach(item => {
this.maCodeList.forEach(sub => {
if (sub.maId == item.maId) {
this.$nextTick(() => {
setTimeout(() => {
this.$refs.codeTableList.toggleRowSelection(item, true)
}, 500)
item.apDetection = sub.apDetection
}, 200)
})
}
})
@ -1141,13 +1139,13 @@ export default {
} else {
//
// console.log("")
console.log(this.maCodeList, '新增')
this.machineList.forEach(item => {
this.maCodeList.forEach(sub => {
if (sub.maId == item.maId) {
this.$nextTick(() => {
setTimeout(() => {
this.$refs.codeTableList.toggleRowSelection(item, true)
}, 500)
this.$refs.codeTableList.toggleRowSelection(item, true)
item.apDetection = sub.apDetection
})
}
})
@ -1159,6 +1157,7 @@ export default {
this.open = true
},
codeSelectionChange(selection) {
if (!this.open) return
this.maCodeList = selection
// console.log(selection)
// this.queryParams.equipmentList = selection

View File

@ -298,18 +298,18 @@
</template>
</el-table-column>
<el-table-column label="外观判定" prop="apDetection" align="center" width="160" :show-overflow-tooltip="true">
<template slot-scope="scope">
<!-- <template slot-scope="scope"> -->
<!-- <el-input
v-model.number="scope.row.apDetection"
placeholder="外观判定" maxlength="20"
type="text" clearable :readonly="isView"
style="width: 100%"
/> -->
<el-radio-group v-model="scope.row.apDetection" disabled>
<!-- <el-radio-group v-model="scope.row.apDetection" disabled>
<el-radio label="1">完好</el-radio>
<el-radio label="0">损坏</el-radio>
</el-radio-group>
</template>
</el-radio-group> -->
<!-- </template> -->
</el-table-column>
<el-table-column label="附件" align="center" width="100">
<template slot-scope="scope">
@ -645,6 +645,9 @@ export default {
//
async GetViewByApply(params) {
const res = await getBackApplyInfo(this.rowId)
if (res.msg && res.msg != '操作成功') {
this.$message.warning(res.msg)
}
console.log(res)
const data = res.data
console.log(data)

View File

@ -25,6 +25,7 @@ import Home from './component/home.vue'
import AddReturn from './component/addReturn.vue'
import QueryReturn from './component/queryReturn.vue'
export default {
name: 'Return',
components: {
PageHeader,
Home,

View File

@ -198,7 +198,7 @@ import {
// import '@riophae/vue-treeselect/dist/vue-treeselect.css'
export default {
name: 'bmAssetAttributes',
name: 'BmAssetAttributes',
dicts: ['sys_normal_disable'],
// components: { Treeselect },
data() {

View File

@ -20,160 +20,73 @@
</el-form-item>
<el-form-item>
<el-button
type="primary"
icon="el-icon-search"
size="mini"
@click="handleQuery"
>搜索</el-button
>
<el-button
icon="el-icon-refresh"
size="mini"
@click="resetQuery"
>重置</el-button
>
<el-button type="primary" icon="el-icon-search" size="mini" @click="handleQuery">搜索</el-button>
<el-button icon="el-icon-refresh" size="mini" @click="resetQuery">重置</el-button>
</el-form-item>
</el-form>
<el-row :gutter="10" class="mb8">
<el-col :span="1.5">
<el-button
type="primary"
plain
icon="el-icon-plus"
size="mini"
@click="handleAdd"
>新建</el-button
>
<el-button type="primary" plain icon="el-icon-plus" size="mini" @click="handleAdd">新建</el-button>
</el-col>
<!-- <el-col :span="1.5">-->
<!-- <el-button-->
<!-- type="warning"-->
<!-- plain-->
<!-- icon="el-icon-download"-->
<!-- size="mini"-->
<!-- @click="handleExport"-->
<!-- >导入数据</el-button-->
<!-- >-->
<!-- </el-col>-->
<!-- <el-col :span="1.5">-->
<!-- <el-button-->
<!-- type="warning"-->
<!-- plain-->
<!-- icon="el-icon-download"-->
<!-- size="mini"-->
<!-- @click="handleExport"-->
<!-- >导入数据</el-button-->
<!-- >-->
<!-- </el-col>-->
<el-col :span="1.5">
<el-button
type="warning"
plain
icon="el-icon-download"
size="mini"
@click="handleExport">
导出数据
<el-button type="warning" plain icon="el-icon-download" size="mini" @click="handleExport">
导出数据
</el-button>
</el-col>
<right-toolbar
:showSearch.sync="showSearch"
@queryTable="getList"
></right-toolbar>
<right-toolbar :showSearch.sync="showSearch" @queryTable="getList"></right-toolbar>
</el-row>
<el-table
v-loading="loading"
:data="projectList"
@selection-change="handleSelectionChange"
border
>
<el-table v-loading="loading" :data="projectList" @selection-change="handleSelectionChange" border>
<el-table-column type="selection" width="55" align="center" />
<el-table-column width="60" align="center" label="序号" type="index" >
<el-table-column width="60" align="center" label="序号" type="index">
<template slot-scope="scope">
<span>{{ (queryParams.pageNum - 1) * queryParams.pageSize + scope.$index + 1 }}</span>
<span>{{ (queryParams.pageNum - 1) * queryParams.pageSize + scope.$index + 1 }}</span>
</template>
</el-table-column>
<el-table-column
label="工程项目名称"
align="center"
prop="proName"
:show-overflow-tooltip="true"
/>
<el-table-column
label="实施单位"
align="center"
prop="impUnitName"
:show-overflow-tooltip="true"
/>
<el-table-column label="工程项目名称" align="center" prop="proName" :show-overflow-tooltip="true" />
<el-table-column label="实施单位" align="center" prop="impUnitName" :show-overflow-tooltip="true" />
<el-table-column
label="工程类型"
align="center"
prop="proType"
:show-overflow-tooltip="true"
>
></el-table-column>
<el-table-column label="工程编号" align="center" prop="proCode" :show-overflow-tooltip="true" />
<el-table-column label="是否匹配i8工程" align="center" prop="isMatchI8" :show-overflow-tooltip="true">
<template slot-scope="scope">
<div v-if="scope.row.isMatchI8 == '匹配'" style="color: green">{{ scope.row.isMatchI8 }}</div>
<div v-if="scope.row.isMatchI8 == '不匹配'" style="color: red">{{ scope.row.isMatchI8 }}</div>
</template>
</el-table-column>
<el-table-column
label="工程编号"
align="center"
prop="proCode"
:show-overflow-tooltip="true"
/>
<el-table-column
label="是否匹配i8工程"
align="center"
prop="isMatchI8"
:show-overflow-tooltip="true">
<template slot-scope="scope">
<div v-if="scope.row.isMatchI8=='匹配'" style="color: green;">{{ scope.row.isMatchI8 }}</div>
<div v-if="scope.row.isMatchI8=='不匹配'" style="color: red;">{{ scope.row.isMatchI8 }}</div>
</template>
</el-table-column>
<el-table-column
label="合同主体"
align="center"
prop="contractPart"
:show-overflow-tooltip="true"
/>
<el-table-column
label="项目经理"
align="center"
prop="proManager"
:show-overflow-tooltip="true"
/>
<el-table-column
label="联系电话"
align="center"
prop="telphone"
:show-overflow-tooltip="true"
/>
<el-table-column
label="i8工程编号"
align="center"
prop="externalId"
:show-overflow-tooltip="true"
/>
<el-table-column
label="工程状态"
align="center"
prop="proStatus"
:show-overflow-tooltip="true"
>
<template slot-scope="scope">
<dict-tag
:options="dict.type.bm_project_status"
:value="scope.row.proStatus"
/>
<el-table-column label="合同主体" align="center" prop="contractPart" :show-overflow-tooltip="true" />
<el-table-column label="项目经理" align="center" prop="proManager" :show-overflow-tooltip="true" />
<el-table-column label="联系电话" align="center" prop="telphone" :show-overflow-tooltip="true" />
<el-table-column label="i8工程编号" align="center" prop="externalId" :show-overflow-tooltip="true" />
<el-table-column label="工程状态" align="center" prop="proStatus" :show-overflow-tooltip="true">
<template slot-scope="scope">
<dict-tag :options="dict.type.bm_project_status" :value="scope.row.proStatus" />
</template>
</el-table-column>
<el-table-column label="操作" align="center" width="140">
<template slot-scope="scope">
<el-button
size="mini"
type="text"
icon="el-icon-edit"
@click="handleUpdate(scope.row)"
>编辑</el-button
>
<el-button
size="mini"
type="text"
icon="el-icon-delete"
@click="handleDelete(scope.row)"
>删除</el-button
>
<el-button size="mini" type="text" icon="el-icon-edit" @click="handleUpdate(scope.row)">
编辑
</el-button>
<el-button size="mini" type="text" icon="el-icon-delete" @click="handleDelete(scope.row)">
删除
</el-button>
</template>
</el-table-column>
</el-table>
@ -187,200 +100,159 @@
/>
<!-- 添加或修改参数配置对话框 -->
<el-dialog
:title="title"
:visible.sync="open"
width="700px"
append-to-body
:close-on-click-modal="false"
>
<el-form
ref="form"
:model="form"
:rules="rules"
label-width="120px"
>
<el-row :gutter="24">
<el-col :span="12">
<el-form-item label="工程名称" prop="proName">
<el-input
v-model="form.proName"
placeholder="请输入工程名称"
maxlength="50"
/>
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item label="工程编号" prop="proCode">
<el-input
v-model="form.proCode"
placeholder="请输入工程编号"
maxlength="50"
/>
</el-form-item>
</el-col>
<el-dialog :title="title" :visible.sync="open" width="80%" append-to-body :close-on-click-modal="false">
<el-form ref="form" :model="form" :rules="rules" label-width="120px">
<el-row :gutter="24">
<el-col :span="12">
<el-form-item label="关联i8工程" prop="relatedI8">
<el-select
v-model="form.relatedI8"
placeholder="请选择关联i8工程"
style="width: 100%"
clearable
filterable
@change="handleChangeI8Pro"
>
<el-option
v-for="(item, index) in i8ProOpts"
:key="index"
:label="item.projectName"
:value="item.id"
></el-option>
</el-select>
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item label="i8工程ID" prop="externalId">
<el-input v-model="form.externalId" placeholder="请输入i8工程ID" maxlength="50" disabled />
</el-form-item>
</el-col>
</el-row>
<el-row :gutter="24">
<el-col :span="12">
<el-form-item label="工程名称" prop="proName">
<el-input v-model="form.proName" placeholder="请输入工程名称" maxlength="50" />
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item label="工程编号" prop="proCode">
<el-input v-model="form.proCode" placeholder="请输入工程编号" maxlength="50" />
</el-form-item>
</el-col>
</el-row>
</el-row>
<el-row :gutter="24">
<el-col :span="12">
<el-form-item label="实施单位" prop="impUnit">
<el-select
v-model="form.impUnit"
filterable
placeholder="请选择实施单位"
style="width: 100%"
>
<el-option
v-for="status in impUnitList"
:key="status.value"
:label="status.label"
:value="status.value"
></el-option>
</el-select>
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item label="工程类型" prop="proTypeId">
<el-select v-model="form.proTypeId" placeholder="请选择工程类型" style="width: 100%">
<el-option
v-for="keeper in proDataRange"
:key="keeper.value"
:label="keeper.label"
:value="keeper.value"
></el-option>
</el-select>
</el-form-item>
</el-col>
</el-row>
<el-row :gutter="24">
<el-col :span="12">
<el-form-item label="实施单位" prop="impUnit">
<el-select
v-model="form.impUnit"
filterable
placeholder="请选择实施单位"
style="width: 100%"
>
<el-option
v-for="status in impUnitList"
:key="status.value"
:label="status.label"
:value="status.value"
></el-option>
</el-select>
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item label="工程类型" prop="proTypeId">
<el-select
v-model="form.proTypeId"
placeholder="请选择工程类型"
style="width: 100%"
>
<el-option
v-for="keeper in proDataRange"
:key="keeper.value"
:label="keeper.label"
:value="keeper.value"
></el-option>
</el-select>
</el-form-item>
</el-col>
<el-row :gutter="24">
<el-col :span="12">
<el-form-item label="工程状态" prop="proStatus">
<el-select
v-model="form.proStatus"
filterable
placeholder="请选择工程状态"
style="width: 100%"
>
<el-option
v-for="(item, index) in proStatusOpts"
:key="index"
:label="item.label"
:value="item.value"
></el-option>
</el-select>
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item label="工程性质" prop="proNature">
<el-select
v-model="form.proNature"
filterable
placeholder="请选择工程性质"
style="width: 100%"
>
<el-option label="基建" value="0"></el-option>
<el-option label="用户工程" value="1"></el-option>
<el-option label="技修大改" value="2"></el-option>
<el-option label="其它" value="3"></el-option>
</el-select>
</el-form-item>
</el-col>
</el-row>
</el-row>
<el-row :gutter="24">
<el-col :span="12">
<el-form-item label="项目经理" prop="proManager">
<el-input v-model="form.proManager" placeholder="请输入项目经理姓名" maxlength="20" />
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item label="联系电话" prop="telphone">
<el-input v-model="form.telphone" placeholder="请输入联系电话" maxlength="11" />
</el-form-item>
</el-col>
</el-row>
<el-row :gutter="24">
<el-col :span="12">
<el-form-item label="工程状态" prop="proStatus">
<el-select
v-model="form.proStatus"
filterable
placeholder="请选择工程状态"
style="width: 100%"
>
<el-option label="开工准备" value="0"></el-option>
<el-option label="在建" value="1"></el-option>
<el-option label="停工" value="2"></el-option>
<el-option label="完工未竣工" value="3"></el-option>
<el-option label="竣工" value="4"></el-option>
</el-select>
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item label="工程性质" prop="proNature">
<el-select
v-model="form.proNature"
filterable
placeholder="请选择工程性质"
style="width: 100%"
>
<el-option label="基建" value="0"></el-option>
<el-option label="用户工程" value="1"></el-option>
<el-option label="技修大改" value="2"></el-option>
<el-option label="其它" value="3"></el-option>
</el-select>
</el-form-item>
</el-col>
<el-row :gutter="24">
<el-col :span="12">
<el-form-item label="合同主体单位" prop="contractPart">
<el-input v-model="form.contractPart" placeholder="请输入合同主体单位" maxlength="50" />
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item label="所属项目中心" prop="proCenter">
<el-input v-model="form.proCenter" placeholder="请输入所属项目中心" maxlength="50" />
</el-form-item>
</el-col>
</el-row>
</el-row>
<el-row :gutter="24">
<el-col :span="12">
<el-form-item label="项目经理" prop="proManager">
<el-input
v-model="form.proManager"
placeholder="请输入项目经理姓名"
maxlength="20"
/>
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item label="联系电话" prop="telphone">
<el-input
v-model="form.telphone"
placeholder="请输入联系电话"
maxlength="11"
/>
</el-form-item>
</el-col>
</el-row>
<el-row :gutter="24">
<el-col :span="12">
<el-form-item label="合同主体单位" prop="contractPart">
<el-input
v-model="form.contractPart"
placeholder="请输入合同主体单位"
maxlength="50"
/>
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item label="所属项目中心" prop="proCenter">
<el-input
v-model="form.proCenter"
placeholder="请输入所属项目中心"
maxlength="50"
/>
</el-form-item>
</el-col>
</el-row>
<el-row :gutter="24">
<el-col :span="12">
<el-form-item label="i8工程ID" prop="externalId">
<el-input
v-model="form.externalId"
placeholder="请输入i8工程ID"
maxlength="50"
/>
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item label="关联i8工程" prop="relatedI8Project">
<el-input
v-model="form.relatedI8Project"
placeholder="输入搜索关键词"
/>
</el-form-item>
</el-col>
</el-row>
<el-row :gutter="24">
<el-col :span="20">
<el-form-item label="备注" prop="remark">
<el-input
type="textarea"
placeholder="请输入内容"
v-model="form.remark"
maxlength="100"
show-word-limit
>
</el-input>
</el-form-item>
</el-col>
</el-row>
</el-form>
<div slot="footer" class="dialog-footer">
<el-button type="primary" @click="submitForm" :loading="isLoading"> </el-button>
<el-button @click="cancel"> </el-button>
</div>
</el-dialog>
<el-row :gutter="24">
<el-col :span="20">
<el-form-item label="备注" prop="remark">
<el-input
type="textarea"
placeholder="请输入内容"
v-model="form.remark"
maxlength="100"
show-word-limit
></el-input>
</el-form-item>
</el-col>
</el-row>
</el-form>
<div slot="footer" class="dialog-footer">
<el-button type="primary" @click="submitForm" :loading="isLoading"> </el-button>
<el-button @click="cancel"> </el-button>
</div>
</el-dialog>
</div>
</template>
@ -393,13 +265,17 @@ import {
updateProject,
queryProDataApi,
getProjectUserList,
unitTypeList,
impUnitTypeList,
getI8ProjectList
} from '@/api/basic/basic'
import { unitTypeList,impUnitTypeList } from '@/api/basic/basic'
import axios from 'axios'
import CryptoJS from 'crypto-js'
// import { deptTreeSelect } from '@/api/system/user'
// import Treeselect from '@riophae/vue-treeselect'
// import '@riophae/vue-treeselect/dist/vue-treeselect.css'
export default {
name: 'bmProject',
name: 'BmProject',
dicts: ['bm_project_status'],
// components: { Treeselect },
data() {
@ -421,9 +297,29 @@ export default {
//
projectList: [],
//
// i8
i8ProOpts: [
// {
// id: '0024a75450',
// htzt: '',
// oname: '',
// pcNo: 'PROJ-2024-0862',
// projectName: '',
// stat: '',
// textcol1: '()',
// xmjl: ''
// }
],
proStatusOpts: [
{ label: '开工准备', value: '0' },
{ label: '在建', value: '1' },
{ label: '停工', value: '2' },
{ label: '完工未竣工', value: '3' },
{ label: '竣工', value: '4' }
],
typeList: [],
impUnitList:[],
projectStatuses:[],
impUnitList: [],
projectStatuses: [],
//
deptOptions: undefined,
//
@ -432,65 +328,65 @@ export default {
open: false,
//
dateRange: [],
projectNatures:[],
projectNatures: [],
//
queryParams: {
pageNum: 1,
pageSize: 10,
proName: undefined,
proName: undefined
},
//
form: {},
chosenData: {},
proDataRange:[],
proStatusDataRange:[],
proNatureDataRange:[],
proDataRange: [],
proStatusDataRange: [],
proNatureDataRange: [],
//
rules: {
proName: [
{
required: true,
message: '工程项目名称不能为空',
trigger: 'blur',
},
trigger: 'blur'
}
],
impUnit: [
{
required: true,
message: '实施单位不能为空',
trigger: 'blur',
},
trigger: 'blur'
}
],
proTypeId: [
{
required: true,
message: '工程类型不能为空',
trigger: 'blur',
},
trigger: 'blur'
}
],
proStatus: [
{
required: true,
message: '工程状态不能为空',
trigger: 'blur',
},
trigger: 'blur'
}
],
proNature: [
{
required: true,
message: '工程性质不能为空',
trigger: 'blur',
},
trigger: 'blur'
}
],
telphone: [
{ required: false, message: "手机号不能为空", trigger: "blur" },
{
pattern: /^1[3|4|5|6|7|8|9][0-9]\d{8}$/,
message: "请输入正确的手机号码",
trigger: "blur"
}
],
},
{ required: false, message: '手机号不能为空', trigger: 'blur' },
{
pattern: /^1[3|4|5|6|7|8|9][0-9]\d{8}$/,
message: '请输入正确的手机号码',
trigger: 'blur'
}
]
}
}
},
created() {
@ -500,47 +396,77 @@ export default {
this.getProjectType()
},
methods: {
async getProjectType(){
let prodataRes = await queryProDataApi('bm_project_type');
this.proDataRange = prodataRes.data.map((item) => {
return {
label: item.dictLabel,
value: item.dictValue,
};
});
// i8
async getI8ProType() {
const url = 'http://sgwpdm.ah.sgcc.com.cn/iws/data-center/dc-security/user/login'
const password = CryptoJS.MD5('Aa2345!').toString()
console.log('🚀 ~ getI8ProType ~ password:', password)
const account = 'jijusystem'
let proStatusdataRes = await queryProDataApi('bm_project_status');
this.proStatusDataRange = proStatusdataRes.data.map((item) => {
axios
.post(
url,
{ account: account, password: password },
{ headers: { 'Content-Type': 'application/json' } }
)
.then(response => {
console.log('🚀 ~ response.data:', response.data)
const token = response.data.data.token
console.log('🚀 ~ token:', token)
getI8ProjectList({ token })
.then(res => {
console.log('🚀 ~ res-i8:', res)
this.i8ProOpts = res.data.data
})
.catch(error => {
console.error('请求失败:', error)
})
})
.catch(error => {
console.error('请求失败:', error)
})
},
async getProjectType() {
let prodataRes = await queryProDataApi('bm_project_type')
this.proDataRange = prodataRes.data.map(item => {
return {
label: item.dictLabel,
value: item.dictValue,
};
});
label: item.dictLabel,
value: item.dictValue
}
})
let proNaturedataRes = await queryProDataApi('bm_project_nature');
this.proNatureDataRange = proNaturedataRes.data.map((item) => {
let proStatusdataRes = await queryProDataApi('bm_project_status')
this.proStatusDataRange = proStatusdataRes.data.map(item => {
return {
label: item.dictLabel,
value: item.dictValue,
};
});
label: item.dictLabel,
value: item.dictValue
}
})
let proNaturedataRes = await queryProDataApi('bm_project_nature')
this.proNatureDataRange = proNaturedataRes.data.map(item => {
return {
label: item.dictLabel,
value: item.dictValue
}
})
},
//
getType() {
impUnitTypeList().then((response) => {
let matTypeRes = response.data;
let result=[];
matTypeRes.forEach(item=>{
const parts = item.ancestors.split(',');
if(parts.length==2){
result.push({
label: item.deptName,
value: item.deptId,
});
}
})
impUnitTypeList().then(response => {
let matTypeRes = response.data
let result = []
matTypeRes.forEach(item => {
const parts = item.ancestors.split(',')
if (parts.length == 2) {
result.push({
label: item.deptName,
value: item.deptId
})
}
})
this.impUnitList=result
this.impUnitList = result
})
},
selecType(id) {
@ -552,7 +478,7 @@ export default {
},
/** 查询部门下拉树结构 */
getDeptTree() {
deptTreeSelect().then((response) => {
deptTreeSelect().then(response => {
this.deptOptions = response.data
})
},
@ -564,7 +490,7 @@ export default {
/** 查询字典类型列表 */
getList() {
this.loading = true
getProjectList(this.queryParams).then((response) => {
getProjectList(this.queryParams).then(response => {
this.projectList = response.rows
this.total = response.total
this.loading = false
@ -583,7 +509,7 @@ export default {
proName: undefined,
dictType: undefined,
status: '0',
remark: undefined,
remark: undefined
}
this.resetForm('form')
},
@ -603,28 +529,31 @@ export default {
this.reset()
this.open = true
this.title = '新增工程'
this.getI8ProType()
},
//
handleSelectionChange(selection) {
this.ids = selection.map((item) => item.proId)
this.ids = selection.map(item => item.proId)
this.single = selection.length != 1
this.multiple = !selection.length
},
changeStatus(row) {
let param = {
proId: row.proId,
status: row.status,
status: row.status
}
updateProject(param).then((response) => {
updateProject(param).then(response => {
this.getList()
})
},
/** 修改按钮操作 */
handleUpdate(row) {
this.getI8ProType()
this.reset()
getProjectListDetail(row.proId).then((response) => {
getProjectListDetail(row.proId).then(response => {
this.form = response.data
this.form.impUnit =Number(this.form.impUnit)
this.form.impUnit = Number(this.form.impUnit)
this.form.relatedI8 = this.form.externalId
})
this.open = true
this.title = '编辑工程'
@ -632,12 +561,13 @@ export default {
},
/** 提交按钮 */
submitForm: function () {
this.$refs['form'].validate((valid) => {
console.log(this.form, '提交--->>>')
this.$refs['form'].validate(valid => {
if (valid) {
this.isLoading = true
if (this.form.proId != undefined) {
updateProject(this.form)
.then((response) => {
.then(response => {
this.$modal.msgSuccess('修改成功')
this.open = false
this.isLoading = false
@ -648,7 +578,7 @@ export default {
})
} else {
addProject(this.form)
.then((response) => {
.then(response => {
this.$modal.msgSuccess('新增成功')
this.open = false
this.isLoading = false
@ -681,9 +611,9 @@ export default {
'/material/bm_project/export',
{
...this.queryParams,
dataCondition: this.ids,
dataCondition: this.ids
},
`工程项目_${new Date().getTime()}.xlsx`,
`工程项目_${new Date().getTime()}.xlsx`
)
},
/** 刷新缓存按钮操作 */
@ -693,6 +623,30 @@ export default {
// this.$store.dispatch('dict/cleanDict')
// })
// },
},
handleChangeI8Pro(val) {
console.log('🚀 ~ handleChangeI8Pro ~ val:', val)
if (!val) {
this.form.proName = ''
this.form.externalId = ''
this.form.proCode = ''
this.form.proManager = ''
this.form.contractPart = ''
this.form.proCenter = ''
this.form.impUnit = ''
this.form.proStatus = ''
return
}
const current = this.i8ProOpts.find(item => item.id == val)
console.log('🚀 ~ handleChangeI8Pro ~ current:', current)
this.form.proName = current.projectName
this.form.externalId = current.id
this.form.proCode = current.pcNo
this.form.proManager = current.xmjl
this.form.contractPart = current.htzt
this.form.proCenter = current.textcol1
this.form.impUnit = this.impUnitList.find(item => item.label == current.oname)?.value
this.form.proStatus = this.proStatusOpts.find(item => item.label == current.stat)?.value
}
}
}
</script>

View File

@ -245,7 +245,7 @@ import { deptTreeSelect } from '@/api/system/user'
import Treeselect from '@riophae/vue-treeselect'
import '@riophae/vue-treeselect/dist/vue-treeselect.css'
export default {
name: 'bmUnit',
name: 'BmUnit',
dicts: ['sys_normal_disable'],
components: { Treeselect },
data() {

View File

@ -394,7 +394,7 @@ import Treeselect from "@riophae/vue-treeselect";
import "@riophae/vue-treeselect/dist/vue-treeselect.css";
export default {
name: "bmUnitPeople",
name: "BmUnitPeople",
dicts: ['sys_normal_disable', 'sys_user_sex'],
components: { Treeselect },
data() {

View File

@ -113,7 +113,7 @@
import { listRole } from "@/api/system/role";
import { getKeeperIds, updateBmConfig } from "@/api/ma/typeConfigKeeper";
export default {
name: "siteConfig",
name: "SiteConfig",
data() {
return {
activeName: "first",

View File

@ -265,7 +265,7 @@ import {
updateData,
} from "@/api/system/dict/data";
export default {
name: "unitType",
name: "UnitType",
dicts: ["sys_normal_disable"],
data() {
return {

View File

@ -177,7 +177,7 @@ import qrcode from 'qrcodejs2';
import Treeselect from "@riophae/vue-treeselect";
import "@riophae/vue-treeselect/dist/vue-treeselect.css";
export default {
name: 'Home',
name: 'Code',
dicts: ['qr_box_type'],
components: { Treeselect },
data() {

View File

@ -14,6 +14,8 @@
>减免明细导出</el-button>
<el-button type="warning" size="mini" @click="handleExportAll"
>全部明细导出</el-button>
<el-button type="warning" size="mini" @click="handleExportEach"
>各结算明细导出</el-button>
<el-button type="success" size="mini" @click="handleAdd"
>提交</el-button>
</el-col>
@ -54,12 +56,12 @@
<el-table-column label="规格型号" align="center" prop="modelName" :show-overflow-tooltip="true"/>
<el-table-column label="计量单位" align="center" prop="mtUnitName" :show-overflow-tooltip="true"/>
<el-table-column label="租赁单价" align="center" prop="leasePrice" :show-overflow-tooltip="true">
<template slot-scope="scope" v-if="scope.row.num">
<template slot-scope="scope" v-show="scope.row.leasePrice">
{{ scope.row.leasePrice.toFixed(2) }}
</template>
</el-table-column>
<el-table-column label="租赁数量" align="center" prop="num" :show-overflow-tooltip="true">
<template slot-scope="scope">
<template slot-scope="scope" v-show="scope.row.num">
{{ scope.row.num.toFixed(2) }}
</template>
</el-table-column>
@ -67,12 +69,12 @@
<!-- <el-table-column label="归还数量" align="center" prop="" :show-overflow-tooltip="true" /> -->
<el-table-column label="归还日期 " align="center" prop="endTime" :show-overflow-tooltip="true"/>
<el-table-column label="租赁天数" align="center" prop="leaseDays" :show-overflow-tooltip="true">
<template slot-scope="scope" v-if="scope.row.num">
<template slot-scope="scope" v-show="scope.row.leaseDays">
{{ Number(scope.row.leaseDays).toFixed(2) }}
</template>
</el-table-column>
<el-table-column label="租赁费用(元)" align="center" prop="costs" :show-overflow-tooltip="true">
<template slot-scope="scope" v-if="scope.row.costs">
<template slot-scope="scope" v-show="scope.row.costs">
{{ scope.row.costs.toFixed(2) }}
</template>
</el-table-column>
@ -95,13 +97,13 @@
<el-table-column label="规格型号" align="center" prop="modelName" :show-overflow-tooltip="true"/>
<el-table-column label="计量单位" align="center" prop="mtUnitName" :show-overflow-tooltip="true"/>
<el-table-column label="维修数量" align="center" prop="num" :show-overflow-tooltip="true">
<template slot-scope="scope" v-if="scope.row.num" >
<template slot-scope="scope" v-show="scope.row.num" >
{{ scope.row.num.toFixed(2) }}
</template>
</el-table-column>
<el-table-column label="是否收费" align="center" prop="partType" :show-overflow-tooltip="true"/>
<el-table-column label="维修费用(元)" align="center" prop="costs" :show-overflow-tooltip="true">
<template slot-scope="scope" v-if="scope.row.costs" >
<template slot-scope="scope" v-show="scope.row.costs" >
{{ scope.row.costs.toFixed(2) }}
</template>
</el-table-column>
@ -123,13 +125,13 @@
<el-table-column label="规格型号" align="center" prop="modelName" :show-overflow-tooltip="true"/>
<el-table-column label="计量单位" align="center" prop="mtUnitName" :show-overflow-tooltip="true"/>
<el-table-column label="报废数量" align="center" prop="num" :show-overflow-tooltip="true">
<template slot-scope="scope" v-if="scope.row.num">
<template slot-scope="scope" v-show="scope.row.num">
{{ scope.row.num.toFixed(2) }}
</template>
</el-table-column>
<el-table-column label="是否收费" align="center" prop="partType" :show-overflow-tooltip="true"/>
<el-table-column label="报废费用(元)" align="center" prop="costs" :show-overflow-tooltip="true">
<template slot-scope="scope" v-if="scope.row.costs">
<template slot-scope="scope" v-show="scope.row.costs">
{{ scope.row.costs.toFixed(2) }}
</template>
</el-table-column>
@ -151,12 +153,12 @@
<el-table-column label="规格型号" align="center" prop="modelName" :show-overflow-tooltip="true"/>
<el-table-column label="计量单位" align="center" prop="mtUnitName" :show-overflow-tooltip="true"/>
<el-table-column label="丢失数量" align="center" prop="num" :show-overflow-tooltip="true">
<template slot-scope="scope" v-if="scope.row.num">
<template slot-scope="scope" v-show="scope.row.num">
{{ scope.row.num.toFixed(2) }}
</template>
</el-table-column>
<el-table-column label="丢失费用(元)" align="center" prop="costs" :show-overflow-tooltip="true">
<template slot-scope="scope" v-if="scope.row.costs">
<template slot-scope="scope" v-show="scope.row.costs">
{{ scope.row.costs.toFixed(2) }}
</template>
</el-table-column>
@ -184,7 +186,7 @@
<el-table-column label="减免天数" align="center" prop="days" :show-overflow-tooltip="true"/>
<el-table-column label="减免原因" align="center" prop="remark" :show-overflow-tooltip="true"/>
<el-table-column label="减免费用(元)" align="center" prop="leaseMoney" :show-overflow-tooltip="true">
<template slot-scope="scope" v-if="scope.row.leaseMoney">
<template slot-scope="scope" v-show="scope.row.leaseMoney">
{{ scope.row.leaseMoney.toFixed(2) }}
</template>
</el-table-column>
@ -279,7 +281,6 @@ export default {
this.loseList = response.data.loseList //
this.loseCost = this.countCost(this.loseList)
this.reducList = response.data.reductionList //
console.log('111111111111111111',this.reducList)
if(this.reducList!=null){
this.reducList.forEach((item) => {
this.reducCost = Number(this.reducCost) + Number(item.leaseMoney)
@ -317,8 +318,6 @@ export default {
let arrCost = 0
list.forEach((item) => {
// arrCost += parseInt(item.costs)
console.log(item)
if (item.partType != 0 && item.scrapType != 0) {
arrCost = arrCost + Number(item.costs)
}
@ -332,8 +331,8 @@ export default {
.confirm('是否确认提交?')
.then(() => {
let params = {
'agreementId': this.rowData.agreementId, 'agreementCode': this.rowData.agreementCode,'totalCostAll': this.costAll,
'leaseList': this.leaseList, 'repairList': this.repairList, 'scrapList': this.scrapList,'loseList': this.loseList,
'agreementIds': Array.isArray(this.rowData) ? this.rowData.map(item => item.agreementId) : [],'totalCostAll': this.costAll,
'leaseList': this.leaseList, 'repairList': this.repairList, 'scrapList': this.scrapList,'loseList': this.loseList,'reductionList': this.reducList,
}
console.log('2222222222222',params)
submitCosts(params).then((response) => {
@ -460,6 +459,15 @@ export default {
`全部费用明细_${new Date().getTime()}.xlsx`,
)
},
handleExportEach() {
let data = _.cloneDeep(this.rowData);
const params = {params:JSON.stringify(data)}
this.download(
'material/slt_agreement_info/exportEach',
{...params,},
`各费用明细_${new Date().getTime()}.xlsx`,
)
},
},
}
</script>

View File

@ -378,7 +378,8 @@ export default {
/** 导出按钮操作 */
//
handleExport1() {
const params = this.rowData
let data = _.cloneDeep(this.rowData);
const params = {params:JSON.stringify(data)}
this.download(
'material/slt_agreement_info/exportLease',
{...params,},
@ -387,7 +388,8 @@ export default {
},
//
handleExport2() {
const params = this.rowData
let data = _.cloneDeep(this.rowData);
const params = {params:JSON.stringify(data)}
this.download(
'material/slt_agreement_info/exportLose',
{...params,},
@ -396,7 +398,8 @@ export default {
},
//
handleExport3() {
const params = this.rowData
let data = _.cloneDeep(this.rowData);
const params = {params:JSON.stringify(data)}
this.download(
'material/slt_agreement_info/exportRepair',
{...params,},
@ -405,7 +408,8 @@ export default {
},
//
handleExport4() {
const params = this.rowData
let data = _.cloneDeep(this.rowData);
const params = {params:JSON.stringify(data)}
this.download(
'material/slt_agreement_info/exportScrap',
{...params,},
@ -418,7 +422,8 @@ export default {
// )
},
handleExport5() {
const params = this.rowData
let data = _.cloneDeep(this.rowData);
const params = {params:JSON.stringify(data)}
this.download(
'material/slt_agreement_info/exportReduction',
{...params,},
@ -427,7 +432,8 @@ export default {
},
handleExportAll() {
const params = this.rowData
let data = _.cloneDeep(this.rowData);
const params = {params:JSON.stringify(data)}
this.download(
'material/slt_agreement_info/exportAll',
{...params,},

View File

@ -404,8 +404,8 @@ export default {
},
//
handleView(row) {
let arr = row
console.log('2222222222222',row)
let arr = [];
arr.push(row);
this.$emit("goDetail",JSON.stringify(arr));
},
//

View File

@ -20,6 +20,7 @@ import PageHeader from '@/components/pageHeader'
import ApplyHome from './component/applyHome.vue'
import ApplyDetail from './component/applyDetail.vue'
export default {
name: 'CostApplyList',
components: {
PageHeader,
ApplyHome,

View File

@ -20,6 +20,7 @@ import PageHeader from '@/components/pageHeader'
import ExamHome from './component/examHome.vue'
import ExamDetail from './component/examDetail.vue'
export default {
name: 'CostExamList',
components: {
PageHeader,
ExamHome,

View File

@ -114,7 +114,7 @@ import {getProtocolList, } from "@/api/costPush/costPush";
import Treeselect from "@riophae/vue-treeselect";
import "@riophae/vue-treeselect/dist/vue-treeselect.css";
export default {
name: "",
name: "ProtocolMatch",
data() {
return {
//

View File

@ -427,7 +427,7 @@ import {getPushReviewList, } from "@/api/costPush/costPush";
import Treeselect from "@riophae/vue-treeselect";
import "@riophae/vue-treeselect/dist/vue-treeselect.css";
export default {
name: "",
name: "PushCost",
data() {
return {
//

View File

@ -430,7 +430,7 @@ import {getPushReviewList,getLeaseList,getRepairList,getLoseList,getScrapList }
import Treeselect from "@riophae/vue-treeselect";
import "@riophae/vue-treeselect/dist/vue-treeselect.css";
export default {
name: "",
name: "PushReview",
data() {
return {
//

View File

@ -127,7 +127,7 @@
<script>
import { getConfigListApi, addConfigApi, editConfigApi, deleteConfigApi } from '@/api/countersign/countersign'
export default {
name: 'signConfig',
name: 'Config',
dicts: ['countersign_process_name', 'countersign_type_name', 'tm_task_type'],
data() {
return {

View File

@ -195,7 +195,7 @@ import { deptTreeSelect } from "@/api/system/user";
import Treeselect from "@riophae/vue-treeselect";
import "@riophae/vue-treeselect/dist/vue-treeselect.css";
export default {
name: "signProcess",
name: "Process",
dicts: ["countersign_process_config_name", "countersign_process_type_name"],
data() {
return {

View File

@ -445,7 +445,7 @@ export default {
endTime: this.queryParams.time && this.queryParams.time[1],
pageSize: this.queryParams.pageSize,
pageNum: this.queryParams.pageNum,
statusList: this.queryParams.taskStatus ? [this.queryParams.taskStatus]:this.dict.type.lease_task_status.map(item => item.value)
statusList: this.queryParams.taskStatus ? [this.queryParams.taskStatus]:[1,2,3,4]
};
getListLeaseApply(params).then((response) => {
this.typeList = response.data.rows;
@ -605,9 +605,18 @@ export default {
/** 导出按钮操作 */
handleExport() {
const params = {
keyWord: this.queryParams.keyWord,
taskStatus: this.queryParams.taskStatus,
startTime: this.queryParams.time && this.queryParams.time[0],
endTime: this.queryParams.time && this.queryParams.time[1],
pageSize: this.queryParams.pageSize,
pageNum: this.queryParams.pageNum,
statusList: this.queryParams.taskStatus ? [this.queryParams.taskStatus]:[1,2,3,4]
};
this.download(
"/material/lease_apply_info/export",
{ ...this.queryParams },
{ ...params },
`领料申请_${new Date().getTime()}.xlsx`
);
},

View File

@ -29,6 +29,7 @@ import Home from "./component/homeApply.vue"; // 主列表
import AddTools from "./component/addToolsApply.vue"; //
import QueryTools from "./component/queryToolsApply.vue"; //
export default {
name: "Apply",
components: {
Home,
PageHeaderApply,

View File

@ -559,6 +559,7 @@ import vueEasyPrint from 'vue-easy-print'
// import chapter from '../../../../utils/chapter';
import printJS from 'print-js'
export default {
name: 'OutBound',
dicts: ['lease_task_status'],
components: { vueEasyPrint },
data() {

View File

@ -506,7 +506,7 @@ import Treeselect from '@riophae/vue-treeselect'
import '@riophae/vue-treeselect/dist/vue-treeselect.css'
export default {
name: 'supplier',
name: 'Protocol',
dicts: ['branch_project'],
components: { Treeselect },
data() {

View File

@ -54,10 +54,11 @@
<el-form-item>
<el-button type="primary" icon="el-icon-search" size="mini" @click="handleQuery">查询</el-button>
<el-button icon="el-icon-refresh" size="mini" @click="resetQuery">重置</el-button>
<el-button icon="el-icon-upload2" size="mini" @click="handleSynch">检验报告同步</el-button>
</el-form-item>
</el-form>
<el-table v-loading="loading" :data="deviceList" ref="multipleTable" row-key="teamId">
<el-table v-loading="loading" :data="deviceList" ref="multipleTable" row-key="maId">
<!-- <el-table-column type="selection" width="55" align="center" :reserve-selection="true" /> -->
<el-table-column label="序号" align="center" width="80" type="index">
<template slot-scope="scope">
@ -69,12 +70,31 @@
<el-table-column label="规格型号" align="center" prop="materialModel" sortable show-overflow-tooltip/>
<el-table-column label="设备编号" align="center" prop="maCode" sortable show-overflow-tooltip/>
<el-table-column label="设备状态" align="center" prop="statusName" sortable show-overflow-tooltip/>
<el-table-column label="固定资产编号" align="center" prop="assetsCode" sortable show-overflow-tooltip/>
<el-table-column label="设备原编号" align="center" prop="preCode" sortable show-overflow-tooltip/>
<el-table-column label="购置批次" align="center" prop="buyTask" sortable show-overflow-tooltip/>
<el-table-column label="固定资产编号" align="center" prop="assetsCode" width="200px" sortable show-overflow-tooltip >
<template slot-scope="scope">
<div style="display: flex; align-items: center; justify-content: center;">
<el-input
v-model="scope.row.assetsCode"
placeholder="请输入"
size="small"
style="width: 80%; margin-right: 5px;"
/>
<el-button type="text" icon="el-icon-check" @click="handleAssetsCodeChange(scope.row)"></el-button>
</div>
</template>
</el-table-column>
<el-table-column label="设备原值" align="center" prop="buyPrice" sortable show-overflow-tooltip/>
<el-table-column label="购置批次" align="center" prop="buyTask" sortable show-overflow-tooltip>
<template slot-scope="{ row }">
<span style="color:blue; cursor: pointer" @click="handleViewBuyTask(row)">
{{ row.buyTask }}
</span>
</template>
</el-table-column>
<el-table-column label="绑定标签" align="center" prop="qrCode" sortable show-overflow-tooltip>
<template slot-scope="scope">
<span v-if="scope.row.qrCode!=null" style="color:blue" @click="handleViewQrCode(scope.row)">
<span v-if="scope.row.qrCode!=null" style="color:blue; cursor: pointer" @click="handleViewQrCode(scope.row)">
{{ "查看" }}
</span>
<span v-else>
@ -82,7 +102,7 @@
</span>
</template>
</el-table-column>
<el-table-column label="所在仓库" align="center" prop="ownHouse" sortable show-overflow-tooltip/>
<!-- <el-table-column label="所在仓库" align="center" prop="ownHouse" sortable show-overflow-tooltip/> -->
<el-table-column label="操作" align="center" width="180">
<template slot-scope="scope">
<el-button
@ -102,7 +122,7 @@
>
编辑
</el-button>
<el-button
<!-- <el-button
size="mini"
type="text"
icon="el-icon-delete"
@ -110,7 +130,7 @@
v-hasPermi="['ma:machine:remove']"
>
删除
</el-button>
</el-button> -->
</template>
</el-table-column>
</el-table>
@ -263,7 +283,7 @@
<el-option
v-for="keeper in KeeperOptions"
:key="keeper.userId+''"
:label="keeper.userName"
:label="keeper.nickName"
:value="keeper.userId+''"
></el-option>
</el-select>
@ -281,7 +301,7 @@
<el-option
v-for="keeper in repairerOptions"
:key="keeper.userId"
:label="keeper.userName"
:label="keeper.nickName"
:value="keeper.userId+''"
></el-option>
</el-select>
@ -327,22 +347,42 @@
</div>
</el-dialog>
<!-- 检验报告同步对话框 -->
<el-dialog :title="titleSynch" :visible.sync="openSynch" width="500px" append-to-body @close="cancelSynch">
<el-form ref="formSynchParams" :model="formSynchParams" :inline="true">
<el-form-item prop="reportCode">
<el-input v-model="formSynchParams.reportCode" placeholder="请输入报告编号" maxlength="20" style="width: 340px"/>
</el-form-item>
<el-form-item>
<el-button type="primary" icon="el-icon-search" size="mini" @click="handleQuerySynch">查询</el-button>
</el-form-item>
<div style="margin-top: 10px; height: 100px; text-align: center; ">
<img v-if="formSynchParams.pdf" src="../../../../assets/img/pdf.png" alt="暂无图片" @click="downloadPdf" style="max-width: 100%; max-height: 100%;" />
</div>
</el-form>
<div slot="footer" class="dialog-footer" style="text-align: right">
<el-button type="primary" @click="synchSubmit">同步</el-button>
<el-button @click="cancelSynch">取消</el-button>
</div>
</el-dialog>
</div>
</template>
<script>
import { getListDevice,getDeviceDetail,editDevice,addDevice,delDevice,getDeviceType,getZichanType } from "@/api/ma/device";
import { getListDevice,getDeviceDetail,editDevice,addDevice,delDevice,getDeviceType,getZichanType,getSynchReportCode,synchReport,editAssetsCode } from "@/api/ma/device";
import { getKeeperIds} from "@/api/ma/typeConfigKeeper";
import { getRepairIds } from "@/api/ma/typeConfigRepair";
import {
getUserTypeList,
} from "@/api/ma/base";
import { downloadFile } from '@/utils/download'
import { downloadFile, downloadFileData } from '@/utils/download'
import { getToken } from '@/utils/auth'
import QRCode from 'qrcodejs2';
import html2canvas from 'html2canvas';
export default {
name: "Post",
name: "Device",
data() {
return {
//
@ -421,6 +461,10 @@
//
form: {
qrCode: "",
keeperArr: [],
repairerArr: [],
keeperNameArr: [],
repairerNameArr: [],
},
//
rules: {
@ -433,7 +477,19 @@
qrCode:"",
qrcodeUrl: '',
KeeperOptions: [],
sortedKeeperOptions: [],
repairerOptions: [],
sortedRepairerOptions: [],
titleSynch: "", //
openSynch: false, //
synchLoading: false, //loading
formSynchParams: { //
reportCode: "", //
pdf: "", //pdf
pdfName: "", //pdf
},
dataSynch: {}, //
};
},
created() {
@ -543,32 +599,67 @@
this.queryParams.pageNum = 1;
this.getList();
},
//
handleAssetsCodeChange(row) {
if (!row.assetsCode) {
this.$message.error('请输入资产编号');
}else{
editAssetsCode(row).then(response => {
this.$message.success('固定资产录入成功');
this.getList();
});
}
},
handleUpdate(row){
this.reset()
const maId = row.maId
getDeviceDetail(maId).then((response) => {
this.form = response.data;
if (response.data.keeperId) {
this.form.keeperArr = response.data.keeperId.split(',');
} else {
this.form.keeperArr = []; //
}
if (response.data.repairId) {
this.form.repairerArr = response.data.repairId.split(',');
} else {
this.form.repairerArr = []; //
}
if (this.form.qrCode) {
this.generateQRCode(this.form.qrCode);
// URL
} else {
this.qrcodeUrl = '';
}
this.showHouse = true
this.title = '修改'
})
},
handleUpdate(row){
this.reset()
const maId = row.maId
getDeviceDetail(maId).then((response) => {
this.form = response.data;
if (response.data.keeperId) {
const keeperIds = response.data.keeperId.split(',');
// keeperIds KeeperOptions keeper
const keepers = keeperIds.map((id) =>
this.KeeperOptions.find((keeper) => keeper.userId + '' === id)
).filter(Boolean); // keeper
// keeperName
keepers.sort((a, b) =>
a.nickName.localeCompare(b.nickName, 'zh-CN')
);
// keeperId
this.form.keeperArr = keepers.map((keeper) => keeper.userId + '');
} else {
this.form.keeperArr = []; //
}
if (response.data.repairId) {
const repairerIds = response.data.repairId.split(',');
// keeperIds KeeperOptions keeper
const repairers = repairerIds.map((id) =>
this.repairerOptions.find((repairer) => repairer.userId + '' === id)
).filter(Boolean); // keeper
// keeperName
repairers.sort((a, b) =>
a.nickName.localeCompare(b.nickName, 'zh-CN')
);
// keeperId
this.form.repairerArr = repairers.map((repairer) => repairer.userId + '');
} else {
this.form.repairerArr = []; //
}
if (this.form.qrCode) {
this.generateQRCode(this.form.qrCode);
// URL
} else {
this.qrcodeUrl = '';
}
this.showHouse = true
this.title = '修改'
})
},
handleView(row){
this.reset()
@ -576,12 +667,36 @@
getDeviceDetail(maId).then((response) => {
this.form = response.data;
if (response.data.keeperId) {
this.form.keeperArr = response.data.keeperId.split(',');
const keeperIds = response.data.keeperId.split(',');
// keeperIds KeeperOptions keeper
const keepers = keeperIds.map((id) =>
this.KeeperOptions.find((keeper) => keeper.userId + '' === id)
).filter(Boolean); // keeper
// keeperName
keepers.sort((a, b) =>
a.nickName.localeCompare(b.nickName, 'zh-CN')
);
// keeperId
this.form.keeperArr = keepers.map((keeper) => keeper.userId + '');
} else {
this.form.keeperArr = []; //
}
if (response.data.repairId) {
this.form.repairerArr = response.data.repairId.split(',');
const repairerIds = response.data.repairId.split(',');
// keeperIds KeeperOptions keeper
const repairers = repairerIds.map((id) =>
this.repairerOptions.find((repairer) => repairer.userId + '' === id)
).filter(Boolean); // keeper
// keeperName
repairers.sort((a, b) =>
a.nickName.localeCompare(b.nickName, 'zh-CN')
);
// keeperId
this.form.repairerArr = repairers.map((repairer) => repairer.userId + '');
} else {
this.form.repairerArr = []; //
}
@ -692,7 +807,92 @@
})
}
},
handleViewBuyTask(row) {
this.$router.push({
path: '/purchase/goodsEntry',
query: {
buyTask: row.buyTask
}
})
},
//
handleSynch(){
this.titleSynch = "检验报告同步";
this.openSynch = true;
},
handleQuerySynch(){
const params = {
reportCode: this.formSynchParams.reportCode,
}
getSynchReportCode(params).then((response) => {
let data = response.data;
this.dataSynch = data;
if(data.pdf){
this.formSynchParams.pdf = data.pdf;
this.formSynchParams.pdfName = data.reportName;
}else{
this.formSynchParams.pdf = "";
this.formSynchParams.pdfName = "";
this.$message.error('该报告编号暂无文件');
}
})
},
downloadPdf(){
if (this.formSynchParams.pdf) {
const link = document.createElement('a');
link.href = this.formSynchParams.pdf;
// URL 使
const fileName = this.formSynchParams.pdfName;
link.download = fileName;
//
link.target = '_blank';
//
document.body.appendChild(link);
link.click();
//
document.body.removeChild(link);
}
},
cancelSynch(){
this.openSynch = false;
this.formSynchParams = { //
reportCode: "", //
pdf: "", //pdf
pdfName: "", //pdf
};
this.dataSynch = {};
},
//
synchSubmit(){
const params = {
checkTimeSynch: this.dataSynch.checkTimeSynch,
nextCheckTimeSynch: this.dataSynch.nextCheckTimeSynch,
pdf: this.dataSynch.pdf,
reportName: this.dataSynch.reportName,
reportNum: this.dataSynch.reportNum,
samples: this.dataSynch.samples,
};
synchReport(params).then((response) => {
if (response.code == 200) {
this.$modal.msgSuccess(response.msg);
this.openSynch = false;
this.formSynchParams = {
reportCode: "",
pdf: "",
pdfName: "",
};
this.dataSynch = {};
}
this.getList();
})
}
// handleExport() {
// this.download('/material/ma_machine/export', {

View File

@ -249,6 +249,7 @@ import {
} from '@/api/ma/base'
export default {
name: 'MechEquipConfigMgmt/index',
components: { Treeselect },
data() {
return {

View File

@ -374,7 +374,7 @@ import Treeselect from "@riophae/vue-treeselect";
import "@riophae/vue-treeselect/dist/vue-treeselect.css";
import IconSelect from "@/components/IconSelect";
export default {
name: "partType",
name: "PartType",
components: { Treeselect },
data() {
return {

View File

@ -155,7 +155,7 @@ import {
} from "@/api/ma/base";
export default {
name: "",
name: "PriceHistory",
data() {
return {
@ -243,7 +243,7 @@ export default {
let queryTemp = this.queryParams;
// queryTemp.level = 0;
this.download(
"/material/ma_type/export",
"/material/ma_type/exportHistory",
{
...queryTemp,
},

View File

@ -176,7 +176,7 @@
</el-form-item>
</el-col>
</el-row>
<el-form-item label="营业执照">
<!-- <el-form-item label="营业执照">
<el-upload
class = "upload-demo"
action="#"
@ -192,7 +192,7 @@
:on-remove="handleRemoveElectricianImgList"
>
<!-- 文件格式下载图片格式预览 -->
<div slot="file" slot-scope="{file}">
<img v-if="isImage(file)" class="el-upload-list__item-thumbnail" :src="file.url" alt="">
<div v-else class="picture-card-container" >
@ -214,7 +214,7 @@
<i class="el-icon-plus avatar-uploader-icon" ></i>
</el-upload>
</el-form-item>
</el-form-item> -->
</el-form>
<div slot="footer" class="dialog-footer">
@ -238,7 +238,7 @@
import {Base64} from 'js-base64'
import { forEach } from 'jszip';
export default {
name: "supplier",
name: "Supplier",
data() {
return {
uploadKey: Date.now(),

View File

@ -225,11 +225,11 @@
<el-dialog
:title="title"
:visible.sync="open"
width="1200px"
width="1300px"
append-to-body
:close-on-click-modal="false"
>
<el-form ref="form" :model="form" :rules="rules" label-width="120px">
<el-form ref="form" :model="form" :rules="rules" label-width="140px">
<el-row>
<el-col :span="12">
<el-form-item label="仓库信息">
@ -305,6 +305,23 @@
/>
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item label="管理模式" prop="manageType">
<el-select
v-model="form.manageType"
filterable
placeholder="请选择"
style="width: 100%"
>
<el-option value="0" label="编码管理">编码管理</el-option>
<el-option value="1" label="数量管理">数量管理</el-option>
</el-select>
</el-form-item>
</el-col>
</el-row>
<el-row>
<el-col :span="12">
<el-form-item label="计量单位" prop="unitName">
<el-input
@ -315,18 +332,6 @@
/>
</el-form-item>
</el-col>
</el-row>
<el-row>
<el-col :span="12">
<el-form-item label="排序" prop="sortNum">
<el-input
v-model.number="form.sortNum"
type="number" :min="0" @input="(v)=>(form.sortNum=v.replace(/[^\d]/g,''))"
placeholder="请输入排序"
maxlength="10"
/>
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item label="计量数值" prop="unitValue">
<el-select
@ -344,9 +349,22 @@
</el-select>
</el-form-item>
</el-col>
<!-- <el-col :span="12">
<el-form-item label="是否扣税" prop="isCharging">
<el-select
v-model="form.isCharging"
filterable
placeholder="请选择"
style="width: 100%"
>
<el-option value="0" label="扣税">扣税</el-option>
<el-option value="1" label="不扣税">不扣税</el-option>
</el-select>
</el-form-item>
</el-col> -->
</el-row>
<el-row>
<!-- <el-row>
<el-col :span="8">
<el-form-item label="总保有量" prop="name9">
<el-input
@ -416,40 +434,41 @@
/>
</el-form-item>
</el-col>
</el-row>
</el-row> -->
<el-row>
<el-col :span="6">
<el-col :span="12">
<el-form-item
label="购置价(元/含税)"
label="内部租赁价(元/天)"
prop="leasePrice"
label-width="140px"
>
<el-input
v-model="form.leasePrice"
placeholder="请输入"
maxlength="20"
type="number" :min="0"
style="width: 100%"
/>
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item
label="购置价(元/不含税)"
prop="buyPrice"
label-width="120px"
label-width="140px"
>
<el-input
v-model="form.buyPrice"
placeholder="请输入"
maxlength="20"
type="number" :min="0"
style="width: 170px"
maxlength="20"
style="width: 100%"
/>
</el-form-item>
</el-col>
<el-col :span="6">
<el-form-item
label="购置价(元/不含税)"
prop="name10"
label-width="130px"
>
<el-input
v-model="form.name10"
placeholder="请输入"
type="number" :min="0"
maxlength="20"
style="width: 160px"
/>
</el-form-item>
</el-col>
<el-col :span="6">
<!-- <el-col :span="6">
<el-form-item label="赔偿价(元)" prop="payPrice" label-width="120px">
<el-input
v-model="form.payPrice"
@ -459,44 +478,27 @@
style="width: 170px"
/>
</el-form-item>
</el-col>
<el-col :span="6">
</el-col> -->
</el-row>
<el-row>
<el-col :span="12">
<el-form-item
label="外部租赁价(元/天)"
prop="rentPrice"
label-width="120px"
label-width="140px"
>
<el-input
v-model="form.rentPrice"
placeholder="请输入"
maxlength="20"
type="number" :min="0"
style="width: 160px"
style="width: 100%"
/>
</el-form-item>
</el-col>
</el-row>
<el-row>
<el-col :span="6">
<el-form-item
label="内部租赁价(元/天)"
prop="leasePrice"
label-width="120px"
>
<el-input
v-model="form.leasePrice"
placeholder="请输入"
maxlength="20"
type="number" :min="0"
style="width: 160px"
/>
</el-form-item>
</el-col>
<el-col :span="6">
<el-col :span="12">
<el-form-item label="是否试验" prop="isTest">
<el-select
v-model="form.isTest"
@ -504,43 +506,26 @@
placeholder="请选择"
style="width: 100%"
>
<el-option value="0" label="未试验">未试验</el-option>
<el-option value="1" label="已试验">已试验</el-option>
<el-option value="0" label="否"></el-option>
<el-option value="1" label="是"></el-option>
</el-select>
</el-form-item>
</el-col>
</el-row>
<el-row>
<el-col :span="6">
<el-form-item label="管理模式" prop="manageType">
<el-select
v-model="form.manageType"
filterable
placeholder="请选择"
style="width: 100%"
>
<el-option value="0" label="编码管理">编码管理</el-option>
<el-option value="1" label="数量管理">数量管理</el-option>
</el-select>
</el-form-item>
</el-col>
<el-col :span="6">
<el-form-item label="是否扣税" prop="isCharging">
<el-select
v-model="form.isCharging"
filterable
placeholder="请选择"
style="width: 100%"
>
<el-option value="0" label="扣税">扣税</el-option>
<el-option value="1" label="不扣税">不扣税</el-option>
</el-select>
<el-col :span="12">
<el-form-item label="排序" prop="sortNum">
<el-input
v-model.number="form.sortNum"
type="number" :min="0" @input="(v)=>(form.sortNum=v.replace(/[^\d]/g,''))"
placeholder="请输入排序"
maxlength="10"
/>
</el-form-item>
</el-col>
<el-col :span="6">
<el-col :span="12">
<el-form-item label="检验周期(月)" prop="testCycle">
<el-input
v-model="form.testCycle"
@ -551,56 +536,58 @@
/>
</el-form-item>
</el-col>
<el-col :span="6">
<el-form-item label="抽检比例(%)" prop="name11">
</el-row>
<el-row>
<el-col :span="12">
<el-form-item label="抽检比例(%)" prop="samplingRatio">
<el-input
v-model="form.name11"
v-model="form.samplingRatio"
type="number" :min="0"
placeholder="请输入"
maxlength="20"
style="width: 170px"
style="width: 100%"
/>
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item
label="核定载荷(T/MPa)"
prop="ratedLoad"
>
<el-input
v-model="form.ratedLoad"
placeholder="请输入"
maxlength="20"
style="width: 100%"
/>
</el-form-item>
</el-col>
</el-row>
<el-row>
<el-col :span="6">
<el-form-item
label="核定载荷(T/MPa)"
prop="ratedLoad"
label-width="120px"
>
<el-input
v-model="form.ratedLoad"
placeholder="请输入"
maxlength="20"
style="width: 160px"
/>
</el-form-item>
</el-col>
<el-col :span="6">
<el-col :span="12">
<el-form-item
label="试验载荷(T/MPa)"
prop="testLoad"
label-width="130px"
>
<el-input
v-model="form.testLoad"
placeholder="请输入"
maxlength="20"
style="width: 160px"
style="width: 100%"
/>
</el-form-item>
</el-col>
<el-col :span="6">
<el-col :span="12">
<el-form-item label="持荷时间(分)" prop="holdingTime">
<el-input
v-model="form.holdingTime"
type="number" :min="0"
placeholder="请输入"
maxlength="20"
style="width: 170px"
style="width: 100%"
/>
</el-form-item>
</el-col>
@ -727,7 +714,7 @@ import { getRepairIds } from "@/api/ma/typeConfigRepair";
import { imgUpLoad } from "@/api/system/upload";
export default {
name: "ToolsType",
name: "Type",
components: { Treeselect },
data() {
return {
@ -818,6 +805,34 @@ export default {
trigger: "blur",
},
],
manageType: [
{
required: true,
message: "管理模式不能为空",
trigger: "change",
},
],
unitName: [
{
required: true,
message: "计量单位不能为空",
trigger: "change",
},
],
buyPrice: [
{
required: true,
message: "购置价不能为空",
trigger: "blur",
},
],
leasePrice: [
{
required: true,
message: "内部租赁价不能为空",
trigger: "blur",
},
]
},
companyId: undefined,
dialogImageUrl: "",
@ -1186,38 +1201,18 @@ export default {
this.levelTemp = data.level;
this.idTemp = data.id;
console.log("dataAdd", data);
console.log("idTemp", data);
if (data.level === 3) {
this.reset();
Object.assign(this.form, data);
//
if (this.treeOptions && this.treeOptions[0] && this.treeOptions[0].children) {
this.treeTemp = this.treeOptions[0].children;
//
this.level0TempName = '';
this.level1TempName = '';
this.level2TempName = '';
// 使undefined
this.treeTemp?.forEach((item) => {
item.children?.forEach((itemTemp) => {
if (itemTemp.level == 2 && itemTemp.id == data.parentId) {
this.level2Temp = itemTemp.id;
this.level2TempName = itemTemp.label;
this.level1Temp = itemTemp.parentId;
}
});
});
//
this.treeTemp?.forEach((item) => {
if (item.level == 1 && item.id == this.level1Temp) {
this.level1TempName = item.label;
}
});
this.treeTemp?.forEach((item) => {
if (item.level == 0 && item.id == data.houseId) {
this.level0TempName = item.label;
}
});
//
if (this.treeOptions && this.treeOptions.length > 0) {
this.findLevelInfo(this.treeOptions, data);
}
this.isLevel1Disabled = true;
@ -1238,6 +1233,39 @@ export default {
this.addTitleVisible = true;
}
},
//
findLevelInfo(nodes, targetData) {
for (const node of nodes) {
if (node.level === 0 && node.id === targetData.houseId) {
this.level0TempName = node.label;
}
if (node.level === 2 && node.id === targetData.parentId) {
this.level2TempName = node.label;
// level 1
if (node.parentId !== undefined) {
this.findLevel1Info(this.treeOptions, node.parentId);
}
}
if (node.children && node.children.length > 0) {
this.findLevelInfo(node.children, targetData);
}
}
},
// level 1
findLevel1Info(nodes, parentId) {
for (const node of nodes) {
if (node.level === 1 && node.id === parentId) {
this.level1TempName = node.label;
break;
}
if (node.children && node.children.length > 0) {
this.findLevel1Info(node.children, parentId);
}
}
},
/* 树节点删除 */
removeTreeNode(data) {
// this.$message.success('--')
@ -1386,7 +1414,7 @@ export default {
font-size: 14px;
color: #606266;
font-weight: 500;
line-height: 1.5;
// line-height: 1.5;
}
//

View File

@ -251,7 +251,7 @@ import { getUserList } from "@/api/basic/basic";
import { getInfo } from "@/api/login";
import { downloadFile } from "@/utils/download";
export default {
name: "typeConfig",
name: "TypeConfigKeeper",
components: { Treeselect },
data() {
return {
@ -329,6 +329,7 @@ export default {
pageSize: 1000,
displayBindRelationship: true,
houseId: "",
keyword: "",
// phonenumber: undefined,
// status: undefined,
// typeId: undefined
@ -539,10 +540,22 @@ export default {
this.dateRange = [];
this.resetForm("queryForm");
this.queryParams.typeId = undefined;
this.queryParams.userId = undefined;
this.queryParams.pageNum = 1;
this.queryParams.pageSize = 1000;
this.queryParams.level = 0;
this.queryParams.level = 1;
this.$refs.tree.setCurrentKey(null);
this.$refs.treeTwo.setCurrentKey(null);
if (
this.treeOptionsTwo.length > 0 &&
this.treeOptionsTwo[0].children.length > 0
) {
const firstNode = this.treeOptionsTwo[0].children[0];
this.queryParams.typeId = firstNode.id;
this.queryParams.level = 1;
this.queryParams.houseId = firstNode.houseId;
this.getList();
}
this.handleQuery();
},

View File

@ -250,7 +250,7 @@ import { getUserList } from "@/api/basic/basic";
import { getInfo } from "@/api/login";
import { downloadFile } from "@/utils/download";
export default {
name: "typeConfig",
name: "TypeConfigRepair",
components: { Treeselect },
data() {
return {

View File

@ -239,7 +239,7 @@ import { deptTreeSelect } from "@/api/system/user";
import Treeselect from "@riophae/vue-treeselect";
import "@riophae/vue-treeselect/dist/vue-treeselect.css";
export default {
name: "whHouse",
name: "WhHouse",
data() {
return {
//

View File

@ -266,7 +266,7 @@ import { getPartTypeCheckInfo,getPartTypeFileList } from '@/api/part/partArrived
import { downloadFile } from "@/utils/download";
import { getToken } from "@/utils/auth";
export default {
name: "AcceptDetail",
name: "PartAcceptDetail",
dicts: ["purchase_task_status"],
data() {
return {

View File

@ -258,7 +258,7 @@ import vueEasyPrint from "vue-easy-print";
import { downloadFile } from '@/utils/download'
import { getToken } from '@/utils/auth'
export default {
name: "PartAcceptList",
name: "PartAccept",
dicts: ['part_task_status'],
components: { vueEasyPrint },
data() {

View File

@ -288,7 +288,7 @@ import { getPartTypeCheckInfo,getPartTypeFileList } from '@/api/part/partArrived
import { downloadFile } from "@/utils/download";
import { getToken } from "@/utils/auth";
export default {
name: "AcceptDetail",
name: "PartAcceptDetailTwo",
dicts: ["purchase_task_status"],
data() {
return {

View File

@ -252,7 +252,7 @@ import vueEasyPrint from "vue-easy-print";
import { downloadFile } from '@/utils/download'
import { getToken } from '@/utils/auth'
export default {
name: "PartAcceptList",
name: "PartAcceptTwo",
dicts: ['part_task_status'],
components: { vueEasyPrint },
data() {

View File

@ -369,6 +369,11 @@
<el-form-item label="通知内容:" prop="remark" label-width="100px">
<el-input v-model="form.remark" type="textarea" maxlength="100" :autosize="{ minRows: 3, maxRows: 6 }" placeholder="请输入通知内容" style="width: 450px"/>
</el-form-item>
<el-form-item label="人员名称:" prop="userName" label-width="100px">
<el-input v-model="form.userName" placeholder="请输入人员名称" style="width: 240px; margin-right: 10px"/>
<el-button type="primary" icon="el-icon-search" size="mini" @click="getNoticeList">查询</el-button>
<el-button icon="el-icon-refresh" size="mini" @click="resetDiaQuery">重置</el-button>
</el-form-item>
</el-form>
</el-col>
</el-row>
@ -395,6 +400,13 @@
<!-- 人员添加 -->
<el-dialog title="人员添加" :visible.sync="peopleOpen" v-if="peopleOpen" width="1000px" append-to-body>
<el-form :model="userForm" size="small" inline>
<el-form-item label="人员名称:" prop="userName" label-width="100px">
<el-input v-model="userForm.userName" placeholder="请输入人员名称" style="width: 240px; margin-right: 10px"/>
<el-button type="primary" icon="el-icon-search" size="mini" @click="getAllUserList">查询</el-button>
<el-button icon="el-icon-refresh" size="mini" @click="restUser">重置</el-button>
</el-form-item>
</el-form>
<el-table v-loading="loading" :data="userList" @selection-change="handleSelectionAddUser" height="450">
<el-table-column type="selection" width="50" align="center" />
<el-table-column label="序号" align="center" type="index" />
@ -484,6 +496,8 @@ export default {
},
form: {
remark: "",
taskId: "",
userName: "",
},
//
rules: {
@ -491,6 +505,9 @@ export default {
{ required: true, message: "通知内容不能为空", trigger: "blur" },
],
},
userForm: {
userName: "",
},
openPrint: false,
printData: {},
printDataSign: {},
@ -665,23 +682,31 @@ export default {
},
getNoticeList() {
const taskId = this.form.taskId;
getNoticePeople({ taskId: taskId }).then((response) => {
getNoticePeople({ taskId: taskId, userName: this.form.userName }).then((response) => {
this.getListPeople = response.rows;
this.showPeople = true;
this.loadingTwo = false;
this.title = "通知";
});
},
resetDiaQuery() {
this.form.userName = ""
this.getNoticeList();
},
addUserOpen() {
this.getAllUserList();
this.peopleOpen = true;
},
/** 查询所有用户列表--可添加人员 */
getAllUserList() {
getListUnSelected().then((response) => {
getListUnSelected({userName: this.userForm.userName}).then((response) => {
this.userList = response.rows;
});
},
restUser() {
this.userForm.userName = "";
this.getAllUserList();
},
// -
handleSelectionAddUser(selection) {

View File

@ -29,6 +29,7 @@ import Home from "./component/home.vue"; // 主列表
import AddTools from './component/addTools.vue' //
import QueryTools from './component/queryTools.vue' //
export default {
name: "PartArrived",
components: {
Home,
PageHeader,

View File

@ -28,6 +28,7 @@ import Home from "./component/homeApply.vue"; // 主列表
import AddTools from "./component/addToolsApply.vue"; //
import QueryTools from "./component/queryToolsApply.vue"; //
export default {
name: "PartLease",
components: {
Home,
PageHeaderApply,

Some files were not shown because too many files have changed in this diff Show More