Commit ea45f266 authored by tianbo's avatar tianbo

feat:大屏应急接口迁移至统计服务

parent 4197d376
......@@ -22,11 +22,6 @@
<artifactId>amos-boot-module-jg-api</artifactId>
<version>${amos-boot-biz.version}</version>
</dependency>
<dependency>
<groupId>com.amosframework.boot</groupId>
<artifactId>amos-boot-module-96333-api</artifactId>
<version>${amos-boot-biz.version}</version>
</dependency>
</dependencies>
......
package com.yeejoin.amos.boot.module.statistics.api.mapper;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.yeejoin.amos.boot.biz.common.dto.CountDto;
import com.yeejoin.amos.boot.module.common.api.dto.DPFilterParamDto;
import com.yeejoin.amos.boot.module.common.api.dto.DPFilterParamForDetailDto;
import com.yeejoin.amos.boot.module.common.api.entity.AlertStatistics;
import com.yeejoin.amos.boot.module.ymt.api.dto.AlertCalledQueryDto;
import com.yeejoin.amos.boot.module.ymt.api.entity.Elevator;
import org.apache.ibatis.annotations.MapKey;
import org.apache.ibatis.annotations.Mapper;
import org.apache.ibatis.annotations.Param;
......@@ -48,4 +51,13 @@ public interface AlertStatisticsMapper extends BaseMapper<AlertStatistics> {
Page<Map<String, Object>> alertRecordForPage(@Param("page") Page<Map<String, Object>> page,
@Param("dto") DPFilterParamForDetailDto dto,
@Param("orgCode") String orgCode);
Map<String, Object> selectUseUnitByAlertId(String sequenceNbr);
Map<String,Object> selectElevator(@Param("elevator") Elevator elevator);
List<Map<String, Object>> selectMtByAlertId(String sequenceNbr);
Page<AlertCalledQueryDto> getAlertCalledRecords(IPage<AlertCalledQueryDto> page, @Param("dto")AlertCalledQueryDto dto, @Param("orgCode") String orgCode);
}
......@@ -264,4 +264,148 @@
ORDER BY rec_date DESC
</select>
<select id="selectUseUnitByAlertId" resultType="java.util.Map">
SELECT
ibjui.SAFETY_MANAGER AS manager,
ibjui.PHONE AS managerPhone,
ibjui.USE_UNIT_NAME as useUnitName,
tbei.address AS address,
tbei.sequence_nbr AS unitId
FROM
idx_biz_jg_use_info ibjui
LEFT JOIN tz_base_enterprise_info tbei ON ibjui.USE_UNIT_CREDIT_CODE = tbei.use_code
WHERE
RECORD = #{sequenceNbr}
</select>
<select id="selectElevator" resultType="java.util.Map">
SELECT
jui.RECORD AS sequenceNbr,
ifnull ( joi.CODE96333, null ) AS rescueCode,
ifnull ( joi.SUPERVISORY_CODE, null ) AS registerCode,
ifnull ( jui.USE_UNIT_NAME, null ) AS useUnit,
ifnull ( jui.EQU_STATE,'')AS useStatus,
ifnull ( ( SELECT NAME FROM cb_data_dictionary WHERE code = jui.USE_PLACE and type = 'ADDRESS' ), null ) AS useSiteCategory,
ifnull ( jui.ADDRESS, null ) AS address,
ifnull ( jui.PROVINCE_NAME, null ) AS province,
ifnull ( jui.CITY_NAME, null ) AS city,
ifnull ( jui.COUNTY_NAME, null ) AS district,
ifnull ( jui."LONGITUDE_LATITUDE"::json->> 'latitude', null ) AS latitude,
ifnull ( jui."LONGITUDE_LATITUDE"::json->> 'longitude', null ) AS longitude,
ifnull(jui.FACTORY_USE_SITE_STREET, '') AS street,
concat(jui.PROVINCE, '#',jui.CITY, '#',jui.COUNTY) AS regionCode,
jsi.ORG_BRANCH_CODE as orgCode
FROM
idx_biz_jg_use_info jui
LEFT JOIN idx_biz_jg_other_info joi ON jui.RECORD = joi.RECORD
LEFT JOIN idx_biz_jg_register_info jri ON jri.RECORD = jui.RECORD
LEFT JOIN idx_biz_jg_supervision_info jsi ON jsi.RECORD = jui.RECORD
WHERE
jri.EQU_LIST = '3000'
<if test="elevator.rescueCode!=null and elevator.rescueCode!='' ">
AND joi.CODE96333 = #{elevator.rescueCode}
</if>
<if test="elevator.registerCode!=null and elevator.registerCode!='' ">
AND joi.SUPERVISORY_CODE = #{elevator.registerCode}
</if>
<if test="elevator.originalId!=null and elevator.originalId!='' ">
AND jui.RECORD = #{elevator.originalId}
</if>
</select>
<select id="selectMtByAlertId" resultType="java.util.Map">
SELECT
SEQUENCE_NBR AS sequenceNbr,
ME_MASTER AS userName1,
ME_MASTER_PHONE AS phone1,
ME_MASTER1 AS userName2,
ME_MASTER1_PHONE AS phone2,
'' AS address,
ME_UNIT_NAME AS unitName,
ME_UNIT_CREDIT_CODE AS useCode
FROM
idx_biz_jg_maintenance_record_info ibjmri
where
ibjmri.RECORD = #{sequenceNbr}
order by ibjmri.INFORM_START desc
limit 1
</select>
<select id="getAlertCalledRecords" resultType="com.yeejoin.amos.boot.module.ymt.api.dto.AlertCalledQueryDto">
SELECT
a.sequence_nbr AS sequenceNbr,
a.work_order_number AS workOrderNumber,
a.rec_user_name AS creator,
a.emergency_person AS emergency,
a.call_time AS callTime,
a.emergency_call AS emergencyCall,
a.device_id AS deviceId,
ibjui.ADDRESS as elevatorAddress,
CONCAT(a.city,a.district) AS address,
a.alarm_type AS alertType,
a.alert_source AS alertSource,
a.alert_stage AS alertStage,
CASE
a.alert_status
WHEN 0 THEN
'未完成'
WHEN 1 THEN
'完成'
ELSE
''
END AS alertStatus
FROM
tz_alert_called a
left join idx_biz_jg_use_info ibjui on ibjui.RECORD = a.equipment_id
WHERE a.is_delete = 0 and a.father_alert is null
and a.biz_org_code like concat(#{orgCode}, '%')
<if test="dto.workOrderNumber != null and dto.workOrderNumber != ''">
AND a.work_order_number like
CONCAT(CONCAT('%',#{dto.workOrderNumber}),'%')
</if>
<if test="dto.creator != null and dto.creator != ''">
AND a.rec_user_name like
CONCAT(CONCAT('%',#{dto.creator}),'%')
</if>
<if test="dto.emergency != null and dto.emergency != ''">
AND a.emergency_person like
CONCAT(CONCAT('%',#{dto.emergency}),'%')
</if>
<if test="dto.emergencyTimeStart != null ">
and #{dto.emergencyTimeStart} <![CDATA[ <= ]]>
a.call_time
</if>
<if test="dto.emergencyTimeEnd != null ">
and a.call_time <![CDATA[ <= ]]>
#{dto.emergencyTimeEnd}
</if>
<if test="dto.emergencyCall != null and dto.emergencyCall != ''">
AND a.emergency_call like
CONCAT(CONCAT('%',#{dto.emergencyCall}),'%')
</if>
<if test="dto.deviceId != null and dto.deviceId != ''">
AND a.device_id like CONCAT(CONCAT('%',#{dto.deviceId}),'%')
</if>
<if test="dto.elevatorAddress != null and dto.elevatorAddress != ''">
AND ibjui.ADDRESS like
CONCAT(CONCAT('%',#{dto.elevatorAddress}),'%')
</if>
<if test="dto.district != null and dto.district != ''">
AND a.district like
CONCAT(CONCAT('%',#{dto.district}),'%')
</if>
<if test="dto.alertType != null and dto.alertType != ''">
AND a.alarm_type_code = #{dto.alertType}
</if>
<if test="dto.alertSource != null and dto.alertSource != ''">
AND a.alert_source_code = #{dto.alertSource}
</if>
<if test="dto.alertStage != null and dto.alertStage != ''">
AND a.alert_stage_code = #{dto.alertStage}
</if>
<if test="dto.alertStatus != null and dto.alertStatus != ''">
AND a.alert_status = #{dto.alertStatus}
</if>
ORDER BY a.call_time desc
</select>
</mapper>
package com.yeejoin.amos.boot.module.statistcs.biz.controller;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.yeejoin.amos.boot.module.statistcs.biz.service.impl.EmergencyBizServiceImpl;
import com.yeejoin.amos.boot.module.ymt.api.dto.AlertCalledQueryDto;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import org.springframework.web.bind.annotation.*;
import org.typroject.tyboot.core.foundation.enumeration.UserType;
import org.typroject.tyboot.core.restful.doc.TycloudOperation;
import org.typroject.tyboot.core.restful.utils.ResponseHelper;
......@@ -36,4 +34,63 @@ public class EmergencyBizController {
public ResponseModel<Object> getDetail(@PathVariable Long id) {
return ResponseHelper.buildResponse(emergencyBizService.getDetail(id));
}
@TycloudOperation(ApiLevel = UserType.AGENCY,needAuth = false)
@GetMapping(value = "/basicDetail/{id}")
@ApiOperation(httpMethod = "GET", value = "根据id获取救援信息", notes = "根据id获取救援信息")
public ResponseModel<Object> getBasicDetail(@PathVariable Long id) {
return ResponseHelper.buildResponse(emergencyBizService.getBasicDetail(id));
}
/**
* 应急大屏使用
*
* @param id 主键
* @return
*/
@TycloudOperation(ApiLevel = UserType.AGENCY,needAuth = false)
@GetMapping(value = "/dispatchRecord/{id}")
@ApiOperation(httpMethod = "GET", value = "根据id获取调派信息", notes = "根据id获取调派信息")
public ResponseModel<Object> getDispatchRecord(@PathVariable Long id) {
return ResponseHelper.buildResponse(emergencyBizService.getDispatchRecord(id));
}
/**
* 应急大屏使用
*
* @param id 主键
* @return
*/
@TycloudOperation(ApiLevel = UserType.AGENCY,needAuth = false)
@GetMapping(value = "/followRecords/{id}")
@ApiOperation(httpMethod = "GET", value = "根据id获取回访信息", notes = "根据id获取回访信息")
public ResponseModel<Object> getFollowRecords(@PathVariable Long id) {
return ResponseHelper.buildResponse(emergencyBizService.getFollowRecords(id));
}
/**
* 应急大屏使用
*
* @param id 主键
* @return
*/
@TycloudOperation(ApiLevel = UserType.AGENCY,needAuth = false)
@GetMapping(value = "/callRecords/{id}")
@ApiOperation(httpMethod = "GET", value = "根据id获取通话记录信息", notes = "根据id获取通话记录信息")
public ResponseModel<Object> getCallRecords(@PathVariable Long id, @RequestParam int number, @RequestParam int size) {
return ResponseHelper.buildResponse(emergencyBizService.getCallRecords(id, number, size));
}
@TycloudOperation(ApiLevel = UserType.AGENCY)
@ApiOperation(value = "应急大屏使用", notes = "查询警情事件记录")
@GetMapping("/selectRecord/dp")
public ResponseModel<Page<AlertCalledQueryDto>> getAlertCalledRecords(AlertCalledQueryDto alertCalledQueryDto,
@RequestParam(value = "pageNum") int pageNum,
@RequestParam(value = "pageSize") int pageSize,
@RequestParam(value = "cityCode") String cityCode) {
Page<AlertCalledQueryDto> page = new Page<>();
page.setCurrent(pageNum);
page.setSize(pageSize);
return ResponseHelper.buildResponse(emergencyBizService.getAlertCalledRecords(page, alertCalledQueryDto, cityCode));
}
}
package com.yeejoin.amos.boot.module.statistcs.biz.service.impl;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.yeejoin.amos.boot.module.elevator.api.dto.FormValue;
import com.yeejoin.amos.boot.module.elevator.api.entity.VoiceRecordFile;
import com.yeejoin.amos.boot.module.elevator.api.mapper.*;
import com.yeejoin.amos.boot.module.statistcs.biz.utils.JsonUtils;
import com.yeejoin.amos.boot.module.elevator.api.dto.AlertCalledDto;
import com.yeejoin.amos.boot.module.elevator.api.dto.AlertCalledFormDto;
import com.yeejoin.amos.boot.module.elevator.api.entity.AlertCalled;
import com.yeejoin.amos.boot.module.elevator.api.entity.AlertFormValue;
import com.yeejoin.amos.boot.module.elevator.api.entity.Elevator;
import com.yeejoin.amos.boot.module.elevator.api.entity.RepairConsult;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.yeejoin.amos.boot.biz.common.service.impl.DataDictionaryServiceImpl;
import com.yeejoin.amos.boot.biz.common.utils.DateUtils;
import com.yeejoin.amos.boot.module.statistics.api.mapper.AlertStatisticsMapper;
import com.yeejoin.amos.boot.module.statistics.api.mapper.CommonBaseMapper;
import com.yeejoin.amos.boot.module.ymt.api.dto.*;
import com.yeejoin.amos.boot.module.ymt.api.entity.*;
import com.yeejoin.amos.boot.module.ymt.api.enums.DispatchPaperEnums;
import com.yeejoin.amos.boot.module.ymt.api.enums.TzsCommonParam;
import com.yeejoin.amos.boot.module.ymt.api.mapper.*;
import org.apache.commons.io.IOUtils;
import org.apache.commons.lang3.ObjectUtils;
import org.apache.commons.lang3.StringUtils;
import org.springframework.beans.BeanUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
......@@ -22,8 +25,15 @@ import org.typroject.tyboot.core.foundation.utils.DateUtil;
import org.typroject.tyboot.core.foundation.utils.ValidationUtil;
import org.typroject.tyboot.core.restful.exception.instance.BadRequest;
import java.io.IOException;
import java.nio.charset.StandardCharsets;
import java.text.SimpleDateFormat;
import java.util.*;
import java.util.concurrent.ConcurrentHashMap;
import java.util.stream.Collectors;
import static com.alibaba.fastjson.JSON.parseArray;
import static com.yeejoin.amos.boot.module.statistcs.biz.utils.JsonUtils.getJsonData;
@Service
public class EmergencyBizServiceImpl {
......@@ -31,30 +41,64 @@ public class EmergencyBizServiceImpl {
@Value("classpath:/json/emergencyInformation.json")
private Resource emergencyInformation;
@Value("classpath:/json/emergencyBasic.json")
private Resource emergencyBasic;
@Value("classpath:/json/dispatchRecordFirst.json")
private Resource dispatchRecordFirst;
@Value("classpath:/json/dispatchRecordSecond.json")
private Resource dispatchRecordSecond;
@Value("classpath:/json/dispatchRecordPower.json")
private Resource dispatchRecordPower;
@Value("classpath:/json/rescueFollow.json")
private Resource rescueFollowJson;
@Value("classpath:/json/repairFollow.json")
private Resource repairFollowJson;
@Autowired
public EmergencyBizServiceImpl(ElevatorMapper elevatorMapper,
public EmergencyBizServiceImpl(AlertStatisticsMapper alertStatisticsMapper,
AlertCalledMapper alertCalledMapper,
RepairConsultMapper repairConsultMapper,
AlertFormValueMapper alertFormValueMapper,
VoiceRecordFileMapper voiceRecordFileMapper) {
this.elevatorMapper = elevatorMapper;
VoiceRecordFileMapper voiceRecordFileMapper,
RescueProcessMapper rescueProcessMapper, DataDictionaryServiceImpl dataDictionaryService, CommonBaseMapper commonMapper, RescueStationMapper rescueStationMapper, DispatchTaskMapper dispatchTaskMapper, DispatchPaperMapper dispatchPaperMapper, ElevatorMapper elevatorMapper) {
this.alertStatisticsMapper = alertStatisticsMapper;
this.alertCalledMapper = alertCalledMapper;
this.repairConsultMapper = repairConsultMapper;
this.alertFormValueMapper = alertFormValueMapper;
this.voiceRecordFileMapper = voiceRecordFileMapper;
this.rescueProcessMapper = rescueProcessMapper;
this.dataDictionaryService = dataDictionaryService;
this.commonMapper = commonMapper;
this.rescueStationMapper = rescueStationMapper;
this.dispatchTaskMapper = dispatchTaskMapper;
this.dispatchPaperMapper = dispatchPaperMapper;
this.elevatorMapper = elevatorMapper;
}
private ElevatorMapper elevatorMapper;
private AlertCalledMapper alertCalledMapper;
private RepairConsultMapper repairConsultMapper;
private AlertFormValueMapper alertFormValueMapper;
private VoiceRecordFileMapper voiceRecordFileMapper;
private final AlertStatisticsMapper alertStatisticsMapper;
private final AlertCalledMapper alertCalledMapper;
private final RepairConsultMapper repairConsultMapper;
private final AlertFormValueMapper alertFormValueMapper;
private final VoiceRecordFileMapper voiceRecordFileMapper;
private final RescueProcessMapper rescueProcessMapper;
private final DataDictionaryServiceImpl dataDictionaryService;
private final CommonBaseMapper commonMapper;
private final RescueStationMapper rescueStationMapper;
private final DispatchTaskMapper dispatchTaskMapper;
private final DispatchPaperMapper dispatchPaperMapper;
private final ElevatorMapper elevatorMapper;
private static final Map<String, String> regionCodeOrgCodeMap = new ConcurrentHashMap<>();
public Object getDetail(Long id) {
SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
HashMap<String, Object> keyinfoData = new HashMap<>();
// 基本信息
List<FormValue> jsonData = JsonUtils.getJsonData(emergencyInformation);
List<FormValue> jsonData = getJsonData(emergencyInformation);
AlertCalledFormDto alertCalledFormVo = getAlertCalledFormDto(id);
Map<String, Object> objectMap = Bean.BeantoMap(alertCalledFormVo.getAlertCalledDto());
List<FormValue> dynamicFormAlert = alertCalledFormVo.getDynamicFormAlert();
......@@ -72,7 +116,7 @@ public class EmergencyBizServiceImpl {
// 获取根据警情获取电梯信息
Map<String, Object> map = this.selectByAlertId(id);
// 根据设备id 获取使用单位信息
Map<String, Object> useUnitMap = elevatorMapper.selectUseUnitByAlertId(String.valueOf(map.get("sequenceNbr")));
Map<String, Object> useUnitMap = alertStatisticsMapper.selectUseUnitByAlertId(String.valueOf(map.get("sequenceNbr")));
if (!ObjectUtils.isEmpty(useUnitMap)) {
jsonData.forEach(f -> {
// 单位名称
......@@ -94,7 +138,7 @@ public class EmergencyBizServiceImpl {
});
}
// 处置记录
LambdaQueryWrapper<RepairConsult> queryWrapper = new LambdaQueryWrapper<RepairConsult>();
LambdaQueryWrapper<RepairConsult> queryWrapper = new LambdaQueryWrapper<>();
queryWrapper.eq(RepairConsult::getParentId, id).orderByDesc(RepairConsult::getRecDate);
List<RepairConsult> list = repairConsultMapper.selectList(queryWrapper);
HashMap<String, Object> datas = new HashMap<>();
......@@ -155,13 +199,13 @@ public class EmergencyBizServiceImpl {
Elevator elevator = new Elevator();
elevator.setRescueCode(Integer.valueOf(alertCalled.getDeviceId()));
elevator.setRegisterCode(alertCalled.getRegistrationCode());
Map<String, Object> map = elevatorMapper.selectElevator(elevator);
Map<String, Object> map = alertStatisticsMapper.selectElevator(elevator);
if (!ObjectUtils.isEmpty(map)) {
alertCalledDto.setAddress(String.valueOf(map.get("address")));
alertCalledDto.setProvince(String.valueOf(map.get("province")));
alertCalledDto.setCity(String.valueOf(map.get("city")));
alertCalledDto.setDistrict(String.valueOf(map.get("district")));
alertCalledDto.setUseStatus(String.valueOf(map.get("useStatus")));
alertCalledDto.setUseStatus(Integer.valueOf(String.valueOf(map.get("useStatus"))));
alertCalledDto.setUseSiteCategory(ObjectUtils.isEmpty(map.get("useSiteCategory")) || "null".equals(String.valueOf(map.get("useSiteCategory"))) ? null : String.valueOf(map.get("useSiteCategory")));
alertCalledDto.setUseUnit(String.valueOf(map.get("useUnit")));
alertCalledDto.setRegionCode(String.valueOf(map.get("regionCode")));
......@@ -182,15 +226,453 @@ public class EmergencyBizServiceImpl {
throw new BadRequest("警情不存在或者设备编码不存在");
}
// 设备类型 和 编码 确定设备的使用单位或者维保单位
String equipmentClassificationCode = alertCalled.getEquipmentClassificationCode();
String deviceId = alertCalled.getEquipmentId();
String deviceId = String.valueOf(alertCalled.getEquipmentId());
// 目前只有电梯类型
Elevator elevator = new Elevator();
elevator.setOriginalId(deviceId);
Map<String, Object> map = elevatorMapper.selectElevator(elevator);
Map<String, Object> map = alertStatisticsMapper.selectElevator(elevator);
if (ValidationUtil.isEmpty(map)) {
throw new BadRequest("设备未找到");
}
return map;
}
public Object getBasicDetail(Long id) {
SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
HashMap<String, Object> map = new HashMap<>();
List<FormValue> jsonData = getJsonData(emergencyBasic);
RescueProcessDto dto = this.getProcessByAlertId(id);
Map<String, Object> objectMap = Bean.BeantoMap(dto);
jsonData.forEach(f -> {
Object o = objectMap.get(f.getKey());
if (!ObjectUtils.isEmpty(o)) {
f.setValue(o.toString());
}
// 派遣状态
if ("dispatchStatus".equals(f.getKey())) {
if (Boolean.TRUE.equals(dto.getDispatchStatus())) {
f.setValue("已通知已派遣");
} else {
f.setValue("未通知未派遣");
}
}
// 到达状态
if ("arriveStatus".equals(f.getKey())) {
if (Boolean.TRUE.equals(dto.getArriveStatus())) {
f.setValue("已到达");
} else {
f.setValue("未到达");
}
}
// 伤亡状态
if ("casualtiesStatus".equals(f.getKey())) {
if (Boolean.TRUE.equals(dto.getCasualtiesStatus())) {
f.setValue("出现伤亡");
} else {
f.setValue("未出现伤亡");
}
}
// 救援状态
if ("rescueStatus".equals(f.getKey())) {
if (Boolean.TRUE.equals(dto.getRescueStatus())) {
f.setValue("救援成功");
} else {
f.setValue("未救援成功");
}
}
// 是否超时
if ("isTimeout".equals(f.getKey())) {
if (Boolean.TRUE.equals(dto.getIsTimeout())) {
f.setValue("是");
} else {
f.setValue("否");
}
}
// 派遣时间
if ("dispatchTime".equals(f.getKey()) && !ObjectUtils.isEmpty(dto.getDispatchTime())) {
f.setValue(simpleDateFormat.format(dto.getDispatchTime()));
}
// 到达时间
if ("arriveTime".equals(f.getKey()) && !ObjectUtils.isEmpty(dto.getArriveTime())) {
f.setValue(simpleDateFormat.format(dto.getArriveTime()));
}
// 完成时间
if ("rescueTime".equals(f.getKey()) && !ObjectUtils.isEmpty(dto.getRescueTime())) {
f.setValue(simpleDateFormat.format(dto.getRescueTime()));
}
});
map.put("datas", jsonData);
map.put("columns", 2);
return map;
}
public RescueProcessDto getProcessByAlertId(Long alertId) {
// 先通过id 查找过程表
RescueProcessDto rescueProcessDto = new RescueProcessDto();
QueryWrapper<RescueProcess> templateQueryWrapper = new QueryWrapper<>();
templateQueryWrapper.eq("alert_id", alertId);
RescueProcess rescueProcess = rescueProcessMapper.selectOne(templateQueryWrapper);
Bean.toModel(rescueProcess, rescueProcessDto);
// 到达时长 不超过30分钟为否,超过为是
// 到达时长 救援响应人员到达时间—救援派遣成功时间
//判断是否存在到达时间
Date dispatchTime = rescueProcessDto.getDispatchTime();
Date arriveTime = rescueProcessDto.getArriveTime();
Date rescueTime = rescueProcessDto.getRescueTime();
if (arriveTime != null && dispatchTime != null) {
long arriveTimes = arriveTime.getTime() - dispatchTime.getTime(); // 相差毫秒数
rescueProcessDto.setIsTimeout(arriveTimes >= 1800000);
}
// 救援时长 用到达时间减去派遣时间
if (dispatchTime != null && arriveTime != null) {
String hms = DateUtils.getTimeDiffString(arriveTime, dispatchTime);
rescueProcessDto.setArriveUseTime(hms);
}
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss");
if (dispatchTime != null) rescueProcessDto.setDispatchTimeStr(sdf.format(dispatchTime));
if (arriveTime != null) rescueProcessDto.setArriveTimeStr(sdf.format(arriveTime));
if (rescueTime != null) rescueProcessDto.setRescueTimeStr(sdf.format(rescueTime));
return rescueProcessDto;
}
public Object getDispatchRecord(Long id) {
SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
HashMap<String, Object> result = new HashMap<>();
ArrayList<Map<String, Object>> group = new ArrayList<>();
String json;
try {
json = IOUtils.toString(dispatchRecordFirst.getInputStream(), String.valueOf(StandardCharsets.UTF_8));
} catch (IOException e) {
throw new RuntimeException(e);
}
List<Map> columns = parseArray(json, Map.class);
// 一级调派
// 获取根据警情获取电梯信息
Map<String, Object> map = this.selectByAlertId(id);
if (ObjectUtils.isEmpty(map)) {
throw new BadRequest("设备未找到");
}
// 根据设备使用id 获取维保单位信息
HashMap<String, Object> first = new HashMap<>();
ArrayList<Map> firstDatas = new ArrayList<>();
HashMap<String, Object> firstData = new HashMap<>();
first.put("key", "firstLevelDispatch");
first.put("renderType", "table");
first.put("columns", columns);
first.put("displayName", "一级调派");
List<Map<String, Object>> list = alertStatisticsMapper.selectMtByAlertId(String.valueOf(map.get("sequenceNbr")));
firstDatas.add(firstData);
first.put("dataList", list);
first.put("rowKey", "sequenceNbr");
// 二级调派
String secondJson;
try {
secondJson = IOUtils.toString(dispatchRecordSecond.getInputStream(), String.valueOf(StandardCharsets.UTF_8));
} catch (IOException e) {
throw new RuntimeException(e);
}
List<Map> secondColumns = parseArray(secondJson, Map.class);
// 获取根据警情获取电梯信息
Map<String, Object> map2 = this.selectByAlertId(id);
String longitude = String.valueOf(map2.get("longitude"));
String latitude = String.valueOf(map2.get("latitude"));
// 根据经纬度和距离返回救援机构信息
HashMap<String, Object> second = new HashMap<>();
second.put("key", "secondLevelDispatch");
second.put("renderType", "table");
second.put("columns", secondColumns);
second.put("displayName", "二级调派");
List<RescueStationDto> listByLatLonDistance = rescueStationMapper.getListByLatLonDistance(latitude, longitude, 1000);
second.put("dataList", listByLatLonDistance);
second.put("rowKey", "sequenceNbr");
// 力量调派
String powerJson;
try {
powerJson = IOUtils.toString(dispatchRecordPower.getInputStream(), String.valueOf(StandardCharsets.UTF_8));
} catch (IOException e) {
throw new RuntimeException(e);
}
List<Map> powerColumns = parseArray(powerJson, Map.class);
LambdaQueryWrapper<DispatchTask> queryWrapper = new LambdaQueryWrapper<DispatchTask>();
queryWrapper.eq(DispatchTask::getAlertId, id);
HashMap<String, Object> power = new HashMap<>();
ArrayList<Map> powerDatas = new ArrayList<>();
power.put("key", "powerLevelDispatch");
power.put("renderType", "table");
power.put("columns", powerColumns);
power.put("displayName", "使用单位");
List<DispatchTask> powerList = dispatchTaskMapper.selectList(queryWrapper);
if (!ObjectUtils.isEmpty(powerList)) {
powerList.forEach(p -> {
Map<String, Object> objectMap = Bean.BeantoMap(p);
if (!ObjectUtils.isEmpty(p.getDispatchTime())) {
objectMap.put("dispatchTime", simpleDateFormat.format(p.getDispatchTime()));
}
if (!ObjectUtils.isEmpty(p.getArriveTime())) {
objectMap.put("arriveTime", simpleDateFormat.format(p.getArriveTime()));
}
powerDatas.add(objectMap);
});
}
power.put("dataList", powerDatas);
power.put("rowKey", "sequenceNbr");
group.add(power);
group.add(first);
group.add(second);
result.put("subs", group);
return result;
}
public Object getFollowRecords(Long id) {
SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
HashMap<String, Object> result = new HashMap<>();
ArrayList<Map<String, Object>> group = new ArrayList<>();
DispatchSaveFeedbackDto dispatchSaveFeedbackDto = this.getDispatchSaveFeedbackDtoByAlertId(id);
Map<String, Object> objectMap = Bean.BeantoMap(dispatchSaveFeedbackDto);
// 救援回访
HashMap<String, Object> rescueFollow = new HashMap<>();
List<FormValue> jsonData = getJsonData(rescueFollowJson);
jsonData.forEach(formValue -> {
Object o = objectMap.get(formValue.getKey());
if (!ObjectUtils.isEmpty(o)) {
formValue.setValue(o.toString());
if ("saveFeedbackTime".equals(formValue.getKey())) {
formValue.setValue(simpleDateFormat.format(dispatchSaveFeedbackDto.getSaveFeedbackTime()));
}
}
});
rescueFollow.put("columns", 2);
rescueFollow.put("datas", jsonData);
rescueFollow.put("renderType", "basic");
rescueFollow.put("key", "rescueFollow");
rescueFollow.put("displayName", "救援回访");
group.add(rescueFollow);
// 维修反馈
HashMap<String, Object> repairFollow = new HashMap<>();
List<FormValue> repairJson = getJsonData(repairFollowJson);
repairJson.forEach(f -> {
Object o = objectMap.get(f.getKey());
if (!ObjectUtils.isEmpty(o)) {
f.setValue(o.toString());
if ("feedbackFinishTime".equals(f.getKey())) {
f.setValue(simpleDateFormat.format(dispatchSaveFeedbackDto.getFeedbackFinishTime()));
}
if ("fixResult".equals(f.getKey())) {
f.setValue(dataDictionaryService.getById(dispatchSaveFeedbackDto.getFixResult()).getName());
}
if ("errorResult".equals(f.getKey())) {
f.setValue(dataDictionaryService.getById(dispatchSaveFeedbackDto.getErrorResult()).getName());
}
}
});
repairFollow.put("columns", 2);
repairFollow.put("datas", repairJson);
repairFollow.put("renderType", "basic");
repairFollow.put("key", "repairFollow");
repairFollow.put("displayName", "维修反馈");
group.add(repairFollow);
result.put("subs", group);
return result;
}
public Object getCallRecords(Long id, int number, int size) {
Page<VoiceRecordFileDto> voiceRecordFileDtoPage = new Page<>();
HashMap<String, Object> map = new HashMap<>();
LambdaQueryWrapper<VoiceRecordFile> queryWrapper = new LambdaQueryWrapper<VoiceRecordFile>();
queryWrapper.eq(VoiceRecordFile::getAlertId, id).orderByDesc(VoiceRecordFile::getRecDate);
List<VoiceRecordFile> list = voiceRecordFileMapper.selectList(queryWrapper);
List<VoiceRecordFileDto> dtoList = new ArrayList<>(list.size());
list.forEach(voiceRecord -> {
// 创建新的对象实例
VoiceRecordFileDto target = new VoiceRecordFileDto();
// 把原对象数据拷贝到新对象
BeanUtils.copyProperties(voiceRecord, target);
dtoList.add(target);
});
List<VoiceRecordFileDto> collect = dtoList.stream()
.skip((long) (number - 1) * size)
.limit(size)
.collect(Collectors.toList());
voiceRecordFileDtoPage.setRecords(collect);
voiceRecordFileDtoPage.setCurrent(number);
voiceRecordFileDtoPage.setSize(size);
return voiceRecordFileDtoPage;
}
public Page<AlertCalledQueryDto> getAlertCalledRecords(Page<AlertCalledQueryDto> page, AlertCalledQueryDto alertCalledQueryDto, String cityCode) {
String orgCode = getAndSetOrgCode(cityCode);
return alertStatisticsMapper.getAlertCalledRecords(page, alertCalledQueryDto, orgCode);
}
public String getAndSetOrgCode(String cityCode) {
String orgCode = regionCodeOrgCodeMap.get(cityCode);
if (orgCode == null) {
orgCode = commonMapper.getOrgCodeByCompanyCode(cityCode);
if (orgCode != null) {
regionCodeOrgCodeMap.put(cityCode, orgCode);
}
}
return orgCode;
}
public DispatchSaveFeedbackDto getDispatchSaveFeedbackDtoByAlertId(Long alertId) {
DispatchSaveFeedbackDto dispatchSaveFeedbackDto = new DispatchSaveFeedbackDto();
dispatchSaveFeedbackDto.setAlertId(alertId);
AlertCalledFormDto alertCalledFormVo = this.selectAlertCalledByIdNoCache(alertId);
// 警情信息
AlertCalledDto alertCalledDto = alertCalledFormVo.getAlertCalledDto();
dispatchSaveFeedbackDto.setEmergency(alertCalledDto.getEmergencyPerson());
dispatchSaveFeedbackDto.setEmergencyCall(alertCalledDto.getEmergencyCall());
// 派遣单信息
DispatchPaperFormDto dispatchPaperFormDto = this.selectDispatchPaperDtoByAlertId(alertId);
if (dispatchPaperFormDto == null || dispatchPaperFormDto.getDispatchPaper() == null) {
return new DispatchSaveFeedbackDto(); // 如果没有派遣就没有派遣反馈信息
}
DispatchPaper dispatchPaper = dispatchPaperFormDto.getDispatchPaper();
dispatchSaveFeedbackDto.setFeedbackFinishTime(dispatchPaper.getFeedbackFinishTime());
if (StringUtils.isBlank(dispatchPaper.getFeedbackUid())) {
dispatchSaveFeedbackDto.setFeedbackUid(null);
} else {
dispatchSaveFeedbackDto.setFeedbackUid(dispatchPaper.getFeedbackUid());
}
if (StringUtils.isBlank(dispatchPaper.getFeedbackUname())) {
dispatchSaveFeedbackDto.setFeedbackUname(null);
} else {
dispatchSaveFeedbackDto.setFeedbackUname(dispatchPaper.getFeedbackUname());
}
//救援响应人和维保响应人
Long useOrgTaskId = dispatchPaper.getUseOrgTaskId();
Long repairOrgTaskId = dispatchPaper.getRepairOrgTaskId();
// 如果维保单位和使用单位都下单了 默认显示维保单位
DispatchTask dispatchTask;
if (repairOrgTaskId != null) {
dispatchTask = dispatchTaskMapper.selectById(repairOrgTaskId);
dispatchSaveFeedbackDto.setResponseUserName(dispatchTask.getResponseUserName());
dispatchSaveFeedbackDto.setResponseUserTel(dispatchTask.getResponseUserTel());
} else if (useOrgTaskId != null) {
dispatchTask = dispatchTaskMapper.selectById(useOrgTaskId);
dispatchSaveFeedbackDto.setResponseUserName(dispatchTask.getResponseUserName());
dispatchSaveFeedbackDto.setResponseUserTel(dispatchTask.getResponseUserTel());
}
// 动态字段
List<AlertFormValue> dynamicFormAlert = dispatchPaperFormDto.getDynamicFormAlert();
dynamicFormAlert.forEach(alertFormValue -> {
String value = null;
switch (alertFormValue.getFieldCode()) {
case TzsCommonParam.SAVE_FEEDBACK_TIME:
value = alertFormValue.getFieldValue();
if (StringUtils.isBlank(value)) {
dispatchSaveFeedbackDto.setSaveFeedbackTime(null);
} else {
try {
dispatchSaveFeedbackDto.setSaveFeedbackTime(DateUtils.longStr2Date(value));
} catch (Exception e) {
throw new BadRequest("救援时间格式错误");
}
}
break;
case TzsCommonParam.SAVE_FEEDBACK_USER:
value = alertFormValue.getFieldValue();
if (StringUtils.isBlank(value)) {
dispatchSaveFeedbackDto.setSaveFeedbackUser(null);
} else {
dispatchSaveFeedbackDto.setSaveFeedbackUser(value);
}
break;
case TzsCommonParam.SAVE_FEEDBACK_UID:
value = alertFormValue.getFieldValue();
if (StringUtils.isBlank(value)) {
dispatchSaveFeedbackDto.setSaveFeedbackUid(null);
} else {
dispatchSaveFeedbackDto.setSaveFeedbackUid(value);
}
break;
case TzsCommonParam.SAVE_FEEDBACK_RESULT:
value = alertFormValue.getFieldValue();
dispatchSaveFeedbackDto.setSaveFeedbackResult(value);
break;
case TzsCommonParam.FIX_RESULT:
value = alertFormValue.getFieldValueCode();
dispatchSaveFeedbackDto.setFixResult(value);
break;
case TzsCommonParam.ERROR_RESULT:
value = alertFormValue.getFieldValueCode();
dispatchSaveFeedbackDto.setErrorResult(value);
break;
case TzsCommonParam.FIX_REMARK:
value = alertFormValue.getFieldValue();
dispatchSaveFeedbackDto.setFixRemark(value);
break;
case TzsCommonParam.FIX_FEEDBACK_TYPE:// 保修反馈方式
value = alertFormValue.getFieldValueCode();
dispatchSaveFeedbackDto.setFeedbackCode(value);
dispatchSaveFeedbackDto.setFeedbackType(alertFormValue.getFieldValue());
break;
}
});
return dispatchSaveFeedbackDto;
}
public AlertCalledFormDto selectAlertCalledByIdNoCache(Long id) {
// 警情基本信息
AlertCalled alertCalled = alertCalledMapper.selectById(id);
LambdaQueryWrapper<AlertFormValue> queryWrapper = new LambdaQueryWrapper<>();
queryWrapper.eq(AlertFormValue::getAlertCalledId, id);
// 警情动态表单数据
List<AlertFormValue> list = alertFormValueMapper.selectList(queryWrapper);
List<FormValue> formValue = new ArrayList<FormValue>();
if (list != null && !list.isEmpty()) {
for (AlertFormValue alertFormValue : list) {
FormValue value = new FormValue(alertFormValue.getFieldCode(), alertFormValue.getFieldName(), "text", alertFormValue.getFieldValue(), alertFormValue.getBlock());
formValue.add(value);
}
}
AlertCalledDto alertCalledDto = new AlertCalledDto();
BeanUtils.copyProperties(alertCalled, alertCalledDto);
LambdaQueryWrapper<Elevator> elevatorQueryWrapper = new LambdaQueryWrapper<>();
elevatorQueryWrapper.eq(Elevator::getRescueCode, alertCalled.getDeviceId());
elevatorQueryWrapper.eq(Elevator::getRegisterCode, alertCalled.getRegistrationCode());
Elevator elevator = elevatorMapper.selectOne(elevatorQueryWrapper);
if (null != elevator) {
alertCalledDto.setAddress(elevator.getAddress());
alertCalledDto.setProvince(elevator.getProvince());
alertCalledDto.setCity(elevator.getCity());
alertCalledDto.setDistrict(elevator.getDistrict());
alertCalledDto.setUseStatus(Integer.valueOf(String.valueOf(elevator.getUseStatus())));
alertCalledDto.setUseSiteCategory(elevator.getUseSiteCategory());
alertCalledDto.setUseUnit(elevator.getUseUnit());
alertCalledDto.setRegionCode(elevator.getRegionCode());
}
String voiceRecord = "";
return new AlertCalledFormDto(alertCalledDto, formValue, voiceRecord);
}
public DispatchPaperFormDto selectDispatchPaperDtoByAlertId(Long alertId) {
// 根据警情id 获取 派遣单信息
DispatchPaper dispatchPaper = selectDispatchPaperByAlertId(alertId);
// 封装dto
DispatchPaperFormDto dispatchPaperFormDto = new DispatchPaperFormDto();
if (dispatchPaper == null) { //如果没有找到paper 返回空Dto
return dispatchPaperFormDto;
}
dispatchPaperFormDto.setDispatchPaper(dispatchPaper);
LambdaQueryWrapper<AlertFormValue> queryWrapper = new LambdaQueryWrapper<>();
queryWrapper.eq(AlertFormValue::getAlertCalledId, dispatchPaper.getSequenceNbr()).eq(AlertFormValue::getAlertTypeCode, DispatchPaperEnums.getEnumById(dispatchPaper.getAlertCode()).getDynamicCode());
// 派遣单动态表单数据
List<AlertFormValue> list = alertFormValueMapper.selectList(queryWrapper);
dispatchPaperFormDto.setDynamicFormAlert(list);
return dispatchPaperFormDto;
}
public DispatchPaper selectDispatchPaperByAlertId(Long alertId) {
LambdaQueryWrapper<DispatchPaper> queryWrapper = new LambdaQueryWrapper<>();
queryWrapper.eq(DispatchPaper::getAlertId, alertId);
// 警情动态表单数据
return dispatchPaperMapper.selectOne(queryWrapper);
}
}
package com.yeejoin.amos.boot.module.statistcs.biz.utils;
import com.alibaba.fastjson.JSONObject;
import com.yeejoin.amos.boot.module.elevator.api.dto.FormValue;
import com.yeejoin.amos.boot.module.ymt.api.dto.FormValue;
import org.apache.commons.io.IOUtils;
import org.springframework.core.io.Resource;
import java.io.IOException;
......
[
{
"dataIndex": "unitName",
"width": "33%",
"align": "left",
"title": "维保单位",
"key": "AA6DE857-C788-494F-8F16-2ECFC7E34528"
},
{
"dataIndex": "address",
"width": "33%",
"align": "left",
"title": "地址",
"key": "611DAF3D-5B79-466C-BEF2-CC91580091FA"
},
{
"dataIndex": "userName1",
"width": "15%",
"align": "left",
"title": "主要负责人",
"key": "611DAF3D-5B79-466C-BEF2-CC91580091FA2"
},
{
"dataIndex": "phone1",
"width": "15%",
"align": "left",
"title": "主要负责人电话",
"key": "611DAF3D-5B79-466C-BEF2-CC91580091FA3"
}
]
\ No newline at end of file
[
{
"dataIndex": "orgType",
"width": "15%",
"align": "left",
"title": "响应级别",
"key": "AA6DE857-C788-494F-8F16-2ECFC7E34528"
},
{
"dataIndex": "responseOrgName",
"width": "26%",
"align": "left",
"title": "单位名称",
"key": "D1CB84A4-E037-446A-9469-65B76E381585"
},
{
"dataIndex": "responseUserName",
"width": "10%",
"align": "left",
"title": "联系人",
"key": "611DAF3D-5B79-466C-BEF2-CC91580091FA"
},
{
"dataIndex": "responseUserTel",
"width": "15%",
"align": "left",
"title": "联系电话",
"key": "611DAF3D-5B79-466C-BEF2-CC91580091FA1"
},
{
"dataIndex": "dispatchTime",
"width": "15%",
"align": "left",
"title": "派遣时间",
"key": "611DAF3D-5B79-466C-BEF2-CC91580091FA2"
},
{
"dataIndex": "arriveTime",
"width": "15%",
"align": "left",
"title": "到达时间",
"key": "611DAF3D-5B79-466C-BEF2-CC91580091FA3"
}
]
\ No newline at end of file
[
{
"dataIndex": "name",
"width": "23%",
"align": "left",
"title": "名称",
"key": "AA6DE857-C788-494F-8F16-2ECFC7E34528"
},
{
"dataIndex": "address",
"width": "33%",
"align": "left",
"title": "地址",
"key": "D1CB84A4-E037-446A-9469-65B76E381585"
},
{
"dataIndex": "distance",
"width": "20%",
"align": "left",
"title": "距离",
"key": "611DAF3D-5B79-466C-BEF2-CC91580091FA"
},
{
"dataIndex": "rescueLeader",
"width": "10%",
"align": "left",
"title": "救援负责人",
"key": "611DAF3D-5B79-466C-BEF2-CC91580091FA1"
},
{
"dataIndex": "rescueLeaderPhone",
"width": "10%",
"align": "left",
"title": "电话",
"key": "611DAF3D-5B79-466C-BEF2-CC91580091FA2"
}
]
\ No newline at end of file
......@@ -8,7 +8,7 @@
"dataConfig": {
"api": {
"httpMethod":"GET",
"apiPath":"/elevator/alert-called/detail/{sequenceNbr}"
"apiPath":"/statistics/dp/biz/emergency/detail/{sequenceNbr}"
}
}
},
......@@ -20,7 +20,7 @@
"dataConfig": {
"api": {
"httpMethod":"GET",
"apiPath":"/elevator/alert-called/basicDetail/{sequenceNbr}"
"apiPath":"/statistics/dp/biz/emergency/basicDetail/{sequenceNbr}"
}
}
},
......@@ -32,7 +32,7 @@
"dataConfig": {
"api": {
"httpMethod":"GET",
"apiPath":"/elevator/alert-called/dispatchRecord/{sequenceNbr}"
"apiPath":"/statistics/dp/biz/emergency/dispatchRecord/{sequenceNbr}"
}
}
},
......@@ -44,7 +44,7 @@
"dataConfig": {
"api": {
"httpMethod":"GET",
"apiPath":"/elevator/alert-called/followRecords/{sequenceNbr}"
"apiPath":"/statistics/dp/biz/emergency/followRecords/{sequenceNbr}"
}
}
},
......@@ -55,7 +55,7 @@
"dataConfig": {
"api": {
"httpMethod":"GET",
"apiPath":"/elevator/alert-called/callRecords/{sequenceNbr}",
"apiPath":"/statistics/dp/biz/emergency/callRecords/{sequenceNbr}",
"params": {
"number": 1,
"size": 10
......
[
{
"key": "dispatchStatus",
"label": "派遣状态",
"type": "text"
},
{
"key": "dispatchUserName",
"label": "派遣人",
"type": "text"
},
{
"key": "dispatchTime",
"label": "派遣时间",
"type": "text"
},
{
"key": "arriveStatus",
"label": "到达状态",
"type": "text"
},
{
"key": "arriveTime",
"label": "到达时间",
"type": "text"
},
{
"key": "arriveUserName",
"label": "记录人",
"type": "text"
},
{
"key": "arriveFeedbackType",
"label": "反馈方式",
"type": "text"
},
{
"key": "casualtiesStatus",
"label": "伤亡状态",
"type": "text"
},
{
"key": "casualtiesInfo",
"label": "受伤人数",
"type": "text"
},
{
"key": "dieNum",
"label": "死亡人数",
"type": "text"
},
{
"key": "rescueStatus",
"label": "救援状态",
"type": "text"
},
{
"key": "rescueTime",
"label": "完成时间",
"type": "text"
},
{
"key": "rescueUserName",
"label": "记录人",
"type": "text"
},
{
"key": "rescueFeedbackType",
"label": "反馈方式",
"type": "text"
},
{
"key": "isTimeout",
"label": "是否超时",
"type": "text"
},
{
"key": "arriveUseTime",
"label": "救援时长",
"type": "text"
}
]
\ No newline at end of file
[
{
"key": "responseUserName",
"label": "维保响应人",
"type": "text"
},
{
"key": "responseUserTel",
"label": "响应电话",
"type": "text"
},
{
"key": "feedbackType",
"label": "反馈方式",
"type": "text"
},
{
"key": "fixResult",
"label": "维修结果",
"type": "text"
},
{
"key": "feedbackFinishTime",
"label": "维修完成时间",
"type": "text"
},
{
"key": "saveFeedbackUser",
"label": "维修回访人",
"type": "text"
},
{
"key": "errorResult",
"label": "故障原因",
"type": "text"
},
{
"key": "fixRemark",
"label": "备注",
"type": "text"
}
]
\ No newline at end of file
[
{
"key": "emergency",
"label": "救援人",
"type": "text"
},
{
"key": "emergencyCall",
"label": "救援电话",
"type": "text"
},
{
"key": "saveFeedbackTime",
"label": "回访时间",
"type": "text"
},
{
"key": "feedbackUname",
"label": "救援回访人",
"type": "text"
},
{
"key": "saveFeedbackResult",
"label": "回访结果",
"type": "text"
}
]
\ No newline at end of file
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment