peng.peng 1 year ago
parent
commit
cde3b3f4dc
  1. 2
      api/Dockerfile
  2. 9
      api/app/lib/controllers/device/index.js
  3. 268
      api/app/lib/controllers/patrolManage/patrolRecord.js
  4. 2
      api/app/lib/controllers/patrolManage/patrolTemplate.js
  5. 6
      api/app/lib/index.js
  6. 15
      api/app/lib/routes/patrolManage/patrolRecord.js
  7. 6
      weapp/app.json
  8. BIN
      weapp/images/calendar.png
  9. BIN
      weapp/images/device.png
  10. BIN
      weapp/images/down1.png
  11. BIN
      weapp/images/edit.png
  12. BIN
      weapp/images/shape1.png
  13. BIN
      weapp/images/shape2.png
  14. BIN
      weapp/images/shape3.png
  15. 168
      weapp/package/deviceBigdataGraph/deviceBigdataGraph.js
  16. 11
      weapp/package/deviceBigdataGraph/deviceBigdataGraph.json
  17. 63
      weapp/package/deviceBigdataGraph/deviceBigdataGraph.wxml
  18. 91
      weapp/package/deviceBigdataGraph/deviceBigdataGraph.wxss
  19. 120
      weapp/package/deviceBigdataGraph/statusDetail/statusDetail.js
  20. 10
      weapp/package/deviceBigdataGraph/statusDetail/statusDetail.json
  21. 26
      weapp/package/deviceBigdataGraph/statusDetail/statusDetail.wxml
  22. 76
      weapp/package/deviceBigdataGraph/statusDetail/statusDetail.wxss
  23. 7
      weapp/package/polling/polling.js
  24. 4
      weapp/package/polling/polling.json
  25. 5
      weapp/package/polling/polling.wxml
  26. 552
      weapp/package/report/report.js
  27. 25
      weapp/package/report/report.json
  28. 96
      weapp/package/report/report.wxml
  29. 131
      weapp/package/report/report.wxss
  30. 87
      weapp/package/riskManagement/riskCalendar/riskCalendar.js
  31. 22
      weapp/package/riskManagement/riskCalendar/riskCalendar.wxml
  32. 1
      weapp/package/riskManagement/riskCalendar/riskCalendar.wxss
  33. 70
      weapp/package/riskManagement/riskManagement.js
  34. 30
      weapp/package/riskManagement/riskManagement.wxml
  35. 145
      weapp/package/subSystem/dayPatrolInfo/dayPatrolInfo.js
  36. 9
      weapp/package/subSystem/dayPatrolInfo/dayPatrolInfo.json
  37. 49
      weapp/package/subSystem/dayPatrolInfo/dayPatrolInfo.wxml
  38. 71
      weapp/package/subSystem/dayPatrolInfo/dayPatrolInfo.wxss
  39. 9
      weapp/package/subSystem/subSystem.js
  40. 66
      weapp/package/subSystem/subSystem.wxml
  41. 46
      weapp/package/subSystem/subSystem.wxss
  42. 63
      weapp/package/troubleshooting/shootingForm/index.js
  43. 41
      weapp/package/troubleshooting/shootingForm/index.wxml
  44. 8
      weapp/pages/home/home.js
  45. 51
      weapp/pages/home/home.wxml
  46. 26
      weapp/pages/home/home.wxss
  47. 29
      weapp/pages/overview/overview.js
  48. 4
      weapp/pages/workbench/workbench.js
  49. 5
      weapp/project.config.json
  50. 22
      weapp/utils/getApiUrl.js
  51. 2
      web/Dockerfile

2
api/Dockerfile

@ -1,6 +1,6 @@
FROM registry.cn-hangzhou.aliyuncs.com/fs-devops/node:12-dev as builder FROM registry.cn-hangzhou.aliyuncs.com/fs-devops/node:12-dev as builder
COPY . /var/app COPY ./api/ /var/app
WORKDIR /var/app WORKDIR /var/app

9
api/app/lib/controllers/device/index.js

@ -119,10 +119,17 @@ function editDevice(opts) {
function deleteDevice(opts) { function deleteDevice(opts) {
return async function (ctx, next) { return async function (ctx, next) {
let message = '删除设备失败'
try { try {
const models = ctx.fs.dc.models; const models = ctx.fs.dc.models;
const { id } = ctx.params; const { id } = ctx.params;
if (id) { if (id) {
let exitPointDevice = await models.PointDevice.findOne({ where: { deviceId: { $in: id.split(',') } } })
if (exitPointDevice) {
message = '该设备已绑定点位 无法删除!'
throw new Error(message)
}
await models.Device.destroy({ await models.Device.destroy({
where: { where: {
id: { $in: id.split(',') } id: { $in: id.split(',') }
@ -137,7 +144,7 @@ function deleteDevice(opts) {
} catch (error) { } catch (error) {
ctx.fs.logger.error(`path: ${ctx.path}, error: ${error}`); ctx.fs.logger.error(`path: ${ctx.path}, error: ${error}`);
ctx.status = 400; ctx.status = 400;
ctx.body = { message: '删除设备失败' } ctx.body = { message: message }
} }
} }
} }

268
api/app/lib/controllers/patrolManage/patrolRecord.js

@ -2,6 +2,7 @@
const moment = require("moment"); const moment = require("moment");
async function findPatrolRecord(ctx, next) { async function findPatrolRecord(ctx, next) {
let rslt = []; let rslt = [];
let error = { name: 'FindError', message: '获取巡检记录失败' }; let error = { name: 'FindError', message: '获取巡检记录失败' };
@ -414,21 +415,188 @@ function editPatrolRecordIssueHandle(opts) {
} }
//查询子系统的当月的巡检和维修 //查询子系统的当月的巡检和维修
function getSubSystemPatrolAbout(opts) { function getSubSystemPatrolAbout(opts) {
return async function (ctx, next) {
try {
let rslt = []
const models = ctx.fs.dc.models;
const { STime, ETime, keywords } = ctx.query
let generalInclude = [{ model: models.PatrolRecordIssueHandle }, { model: models.Project, where: { subType: { $like: `%${keywords}%` } } }]
rslt = await models.PatrolRecord.findAll({
where: { inspectionTime: { $between: [STime, ETime] } },
include: generalInclude
})
let userInfo = ctx.fs.api.userInfo;
rslt = rslt.filter(f => f)
if (userInfo.username != 'SuperAdmin') {
if (userInfo.structure) {
rslt = rslt.filter(s => userInfo.structure.find(x => x == s.points.project.id))
} else {
rslt = []
}
}
ctx.status = 200;
ctx.body = rslt
} catch (error) {
ctx.fs.logger.error(`path: ${ctx.path}, error: ${error}`);
ctx.status = 400;
ctx.body = { message: '子系统查询巡检记录失败' }
}
}
}
/**
* 查询故障风险统计
* @param structures {String} 结构物id, example: 1,2,3
*/
function getPatrolRecordStatistic(opts) {
return async function (ctx, next) {
try {
let rslt = {
monthAlarmCount: 0, // 本月上报风险
monthHandleCount: 0, // 本月处理风险
historyTrend: [], // 历史风险趋势
monthDeviceAlarm: [], // 设备故障统计
};
const models = ctx.fs.dc.models;
const sequelize = ctx.fs.dc.orm;
const { structures } = ctx.query;
const monthStartTime = moment().startOf("month").format('YYYY-MM-DD HH:mm:ss');
const historyStartTime = moment().startOf("month").subtract(11, 'months').format('YYYY-MM-DD HH:mm:ss');
const endTime = moment().endOf("month").format('YYYY-MM-DD HH:mm:ss');
const monthAlarm = await models.PatrolRecord.findAndCountAll({
where: {
inspectionTime: { $between: [monthStartTime, endTime] },
projectId: { $in: structures.split(',') },
alarm: true
},
include: [{
model: models.Project,
where: { type: '管廊' }
}],
})
rslt.monthAlarmCount = monthAlarm.count;
let abnormalDevice = [];
for (const r of monthAlarm.rows) {
if (Array.isArray(r.points.inspectContent)) {
for (const d of r.points.inspectContent) {
if (d.deviceName && d.alarm) {
let abnormalCount = 0, abnormalScore = 0, slight = 0, middle = 0, severity = 0, itemsCount = [];
const index = abnormalDevice.findIndex(e => e.deviceId === d.deviceId);
if (index !== -1) {
itemsCount = abnormalDevice[index].itemsCount;
slight = abnormalDevice[index].slight;
middle = abnormalDevice[index].middle;
severity = abnormalDevice[index].severity;
}
for (const item of d.checkItems) {
if (item.isNormal === false) {
abnormalCount += 1;
switch (item.level) {
case '轻微':
slight += 1;
abnormalScore += 1;
break;
case '中度':
middle += 1;
abnormalScore += 3;
break;
case '严重':
severity += 1;
abnormalScore += 5;
break;
default:
break;
}
const itemIndex = itemsCount.findIndex(i => i.name === item.name);
if (itemIndex === -1) {
itemsCount.push({ name: item.name, count: 1 });
} else {
itemsCount[itemIndex].count += 1;
}
}
}
if (index !== -1) {
abnormalDevice[index].abnormalCount += abnormalCount;
abnormalDevice[index].abnormalScore += abnormalScore;
abnormalDevice[index].itemsCount = itemsCount;
abnormalDevice[index].slight = slight;
abnormalDevice[index].middle = middle;
abnormalDevice[index].severity = severity;
} else {
abnormalDevice.push({
deviceId: d.deviceId, deviceName: d.deviceName, project: r.points.project.name,
abnormalCount, abnormalScore, itemsCount, slight, middle, severity,
})
}
}
}
}
}
rslt.monthDeviceAlarm = abnormalDevice;
rslt.monthHandleCount = await models.PatrolRecord.count({
where: {
inspectionTime: { $between: [monthStartTime, endTime] },
projectId: { $in: structures.split(',') },
alarm: true
},
include: [{
model: models.PatrolRecordIssueHandle,
where: { state: 6 } // 验收通过
}, {
model: models.Project,
where: { type: '管廊' }
}],
})
// rslt.historyTrend = await sequelize.query(
// `select to_char(inspection_time::DATE, 'YYYY-MM') as month, COUNT(*) as num from patrol_record INNER JOIN "project" ON "patrol_record"."project_id" = "project"."id" AND "project"."type" = '管廊' where inspection_time >= '${historyStartTime}' and inspection_time <= '${endTime}' group by month order by month;`
// );
const monthFn = sequelize.fn('to_char', sequelize.col('inspection_time'), 'YYYY-MM');
rslt.historyTrend = await models.PatrolRecord.findAll({
attributes: [
[monthFn, 'month'],
[sequelize.fn('COUNT', sequelize.col('*')), 'count'],
],
group: [monthFn],
order: [monthFn],
where: {
inspectionTime: { $between: [historyStartTime, endTime] },
projectId: { $in: structures.split(',') },
alarm: true
},
include: [{
attributes: [],
model: models.Project,
where: { type: '管廊' }
}],
})
ctx.status = 200;
ctx.body = rslt
} catch (error) {
ctx.fs.logger.error(`path: ${ctx.path}, error: ${error}`);
ctx.status = 400;
ctx.body = { message: '查询故障风险统计失败' }
}
}
}
//根据子系统查询点位信息
function getPointInfo(opts) {
return async function (ctx, next){ return async function (ctx, next){
try{ try{
let rslt=[] let rslt=[]
const models = ctx.fs.dc.models; const models = ctx.fs.dc.models;
const {STime,ETime,keywords}=ctx.query const {keywords}=ctx.query
let generalInclude = [{model: models.PatrolRecordIssueHandle},{model:models.Project,where:{subType :{$like: `%${keywords}%`}}}] let generalInclude = [{model:models.Project,where:{subType :{$like: `%${keywords}%`}}},{model:models.Device}]
rslt=await models.PatrolRecord.findAll({ rslt=await models.Point.findAll({
where:{inspectionTime: { $between: [STime, ETime] }},
include:generalInclude include:generalInclude
}) })
let userInfo = ctx.fs.api.userInfo; let userInfo = ctx.fs.api.userInfo;
rslt = rslt.filter(f => f) rslt = rslt.filter(f => f)
if (userInfo.username != 'SuperAdmin') { if (userInfo.username != 'SuperAdmin') {
if (userInfo.structure) { if (userInfo.structure) {
rslt = rslt.filter(s => userInfo.structure.find(x => x == s.points.project.id)) rslt = rslt.filter(s => userInfo.structure.find(x => x == s.project.userId))
} else { } else {
rslt = [] rslt = []
} }
@ -438,11 +606,91 @@ function getSubSystemPatrolAbout(opts) {
}catch(error){ }catch(error){
ctx.fs.logger.error(`path: ${ctx.path}, error: ${error}`); ctx.fs.logger.error(`path: ${ctx.path}, error: ${error}`);
ctx.status = 400; ctx.status = 400;
ctx.body = { message: '子系统查询巡检记录失败' } ctx.body = { message: '根据子系统查询点位信息失败' }
}
}
}
//根据结构物查询对应巡检计划的模板
function getTemplate(opts){
return async function (ctx, next){
try{
let rslt=[]
const models = ctx.fs.dc.models;
const {keywords}=ctx.query
rslt=await models.PatrolPlan.findAll({
include:[
{model:models.Project,
where:{subType:{$like: `%${keywords}%`}}},
{model:models.PatrolTemplate}]
})
let userInfo = ctx.fs.api.userInfo;
rslt = rslt.filter(f => f)
if (userInfo.username != 'SuperAdmin') {
if (userInfo.structure) {
rslt = rslt.filter(s => userInfo.structure.find(x => x == s.project.userId))
} else {
rslt = []
}
}
ctx.status = 200;
ctx.body = rslt
}catch(error){
ctx.fs.logger.error(`path: ${ctx.path}, error: ${error}`);
ctx.status = 400;
ctx.body = { message: '根据结构物查询对应巡检计划的模板失败' }
} }
} }
} }
// //上报问题和发现问题接口
function reportQuest(opts){
return async function (ctx, next){
try{
const transaction = await ctx.fs.dc.orm.transaction();
const models = ctx.fs.dc.models;
const data = ctx.request.body;
let { patrolPlanId, inspectionTime, points, alarm, pointId, projectId } = data
const pointRecord = await models.PatrolRecord.findAll({
where: { pointId: pointId },
order: [['inspectionTime', 'desc']],
attributes: ['inspectionTime'],
});
const lastInspectionTime = pointRecord.length ? pointRecord[0].dataValues.inspectionTime : null;
const recordRes = await models.PatrolRecord.create(
// record
{
patrolPlanId: patrolPlanId,
lastInspectionTime,
inspectionTime,
points,
alarm,
pointId: pointId,
projectId
},{transaction}
);
if (alarm) {
await models.PatrolRecordIssueHandle.create({
patrolRecordId: recordRes.id,
state: 1,
}, { transaction });
}
await transaction.commit();
ctx.status = 204;
}catch(error){
await transaction.rollback();
ctx.fs.logger.error(`path: ${ctx.path}, error: ${error}`);
ctx.status = 400;
ctx.body = { message: '上报问题失败' }
}
}
}
//根据子系统查询点位信息
// function getPointInfo(opts) {
// return async function (ctx, next){
// }
// }
Array.prototype.group = function (callback, thisArg = null) { Array.prototype.group = function (callback, thisArg = null) {
// 参数合法性判断 // 参数合法性判断
@ -473,5 +721,9 @@ module.exports = {
getPatrolRecordIssueHandleById, getPatrolRecordIssueHandleById,
addPatrolRecordIssueHandle, addPatrolRecordIssueHandle,
editPatrolRecordIssueHandle, editPatrolRecordIssueHandle,
getSubSystemPatrolAbout getSubSystemPatrolAbout,
getPatrolRecordStatistic,
getPointInfo,
getTemplate,
reportQuest
} }

2
api/app/lib/controllers/patrolManage/patrolTemplate.js

@ -16,7 +16,7 @@ async function getPatrolTemplate (ctx, next) {
model: models.CheckItems, model: models.CheckItems,
}, { }, {
model: models.PatrolPlan, model: models.PatrolPlan,
attributes: ['name'], attributes: ['structure_id','name'],
}] }]
}; };
if (id) { if (id) {

6
api/app/lib/index.js

@ -111,4 +111,10 @@ module.exports.models = function (dc) { // dc = { orm: Sequelize对象, ORM: Seq
PointDevice.belongsTo(Device, { foreignKey: 'deviceId', targetKey: 'id' }); PointDevice.belongsTo(Device, { foreignKey: 'deviceId', targetKey: 'id' });
Device.hasMany(PointDevice, { foreignKey: 'deviceId', sourceKey: 'id' }); Device.hasMany(PointDevice, { foreignKey: 'deviceId', sourceKey: 'id' });
Device.belongsToMany(Point,{ through: PointDevice, foreignKey: 'deviceId', otherKey: 'pointId' })
Point.belongsToMany(Device,{ through: PointDevice, foreignKey: 'pointId', otherKey: 'deviceId' })
}; };

15
api/app/lib/routes/patrolManage/patrolRecord.js

@ -34,4 +34,19 @@ module.exports = function (app, router, opts) {
//子系统巡检记录 //子系统巡检记录
app.fs.api.logAttr['GET/patrolRecord/subSystemPatrolAbout'] = { content: '子系统查询巡检记录', visible: true }; app.fs.api.logAttr['GET/patrolRecord/subSystemPatrolAbout'] = { content: '子系统查询巡检记录', visible: true };
router.get('/patrolRecord/subSystemPatrolAbout', patrolRecord.getSubSystemPatrolAbout(opts)) router.get('/patrolRecord/subSystemPatrolAbout', patrolRecord.getSubSystemPatrolAbout(opts))
//故障风险管理-统计接口
app.fs.api.logAttr['GET/patrolRecord/statistic'] = { content: '故障风险统计', visible: true };
router.get('/patrolRecord/statistic', patrolRecord.getPatrolRecordStatistic(opts))
//点位信息
app.fs.api.logAttr['GET/patrolRecord/pointInfo'] = { content: '点位信息', visible: true };
router.get('/patrolRecord/pointInfo', patrolRecord.getPointInfo(opts))
//查询模板
app.fs.api.logAttr['GET/patrolRecord/getTemplate'] = { content: '查询模板', visible: true };
router.get('/patrolRecord/getTemplate', patrolRecord.getTemplate(opts))
//查询模板
app.fs.api.logAttr['POST/patrolRecord/reportQuest'] = { content: '上报问题', visible: true };
router.post('/patrolRecord/reportQuest', patrolRecord.reportQuest(opts))
}; };

6
weapp/app.json

@ -22,8 +22,12 @@
"inspectionReport/inspectionReport", "inspectionReport/inspectionReport",
"pointsStatus/pointsStatus", "pointsStatus/pointsStatus",
"subSystem/subSystem", "subSystem/subSystem",
"subSystem/dayPatrolInfo/dayPatrolInfo",
"riskManagement/riskManagement", "riskManagement/riskManagement",
"riskManagement/riskCalendar/riskCalendar" "riskManagement/riskCalendar/riskCalendar",
"deviceBigdataGraph/deviceBigdataGraph",
"deviceBigdataGraph/statusDetail/statusDetail",
"report/report"
] ]
} }
], ],

BIN
weapp/images/calendar.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.1 KiB

BIN
weapp/images/device.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.3 KiB

BIN
weapp/images/down1.png

Binary file not shown.

BIN
weapp/images/edit.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.2 KiB

BIN
weapp/images/shape1.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.6 KiB

BIN
weapp/images/shape2.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 808 B

BIN
weapp/images/shape3.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.6 KiB

168
weapp/package/deviceBigdataGraph/deviceBigdataGraph.js

@ -0,0 +1,168 @@
// package/riskManagement/riskCalendar/riskCalendar.js
import * as echarts from '../components/ec-canvas/echarts';
Page({
initECharts(option) {
this.ecComponent.init((canvas, width, height, dpr) => {
const chart = echarts.init(canvas, null, {
width: width,
height: height,
devicePixelRatio: dpr,
});
chart.setOption(option);
this.chart = chart;
return chart;
});
},
initDeviceECharts(option) {
this.ecDeviceComponent.init((canvas, width, height, dpr) => {
const chart = echarts.init(canvas, null, {
width: width,
height: height,
devicePixelRatio: dpr,
});
chart.setOption(option);
this.chart = chart;
return chart;
});
},
/**
* 页面的初始数据
*/
data: {
ec:{}
},
navigator(e) {
wx.navigateTo({
url: '/package/deviceBigdataGraph/statusDetail/statusDetail',
})
console.log('xxxxxx',e)
},
/**
* 生命周期函数--监听页面加载
*/
onLoad(options) {
const that = this
that.ecComponent = that.selectComponent('#mychart-dom-pie');
that.ecDeviceComponent=that.selectComponent('#mychart-device-pie');
var option = {
backgroundColor: "#ffffff",
legend: {
bottom: 10,
left: 'center',
},
series: [{
label: {
normal: {
fontSize: 14
}
},
type: 'pie',
center: ['50%', '50%'],
radius: ['20%', '40%'],
data: [{
name: '类型一',
value: 1
},
{
name: '类型二',
value: 2
},
{
name: '类型三',
value: 3
},
{
name: '类型四',
value: 4
}
]
}]
};
var optionDevice = {
backgroundColor: "#ffffff",
legend: {
bottom: 10,
left: 'center',
},
series: [{
label: {
normal: {
fontSize: 14
}
},
type: 'pie',
center: ['50%', '50%'],
radius: ['20%', '40%'],
data: [{
name: '正常',
value: 1
},
{
name: '未知',
value: 2
},
{
name: '异常',
value: 3
},
]
}]
};
that.initECharts(option);
that.initDeviceECharts(optionDevice);
},
/**
* 生命周期函数--监听页面初次渲染完成
*/
onReady() {
},
/**
* 生命周期函数--监听页面显示
*/
onShow() {
},
/**
* 生命周期函数--监听页面隐藏
*/
onHide() {
},
/**
* 生命周期函数--监听页面卸载
*/
onUnload() {
},
/**
* 页面相关事件处理函数--监听用户下拉动作
*/
onPullDownRefresh() {
},
/**
* 页面上拉触底事件的处理函数
*/
onReachBottom() {
},
/**
* 用户点击右上角分享
*/
onShareAppMessage() {
}
})

11
weapp/package/deviceBigdataGraph/deviceBigdataGraph.json

@ -0,0 +1,11 @@
{
"navigationBarBackgroundColor": "#1979ff",
"navigationBarTextStyle": "white",
"navigationBarTitleText": "设备大数据图谱",
"enablePullDownRefresh": false,
"usingComponents": {
"ec-canvas": "../components/ec-canvas/ec-canvas",
"van-button": "@vant/weapp/button/index",
"van-progress": "@vant/weapp/progress/index"
}
}

63
weapp/package/deviceBigdataGraph/deviceBigdataGraph.wxml

@ -0,0 +1,63 @@
<!--package/riskManagement/riskCalendar/riskCalendar.wxml-->
<view class="container">
<!--质保图谱-->
<view class="card">
<image src="/images/shape3.png" class="imgStyle"></image>
<view class="top">
<view style="display: flex; align-items: center;">
<image style="width: 30px; height: 30px;" src="/images/edit.png" />
<text class="fontStyle">质保图谱</text>
</view>
<view class="detailStyle">
<van-button type="info" round size="small">查看详情</van-button>
</view>
</view>
<view class="progress-container">
<text class="label">过保比率:</text>
<view class="progress-wrapper">
<progress class="progress" percent="50" color="#4E87FF"></progress>
<text>50%</text>
</view>
</view>
<view class="progress-container">
<text class="label">质保期比例:</text>
<view class="progress-wrapper">
<progress class="progress" percent="50"></progress>
<text>50%</text>
</view>
</view>
</view>
<!--设备状态-->
<view class="card">
<image src="/images/shape1.png" class="imgStyle"></image>
<view class="top">
<view style="display: flex; align-items: center;">
<image style="width: 30px; height: 30px;" src="/images/device.png" />
<text class="fontStyle">设备状态</text>
</view>
<view class="detailStyle">
<van-button type="info" round size="small" bindtap="navigator">查看详情</van-button>
</view>
</view>
<view style="height: 250px;">
<ec-canvas id="mychart-device-pie" canvas-id="mychart-device-pie" ec="{{ ec }}"></ec-canvas>
</view>
</view>
<!--设备类型-->
<view class="card">
<image src="/images/shape1.png" class="imgStyle"></image>
<view class="top">
<view style="display: flex; align-items: center;">
<image style="width: 30px; height: 30px;" src="/images/device.png" />
<text class="fontStyle">设备类型</text>
</view>
<view class="countStyle">
总数:
</view>
</view>
<view style="height: 250px;">
<ec-canvas id="mychart-dom-pie" canvas-id="mychart-pie" ec="{{ ec }}"></ec-canvas>
</view>
</view>
</view>

91
weapp/package/deviceBigdataGraph/deviceBigdataGraph.wxss

@ -0,0 +1,91 @@
/* package/riskManagement/riskCalendar/riskCalendar.wxss */
.container {
background-image: linear-gradient(179deg, #006BE3 0%, #4E87FF 16%, #4e87ff00 93%);
padding: 0 15px;
}
.card {
position: relative;
background-color: #fff;
border: 1px solid #ddd;
border-radius: 8px;
/* padding: 10px; */
box-shadow: 0 4px 8px rgba(0, 0, 0, 0.2);
margin-top: 12px;
width: 100%;
background-image: linear-gradient(0deg, #F3F7FF 84%, #DBE6FF 100%);
}
.top {
display: flex;
justify-content: space-between;
padding: 10px;
/* background-position: bottom; */
}
.fontStyle {
width: 64px;
height: 22px;
font-family: PingFangSC-Medium;
font-weight: 500;
font-size: 16px;
color: #000000d9;
letter-spacing: 0;
margin-left: 5px;
}
.imgStyle {
position: absolute;
width: 115px;
height: 67px;
right: 0;
}
.detailStyle {
z-index: 1;
}
.progress-container {
display: flex;
align-items: center;
width: 100%;
margin: 0px 0px 10px 10px;
}
.label {
margin-right: 10px;
width: 50%;
height: 20px;
font-family: PingFangSC-Regular;
font-weight: 400;
font-size: 14px;
color: #383A3B;
}
.progress-wrapper {
display: flex;
align-items: center;
width: 100%;
}
.percentage {
margin-right: 10px;
}
.progress {
width: 75%;
}
.countStyle {
width: 89px;
height: 24px;
font-family: PingFangSC-Medium;
font-weight: 500;
font-size: 17px;
color: #1684FF;
letter-spacing: 0;
}

120
weapp/package/deviceBigdataGraph/statusDetail/statusDetail.js

@ -0,0 +1,120 @@
// package/deviceBigdataGraph/detail/detail.js
import * as echarts from '../../components/ec-canvas/echarts';
function setOption(chart, data) {
const option = {
grid: {
top: '5%',
left: '3%',
right: '4%',
bottom: '3%',
containLabel: true
},
xAxis: {
type: 'category',
data: ['Mon', 'Tue', 'Wed', 'Thu', 'Fri', 'Sat', 'Sun']
},
yAxis: {
type: 'value'
},
series: [
{
data: data,
type: 'line'
}
]
};
chart.setOption(option);
}
Page({
/**
* 页面的初始数据
*/
data: {
ec: {
// onInit: initChart,
lazyLoad: true, // 将 lazyLoad 设为 true 后,需要手动初始化图表
},
isLoaded: false,
list: [1,2,3]
},
/**
* 生命周期函数--监听页面加载
*/
onLoad(options) {
setTimeout(() => {
this.initChart([250, 300, 100, 147, 260, 123, 311])
}, 1000)
},
initChart: function (data) {
this.ecComponent.init((canvas, width, height, dpr) => {
const chart = echarts.init(canvas, null, {
width: width,
height: height,
devicePixelRatio: dpr // new
});
setOption(chart, data);
// 将图表实例绑定到 this 上,可以在其他成员函数中访问
this.chart = chart;
this.setData({
isLoaded: true,
});
// 注意这里一定要返回 chart 实例,否则会影响事件处理等
return chart;
});
},
/**
* 生命周期函数--监听页面初次渲染完成
*/
onReady() {
this.ecComponent = this.selectComponent('#device-status-chart');
},
/**
* 生命周期函数--监听页面显示
*/
onShow() {
},
/**
* 生命周期函数--监听页面隐藏
*/
onHide() {
},
/**
* 生命周期函数--监听页面卸载
*/
onUnload() {
},
/**
* 页面相关事件处理函数--监听用户下拉动作
*/
onPullDownRefresh() {
},
/**
* 页面上拉触底事件的处理函数
*/
onReachBottom() {
},
/**
* 用户点击右上角分享
*/
onShareAppMessage() {
}
})

10
weapp/package/deviceBigdataGraph/statusDetail/statusDetail.json

@ -0,0 +1,10 @@
{
"navigationBarBackgroundColor": "#1979ff",
"navigationBarTextStyle": "white",
"navigationBarTitleText": "设备状态",
"enablePullDownRefresh": false,
"usingComponents": {
"ec-canvas": "../../components/ec-canvas/ec-canvas"
}
}

26
weapp/package/deviceBigdataGraph/statusDetail/statusDetail.wxml

@ -0,0 +1,26 @@
<!--package/deviceBigdataGraph/detail/detail.wxml-->
<view class="status-detail">
<view class="icon"><text class="icon-text">设备总数</text></view>
<view>300</view>
<view class="flex flex-around">
<view class="title-item flex flex-col">
<view>设备故障率</view>
<view><text class="title-num">{{86}}%</text></view>
</view>
<view class="title-item flex flex-col">
<view>完好率</view>
<view><text class="title-num">{{300}}%</text></view>
</view>
</view>
<view class="card">
<view class="flex flex-start">
<!-- <image src="" class="card-img" /> -->
<view class="card-img" style="background: blue;"></view>
<view class="card-title">历史风险趋势</view>
</view>
<view class="chart">
<ec-canvas id="device-status-chart" canvas-id="device-status-chart" ec="{{ ec }}"></ec-canvas>
</view>
</view>
</view>

76
weapp/package/deviceBigdataGraph/statusDetail/statusDetail.wxss

@ -0,0 +1,76 @@
/* package/deviceBigdataGraph/detail/detail.wxss */
.status-detail {
height: 100vh;
background-image: linear-gradient(179deg, #006BE3 0%, #4E87FF 16%, #4e87ff00 93%);
padding: 0 15px;
}
.icon {
width: 61px;
height: 31.86px;
background-image: linear-gradient(0deg, #EAF2FF 5%, #2578F0 100%);
box-shadow: 0 3px 4px 1px #bfdbfa4f;
}
.icon-text {
width: 48px;
height: 17px;
font-family: PingFangSC-Medium;
font-weight: 500;
font-size: 12px;
color: #FFFFFF;
}
.title-item {
width: 150px;
color: #ffffffd9;
}
.title-num {
font-size: 20px;
color: #FFFFFF;
}
.title-unit {
font-size: 10px;
color: #FFFFFE;
margin-left: 10px;
}
.card {
background: #FFFFFF;
box-shadow: 2px 2px 11px 0 #00000008, 0 0 4px 0 #00000012;
border-radius: 4px;
padding: 12px;
margin-top: 12px;
}
.card-img {
width: 18px;
height: 18px;
margin-right: 13px;
}
.card-title {
font-weight: 500;
font-size: 16px;
color: #383A3B;
}
.card-link {
font-weight: 500;
font-size: 14px;
color: #1684FF;
}
.chart {
width: 100%;
height: 195px;
margin-top: 20px;
}
.list {
margin-top: 10px;
padding: 10px 7px;
background-color: #F1F7FF;
}

7
weapp/package/polling/polling.js

@ -48,7 +48,12 @@ Page({
}, },
recordHidden: true, recordHidden: true,
}, },
jumpToReport (options) {
const key='主动上报'
wx.navigateTo({
url: `/package/report/report?key=${key}`,
})
},
// 顶部tab切换 // 顶部tab切换
onChange(event) { onChange(event) {
this.setData({ this.setData({

4
weapp/package/polling/polling.json

@ -9,6 +9,8 @@
"van-tabs": "@vant/weapp/tabs/index", "van-tabs": "@vant/weapp/tabs/index",
"van-dropdown-menu": "@vant/weapp/dropdown-menu/index", "van-dropdown-menu": "@vant/weapp/dropdown-menu/index",
"van-dropdown-item": "@vant/weapp/dropdown-item/index", "van-dropdown-item": "@vant/weapp/dropdown-item/index",
"van-datetime-picker": "@vant/weapp/datetime-picker/index" "van-datetime-picker": "@vant/weapp/datetime-picker/index",
"van-icon": "@vant/weapp/icon/index"
} }
} }

5
weapp/package/polling/polling.wxml

@ -79,5 +79,10 @@
</view> </view>
</view> </view>
</van-tab> </van-tab>
<van-tab title='主动上报' >
<view>
<van-button type="info" round bindtap="jumpToReport"><van-icon name="plus" /></van-button>
</view>
</van-tab>
</van-tabs> </van-tabs>
</view> </view>

552
weapp/package/report/report.js

@ -0,0 +1,552 @@
// package/report/report.js
import { getPointList,getPatrolTemplate,getTemplates,reportQuest,getPatrolPlan } from "../../utils/getApiUrl";
import {Request} from "../../common";
const moment = require("../../utils/moment");
Page({
data: {
isPlanState: false,
structList: [{
id: 0,
name: '指挥中心'
}, {
id: 1,
name: '管廊'
},
{
id: 2,
name: '电梯系统'
}, {
id: 3,
name: '供配电系统'
}, {
id: 4,
name: '燃气仓'
},
{
id: 5,
name: '给水仓'
}, {
id: 6,
name: '防雷与接地系统'
}, {
id: 7,
name: '电气仓'
},
{
id: 8,
name: '高压电力仓'
}, {
id: 9,
name: '安防系统'
}
],
data:[],//巡检计划的数据(包括点位,设备等等)
structListIndex: undefined,//结构物id
pointList:[],//点位列表
pointIndex:undefined,//点位索引
devicesList:[],//设备列表
dataList: '', // 当前巡检计划
patrolTemplate:[],//巡检模板
templateData:[],//巡检模板总数居
// curPlanTemplateId:0,//当前巡检计划的模板id
patrolTemplateIndex:undefined,//巡检模板索引
itemData: '', // 点位
address: '', // 当前位置
imgUrl: getApp().globalData.imgUrl,
checkItems: [], // 检查项
inspectContentArr: [], // 巡检内容
isCommitting: false,
planList: null, // 巡检计划列表
structListVisible: true,
scenePointId: null, // 当前点位id
},
//巡检计划
getPatrolPlan: function (scenePointId) {
let that = this;
wx.showLoading({
title: '加载中',
})
Request.get(getPatrolPlan()).then(res => {
wx.hideLoading();
let pointPlan = res.rows.filter(plan => {
for (const point of plan.points) {
if (point.id == scenePointId) {
return true;
}
}
return false;
}).map(p => ({
label: p.name,
value: p.name,
...p
}))
that.setData({
planList: pointPlan
})
})
},
//点位改变函数
pointChange(e){
const that = this
that.getPatrolPlan(that.data.data[e.detail.value].id)
that.setData({
inspectContentArr:[],
pointIndex:e.detail.value,
devicesList:that.data.data[e.detail.value].devices,
scenePointId:that.data.data[e.detail.value].id
})
},
// 预览图片
previewImg: function (e) {
const { deviceidx, itemidx, index } = e.currentTarget.dataset;
// 所有图片
const imgs = this.data.inspectContentArr[deviceidx].checkItems[itemidx].imgs;
const newImgs = imgs.map(i => this.data.imgUrl + i);
wx.previewImage({
// 当前显示图片
current: newImgs[index],
// 所有图片
urls: newImgs
})
},
//结构物改变函数
structChange(event) {
const that = this
that.setData({
structListIndex: event.detail.value,
// isPlanState: true,
pointList:[],//选择结构物后先置空先前的点位列表
})
const keywords=that.data?.structList[event.detail.value]?.name
const query={keywords}
Request.get(getTemplates(query)).then(res=>{
if(res){
const rlst=res.map(item=>item.patrolTemplate)
that.setData({patrolTemplate:rlst,templateData:res})
}else{
}
})
Request.get(getPointList(query)).then(res => {
if(res){
const pointList=res.map(item=>{
return {
id:item.id,
name:item.name
}
})
that.setData({pointList:pointList,data:res})
}else {
wx.hideLoading();
}
})
},
//整理设备和检查项
getPatrolTemplate(templateId,pointDevices=[]) {
const that=this
Request.get(getPatrolTemplate(templateId)).then(res => {
const checkItems = res.rows[0].checkItems;
let inspectContentArr = [];
// 有绑定设备的点位,每个设备都要检查各个检查项
if (pointDevices.length) {
pointDevices.forEach(device => {
inspectContentArr.push({
deviceName: device.name,
deviceId: device.id,
checkItems: checkItems.map(c => ({
id: `${device.id}-${c.id}`,
name: c.name,
isNormal: null,
msgInp: null,
level: null,
imgs: [],
}))
})
});
} else {
inspectContentArr.push({
checkItems: checkItems.map(c => ({
id: c.id,
name: c.name,
isNormal: null,
msgInp: null,
level: null,
imgs: [],
}))
})
}
this.setData({
checkItems,
inspectContentArr: inspectContentArr,
})
})
},
//选择异常或者正常
handleChangeTwo(e) {
const isNormal = e.detail === 'normal';
const { deviceidx, itemidx } = e.currentTarget.dataset;
let nextInspectContentArr = this.data.inspectContentArr;
nextInspectContentArr[deviceidx].checkItems[itemidx].isNormal = isNormal;
if (isNormal) { // 清除异常数据
nextInspectContentArr[deviceidx].checkItems[itemidx].msgInp = null;
nextInspectContentArr[deviceidx].checkItems[itemidx].level = null;
nextInspectContentArr[deviceidx].checkItems[itemidx].imgs = [];
}
this.setData({ inspectContentArr: nextInspectContentArr })
},
//返回前一页
bindCancel() {
wx.navigateBack();
},
// 开始巡检录入
addPatrolRecord: function () {
const that = this;
if (that.data.isCommitting) { return }
let {
patrolTemplate,
patrolTemplateIndex,
structListIndex,
pointIndex,
pointList,
inspectContentArr,
dataList,
address,
data,
templateData
} = that.data;
let alarm = false;
if (!address) {
wx.showToast({
title: '请获取当前位置',
icon: 'none',
duration: 1500
})
return;
}
if (!structListIndex) {
wx.showToast({
title: '请选择结构物',
icon: 'none',
duration: 1500
})
return;
}
if (!patrolTemplateIndex) {
wx.showToast({
title: '请选择模板',
icon: 'none',
duration: 1500
})
return;
}
if (!pointIndex) {
wx.showToast({
title: '请选择点位',
icon: 'none',
duration: 1500
})
return;
}
let reportArr = inspectContentArr.map(d => ({ ...d, alarm: false }));
for (const [index, device] of inspectContentArr.entries()) {
for (const item of device.checkItems) {
if (item.isNormal === null) {
wx.showToast({
title: '请填写完整',
icon: 'none',
duration: 1500
})
return;
}
if ((!item.isNormal) && (!item.level || !item.msgInp)) {
wx.showToast({
title: '异常项必须输入巡查详情和选择严重等级',
icon: 'none',
duration: 2000
})
return;
}
if (item.isNormal === false) {
alarm = true; // 巡检记录异常
reportArr[index].alarm = true; // 设备异常
}
}
}
const { id, name, departmentId, deptName } = wx.getStorageSync('userInfo');
const curPlan = that.data.planList.find(item=>item.id=patrolTemplate[patrolTemplateIndex].id)
const nextItemData = curPlan.points.find(p => p.id == this.data.scenePointId)
const aboutSend=templateData.find(item=>item.patrolTemplate.id===patrolTemplate[patrolTemplateIndex].id)
let datas = {
patrolPlanId: -1,
pointId: pointList[pointIndex].id,
inspectionTime: moment().format('YYYY-MM-DD HH:mm:ss'),
points: {
user: { id, name, department: { id: departmentId, name: deptName } },
project: aboutSend.project,
frequency: aboutSend.frequency,
itemData:nextItemData,
inspectContent: reportArr,
address: address
},
alarm,
projectId: aboutSend.project.id
}
wx.showLoading({ title: '提交中...' });
that.setData({ isCommitting: true });
Request.post(reportQuest(), datas).then(res => {
wx.hideLoading();
that.setData({ isCommitting: false });
wx.showToast({
title: '提交成功',
icon: 'success'
})
setTimeout(() => {
that.bindCancel();
}, 1500)
})
},
//多张图片上传
uploadImg: function (data, deviceidx, itemidx) {
wx.showLoading({
title: '上传中...',
mask: true,
})
let that = this,
i = data.i ? data.i : 0,
success = data.success ? data.success : 0,
fail = data.fail ? data.fail : 0;
let imgs = that.data.inspectContentArr[deviceidx].checkItems[itemidx].imgs;
wx.uploadFile({
url: data.url,
filePath: data.path[i],
name: 'file',
success: (resp) => {
wx.hideLoading();
success++;
let str = JSON.parse(resp.data) // 返回的结果,可能不同项目结果不一样
str = str.uploaded
if (imgs.length >= 20) {
let nextInspectContentArr = that.data.inspectContentArr;
nextInspectContentArr[deviceidx].checkItems[itemidx].imgs = imgs;
that.setData({ inspectContentArr: nextInspectContentArr });
return false;
} else {
imgs.push(str);
let nextInspectContentArr = that.data.inspectContentArr;
nextInspectContentArr[deviceidx].checkItems[itemidx].imgs = imgs;
that.setData({ inspectContentArr: nextInspectContentArr });
}
},
fail: (res) => {
fail++;
console.log('fail:' + i + "fail:" + fail);
},
complete: () => {
i++;
if (i == data.path.length) { // 当图片传完时,停止调用
console.log('执行完毕');
console.log('成功:' + success + " 失败:" + fail);
} else { // 若图片还没有传完,则继续调用函数
data.i = i;
data.success = success;
data.fail = fail;
that.uploadImg(data, deviceidx, itemidx); // 递归,回调自己
}
}
});
},
// 上传图片
chooseImg: function (e) { // 这里是选取图片的方法
const { deviceidx, itemidx } = e.currentTarget.dataset;
const that = this;
let pics = [];
const detailPics = that.data.inspectContentArr[deviceidx].checkItems[itemidx].imgs;
if (detailPics.length >= 20) {
wx.showToast({
title: '最多选择20张图片上传',
icon: 'none'
});
return;
}
wx.chooseMedia({
count: 20, // 基础库2.25.0前,最多可支持9个文件,2.25.0及以后最多可支持20个文件
mediaType: ['image'], // 文件类型
sizeType: ['original', 'compressed'], // original 原图,compressed 压缩图,默认二者都有
sourceType: ['album', 'camera'], // album 从相册选图,camera 使用相机,默认二者都有
success: function (res) {
const imgs = res.tempFiles;
for (let i = 0; i < imgs.length; i++) {
if (res.tempFiles[i].size > 15728640) {
wx.showToast({ title: '图片大于15M,不可上传', icon: 'none' });
return;
}
const fileNameArr = res.tempFiles[i].tempFilePath.split('.');
const extension = res.tempFiles[i].tempFilePath.split('.')[fileNameArr.length - 1];
if (extension !== 'jpg' && extension !== 'png' && extension !== 'jpeg') {
wx.showToast({ title: '只能上传jpg、jpeg、png格式的图片', icon: 'none' });
return;
}
pics.push(imgs[i].tempFilePath)
}
that.uploadImg({
url: getApp().globalData.webUrl + '_upload/attachments/project', // 图片上传的接口
path: pics, // 选取的图片的地址数组
}, deviceidx, itemidx);
},
})
},
// 删除图片
deleteImg: function (e) {
const { deviceidx, itemidx, index } = e.currentTarget.dataset;
let imgs = this.data.inspectContentArr[deviceidx].checkItems[itemidx].imgs;
imgs.splice(index, 1);
let nextInspectContentArr = this.data.inspectContentArr;
nextInspectContentArr[deviceidx].checkItems[itemidx].imgs = imgs;
this.setData({ inspectContentArr: nextInspectContentArr })
},
// 巡查详情
bindInput: function (e) {
const { deviceidx, itemidx } = e.currentTarget.dataset;
let nextInspectContentArr = this.data.inspectContentArr;
nextInspectContentArr[deviceidx].checkItems[itemidx].msgInp = e.detail.value;
this.setData({ inspectContentArr: nextInspectContentArr })
},
handleChangeThree(e) {
const { deviceidx, itemidx } = e.currentTarget.dataset;
let nextInspectContentArr = this.data.inspectContentArr;
nextInspectContentArr[deviceidx].checkItems[itemidx].level = e.detail;
this.setData({ inspectContentArr: nextInspectContentArr })
},
//巡检模板改变
patrolTemplateChange(e){
const that=this
that.getPatrolTemplate(that.data.patrolTemplate[e.detail.value].id,that.data.devicesList)
that.setData({
patrolTemplateIndex:e.detail.value
})
},
bindShowMsg() {
this.setData({
select: !this.data.select
})
},
mySelect(e) {
var name = e.currentTarget.dataset.name
this.setData({
tihuoWay: name,
select: false
})
},
/**
* 页面的初始数据
*/
// data: {
// },
/**
* 生命周期函数--监听页面加载
*/
onLoad(options) {
const that=this
wx.setNavigationBarTitle({
title: options.key,
});
},
onStructListPicker() {
this.setData({
structListVisible: true
});
},
// 获取当前位置
selfLocation() {
const that = this
wx.showLoading({
title: '定位中',
mask: true,
});
wx.getLocation({
type: 'wgs84',
success: (res) => {
wx.request({
url: `https://apis.map.qq.com/ws/geocoder/v1/?location=${res.latitude},${res.longitude}&key=${getApp().globalData.key}`,
success: function (res) {
wx.hideLoading();
// 根据自己项目需求获取res内容
that.setData({
address: res.data.result.address
})
}
})
},
fail: (res) => {
wx.hideLoading();
wx.showToast({
title: res.errMsg,
icon: 'none',
duration: 1000
});
}
});
},
/**
* 生命周期函数--监听页面初次渲染完成
*/
onReady() {
},
/**
* 生命周期函数--监听页面显示
*/
onShow() {
},
/**
* 生命周期函数--监听页面隐藏
*/
onHide() {
},
/**
* 生命周期函数--监听页面卸载
*/
onUnload() {
},
/**
* 页面相关事件处理函数--监听用户下拉动作
*/
onPullDownRefresh() {
},
/**
* 页面上拉触底事件的处理函数
*/
onReachBottom() {
},
/**
* 用户点击右上角分享
*/
onShareAppMessage() {
}
})

25
weapp/package/report/report.json

@ -0,0 +1,25 @@
{
"navigationBarBackgroundColor": "#1979ff",
"navigationBarTextStyle": "white",
"navigationBarTitleText": "发现问题",
"enablePullDownRefresh": false,
"componentFramework": "glass-easel",
"usingComponents": {
"van-button": "@vant/weapp/button/index",
"van-field": "@vant/weapp/field/index",
"van-cell": "@vant/weapp/cell/index",
"van-cell-group": "@vant/weapp/cell-group/index",
"van-picker": "@vant/weapp/picker/index",
"van-popup": "@vant/weapp/popup/index",
"van-icon": "@vant/weapp/icon/index",
"van-collapse": "@vant/weapp/collapse/index",
"van-collapse-item": "@vant/weapp/collapse-item/index",
"van-divider": "@vant/weapp/divider/index",
"t-cell-group": "tdesign-miniprogram/cell-group/cell-group",
"t-cell": "tdesign-miniprogram/cell/cell",
"t-picker": "tdesign-miniprogram/picker/picker",
"t-picker-item": "tdesign-miniprogram/picker-item/picker-item",
"van-radio": "@vant/weapp/radio/index",
"van-radio-group": "@vant/weapp/radio-group/index"
}
}

96
weapp/package/report/report.wxml

@ -0,0 +1,96 @@
<view class="popBox">
<view>
<van-cell-group class="mission-card">
<van-cell>
<view style="display:flex">
<view class="fs-cell-title" style="">结构物:</view>
<picker style="width:100%;text-align:left" bindchange="structChange" data-type='jiegouwu' value="{{0}}" range="{{structList}}" range-key="name">
<view class="fs-cell-content" style="width:100%">
{{structListIndex||structListIndex==0?structList[structListIndex].name:'请选择'}}
<van-icon name="arrow" style="float:right;position:relative; top:4px" />
</view>
</picker>
</view>
</van-cell>
<van-cell>
<view style="display:flex">
<view class="fs-cell-title" style="">当前点位:</view>
<picker style="width:100%;text-align:left" bindchange="pointChange" data-type='point' range="{{pointList}}" range-key="name">
<view class="fs-cell-content" style="width:100%">
{{pointIndex||pointIndex==0?pointList[pointIndex].name:'请选择'}}
<van-icon name="arrow" style="float:right;position:relative; top:4px" />
</view>
</picker>
</view>
</van-cell>
<van-cell>
<view style="overflow: hidden;">
<view style="float: left;" class="fs-cell-title">当前位置:</view>
<view style="float:right;" class="fs-cell-content" wx:if="{{address}}">
{{address}}
</view>
<view style="float:right;">
<image wx:if="{{!address}}" class="icon" src="../../images/landmark.svg" />
<view style="display: inline-block;" bindtap="selfLocation" wx:if="{{!address}}">
点击获取
</view>
</view>
</view>
</van-cell>
<van-cell>
<view style="display:flex">
<view class="fs-cell-title">巡检模板:</view>
<picker style="width:100%;text-align:left" bindchange="patrolTemplateChange" data-type='template' value="{{0}}" range="{{patrolTemplate}}" range-key="name">
<view class="fs-cell-content" style="width:100%">
{{patrolTemplateIndex||patrolTemplateIndex==0?patrolTemplate[patrolTemplateIndex].name:'请选择'}}
<van-icon name="arrow" style="float:right;position:relative; top:4px" />
</view>
</picker>
</view>
</van-cell>
</van-cell-group>
</view>
<!-- 渲染巡检内容 -->
<view wx:for="{{inspectContentArr}}" wx:key="id" wx:for-item="device" wx:for-index="deviceidx" >
<view wx:if="{{device.deviceName}}" class="flex flex-start" style="height: 40px">{{device.deviceName}}</view>
<view wx:for="{{device.checkItems}}" wx:key="id" wx:for-index="itemidx">
<view class="flex-between">
<view class="item-name">{{item.name}}:</view>
<van-radio-group style="padding:10px 15px;" data-deviceidx="{{deviceidx}}" data-itemidx="{{itemidx}}" bindchange="handleChangeTwo">
<van-radio style="margin-right: 20px;" class="radio-text" color="#1979ff" name="normal">正常</van-radio>
<van-radio class="radio-text" checked-color="#CC0000" name="abnormal">异常</van-radio>
</van-radio-group>
</view>
<view class="divider" />
<van-radio-group class="flex-end" style="padding:10px 15px;" data-deviceidx="{{deviceidx}}" data-itemidx="{{itemidx}}" bindchange="handleChangeThree" wx:if="{{item.isNormal === false}}">
<van-radio style="margin-right: 20px;" class="radio-text" checked-color="#FF9900" name="轻微">轻微</van-radio>
<van-radio style="margin-right: 20px;" class="radio-text" checked-color="#FF3300" name="中度">中度</van-radio>
<van-radio class="radio-text" checked-color="#990000" name="严重">严重</van-radio>
</van-radio-group>
<textarea class="textarea" placeholder="请输入巡查详情" maxlength="-1" wx:if="{{item.isNormal === false}}" data-deviceidx="{{deviceidx}}" data-itemidx="{{itemidx}}" bindinput="bindInput" />
<view class="weui-uploader" style="padding: 20rpx 30rpx;overflow-y:scroll;" wx:if="{{item.isNormal === false}}">
<view class="img-v weui-uploader__bd" style="overflow:hidden;">
<view class="pic" wx:for="{{item.imgs}}" wx:for-item="img" wx:key="*this">
<image class="weui-uploader__img showImg" src="{{imgUrl + img}}" data-index="{{index}}" data-deviceidx="{{deviceidx}}" data-itemidx="{{itemidx}}" mode="aspectFill" bindtap="previewImg">
<icon type="cancel" class="delete-btn" data-index="{{index}}" data-deviceidx="{{deviceidx}}" data-itemidx="{{itemidx}}" catchtap="deleteImg" />
</image>
</view>
<!-- 用来提示用户上传图片 -->
<view class="weui-uploader__input-box pic" data-item="{{item.name}}" data-deviceidx="{{deviceidx}}" data-itemidx="{{itemidx}}" bindtap="chooseImg">
<image class="upload" src="/images/upload.png" />
</view>
</view>
</view>
<view class="divider" />
</view>
</view>
<view class="btnBox">
<view class="cancel" bindtap="bindCancel">取消</view>
<view class="submit" bindtap="addPatrolRecord">提交</view>
</view>
</view>

131
weapp/package/report/report.wxss

@ -0,0 +1,131 @@
.divider {
width: 100%;
height: 0px;
border-top: 1px solid #F5F5F5;
}
.flex-between {
display: flex;
justify-content: space-between;
}
.flex-end {
display: flex;
justify-content: flex-end;
}
.popBox {
position: absolute;
left: 50%;
z-index: 1000;
background: #fff;
width: 95%;
margin-left: -356rpx;
padding: 20rpx 0;
}
.item-name {
margin: 20rpx 0 0 30rpx;
}
.btnBox {
padding: 50px 30rpx;
overflow: hidden;
font-size: 30rpx;
display: flex;
justify-content: space-between;
}
.cancel {
width: 38vw;
height: 42px;
line-height: 42px;
text-align: center;
background: #fff;
border: 1px solid #006BE3;
border-radius: 24px;
font-weight: 600;
font-size: 16px;
color: #1684FF;
}
.submit {
width: 38vw;
height: 42px;
line-height: 42px;
text-align: center;
background: #1684FF;
border: 1px solid #006BE3;
border-radius: 24px;
font-weight: 600;
font-size: 16px;
color: #FFFFFF;
}
.pic {
float: left;
position: relative;
margin-right: 8px;
margin-bottom: 8px;
}
.showImg {
width: 160rpx;
height: 160rpx;
}
.delete-btn {
position: absolute;
top: 0;
right: 0;
}
.upload {
width: 63px;
height: 63px;
}
.block {
display: block;
}
.icon {
width: 18px;
height: 18px;
margin-right: 5px;
}
.radio-text {
font-size: 14px;
color: #323233;
}
.van-radio-group {
display: flex;
}
.textarea {
width: 84%;
margin: 0 auto;
padding: 20rpx;
height: 120rpx;
border: 1px solid #61616166;
}
.mission-card-title {
background-color: #fff;
overflow: auto;
padding: 24rpx 16px;
display: flex;
align-items: center
}
.fs-cell-title {
max-width: 6.2em;
min-width: 6.2em;
margin-right: 12px;
text-align: left;
color: var(--field-label-color, #646566)
}
.fs-cell-content {
color: var(--field-input-text-color, #323233)
}

87
weapp/package/riskManagement/riskCalendar/riskCalendar.js

@ -1,14 +1,28 @@
// package/riskManagement/riskCalendar/riskCalendar.js // package/riskManagement/riskCalendar/riskCalendar.js
Page({ import { getPatrolRecord } from "../../../utils/getApiUrl";
import { Request } from "../../../common";
import moment from '../../../utils/moment';
Page({
/** /**
* 页面的初始数据 * 页面的初始数据
*/ */
data: { data: {
show: false, show: false,
level: ['轻微', '中度', '严重'], level: ['全部', '轻微', '中度', '严重'],
curLevel: '轻微', curLevel: '全部',
todayAlarm: [1, 2, 3], minDate: moment().startOf('day').subtract(6, 'days').valueOf(),
maxDate: moment().endOf('day').valueOf(),
curDate: moment().format('YYYY-MM-DD'),
showList: [],
formatter(day) { return day; },
},
dayData: [], // 每天的异常数据
onDateSelect(e) {
this.setData({ curDate: moment(e.detail).format('YYYY-MM-DD') })
this.calcShowList(this.data.curLevel, moment(e.detail).format('YYYY-MM-DD'))
}, },
showPopup() { showPopup() {
@ -19,13 +33,76 @@ Page({
}, },
onConfirm(e) { onConfirm(e) {
this.setData({ curLevel: e.detail.value, show: false }) this.setData({ curLevel: e.detail.value, show: false })
this.calcShowList(e.detail.value, this.data.curDate)
},
calcShowList(level = this.data.curLevel, date = this.data.curDate) {
const { dayData } = this;
let nextShowList = []
for (const day of dayData) {
if (day.formatDate === date) {
nextShowList = day.data;
}
}
if (level !== '全部') {
nextShowList = nextShowList.filter(l => l.level === level)
}
this.setData({ showList: nextShowList })
},
// 查看详情
toDetail(e) {
let data = JSON.stringify(e.currentTarget.dataset.item);
wx.navigateTo({
url: '/package/polling/inspectionRecordDetail/inspectionRecordDetail?data=' + encodeURIComponent(data),
})
}, },
/** /**
* 生命周期函数--监听页面加载 * 生命周期函数--监听页面加载
*/ */
onLoad(options) { onLoad(options) {
const { minDate, maxDate } = this.data;
Request.get(getPatrolRecord('all', moment(minDate).format('YYYY-MM-DD HH:mm:ss'), moment(maxDate).format('YYYY-MM-DD HH:mm:ss'), true, 'null')).then(res => {
let dayData = new Array(7)
for (let i = 6; i >= 0; i--) {
const month = moment().subtract(i, 'day').month();
const date = moment().subtract(i, 'day').date();
let data = [];
res.forEach(d => {
if (moment(d.inspectionTime).date() === date) {
// 计算此记录的异常等级(检查项中异常最高等级),用于列表展示
let tempLevel = '轻微';
for (const device of d.points.inspectContent) {
if (device.alarm === true) {
for (const item of device.checkItems) {
if (item.level) { tempLevel = item.level; }
}
}
}
data.push({
...d, level: tempLevel,
inspectionTime: moment(d.inspectionTime).format('YYYY-MM-DD HH:mm:ss'),
lastInspectionTime: d.lastInspectionTime ? moment(d.lastInspectionTime).format('YYYY-MM-DD HH:mm:ss') : '--',
})
}
})
dayData[6 - i] = { month, date, formatDate: moment().subtract(i, 'day').format('YYYY-MM-DD'), data }
}
const formatter = (day) => {
const month = day.date.getMonth();
const date = day.date.getDate();
dayData.forEach(d => {
if (d.month === month && d.date === date && d.data.length) {
day.bottomInfo = '🔸'
}
})
return day;
}
this.setData({ formatter });
this.dayData = dayData;
this.calcShowList();
})
}, },
/** /**

22
weapp/package/riskManagement/riskCalendar/riskCalendar.wxml

@ -6,7 +6,7 @@
<image class="card-icon" src="/images/calendar_icon.png" /> <image class="card-icon" src="/images/calendar_icon.png" />
<view class="title">巡检日历</view> <view class="title">巡检日历</view>
</view> </view>
<view class="card-right">{{'2023-10-20'}}</view> <view class="card-right">{{curDate}}</view>
<image src="/images/calendar_card_bg.png" class="card-bg" /> <image src="/images/calendar_card_bg.png" class="card-bg" />
</view> </view>
<view class="calendar-box"> <view class="calendar-box">
@ -16,6 +16,10 @@
show-subtitle="{{ false }}" show-subtitle="{{ false }}"
poppable="{{ false }}" poppable="{{ false }}"
show-confirm="{{ false }}" show-confirm="{{ false }}"
min-date="{{ minDate }}"
max-date="{{ maxDate }}"
formatter="{{ formatter }}"
bind:select="onDateSelect"
row-height="48" row-height="48"
color="#1684FF" color="#1684FF"
class="calendar" class="calendar"
@ -30,7 +34,7 @@
<image class="arrow" src="/images/arrow_right_blue.svg" /> <image class="arrow" src="/images/arrow_right_blue.svg" />
</view> </view>
</view> </view>
<van-popup show="{{ show }}" round position="bottom" bind:click-overlay="onCancel"> <van-popup show="{{ show }}" round position="bottom" close-on-click-overlay="{{false}}">
<van-picker <van-picker
show-toolbar show-toolbar
columns="{{ level }}" columns="{{ level }}"
@ -39,27 +43,27 @@
/> />
</van-popup> </van-popup>
<view wx:for="{{todayAlarm}}" class="card" style="margin-bottom: 10px"> <view wx:for="{{showList}}" class="card" style="margin-bottom: 10px">
<view class="card-top flex flex-between"> <view class="card-top flex flex-between">
<view class="card-left flex"> <view class="card-left flex">
<image class="card-icon" src="/images/right_icon.png" /> <image class="card-icon" src="/images/right_icon.png" />
<view class="title">结构物A</view> <view class="title">{{item.points.project.name}}</view>
</view> </view>
<view class="card-right-btn flex">查看详情</view> <view class="card-right-btn flex" data-item="{{item}}" bindtap="toDetail">查看详情</view>
<image src="/images/right_card_bg.png" class="card-bg" /> <image src="/images/right_card_bg.png" class="card-bg" />
</view> </view>
<view class="card-content"> <view class="card-content">
<view class="row flex flex-between"> <view class="row flex flex-between">
<view class="content-left">本次巡检日期</view> <view class="content-left">本次巡检日期</view>
<view class="content-right">2020/12/21 17:00:00</view> <view class="content-right">{{item.inspectionTime}}</view>
</view> </view>
<view class="row flex flex-between"> <view class="row flex flex-between">
<view class="content-left">点位</view> <view class="content-left">点位</view>
<view class="content-right">点位A</view> <view class="content-right">{{item.points.itemData.name}}</view>
</view> </view>
<view class="row flex flex-between"> <view class="row flex flex-between">
<view class="content-left">巡检人</view> <view class="content-left">巡检人</view>
<view class="content-right">离成功</view> <view class="content-right">{{item.points.user.name}}</view>
</view> </view>
<view class="row flex flex-between"> <view class="row flex flex-between">
<view class="content-left">巡检结果</view> <view class="content-left">巡检结果</view>
@ -67,7 +71,7 @@
</view> </view>
<view class="row flex flex-between"> <view class="row flex flex-between">
<view class="content-left">异常等级</view> <view class="content-left">异常等级</view>
<view class="content-right" style="color: red;">轻微</view> <view class="content-right" style="color: red;">{{item.level}}</view>
</view> </view>
</view> </view>
</view> </view>

1
weapp/package/riskManagement/riskCalendar/riskCalendar.wxss

@ -47,6 +47,7 @@
border-radius: 16px; border-radius: 16px;
color: #fff; color: #fff;
font-size: 13px; font-size: 13px;
z-index: 99;
} }
.card-icon { .card-icon {

70
weapp/package/riskManagement/riskManagement.js

@ -1,5 +1,8 @@
// package/riskManagement/riskManagement.js // package/riskManagement/riskManagement.js
import * as echarts from '../components/ec-canvas/echarts'; import * as echarts from '../components/ec-canvas/echarts';
import { Request } from "../../common";
import { getPatrolRecordStatistic } from '../../utils/getApiUrl';
import moment from '../../utils/moment';
function setOption(chart, data) { function setOption(chart, data) {
const option = { const option = {
@ -10,17 +13,42 @@ function setOption(chart, data) {
bottom: '3%', bottom: '3%',
containLabel: true containLabel: true
}, },
tooltip: {
trigger: 'axis',
},
xAxis: { xAxis: {
type: 'category', type: 'category',
data: ['Mon', 'Tue', 'Wed', 'Thu', 'Fri', 'Sat', 'Sun'] data: data.map(d => d.month),
boundaryGap: false,
axisLabel: {
formatter: (value) => {
const temp = value.split('-');
return + temp[1] + '月' + '\n ' + temp[0];
}
},
}, },
yAxis: { yAxis: {
type: 'value' type: 'value',
splitLine: { // 网格线
lineStyle: {
type: 'dashed'
},
}
}, },
series: [ series: [
{ {
data: data, data: data.map(d => d.count),
type: 'line' type: 'line',
symbol: 'circle',
symbolSize: 5,
itemStyle: {
normal: {
color: '#008AFF',
lineStyle: {
color: '#008AFF',
}
}
},
} }
] ]
}; };
@ -39,6 +67,11 @@ Page({
}, },
isLoaded: false, isLoaded: false,
list: [1, 2, 3, 4], list: [1, 2, 3, 4],
monthAlarmCount: 0,
monthHandleCount: 0,
historyTrend: [],
monthDeviceRank: [],
monthDeviceScoreRank: [],
}, },
// 初始化图表 // 初始化图表
@ -75,17 +108,38 @@ Page({
* 生命周期函数--监听页面加载 * 生命周期函数--监听页面加载
*/ */
onLoad(options) { onLoad(options) {
const userInfo = wx.getStorageSync("userInfo");
// 请求数据 // 请求数据
setTimeout(() => { wx.showLoading()
this.initChart([250, 300, 100, 147, 260, 123, 311]) Request.get(getPatrolRecordStatistic(userInfo.structure.join())).then(res => {
}, 1000) wx.hideLoading()
let historyTrend = new Array(12)
for (let i = 11; i >= 0; i--) {
const month = moment().subtract(i, 'month').format('YYYY-MM')
historyTrend[11 - i] = {
month: month,
count: res.historyTrend?.find(h => h.month === month)?.count || 0,
}
}
const monthDeviceRank = [...res.monthDeviceAlarm]
.sort((a, b) => b.abnormalCount - a.abnormalCount)
.map(d => ({ ...d, itemsCount: d.itemsCount.sort((a, b) => b.count - a.count) }))
this.setData({
monthAlarmCount: res.monthAlarmCount,
monthHandleCount: res.monthHandleCount,
historyTrend,
monthDeviceRank: monthDeviceRank,
monthDeviceScoreRank: [...res.monthDeviceAlarm].sort((a, b) => b.abnormalScore - a.abnormalScore),
})
this.initChart(historyTrend)
})
}, },
/** /**
* 生命周期函数--监听页面初次渲染完成 * 生命周期函数--监听页面初次渲染完成
*/ */
onReady() { onReady() {
this.ecComponent = this.selectComponent('#risk-trend-chart'); this.ecComponent = this.selectComponent('#risk-trend-chart-dom');
}, },
/** /**

30
weapp/package/riskManagement/riskManagement.wxml

@ -2,16 +2,16 @@
<view class="risk-management"> <view class="risk-management">
<image src="/images/right_bg.png" class="page-bg" /> <image src="/images/right_bg.png" class="page-bg" />
<view class="icon"><text class="icon-text">故障统计</text></view> <view class="icon flex"><text class="icon-text">故障统计</text></view>
<view class="flex flex-between"> <view class="flex flex-between">
<view class="title-item flex flex-col"> <view class="title-item flex flex-col">
<view>本月上报风险</view> <view>本月上报风险</view>
<view><text class="title-num">{{86}}</text><text class="title-unit">个</text></view> <view><text class="title-num">{{monthAlarmCount}}</text><text class="title-unit">个</text></view>
</view> </view>
<view class="title-item flex flex-col"> <view class="title-item flex flex-col">
<view>故障风险管理</view> <view>本月处理风险</view>
<view><text class="title-num">{{300}}</text><text class="title-unit">个</text></view> <view><text class="title-num">{{monthHandleCount}}</text><text class="title-unit">个</text></view>
</view> </view>
</view> </view>
@ -21,7 +21,7 @@
<view class="card-title">历史风险趋势</view> <view class="card-title">历史风险趋势</view>
</view> </view>
<view class="chart"> <view class="chart">
<ec-canvas id="risk-trend-chart" canvas-id="risk-trend-chart" ec="{{ ec }}"></ec-canvas> <ec-canvas id="risk-trend-chart-dom" canvas-id="risk-trend-chart" ec="{{ ec }}"></ec-canvas>
</view> </view>
</view> </view>
@ -34,8 +34,8 @@
<view class="card-link" bindtap="toCalendar">查看详情 ></view> <view class="card-link" bindtap="toCalendar">查看详情 ></view>
</view> </view>
<view style="margin-top: 10px">【故障次数统计】</view> <view style="margin-top: 10px">【故障次数统计】</view>
<view class="list" wx:for="{{list}}"> <view class="list" wx:for="{{monthDeviceRank}}">
<view class="list-title">设备{{item}}</view> <view class="list-title">{{item.deviceName}}</view>
<view class="list-line" /> <view class="list-line" />
<view class="list-content flex flex-between"> <view class="list-content flex flex-between">
<view class="content-item content-left"> <view class="content-item content-left">
@ -44,15 +44,15 @@
<view>问题概述</view> <view>问题概述</view>
</view> </view>
<view class="content-item content-right"> <view class="content-item content-right">
<view>管廊{{item}}</view> <view>{{item.project}}</view>
<view>{{10}}次</view> <view>{{item.abnormalCount}}次</view>
<view>{{'设备损坏' + item}}</view> <view>{{item.itemsCount[0].name}}</view>
</view> </view>
</view> </view>
</view> </view>
<view style="margin-top: 10px">【故障评分统计】</view> <view style="margin-top: 10px">【故障评分统计】</view>
<view class="list" wx:for="{{list}}"> <view class="list" wx:for="{{monthDeviceScoreRank}}">
<view class="list-title">设备{{item}}</view> <view class="list-title">{{item.deviceName}}</view>
<view class="list-line" /> <view class="list-line" />
<view class="list-content flex flex-between"> <view class="list-content flex flex-between">
<view class="content-item content-left"> <view class="content-item content-left">
@ -61,9 +61,9 @@
<view>等级分布</view> <view>等级分布</view>
</view> </view>
<view class="content-item content-right"> <view class="content-item content-right">
<view>管廊{{item}}</view> <view>{{item.project}}</view>
<view>{{15 - item}}</view> <view>{{item.abnormalScore}}</view>
<view>严重:{{5-item}}次,中等{{2}}次,轻微{{1}}次</view> <view>严重:{{item.severity}}次,中度{{item.middle}}次,轻微{{item.slight}}次</view>
</view> </view>
</view> </view>
</view> </view>

145
weapp/package/subSystem/dayPatrolInfo/dayPatrolInfo.js

@ -0,0 +1,145 @@
// package/subSystem/dayPatrolInfo/dayPatrolInfo.js
import * as echarts from '../../components/ec-canvas/echarts';
const setPieOptions = ((chart, data) => {
const option = {
grid: {
top: '0%',
left: '3%',
right: '4%',
bottom: '3%',
containLabel: true
},
tooltip: {
trigger: 'item'
},
legend: {
top: 'bottom',
},
series: [
{
type: 'pie',
radius: ['30%', '55%'],
// avoidLabelOverlap: false,
emphasis: {
label: {
show: true,
fontWeight: 'bold'
}
},
data: data
}
]
};
chart.setOption(option);
})
Page({
/**
* 页面的初始数据
*/
data: {
needEc: { lazyLoad: true },
alreadyEc: { lazyLoad: true },
},
// 今日待检分布图表
initNeedChart: function (data) {
this.needEcComponent.init((canvas, width, height, dpr) => {
const chart = echarts.init(canvas, null, {
width: width,
height: height,
devicePixelRatio: dpr // new
});
setPieOptions(chart, data)
return chart;
});
},
// 今日已检分布图表
initAlreadyChart: function (data) {
this.alreadyEcComponent.init((canvas, width, height, dpr) => {
const chart = echarts.init(canvas, null, {
width: width,
height: height,
devicePixelRatio: dpr // new
});
setPieOptions(chart, data)
return chart;
});
},
/**
* 生命周期函数--监听页面加载
*/
onLoad(options) {
wx.setNavigationBarTitle({ title: options.day })
setTimeout(() => {
this.initNeedChart([
{ value: 1048, name: 'Search Engine' },
{ value: 735, name: 'Direct' },
{ value: 580, name: 'Email' },
{ value: 580, name: 'Email2' },
{ value: 580, name: 'Email3' },
])
this.initAlreadyChart([
{ value: 1048, name: 'Search Engine' },
{ value: 735, name: 'Direct' },
{ value: 580, name: 'Email' },
{ value: 580, name: 'Email2' },
{ value: 580, name: 'Email3' },
])
}, 1000)
},
/**
* 生命周期函数--监听页面初次渲染完成
*/
onReady() {
this.needEcComponent = this.selectComponent('#need-chart-dom');
this.alreadyEcComponent = this.selectComponent('#already-chart-dom');
},
/**
* 生命周期函数--监听页面显示
*/
onShow() {
},
/**
* 生命周期函数--监听页面隐藏
*/
onHide() {
},
/**
* 生命周期函数--监听页面卸载
*/
onUnload() {
},
/**
* 页面相关事件处理函数--监听用户下拉动作
*/
onPullDownRefresh() {
},
/**
* 页面上拉触底事件的处理函数
*/
onReachBottom() {
},
/**
* 用户点击右上角分享
*/
onShareAppMessage() {
}
})

9
weapp/package/subSystem/dayPatrolInfo/dayPatrolInfo.json

@ -0,0 +1,9 @@
{
"navigationBarBackgroundColor": "#006BE3",
"navigationBarTextStyle": "white",
"navigationBarTitleText": "",
"enablePullDownRefresh": false,
"usingComponents": {
"ec-canvas": "../../components/ec-canvas/ec-canvas"
}
}

49
weapp/package/subSystem/dayPatrolInfo/dayPatrolInfo.wxml

@ -0,0 +1,49 @@
<!--package/subSystem/dayPatrolInfo/dayPatrolInfo.wxml-->
<view class="day-patrol-info">
<view class="card" style="margin-bottom: 10px">
<view class="card-top flex flex-between">
<view class="card-left flex">
<image class="card-icon" src="/images/right_icon.png" />
<view class="title">今日问题分布</view>
</view>
<image src="/images/right_card_bg.png" class="card-bg" />
</view>
<view wx:for="{{[1,2,3,4]}}" class="problem-box flex">
<view class="problem-title text---">类型1:</view>
<progress
style="width: 70%;"
percent="{{80}}"
stroke-width="8"
show-info
font-size="14"
border-radius="4"
/>
</view>
</view>
<view class="card" style="margin-bottom: 10px">
<view class="card-top flex flex-between">
<view class="card-left flex">
<image class="card-icon" src="/images/right_icon.png" />
<view class="title">今日待检分布</view>
</view>
<view class="card-right">总次数:{{50}}次</view>
<image src="/images/right_card_bg.png" class="card-bg" />
</view>
<view class="pie-chart-box">
<ec-canvas id="need-chart-dom" canvas-id="need-chart" ec="{{ needEc }}"></ec-canvas>
</view>
</view>
<view class="card" style="margin-bottom: 10px">
<view class="card-top flex flex-between">
<view class="card-left flex">
<image class="card-icon" src="/images/right_icon.png" />
<view class="title">今日已检分布</view>
</view>
<view class="card-right">总次数:{{50}}次</view>
<image src="/images/right_card_bg.png" class="card-bg" />
</view>
<view class="pie-chart-box">
<ec-canvas id="already-chart-dom" canvas-id="already-chart" ec="{{ alreadyEc }}"></ec-canvas>
</view>
</view>
</view>

71
weapp/package/subSystem/dayPatrolInfo/dayPatrolInfo.wxss

@ -0,0 +1,71 @@
.day-patrol-info {
height: 100%;
background-image: linear-gradient(179deg, #006BE3 0%, #4E87FF 16%, #4e87ff00 93%);
padding: 0 15px 15px;
}
.card {
box-sizing: border-box;
background: #FFFFFF;
box-shadow: 2px 2px 11px 0 #00000008, 0 0 4px 0 #00000012;
border-radius: 4px;
}
.card-top {
height: 68px;
background-image: linear-gradient(0deg, #F3F7FF 84%, #DBE6FF 100%);
border-radius: 4px;
position: relative;
}
.card-bg {
position: absolute;
top: 0;
right: 11px;
width: 115px;
height: 67px;
}
.card-left {
margin-left: 23px;
font-weight: 500;
font-size: 16px;
color: #000000d9;
}
.card-right {
margin-right: 18px;
color: #1684FF;
}
.card-icon {
width: 30px;
height: 30px;
margin-right: 8px;
}
.problem-box {
width: 100%;
height: 58px;
padding: 18px;
border-top: 1px solid rgb(238, 237, 237);
box-sizing: border-box;
}
.problem-title {
width: 30%;
font-size: 14px;
color: #383A3B;
}
.t-class-label {
font-size: 14px;
color: #383A3B;
}
.pie-chart-box {
box-sizing: border-box;
width: 100%;
height: 280px;
padding: 0 10px 10px;
}

9
weapp/package/subSystem/subSystem.js

@ -68,6 +68,12 @@ Page({
}); });
}, },
onDateSelect(e) {
wx.navigateTo({
url: `/package/subSystem/dayPatrolInfo/dayPatrolInfo?day=${moment(e.detail).format('YYYY-MM-DD')}`,
})
},
/** /**
* 生命周期函数--监听页面加载 * 生命周期函数--监听页面加载
*/ */
@ -141,7 +147,7 @@ Page({
if (res) { if (res) {
//巡查内容 //巡查内容
that.setData({ that.setData({
currentRepairCount: res?.filter(i => i?.patrolRecordIssueHandles[0]?.yanshoushijian && parseInt(moment(i?.patrolRecordIssueHandles[0]?.yanshoushijian).format('YYYYMMDD')) === parseInt(moment().format('YYYYMMDD'))).length || 0, currentRepairCount: res?.filter(i =>i.patrolRecordIssueHandles.length>0 ).length || 0,
currentPatrolCount: res.length, currentPatrolCount: res.length,
level1Count: that.filterLevelCount(res,'轻微')||0, level1Count: that.filterLevelCount(res,'轻微')||0,
level2Count: that.filterLevelCount(res,'中度')||0, level2Count: that.filterLevelCount(res,'中度')||0,
@ -160,7 +166,6 @@ Page({
} }
}) })
that.ecComponent = that.selectComponent('#mychart-dom-pie'); that.ecComponent = that.selectComponent('#mychart-dom-pie');
console.log('that.level1Count',this.data.level2Count)
var option = { var option = {
backgroundColor: "#ffffff", backgroundColor: "#ffffff",
legend: { legend: {

66
weapp/package/subSystem/subSystem.wxml

@ -1,35 +1,41 @@
<!--package/subSystem/subSystem.wxml--> <!--package/subSystem/subSystem.wxml-->
<!--总览图--> <view style="background-image: linear-gradient(179deg, #006BE3 0%, #4E87FF 16%, #4e87ff00 93%); padding: 0 15px; ">
<view style="display: flex;justify-content: space-around;margin-bottom: 10px; padding-top: 10px; background-image: linear-gradient(179deg, #006BE3 0%, #4E87FF 16%, #4e87ff00 93%);"> <!--总览图-->
<view> <view style="display: flex;justify-content: space-around;margin-bottom: 10px; padding-top: 10px; ">
<view>本月巡检次数</view> <view>
<view class="number">{{currentPatrolCount}}</view> <view>本月巡检次数</view>
<view class="number">{{currentPatrolCount}}</view>
</view>
<view>
<view>本月维修次数</view>
<view class="number">{{currentRepairCount}}</view>
</view>
</view> </view>
<view> <!--饼图-->
<view>本月维修次数</view> <view class="card ">
<view class="number">{{currentRepairCount}}</view> <image src="/images/shape1.png" class="imgStyle"></image>
</view> <view class="top">
</view> <view style="display: flex; align-items: center;">
<!--饼图--> <image style="width: 30px; height: 30px;" src="/images/device.png" />
<view class="card" > <text class="fontStyle">故障</text>
<ec-canvas id="mychart-dom-pie" canvas-id="mychart-pie" ec="{{ ec }}"></ec-canvas> </view>
<view class="countStyle">
总数:{{currentPatrolCount}}
</view>
</view>
<view style="height: 300px"> <ec-canvas id="mychart-dom-pie" canvas-id="mychart-pie" ec="{{ ec }}"></ec-canvas>
</view> </view>
<!--巡检日历-->
<view class="card heightStyle">
<view class="header">
<view class="xunjian">巡检日历</view>
<view class="yearMonth">{{currentYear+'年'+currentMonth+'月'}}</view>
</view> </view>
<van-calendar <!--巡检日历-->
max-date="{{lastDay}}" <view class="card heightStyle">
v-model="selectedDate" <view class="header">
readonly <view style="display:flex;align-items: center;">
show-title="{{false}}" <image style="width: 30px; height: 30px;" src="/images/calendar.png" />
show-subtitle="{{false}}" <view class="xunjian">巡检日历</view>
poppable="{{ false }}" </view>
show-confirm="{{ false }}" <image src="/images/shape2.png" class="imgStyle"></image>
default-date="{{selectedDate}}" <view class="yearMonth">{{currentYear+'年'+currentMonth+'月'}}</view>
formatter="{{formatter}}" </view>
color="#0000FF" <van-calendar max-date="{{lastDay}}" v-model="selectedDate" show-title="{{false}}" show-subtitle="{{false}}" poppable="{{ false }}" show-confirm="{{ false }}" default-date="{{selectedDate}}" formatter="{{formatter}}" bind:select="onDateSelect" color="#0000FF" class="calendar" />
class="calendar" /> </view>
</view> </view>

46
weapp/package/subSystem/subSystem.wxss

@ -18,13 +18,14 @@
border: 1px solid #ddd; border: 1px solid #ddd;
border-radius: 8px; border-radius: 8px;
/* padding: 10px 10px; */ /* padding: 10px 10px; */
margin: 5px 5px; padding: 12px;
margin-top: 12px;
box-shadow: 0 4px 8px rgba(0, 0, 0, 0.2); box-shadow: 0 4px 8px rgba(0, 0, 0, 0.2);
/* width: 300px; */ background-image: linear-gradient(0deg, #F3F7FF 84%, #DBE6FF 100%);
height: 300px;
} }
.heightStyle{ .heightStyle{
height: auto; height: 100%;
} }
.xunjian{ .xunjian{
@ -48,9 +49,12 @@
} }
.header{ .header{
display: flex; display: flex;
justify-content: space-around; justify-content: space-between;
margin-bottom: 10px; margin-bottom: 10px;
margin-top:10px; margin-top:10px;
align-items: center;
position: relative;
/* margin-left: -22px; */
} }
.yellowClass .van-calendar__bottom-info{ .yellowClass .van-calendar__bottom-info{
@ -62,8 +66,38 @@
font-size: 50px; font-size: 50px;
color:green; color:green;
} }
.imgStyle {
position: absolute;
width: 115px;
height: 67px;
right: 0;
}
.top{
display: flex;
justify-content: space-between;
padding: 10px;
}
.fontStyle {
width: 64px;
height: 22px;
font-family: PingFangSC-Medium;
font-weight: 500;
font-size: 16px;
color: #000000d9;
letter-spacing: 0;
margin-left: 5px;
}
.countStyle {
width: 89px;
height: 24px;
font-family: PingFangSC-Medium;
font-weight: 500;
font-size: 17px;
color: #1684FF;
letter-spacing: 0;
}

63
weapp/package/troubleshooting/shootingForm/index.js

@ -47,7 +47,7 @@ Page({
/** /**
* 生命周期函数--监听页面加载 * 生命周期函数--监听页面加载
*/ */
onLoad (options) { onLoad(options) {
const { shootingid, tabIndex } = options const { shootingid, tabIndex } = options
if (shootingid) { if (shootingid) {
this.setData({ this.setData({
@ -69,14 +69,20 @@ Page({
points: { points: {
...issue.PatrolRecord.points, ...issue.PatrolRecord.points,
inspectContent: (() => { inspectContent: (() => {
let inspectContent = [] // 1.1 版本(2023-10-18)之前 dataList.points.inspectContent 为 Object, 1.1版本因增加点位关联设备改为 Array
for (let k in issue.PatrolRecord.points.inspectContent) { const priorToV1_1 = moment(issue.PatrolRecord.inspectionTime).isBefore(moment('2023-10-18'))
inspectContent.push({ if (priorToV1_1) {
...issue.PatrolRecord.points.inspectContent[k], let inspectContent = []
itemName: k for (let k in issue.PatrolRecord.points.inspectContent) {
}) inspectContent.push({
...issue.PatrolRecord.points.inspectContent[k],
name: k,
})
}
return [{ checkItems: inspectContent }]
} else {
return issue.PatrolRecord.points.inspectContent
} }
return inspectContent
})() })()
} }
} }
@ -88,6 +94,7 @@ Page({
isRepair: tabIndex == 0 && (issue.state == 4 || issue.state == 7), isRepair: tabIndex == 0 && (issue.state == 4 || issue.state == 7),
isCheck: tabIndex == 0 && issue.state == 5, isCheck: tabIndex == 0 && issue.state == 5,
}) })
console.log(nextData, 'nextData')
this.setData({ this.setData({
strucFocusUser: { strucFocusUser: {
...strucUser, ...strucUser,
@ -135,13 +142,13 @@ Page({
} }
}, },
onPointItemCollapseActiveChange (event) { onPointItemCollapseActiveChange(event) {
this.setData({ this.setData({
pointItemCollapseActiveNames: event.detail, pointItemCollapseActiveNames: event.detail,
}); });
}, },
onMaintenancePersonPopupChange (e) { onMaintenancePersonPopupChange(e) {
if (e.target.dataset.type == 'zhijian') { if (e.target.dataset.type == 'zhijian') {
this.setData({ this.setData({
qualityPersonIndex: e.detail.value qualityPersonIndex: e.detail.value
@ -155,13 +162,13 @@ Page({
} }
}, },
showPlanStartTimePopup () { showPlanStartTimePopup() {
if (this.data.isPlanState) { if (this.data.isPlanState) {
this.setData({ planStartTimePopupShow: true }) this.setData({ planStartTimePopupShow: true })
} }
}, },
closePlanStartTimePopup (e) { closePlanStartTimePopup(e) {
this.setData({ planStartTimePopupShow: false }) this.setData({ planStartTimePopupShow: false })
if (e.target.dataset.option == 'cancel') { if (e.target.dataset.option == 'cancel') {
// this.setData({ planStartTime: '' }) // this.setData({ planStartTime: '' })
@ -172,19 +179,19 @@ Page({
} }
}, },
onPlanStartTimeChange (event) { onPlanStartTimeChange(event) {
this.setData({ this.setData({
planStartTime: event.detail, planStartTime: event.detail,
}) })
}, },
showPlanEndTimePopup () { showPlanEndTimePopup() {
if (this.data.isPlanState) { if (this.data.isPlanState) {
this.setData({ planEndTimePopupShow: true }) this.setData({ planEndTimePopupShow: true })
} }
}, },
closePlanEndTimePopup (e) { closePlanEndTimePopup(e) {
this.setData({ planEndTimePopupShow: false }) this.setData({ planEndTimePopupShow: false })
if (e.target.dataset.option == 'confirmed') { if (e.target.dataset.option == 'confirmed') {
this.setData({ this.setData({
@ -193,13 +200,13 @@ Page({
} }
}, },
onPlanEndTimeChange (event) { onPlanEndTimeChange(event) {
this.setData({ this.setData({
planEndTime: event.detail, planEndTime: event.detail,
}) })
}, },
onInputChange (e) { onInputChange(e) {
let value = e.detail.value let value = e.detail.value
if (e.target.dataset.type === 'cost' && !/^(\d?)+(\.\d{0,2})?$/.test(e.detail.value)) { if (e.target.dataset.type === 'cost' && !/^(\d?)+(\.\d{0,2})?$/.test(e.detail.value)) {
wx.showToast({ wx.showToast({
@ -215,8 +222,8 @@ Page({
// 预览图片 // 预览图片
previewImg: function (e) { previewImg: function (e) {
const { index, itemindex, type } = e.currentTarget.dataset const { index, itemindex, deviceidx, type } = e.currentTarget.dataset
const imgs = type == 'point' ? this.data.data.PatrolRecord.points.inspectContent[itemindex].imgs : this.data[type]; const imgs = type == 'point' ? this.data.data.PatrolRecord.points.inspectContent[deviceidx].checkItems[itemindex].imgs : this.data[type];
const newImgs = imgs.map(i => this.data.imgServer + i); const newImgs = imgs.map(i => this.data.imgServer + i);
wx.previewImage({ wx.previewImage({
current: newImgs[index], current: newImgs[index],
@ -324,7 +331,7 @@ Page({
}); });
}, },
async confirm (e) { async confirm(e) {
const { approve } = e.target.dataset const { approve } = e.target.dataset
const { state } = this.data.data const { state } = this.data.data
const { const {
@ -465,7 +472,7 @@ Page({
}) })
}, },
mustInput (field) { mustInput(field) {
let fieldMap = { let fieldMap = {
repairPerson: '维修人', repairPerson: '维修人',
checkPerson: '质检人', checkPerson: '质检人',
@ -488,49 +495,49 @@ Page({
/** /**
* 生命周期函数--监听页面初次渲染完成 * 生命周期函数--监听页面初次渲染完成
*/ */
onReady () { onReady() {
}, },
/** /**
* 生命周期函数--监听页面显示 * 生命周期函数--监听页面显示
*/ */
onShow () { onShow() {
}, },
/** /**
* 生命周期函数--监听页面隐藏 * 生命周期函数--监听页面隐藏
*/ */
onHide () { onHide() {
}, },
/** /**
* 生命周期函数--监听页面卸载 * 生命周期函数--监听页面卸载
*/ */
onUnload () { onUnload() {
}, },
/** /**
* 页面相关事件处理函数--监听用户下拉动作 * 页面相关事件处理函数--监听用户下拉动作
*/ */
onPullDownRefresh () { onPullDownRefresh() {
}, },
/** /**
* 页面上拉触底事件的处理函数 * 页面上拉触底事件的处理函数
*/ */
onReachBottom () { onReachBottom() {
}, },
/** /**
* 用户点击右上角分享 * 用户点击右上角分享
*/ */
onShareAppMessage () { onShareAppMessage() {
} }
}) })

41
weapp/package/troubleshooting/shootingForm/index.wxml

@ -15,26 +15,29 @@
</view> </view>
<van-field value="{{data.PatrolRecord.points.itemData.name}}" label="点位" readonly accordion /> <van-field value="{{data.PatrolRecord.points.itemData.name}}" label="点位" readonly accordion />
<van-collapse wx:if="{{data.PatrolRecord.points.inspectContent}}" value="{{ pointItemCollapseActiveNames }}" bind:change="onPointItemCollapseActiveChange" border="{{false}}"> <van-collapse wx:if="{{data.PatrolRecord.points.inspectContent}}" value="{{ pointItemCollapseActiveNames }}" bind:change="onPointItemCollapseActiveChange" border="{{false}}">
<block wx:for="{{data.PatrolRecord.points.inspectContent}}" wx:key="index"> <block wx:for="{{data.PatrolRecord.points.inspectContent}}" wx:key="index" wx:for-item="device" wx:for-index="deviceidx">
<van-collapse-item wx:if="{{!item.isNormal}}" name="{{item.itemName}}" border="{{false}}"> <van-field wx:if="{{device.deviceName && device.alarm}}" value="{{device.deviceName}}" label="设备" readonly accordion />
<view slot="title"> <block wx:for="{{device.checkItems}}">
<van-field value="{{item.itemName}}" label="检查项" readonly /> <van-collapse-item wx:if="{{!item.isNormal}}" name="{{item.id}}" border="{{false}}">
</view> <view slot="title">
<view slot=""> <van-field value="{{item.name}}" label="检查项" readonly />
<van-field value="{{item.level}}" label="异常等级" readonly /> </view>
<van-field value="{{item.msgInp||''}}" label="问题描述" readonly /> <view slot="">
<van-cell border="{{false}}"> <van-field value="{{item.level}}" label="异常等级" readonly />
<view style="display:flex"> <van-field value="{{item.msgInp||''}}" label="问题描述" readonly />
<view class="fs-cell-title" style="">现场照片</view> <van-cell border="{{false}}">
<view class="fs-cell-content" style=""> <view style="display:flex">
<block wx:for="{{item.imgs}}" wx:for-index="imgIndex" wx:for-item="imgUrl" wx:key="imgIndex"> <view class="fs-cell-title" style="">现场照片</view>
<image style="height:160rpx;width:160rpx;padding-right:12rpx;" src="{{imgServer+imgUrl}}" data-img="{{imgServer+imgUrl}}" data-index="{{imgIndex}}" data-key="{{imgIndex}}" data-itemindex="{{index}}" mode="aspectFill" bindtap="previewImg" data-type="point"></image> <view class="fs-cell-content" style="">
</block> <block wx:for="{{item.imgs}}" wx:for-index="imgIndex" wx:for-item="imgUrl" wx:key="imgIndex">
<image style="height:160rpx;width:160rpx;padding-right:12rpx;" src="{{imgServer+imgUrl}}" data-img="{{imgServer+imgUrl}}" data-index="{{imgIndex}}" data-key="{{imgIndex}}" data-itemindex="{{index}}" data-deviceidx="{{deviceidx}}" mode="aspectFill" bindtap="previewImg" data-type="point"></image>
</block>
</view>
</view> </view>
</view> </van-cell>
</van-cell> </view>
</view> </van-collapse-item>
</van-collapse-item> </block>
</block> </block>
</van-collapse> </van-collapse>
<view class="mission-card-title mission-center-card-title"> <view class="mission-card-title mission-center-card-title">

8
weapp/pages/home/home.js

@ -98,7 +98,7 @@ Page({
//过去七天的所有巡检记录 //过去七天的所有巡检记录
const sevenDaysList=list?.filter(item=> const sevenDaysList=list?.filter(item=>
{ {
const recordDate = moment(date, 'YYYY-MM-DD'); // 解析日期 const recordDate = moment(item?.inspectionTime, 'YYYY-MM-DD'); // 解析日期
const daysDifference = moment().diff(recordDate, 'days'); // 计算日期差 const daysDifference = moment().diff(recordDate, 'days'); // 计算日期差
// 返回近七天内的记录 // 返回近七天内的记录
return daysDifference >= 0 && daysDifference < 7; return daysDifference >= 0 && daysDifference < 7;
@ -106,10 +106,10 @@ Page({
)||[] )||[]
that.setData({ that.setData({
allCount:list.length || 0, allCount:list.length || 0,
allQuestionCount:list?.filter(i=>i.patrolRecordIssueHandles>0)?.length || 0, allQuestionCount:list?.filter(i=>i.patrolRecordIssueHandles.length>0)?.length || 0,
allHandleCount:list?.filter(i => i?.patrolRecordIssueHandles[0]?.yanshoushijian && parseInt(moment(i?.patrolRecordIssueHandles[0]?.yanshoushijian).format('YYYYMMDD')) === parseInt(moment().format('YYYYMMDD'))).length || 0, allHandleCount:list?.filter(i => i?.patrolRecordIssueHandles[0]?.yanshoushijian && parseInt(moment(i?.patrolRecordIssueHandles[0]?.yanshoushijian).format('YYYYMMDD')) === parseInt(moment().format('YYYYMMDD'))).length || 0,
sevenDaysCount:sevenDaysList.length||0, sevenDaysCount:sevenDaysList?.length||0,
sevenDaysQuestionCount:sevenDaysList?.filter(i=>i.patrolRecordIssueHandles>0)?.length || 0, sevenDaysQuestionCount:sevenDaysList?.filter(i=>i.patrolRecordIssueHandles.length>0)?.length || 0,
sevenDaysHandleCount:sevenDaysList?.filter(i => i?.patrolRecordIssueHandles[0]?.yanshoushijian && parseInt(moment(i?.patrolRecordIssueHandles[0]?.yanshoushijian).format('YYYYMMDD')) === parseInt(moment().format('YYYYMMDD'))).length || 0, sevenDaysHandleCount:sevenDaysList?.filter(i => i?.patrolRecordIssueHandles[0]?.yanshoushijian && parseInt(moment(i?.patrolRecordIssueHandles[0]?.yanshoushijian).format('YYYYMMDD')) === parseInt(moment().format('YYYYMMDD'))).length || 0,
pageHeight:pageHeight+'px', pageHeight:pageHeight+'px',
swiperData:data.datas swiperData:data.datas

51
weapp/pages/home/home.wxml

@ -1,9 +1,9 @@
<!--pages/home/home.wxml--> <!--pages/home/home.wxml-->
<view style="height:{{pageHeight}} ; overflow: auto;"> <view style="height:{{pageHeight}} ; overflow: auto; padding: 0 15px;">
<!--轮播图--> <!--轮播图-->
<view class="card"> <view class="card">
<swiper class="home-swiper" indicator-dots="true" autoplay="{{true}}" interval="{{2000}}" duration="{{500}}"> <swiper class="home-swiper" indicator-dots="true" autoplay="{{true}}" interval="{{2000}}" duration="{{500}}">
<block wx:for-items="{{swiperData}}"> <block wx:for-items="{{swiperData}}" wx:key="*this">
<swiper-item> <swiper-item>
<image src="{{item.imgurl}}" class="slide-image" /> <image src="{{item.imgurl}}" class="slide-image" />
</swiper-item> </swiper-item>
@ -19,40 +19,43 @@
</view> </view>
<!--最近7天统计--> <!--最近7天统计-->
<view class="card"> <view class="card">
最近7天统计 <text>最近7天统计</text>
<view style="background-image:url('/images/sevenDays.png');width: 100%; height: 99px; background-repeat: no-repeat;display: flex"> <view class="image-container">
<image src="/images/sevenDays.png" class="background-image"></image>
<view class="overlay-content">
<image src="/images/check.png" style="width:36px;height:36px;margin-right: 10px;" />
<view> <view>
<image src="/images/check.png" style="width:36px;height:36px;margin:40px 10px 20px 10px" />
</view>
<view style="margin:40px 10px 20px 10px">
<view>巡检次数</view> <view>巡检次数</view>
<view>{{sevenDaysCount}}次</view> <view>{{sevenDaysCount}}次</view>
</view> </view>
</view> </view>
<view style="display: flex; justify-content: space-around;">
<view style="margin:10px 0px;">发现问题个数</view>
<view style="margin:10px 0px;">{{sevenDaysQuestionCount}}个</view>
<view style="margin:10px 0px;">问题处理个数</view>
<view style="margin:10px 0px;">{{sevenDaysHandleCount}}个</view>
</view>
</view> </view>
<view style="display: flex; justify-content: space-around;">
<view style="margin:10px 0px;">发现问题个数</view>
<view style="margin:10px 0px;">{{sevenDaysQuestionCount}}个</view>
<view style="margin:10px 0px;">问题处理个数</view>
<view style="margin:10px 0px;">{{sevenDaysHandleCount}}个</view>
</view>
</view>
<!--总巡巡检统计--> <!--总巡巡检统计-->
<view class="card"> <view class="card">
总巡巡检统计 <text>总巡检统计</text>
<view style="background-image:url('/images/xunjian.png');width: 100%; height: 99px; background-repeat: no-repeat;display: flex;"> <view class="image-container">
<image src="/images/xunjian.png" class="background-image"></image>
<view class="overlay-content">
<image src="/images/check.png" style="width:36px;height:36px;margin-right: 10px;" />
<view> <view>
<image src="/images/check.png" style="width:36px;height:36px;margin:40px 10px 20px 10px" />
</view>
<view style="margin:40px 10px 20px 10px">
<view>巡检次数</view> <view>巡检次数</view>
<view>{{allCount}}次</view> <view>{{allCount}}次</view>
</view> </view>
</view> </view>
<view style="display: flex; justify-content: space-around;">
<view style="margin:10px 0px;">发现问题个数</view>
<view style="margin:10px 0px;">{{allQuestionCount}}个</view>
<view style="margin:10px 0px;">问题处理个数</view>
<view style="margin:10px 0px;">{{allHandleCount}}个</view>
</view>
</view> </view>
<view style="display: flex; justify-content: space-around;">
<view style="margin:10px 0px;">发现问题个数</view>
<view style="margin:10px 0px;">{{allQuestionCount}}个</view>
<view style="margin:10px 0px;">问题处理个数</view>
<view style="margin:10px 0px;">{{allHandleCount}}个</view>
</view>
</view>
</view> </view>

26
weapp/pages/home/home.wxss

@ -12,7 +12,31 @@
border-radius: 8px; border-radius: 8px;
/* padding: 10px; */ /* padding: 10px; */
box-shadow: 0 4px 8px rgba(0, 0, 0, 0.2); box-shadow: 0 4px 8px rgba(0, 0, 0, 0.2);
margin: 10px; margin-top: 12px;
}
.image-container {
position: relative;
width: 100%;
height: 99px;
}
.background-image {
width: 100%;
height: 99px;
}
.overlay-content {
position: absolute;
top: 10px;
left: 10px;
width: 100%;
height: 100%;
display: flex;
align-items: center;
/* justify-content: center; */
/* flex-direction: column; */
/* 其他样式属性,根据需要添加 */
} }
.home-swiper { .home-swiper {
width: 95%; width: 95%;

29
weapp/pages/overview/overview.js

@ -9,19 +9,19 @@ Page({
}, },
// 巡检 // 巡检
bindPolling () { bindPolling() {
wx.navigateTo({ wx.navigateTo({
url: '/package/polling/polling', url: '/package/polling/polling',
}) })
}, },
bindTroubleshooting () { bindTroubleshooting() {
wx.navigateTo({ wx.navigateTo({
url: '/package/troubleshooting/index', url: '/package/troubleshooting/index',
}) })
}, },
bindInspectionReport () { bindInspectionReport() {
wx.navigateTo({ wx.navigateTo({
url: '/package/inspectionReport/inspectionReport', url: '/package/inspectionReport/inspectionReport',
}) })
@ -30,21 +30,28 @@ Page({
/** /**
* 生命周期函数--监听页面加载 * 生命周期函数--监听页面加载
*/ */
onLoad (options) { onLoad(options) {
}, },
/** /**
* 生命周期函数--监听页面初次渲染完成 * 生命周期函数--监听页面初次渲染完成
*/ */
onReady () { onReady() {
}, },
/** /**
* 生命周期函数--监听页面显示 * 生命周期函数--监听页面显示
*/ */
onShow () { onShow() {
const userRole = wx.getStorageSync('userRole');
if (userRole && userRole.includes('管理')) {
wx.reLaunch({
url: '/pages/workbench/workbench'
});
return
}
if (typeof this.getTabBar === 'function' && this.getTabBar()) { if (typeof this.getTabBar === 'function' && this.getTabBar()) {
this.getTabBar().setData({ this.getTabBar().setData({
selected: 1 selected: 1
@ -55,35 +62,35 @@ Page({
/** /**
* 生命周期函数--监听页面隐藏 * 生命周期函数--监听页面隐藏
*/ */
onHide () { onHide() {
}, },
/** /**
* 生命周期函数--监听页面卸载 * 生命周期函数--监听页面卸载
*/ */
onUnload () { onUnload() {
}, },
/** /**
* 页面相关事件处理函数--监听用户下拉动作 * 页面相关事件处理函数--监听用户下拉动作
*/ */
onPullDownRefresh () { onPullDownRefresh() {
}, },
/** /**
* 页面上拉触底事件的处理函数 * 页面上拉触底事件的处理函数
*/ */
onReachBottom () { onReachBottom() {
}, },
/** /**
* 用户点击右上角分享 * 用户点击右上角分享
*/ */
onShareAppMessage () { onShareAppMessage() {
} }
}) })

4
weapp/pages/workbench/workbench.js

@ -14,7 +14,7 @@ Page({
{ {
iconPath: '/images/workbench/report.png', iconPath: '/images/workbench/report.png',
text: '设备大数据图谱', text: '设备大数据图谱',
page: '/package/riskManagement/riskCalendar/riskCalendar' page: '/package/deviceBigdataGraph/deviceBigdataGraph'
}, },
{ {
iconPath: '/images/workbench/report.png', iconPath: '/images/workbench/report.png',
@ -34,7 +34,7 @@ Page({
{ {
iconPath: '/images/workbench/issues.png', iconPath: '/images/workbench/issues.png',
text: '发现问题', text: '发现问题',
page: '/package/riskManagement/riskManagement' page: '/package/report/report'
}, },
] ]
}, },

5
weapp/project.config.json

@ -43,11 +43,12 @@
"disablePlugins": [], "disablePlugins": [],
"outputPath": "" "outputPath": ""
}, },
"condition": false "condition": false,
"ignoreUploadUnusedFiles": true
}, },
"compileType": "miniprogram", "compileType": "miniprogram",
"libVersion": "2.19.4", "libVersion": "2.19.4",
"appid": "wxdd82ae635b22ccdb", "appid": "wx79ff58f03d17f24d",
"projectname": "miniprogram-92", "projectname": "miniprogram-92",
"condition": {}, "condition": {},
"editorSetting": { "editorSetting": {

22
weapp/utils/getApiUrl.js

@ -33,6 +33,11 @@ exports.getPatrolPlan = () => {
exports.addPatrolRecord = () => { exports.addPatrolRecord = () => {
return `/patrolRecord/add` return `/patrolRecord/add`
} }
//上报问题
exports.reportQuest = () => {
return `/patrolRecord/reportQuest`
}
// 获取巡检记录 // 获取巡检记录
exports.getPatrolRecord = (patrolPlanId, startTime, endTime, alarm, pointId) => { exports.getPatrolRecord = (patrolPlanId, startTime, endTime, alarm, pointId) => {
@ -44,6 +49,13 @@ exports.getSubSystemPatrolAbout = (query) => {
return `/patrolRecord/subSystemPatrolAbout?STime=${STime}&ETime=${ETime}&keywords=${keywords}` return `/patrolRecord/subSystemPatrolAbout?STime=${STime}&ETime=${ETime}&keywords=${keywords}`
} }
// 获取点位信息
exports.getPointList = (query) => {
const {keywords } = query;
return `/patrolRecord/pointInfo?keywords=${keywords}`
}
// 获取点位最新一条巡检记录 // 获取点位最新一条巡检记录
exports.getdPointCurPatrolRecord = (pointId) => { exports.getdPointCurPatrolRecord = (pointId) => {
return `/patrolRecord/${pointId}/cur` return `/patrolRecord/${pointId}/cur`
@ -53,6 +65,11 @@ exports.getdPointCurPatrolRecord = (pointId) => {
exports.getPatrolTemplate = (id) => { exports.getPatrolTemplate = (id) => {
return `/patrolTemplate?id=${id}` return `/patrolTemplate?id=${id}`
} }
//根据结构物获取巡检模板
exports.getTemplates = (query) => {
const {keywords } = query;
return `/patrolRecord/getTemplate?keywords=${keywords}`
}
exports.getPatrolRecordIssueHandle = () => { exports.getPatrolRecordIssueHandle = () => {
return `/patrolRecord/issue/handle` return `/patrolRecord/issue/handle`
@ -79,4 +96,9 @@ exports.getStructuresList = () => {
exports.getPatrolReport = (query) => { exports.getPatrolReport = (query) => {
const { projectId, startTime, endTime } = query; const { projectId, startTime, endTime } = query;
return `/patrolReport?projectId=${projectId}&startTime=${startTime}&endTime=${endTime}` return `/patrolReport?projectId=${projectId}&startTime=${startTime}&endTime=${endTime}`
}
// 故障风险管理统计
exports.getPatrolRecordStatistic = (structures) => {
return `/patrolRecord/statistic?structures=${structures}`
} }

2
web/Dockerfile

@ -1,6 +1,6 @@
#FROM repository.anxinyun.cn/base-images/nodejs12:20.10.12.2 #FROM repository.anxinyun.cn/base-images/nodejs12:20.10.12.2
FROM repository.anxinyun.cn/base-images/nodejs12:20.10.12.2 FROM repository.anxinyun.cn/base-images/nodejs12:20.10.12.2
COPY . /var/app COPY ./web/ /var/app
WORKDIR /var/app WORKDIR /var/app
EXPOSE 8080 EXPOSE 8080

Loading…
Cancel
Save