diff --git a/api/app/lib/controllers/data/appointed.js b/api/app/lib/controllers/data/appointed.js index 91159b43..921d0074 100644 --- a/api/app/lib/controllers/data/appointed.js +++ b/api/app/lib/controllers/data/appointed.js @@ -1,6 +1,26 @@ 'use strict'; const moment = require('moment') +const reportTypeText = (text) => { + switch (text) { + case 'road': return '道路'; + // + case 'countyRoad': return '县道'; + case 'villageRoad': return '乡道'; + case 'rusticRoad': return '村道'; + // + case 'bridge': return '桥梁'; + case 'culvert': return '涵洞'; + case 'other': return '其他'; + // + case 'conserve': return '养护'; + case 'patrol': return '巡查'; + case 'construction': return '在建'; + default: return text; + } +} + + async function appoint(ctx) { try { const models = ctx.fs.dc.models @@ -8,6 +28,22 @@ async function appoint(ctx) { await models.Report.update({ performerId, handleAdvice, handleState }, { where: { id: recordId } }) + + const { pushBySms } = ctx.app.fs.utils + const report = await models.Report.findOne({ where: { id: recordId } }) + const data = await models.User.findOne({ where: { id: performerId } }) + if (data.phone && data.name && report.projectType) { + await pushBySms({ + phone: [data.phone], + templateCode: 'SMS_464820121', + templateParam: { + report_name: data.name, + type: reportTypeText(report.projectType), + road_name: report.road, + section_name: report.roadSectionStart + report.roadSectionEnd + } + }) + } ctx.status = 204; } catch (error) { ctx.fs.logger.error(`path: ${ctx.path}, error: ${error}`); diff --git a/api/app/lib/controllers/data/road.js b/api/app/lib/controllers/data/road.js index 825d410b..16d56c05 100644 --- a/api/app/lib/controllers/data/road.js +++ b/api/app/lib/controllers/data/road.js @@ -96,7 +96,7 @@ async function getRoadSection (ctx) { let findOption = { where: { del: false }, order: [['id', 'DESC']], - attributes: ['id', 'routeName', 'startingPlaceName', 'stopPlaceName', 'routeCode', 'sectionNo', 'level'] + attributes: ['id', 'routeName', 'startingPlaceName', 'stopPlaceName', 'routeCode', 'sectionNo', 'level', 'startStation', 'stopStation'] } if (level) { diff --git a/api/app/lib/index.js b/api/app/lib/index.js index da9856ce..0cf88149 100644 --- a/api/app/lib/index.js +++ b/api/app/lib/index.js @@ -7,6 +7,7 @@ const authenticator = require('./middlewares/authenticator'); // const apiLog = require('./middlewares/api-log'); const paasRequest = require('./service/paasRequest'); const schedule = require('./schedule') +const utils = require('./utils') module.exports.entry = function (app, router, opts) { app.fs.logger.log('info', '[FS-AUTH]', 'Inject auth and api mv into router.'); @@ -14,6 +15,7 @@ module.exports.entry = function (app, router, opts) { app.fs.api = app.fs.api || {}; app.fs.api.authAttr = app.fs.api.authAttr || {}; app.fs.api.logAttr = app.fs.api.logAttr || {}; + app.fs.utils = app.fs.utils || {}; router.use(authenticator(app, opts)); // router.use(apiLog(app, opts)); @@ -21,6 +23,9 @@ module.exports.entry = function (app, router, opts) { paasRequest(app, opts) // 定时任务 schedule(app, opts) + + // 工具类函数 + utils(app, opts) router = routes(app, router, opts); }; diff --git a/api/app/lib/utils/index.js b/api/app/lib/utils/index.js new file mode 100644 index 00000000..19d9745a --- /dev/null +++ b/api/app/lib/utils/index.js @@ -0,0 +1,17 @@ +'use strict'; + +const path = require('path'); +const fs = require('fs'); + +module.exports = async function (app, opts) { + fs.readdirSync(__dirname).forEach((filename) => { + if (!['index.js'].some(f => filename == f)) { + const utils = require(`./${filename}`)(app, opts) + console.log(`载入 ${filename} 工具集成功`); + app.fs.utils = { + ...app.fs.utils, + ...utils, + } + } + }); +}; diff --git a/api/app/lib/utils/push.js b/api/app/lib/utils/push.js new file mode 100644 index 00000000..aa044de8 --- /dev/null +++ b/api/app/lib/utils/push.js @@ -0,0 +1,36 @@ +'use strict'; + +const moment = require('moment') +const Core = require('@alicloud/pop-core'); + + +module.exports = function (app, opts) { + const pushBySms = async ({ phone = [], templateCode, templateParam } = {}) => { + try { + if (phone.length) { + const client = new Core({ + accessKeyId: opts.sms.accessKey, + accessKeySecret: opts.sms.accessSecret, + endpoint: 'http://dysmsapi.aliyuncs.com',//固定 + apiVersion: '2017-05-25'//固定 + }); + const SendSmsRes = await client.request('SendSms', { + "PhoneNumbers": phone.join(','),//接收短信的手机号码。 + "SignName": "四好农村路",//短信签名名称。必须是已添加、并通过审核的短信签名。 + "TemplateCode": templateCode,//短信模板ID。必须是已添加、并通过审核的短信签名;且发送国际/港澳台消息时,请使用国际/港澳台短信模版。 + "TemplateParam": JSON.stringify(templateParam)//短信模板变量对应的实际值,JSON格式。 + }, { + method: 'POST' + }); + return SendSmsRes + } + } catch (error) { + throw error + } + } + + return { + + pushBySms, + } +} \ No newline at end of file diff --git a/weapp/src/packages/patrol/index.jsx b/weapp/src/packages/patrol/index.jsx index 7abd6448..7b27b6d6 100644 --- a/weapp/src/packages/patrol/index.jsx +++ b/weapp/src/packages/patrol/index.jsx @@ -225,11 +225,12 @@ const Index = () => { ]); const [routeNameList, setRouteNameList] = useState([]); const [routeCodeList, setRouteCodeList] = useState([]); - const [sectionNoList, setSectionNoList] = useState([]); + const [stationRangeList, setStationRangeList] = useState([]); const [roadChecked, setRoadChecked] = useState({ routeName: '', routeCode: '', sectionNo: '', + stationRange: '', startingPlaceName: '', stopPlaceName: '', }) @@ -362,6 +363,7 @@ const Index = () => { routeName: data.road, routeCode: data.codeRoad, sectionNo: data.road_?.sectionNo || '-', + stationRange: `${data.road_?.startStation || ' '} - ${data.road_?.stopStation || ' '}`, startingPlaceName: data.roadSectionStart, stopPlaceName: data.roadSectionEnd, }) @@ -415,35 +417,22 @@ const Index = () => { let nextSourceRoadStartSel = [] let nextSourceRoadEndSel = [] let nextCodeRoadSel = [] - - let routeName = [] let routeCode = [] - let sectionNo = [] const selLevel = roadTypeList.find(item => item.checked).value data.forEach(item => { nextSourceRoadStartSel.push(item.startingPlaceName) nextSourceRoadEndSel.push(item.stopPlaceName) nextCodeRoadSel.push(item.routeCode) - - if (item.routeName && !routeName.includes(item.routeName) && item.level === selLevel) { - routeName.push(item.routeName) - } - if (item.routeCode && !routeCode.includes(item.routeCode)) { + if (item.routeCode && !routeCode.includes(item.routeCode) && item.level === selLevel) { routeCode.push(item.routeCode) } - if (item.sectionNo && !sectionNo.includes(item.sectionNo)) { - sectionNo.push(item.sectionNo) - } }) setSourceRoadStartSel(nextSourceRoadStartSel) setSourceRoadEndSel(nextSourceRoadEndSel) setCodeRoadSel(nextCodeRoadSel) setRoadList(data) - - setRouteNameList(routeName) setRouteCodeList(routeCode) - setSectionNoList(sectionNo) } else { Taro.showToast({ title: res.data.message || '请求出错', icon: 'none' }) } @@ -529,6 +518,7 @@ const Index = () => { && roadChecked?.routeCode == r?.routeCode && roadChecked?.sectionNo == r?.sectionNo )?.id, + } if (reportType === 'patrol' || isAnomaly || isRoad) { data['scenePic'] = sceneImg @@ -757,52 +747,40 @@ const Index = () => { } } - const handleRoadCheckChange = (value, key, typeList = roadTypeList) => { + const handleRoadCheckChange = (value, key, typeList = roadTypeList, sectionNo) => { let nextValue = { ...roadChecked, [key]: value } - let routeCode = [] - let sectionNo = [] let data = roadList.filter(r => r.level === typeList.find(t => t.checked).value) - if (key == 'routeName') { - // routeName关键字筛选 - let routeName = [] - data.forEach(item => { - if (item.routeName && !routeName.includes(item.routeName)) { - routeName.push(item.routeName) - } - }) - if (value) { - routeName = routeName.filter(item => item.indexOf(value) > -1) - } - setRouteNameList(routeName) - - nextValue.routeCode = '' - nextValue.sectionNo = '' - data?.forEach(v => { - if (nextValue?.routeName && nextValue?.routeName == v.routeName && v.routeCode && !routeCode.includes(v.routeCode)) { - routeCode.push(v.routeCode) - } - }); - setRouteCodeList(routeCode) - } + if (key == 'stationRange') nextValue.sectionNo = sectionNo; if (key == 'routeCode') { nextValue.sectionNo = '' - data = roadList?.filter(s => nextValue?.routeName == s?.routeName) - data?.forEach(v => { - if (nextValue?.routeCode && nextValue?.routeCode == v?.routeCode && v.sectionNo && !sectionNo.includes(v.sectionNo)) { - sectionNo.push(v.sectionNo) + nextValue.stationRange = '' + let routeCode = [] + let matchData = [] + data.forEach(item => { + if (item.routeCode.indexOf(value) > -1) { + routeCode.push(item.routeCode) } - if (!nextValue?.routeCode && v.routeCode && !routeCode.includes(v.routeCode)) { - routeCode.push(v.routeCode) + if (item.routeCode === value) { + matchData.push(item) } - }); - if (!nextValue?.routeCode) { - setRouteCodeList(routeCode) + }) + setRouteCodeList(routeCode) + if (matchData.length) { + // 匹配路线名称 + nextValue.routeName = matchData[0].routeName + // 匹配桩号区间 + setStationRangeList(matchData.map(s => ({ + label: `${s.startStation || ' '} - ${s.stopStation || ' '}`, + sectionNo: s.sectionNo, + }))) + } else { + nextValue.routeName = '' + setStationRangeList([]) } - setSectionNoList(sectionNo) } if (nextValue?.routeName) { @@ -823,6 +801,7 @@ const Index = () => { && nextValue.routeCode == s.routeCode && nextValue.sectionNo == s.sectionNo ) + nextValue.startingPlaceName = find?.startingPlaceName nextValue.stopPlaceName = find?.stopPlaceName setRoadCodeHead(find?.routeCode?.charAt(0)) @@ -1080,7 +1059,7 @@ const Index = () => { for (let i = 0, len = items.length; i < len; ++i) { items[i].checked = items[i].value === e.detail.value } - handleRoadCheckChange('', 'routeName', items) + handleRoadCheckChange('', 'routeCode', items) // 清空 routeCode setRoadTypeList(items) } @@ -1104,77 +1083,75 @@ const Index = () => { - - 路线名称: + + {!(isView && isBeforeReport) && + 线路编码: handleRoadCheckChange(e.detail.value, 'routeName')} + value={roadChecked.routeCode} + onInput={e => handleRoadCheckChange(e.detail.value, 'routeCode')} disabled={isView} /> handleRoadCheckChange(routeNameList[e.detail.value], 'routeName')} + range={routeCodeList} + onChange={e => handleRoadCheckChange(routeCodeList[e.detail.value], 'routeCode')} disabled={isView} > + {roadChecked.routeCode && !isView && handleRoadCheckChange('', 'routeCode')} + />} - {!isView && handleRoadCheckChange('', 'routeName')} - />} - - {!(isView && isBeforeReport) && - 线路编码: + } + + + 路线名称: handleRoadCheckChange(routeCodeList[e.detail.value], 'routeCode')} - disabled={routeCodeDisabled} + range={routeNameList} + onChange={e => handleRoadCheckChange(routeNameList[e.detail.value], 'routeName')} + disabled={true} > - {roadChecked.routeCode || '请选择线路编码'} + {roadChecked.routeName || '选择编码自动带出'} - {roadChecked.routeCode && !isView && handleRoadCheckChange('', 'routeCode')} - />} - } + + - 路段序号: + 桩号区间: handleRoadCheckChange(sectionNoList[e.detail.value], 'sectionNo')} + range={stationRangeList} + rangeKey='label' + onChange={e => handleRoadCheckChange(stationRangeList[e.detail.value].label, 'stationRange', undefined, stationRangeList[e.detail.value].sectionNo)} disabled={sectionNoDisabled} > - {roadChecked.sectionNo || '请选择路段序号'} + {roadChecked.stationRange || '请选择桩号区间'} - {roadChecked.sectionNo && !isView && handleRoadCheckChange('', 'sectionNo')} + onClick={() => handleRoadCheckChange('', 'stationRange', undefined, '')} />}