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, '')}
/>}