Commit 539887b0 authored by chenhao's avatar chenhao

Merge branch 'developer' of http://172.16.10.76/moa/amos-boot-biz into developer

parents cbe33fd0 d3d40e9f
package com.yeejoin.amos.boot.module.tzs.api.service; package com.yeejoin.amos.boot.module.tzs.api.service;
import com.yeejoin.amos.boot.module.tzs.api.dto.VoiceRecordFileDto;
/** /**
* 通话记录附件接口类 * 通话记录附件接口类
* *
...@@ -9,4 +11,6 @@ package com.yeejoin.amos.boot.module.tzs.api.service; ...@@ -9,4 +11,6 @@ package com.yeejoin.amos.boot.module.tzs.api.service;
*/ */
public interface IVoiceRecordFileService { public interface IVoiceRecordFileService {
void publishRecord(VoiceRecordFileDto model);
} }
...@@ -2,6 +2,7 @@ package com.yeejoin.amos.boot.module.common.biz.controller; ...@@ -2,6 +2,7 @@ package com.yeejoin.amos.boot.module.common.biz.controller;
import com.alibaba.fastjson.JSON; import com.alibaba.fastjson.JSON;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.baomidou.mybatisplus.core.conditions.update.UpdateWrapper; import com.baomidou.mybatisplus.core.conditions.update.UpdateWrapper;
import com.baomidou.mybatisplus.core.metadata.IPage; import com.baomidou.mybatisplus.core.metadata.IPage;
...@@ -76,8 +77,16 @@ public class OrgUsrController extends BaseController { ...@@ -76,8 +77,16 @@ public class OrgUsrController extends BaseController {
@TycloudOperation(ApiLevel = UserType.AGENCY) @TycloudOperation(ApiLevel = UserType.AGENCY)
@RequestMapping(value = "/{id}", method = RequestMethod.DELETE) @RequestMapping(value = "/{id}", method = RequestMethod.DELETE)
@ApiOperation(httpMethod = "DELETE", value = "根据id删除", notes = "根据id删除") @ApiOperation(httpMethod = "DELETE", value = "根据id删除", notes = "根据id删除")
public ResponseModel<?> deleteById(HttpServletRequest request, @PathVariable Long id) { public ResponseModel<String> deleteById(HttpServletRequest request, @PathVariable Long id) {
// 删除时,只作逻辑删除 // 删除时,只作逻辑删除
// BUG 2741 首先判断是否为公司 如果公司底下有人员不可直接删除 bykongfm
OrgUsr tempOrg = iOrgUsrService.getById(id);
if(tempOrg.getBizOrgType().equals("COMPANY")) {
List<OrgUsr> tempList = iOrgUsrService.list(new LambdaQueryWrapper<OrgUsr>().eq(OrgUsr::getParentId,id).eq(OrgUsr::getIsDelete,false));
if(tempList.size() > 0) {
return ResponseHelper.buildResponse("-1");
}
}
iOrgUsrService.update(new UpdateWrapper<OrgUsr>().eq("sequence_nbr", id).set("is_delete", CommonConstant.IS_DELETE_01)); iOrgUsrService.update(new UpdateWrapper<OrgUsr>().eq("sequence_nbr", id).set("is_delete", CommonConstant.IS_DELETE_01));
try { try {
eSOrgUsrService.deleteById(id); eSOrgUsrService.deleteById(id);
...@@ -86,7 +95,7 @@ public class OrgUsrController extends BaseController { ...@@ -86,7 +95,7 @@ public class OrgUsrController extends BaseController {
e.printStackTrace(); e.printStackTrace();
throw new RuntimeException(); throw new RuntimeException();
} }
return ResponseHelper.buildResponse(null); return ResponseHelper.buildResponse("0");
} }
......
...@@ -211,13 +211,15 @@ public class LinkageUnitServiceImpl extends BaseService<LinkageUnitDto, LinkageU ...@@ -211,13 +211,15 @@ public class LinkageUnitServiceImpl extends BaseService<LinkageUnitDto, LinkageU
updateWithModel(linkageUnitDto); updateWithModel(linkageUnitDto);
// 修改行信息 // 修改行信息
Long instanceId = linkageUnitDto.getInstanceId(); Long instanceId = linkageUnitDto.getInstanceId();
List<DynamicFormInstance> dynamicFormInstanceList = dynamicFormInstanceService if(instanceId != null) { // BUG 2748 联动单位无法保存 bykongfm
.list(new LambdaQueryWrapper<DynamicFormInstance>().eq(DynamicFormInstance::getInstanceId, instanceId)); List<DynamicFormInstance> dynamicFormInstanceList = dynamicFormInstanceService
Map<String, Object> objectMap = Bean.BeantoMap(linkageUnitDto); .list(new LambdaQueryWrapper<DynamicFormInstance>().eq(DynamicFormInstance::getInstanceId, instanceId));
dynamicFormInstanceList.forEach(item -> item.setFieldValue( Map<String, Object> objectMap = Bean.BeantoMap(linkageUnitDto);
objectMap.get(item.getFieldCode()) != null ? objectMap.get(item.getFieldCode()).toString() dynamicFormInstanceList.forEach(item -> item.setFieldValue(
: item.getFieldValue())); objectMap.get(item.getFieldCode()) != null ? objectMap.get(item.getFieldCode()).toString()
dynamicFormInstanceService.updateBatchById(dynamicFormInstanceList); : item.getFieldValue()));
dynamicFormInstanceService.updateBatchById(dynamicFormInstanceList);
}
// 修改照片信息 // 修改照片信息
sourceFileServiceImpl.saveSourceFile(linkageUnitDto.getSequenceNbr(), linkageUnitDto.getImage()); sourceFileServiceImpl.saveSourceFile(linkageUnitDto.getSequenceNbr(), linkageUnitDto.getImage());
return linkageUnitDto; return linkageUnitDto;
......
...@@ -959,15 +959,16 @@ public class OrgUsrServiceImpl extends BaseService<OrgUsrDto, OrgUsr, OrgUsrMapp ...@@ -959,15 +959,16 @@ public class OrgUsrServiceImpl extends BaseService<OrgUsrDto, OrgUsr, OrgUsrMapp
} }
CompanyPerson company = new CompanyPerson(); CompanyPerson company = new CompanyPerson();
BeanUtils.copyProperties(org, company); BeanUtils.copyProperties(org, company);
company.setPersons(this.queryForListByParentIdAndOrgType(org.getSequenceNbr(), OrgPersonEnum.人员.getKey())); company.setPersons(this.queryForListByParentIdAndOrgType(org.getSequenceNbr(), OrgPersonEnum.人员.getKey(), false));
return company; return company;
}).filter(c -> { }).filter(c -> {
return c != null; return c != null;
}).collect(Collectors.toList()); }).collect(Collectors.toList());
} }
public List<OrgUsrDto> queryForListByParentIdAndOrgType(Long parentId, String bizOrgType) { // BUG 2736 人员导出过滤已经删除的数据by kongfm
return this.queryForList(null, false, parentId, bizOrgType); public List<OrgUsrDto> queryForListByParentIdAndOrgType(Long parentId, String bizOrgType, Boolean isDelete) {
return this.queryForList(null, false, parentId, bizOrgType, isDelete);
} }
public OrgUsrDto getOrg(String amosUserId) { public OrgUsrDto getOrg(String amosUserId) {
......
...@@ -6,6 +6,8 @@ import java.util.Map; ...@@ -6,6 +6,8 @@ import java.util.Map;
import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletRequest;
import com.yeejoin.amos.boot.module.common.api.entity.FireTeam;
import com.yeejoin.amos.boot.module.jcs.biz.service.impl.FireTeamServiceImpl;
import com.yeejoin.amos.component.feign.model.FeignClientResult; import com.yeejoin.amos.component.feign.model.FeignClientResult;
import com.yeejoin.amos.feign.systemctl.Systemctl; import com.yeejoin.amos.feign.systemctl.Systemctl;
import com.yeejoin.amos.feign.systemctl.model.RegionModel; import com.yeejoin.amos.feign.systemctl.model.RegionModel;
...@@ -81,6 +83,8 @@ public class FirefightersController extends BaseController { ...@@ -81,6 +83,8 @@ public class FirefightersController extends BaseController {
@Autowired @Autowired
FirefightersJacketServiceImpl iFirefightersJacketService; FirefightersJacketServiceImpl iFirefightersJacketService;
@Autowired @Autowired
FireTeamServiceImpl iFireTeamService;
@Autowired
RedisUtils redisUtils; RedisUtils redisUtils;
@Value("${redis.cache.failure.time}") @Value("${redis.cache.failure.time}")
private long time; private long time;
...@@ -116,6 +120,11 @@ public class FirefightersController extends BaseController { ...@@ -116,6 +120,11 @@ public class FirefightersController extends BaseController {
@ApiOperation(httpMethod = "DELETE", value = "根据id删除", notes = "根据id删除") @ApiOperation(httpMethod = "DELETE", value = "根据id删除", notes = "根据id删除")
@Transactional @Transactional
public ResponseModel<Object> deleteById(HttpServletRequest request, @PathVariable Long id) { public ResponseModel<Object> deleteById(HttpServletRequest request, @PathVariable Long id) {
//BUG 2761 判断人员删除时的逻辑 如果被选为队伍联系人则无法被删除 bykongfm
List fireTeam = iFireTeamService.list(new LambdaQueryWrapper<FireTeam>().eq(FireTeam::getIsDelete,false).eq(FireTeam::getContactUserId,id));
if(fireTeam.size() > 0 ) {
return ResponseHelper.buildResponse("-1");
}
QueryWrapper<FirefightersJacket> queryWrapper = new QueryWrapper<>(); QueryWrapper<FirefightersJacket> queryWrapper = new QueryWrapper<>();
queryWrapper.eq("firefighters_id", id); queryWrapper.eq("firefighters_id", id);
queryWrapper.eq("is_delete", 0); queryWrapper.eq("is_delete", 0);
...@@ -139,7 +148,7 @@ public class FirefightersController extends BaseController { ...@@ -139,7 +148,7 @@ public class FirefightersController extends BaseController {
.update(new UpdateWrapper<FirefightersJacket>().eq("firefighters_id", id).set("is_delete", 1)); .update(new UpdateWrapper<FirefightersJacket>().eq("firefighters_id", id).set("is_delete", 1));
// 删除缓存 // 删除缓存
redisUtils.del(RedisKey.FIREFIGHTERS_ID + id, RedisKey.FIREFIGHTERS_LIST_ID + id); redisUtils.del(RedisKey.FIREFIGHTERS_ID + id, RedisKey.FIREFIGHTERS_LIST_ID + id);
return ResponseHelper.buildResponse(null); return ResponseHelper.buildResponse("0");
} catch (Exception e) { } catch (Exception e) {
e.printStackTrace(); e.printStackTrace();
throw new RuntimeException("删除失败!"); throw new RuntimeException("删除失败!");
......
...@@ -15,6 +15,7 @@ import io.swagger.annotations.Api; ...@@ -15,6 +15,7 @@ import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation; import io.swagger.annotations.ApiOperation;
import org.springframework.beans.BeanUtils; import org.springframework.beans.BeanUtils;
import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.scheduling.annotation.Async;
import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PathVariable; import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.PostMapping; import org.springframework.web.bind.annotation.PostMapping;
...@@ -54,9 +55,6 @@ public class VoiceRecordFileController extends BaseController { ...@@ -54,9 +55,6 @@ public class VoiceRecordFileController extends BaseController {
@Autowired @Autowired
AlertCalledServiceImpl iAlertCalledService; AlertCalledServiceImpl iAlertCalledService;
@Autowired
ICtiService ctiService;
/** /**
* 新增通话记录附件 * 新增通话记录附件
* *
...@@ -123,56 +121,15 @@ public class VoiceRecordFileController extends BaseController { ...@@ -123,56 +121,15 @@ public class VoiceRecordFileController extends BaseController {
@TycloudOperation(ApiLevel = UserType.AGENCY) @TycloudOperation(ApiLevel = UserType.AGENCY)
@PostMapping(value = "/saveRecord") @PostMapping(value = "/saveRecord")
@ApiOperation(httpMethod = "POST", value = "新增通话记录附件", notes = "新增通话记录附件") @ApiOperation(httpMethod = "POST", value = "新增通话记录附件", notes = "新增通话记录附件")
public ResponseModel<VoiceRecordFileDto> saveRecord(@RequestBody VoiceRecordFileDto model) { public ResponseModel<Boolean> saveRecord(@RequestBody VoiceRecordFileDto model) {
if (ValidationUtil.isEmpty(model.getAlertId()) if (ValidationUtil.isEmpty(model.getAlertId())
|| ValidationUtil.isEmpty(model.getConnectId())){ || ValidationUtil.isEmpty(model.getConnectId())){
throw new BadRequest("参数校验失败."); throw new BadRequest("参数校验失败.");
} }
// 获取通话人信息 voiceRecordFileServiceImpl.publishRecord(model);
JSONArray recordInfos = ctiService.getCallInfo(model.getConnectId()); return ResponseHelper.buildResponse(true);
if(recordInfos == null || recordInfos.size() == 0) { }
throw new BadRequest("未找到通话详单信息");
}
JSONObject recordInfo = recordInfos.getJSONObject(0);
model.setTel(recordInfo.getString("telephone"));
Date telStartTime = null;
Date telEndTime = null;
try {
telStartTime = DateUtils.longStr2Date(recordInfo.getString("connectTime"));
telEndTime = DateUtils.longStr2Date(recordInfo.getString("hangupTime"));
} catch (Exception e) {
throw new BadRequest("日期转换错误");
}
model.setTelStartTime(telStartTime);
model.setTelEndTime(telEndTime);
if(1 == recordInfo.getInteger("callType")) {
model.setFileType("客户呼入");
} else if(2 == recordInfo.getInteger("callType")) {
model.setFileType("坐席呼出");
}
// 获取附件 需要延时5S
try {
Thread.sleep(5000);
} catch (InterruptedException e) {
e.printStackTrace();
}
Map<String, String> downloadFile = ctiService.downLoadRecordFile(recordInfo.getString("connectionid"));
if(downloadFile.isEmpty()) {
throw new BadRequest("未找到附件文件");
}
for(Map.Entry<String,String> file : downloadFile.entrySet()) {
model.setFilePath(file.getKey());
}
AlertCalledFormDto alertDto = iAlertCalledService.selectAlertCalledByIdNoCache(model.getAlertId());
if(alertDto == null || alertDto.getAlertCalledDto() == null) {
throw new BadRequest("未找到相关警情");
}
model.setAlertStage(alertDto.getAlertCalledDto().getAlertStage());
model.setAlertStageCode(alertDto.getAlertCalledDto().getAlertStageCode());
model.setSourceId(-1l);
model = voiceRecordFileServiceImpl.createWithModel(model);
return ResponseHelper.buildResponse(model);
}
} }
package com.yeejoin.amos.boot.module.tzs.biz.core.async;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.scheduling.concurrent.ThreadPoolTaskExecutor;
import java.util.concurrent.Executor;
@Configuration
public class TaskExecutorPoolConfig {
@Bean("asyncTaskExecutor")
public Executor taskExecutor() {
ThreadPoolTaskExecutor executor = new ThreadPoolTaskExecutor();
executor.setCorePoolSize(10);//线程池维护线程的最少数量
executor.setMaxPoolSize(100); //线程池维护线程的最大数量
executor.setQueueCapacity(100);
executor.setKeepAliveSeconds(30);//线程池维护线程所允许的空闲时间,TimeUnit.SECONDS
executor.setThreadNamePrefix("asyncTaskExecutor-");
// 线程池对拒绝任务的处理策略: CallerRunsPolicy策略,当线程池没有处理能力的时候,该策略会直接在 execute 方法的调用线程中运行被拒绝的任务;如果执行程序已关闭,则会丢弃该任务
// executor.setRejectedExecutionHandler(ThreadPoolExecutor.CallerRunsPolicy());
return executor;
}
}
package com.yeejoin.amos.boot.module.tzs.biz.core.threadpool;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
/**
* 线程池
*/
public class AmosThreadPool {
/**
* 日志记录器
*/
private static final Logger log = LoggerFactory.getLogger(AmosThreadPool.class);
/**
* 单例
*/
private static AmosThreadPool instance;
/**
* 执行服务
*/
private static ExecutorService executorService;
/**
* 获取单例
*
* @return
*/
public static AmosThreadPool getInstance() {
if (instance == null) {
synchronized (AmosThreadPool.class) {
if (instance == null) {
instance = new AmosThreadPool();
}
}
}
return instance;
}
static {
executorService = Executors
.newFixedThreadPool(20);
}
/**
* 执行线程
*
* @param task
*/
public void execute(Runnable task) {
executorService.execute(task);
}
}
...@@ -121,6 +121,7 @@ public class CtiServiceImpl implements ICtiService { ...@@ -121,6 +121,7 @@ public class CtiServiceImpl implements ICtiService {
Map<String,String> header = new HashMap<>(); Map<String,String> header = new HashMap<>();
header.put("accessToken",token); header.put("accessToken",token);
String responseStr = HttpUtils.doPostWithHeader(url,params.toJSONString(),header); String responseStr = HttpUtils.doPostWithHeader(url,params.toJSONString(),header);
JSONObject response = null; JSONObject response = null;
try { try {
response = JSONObject.parseObject(responseStr); response = JSONObject.parseObject(responseStr);
......
package com.yeejoin.amos.boot.module.tzs.biz.service.impl; package com.yeejoin.amos.boot.module.tzs.biz.service.impl;
import com.alibaba.fastjson.JSONArray;
import com.alibaba.fastjson.JSONObject;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.yeejoin.amos.boot.biz.common.feign.AmosFeignService;
import com.yeejoin.amos.boot.biz.common.utils.DateUtils;
import com.yeejoin.amos.boot.module.tzs.api.dto.AlertCalledFormDto;
import com.yeejoin.amos.boot.module.tzs.api.dto.VoiceRecordFileDto;
import com.yeejoin.amos.boot.module.tzs.api.entity.VoiceRecordFile; import com.yeejoin.amos.boot.module.tzs.api.entity.VoiceRecordFile;
import com.yeejoin.amos.boot.module.tzs.api.mapper.VoiceRecordFileMapper; import com.yeejoin.amos.boot.module.tzs.api.mapper.VoiceRecordFileMapper;
import com.yeejoin.amos.boot.module.tzs.api.service.ICtiService;
import com.yeejoin.amos.boot.module.tzs.api.service.IVoiceRecordFileService; import com.yeejoin.amos.boot.module.tzs.api.service.IVoiceRecordFileService;
import com.yeejoin.amos.boot.module.tzs.api.dto.VoiceRecordFileDto; import org.apache.logging.log4j.LogManager;
import org.typroject.tyboot.core.rdbms.service.BaseService; import org.apache.logging.log4j.Logger;
import org.eclipse.paho.client.mqttv3.MqttException;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service; import org.springframework.stereotype.Service;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import org.typroject.tyboot.component.emq.EmqKeeper;
import org.typroject.tyboot.core.rdbms.service.BaseService;
import java.util.Date;
import java.util.List; import java.util.List;
import java.util.Map;
/** /**
* 通话记录附件服务实现类 * 通话记录附件服务实现类
...@@ -17,6 +31,25 @@ import java.util.List; ...@@ -17,6 +31,25 @@ import java.util.List;
*/ */
@Service @Service
public class VoiceRecordFileServiceImpl extends BaseService<VoiceRecordFileDto,VoiceRecordFile,VoiceRecordFileMapper> implements IVoiceRecordFileService { public class VoiceRecordFileServiceImpl extends BaseService<VoiceRecordFileDto,VoiceRecordFile,VoiceRecordFileMapper> implements IVoiceRecordFileService {
@Autowired
private VoiceRecordFileServiceImpl voiceRecordFileServiceImpl;
private final Logger logger = LogManager.getLogger(AmosFeignService.class);
@Autowired
AlertCalledServiceImpl iAlertCalledService;
@Autowired
ICtiService ctiService;
private volatile JSONArray ctiInfos;
@Autowired
EmqKeeper emqKeeper;
private String ctiMessage = "/cti/callphone";
/** /**
* 分页查询 * 分页查询
*/ */
...@@ -30,4 +63,69 @@ public class VoiceRecordFileServiceImpl extends BaseService<VoiceRecordFileDto,V ...@@ -30,4 +63,69 @@ public class VoiceRecordFileServiceImpl extends BaseService<VoiceRecordFileDto,V
public List<VoiceRecordFileDto> queryForVoiceRecordFileList() { public List<VoiceRecordFileDto> queryForVoiceRecordFileList() {
return this.queryForList("" , false); return this.queryForList("" , false);
} }
@Override
public void publishRecord(final VoiceRecordFileDto model) {
Long now = System.currentTimeMillis();
try {
Thread.sleep(5000);
} catch (InterruptedException e) {
e.printStackTrace();
}
Long end = System.currentTimeMillis();
// 获取通话人信息
ctiInfos = ctiService.getCallInfo(model.getConnectId());
if(ctiInfos == null || ctiInfos.size() == 0) {
logger.error("未找到通话详单信息" + (end-now));
}
JSONObject recordInfo = ctiInfos.getJSONObject(0);
model.setTel(recordInfo.getString("telephone"));
Date telStartTime = null;
Date telEndTime = null;
try {
telStartTime = DateUtils.longStr2Date(recordInfo.getString("connectTime"));
telEndTime = DateUtils.longStr2Date(recordInfo.getString("hangupTime"));
} catch (Exception e) {
logger.error("日期转换错误");
}
model.setTelStartTime(telStartTime);
model.setTelEndTime(telEndTime);
if(1 == recordInfo.getInteger("callType")) {
model.setFileType("客户呼入");
} else if(2 == recordInfo.getInteger("callType")) {
model.setFileType("坐席呼出");
}
Map<String, String> downloadFile = ctiService.downLoadRecordFile(recordInfo.getString("connectionid"));
if(downloadFile.isEmpty()) {
logger.error("未找到附件文件");
}
for(Map.Entry<String,String> file : downloadFile.entrySet()) {
model.setFilePath(file.getKey());
}
AlertCalledFormDto alertDto = iAlertCalledService.selectAlertCalledByIdNoCache(model.getAlertId());
if(alertDto == null || alertDto.getAlertCalledDto() == null) {
logger.error("未找到相关警情");
}
model.setAlertStage(alertDto.getAlertCalledDto().getAlertStage());
model.setAlertStageCode(alertDto.getAlertCalledDto().getAlertStageCode());
model.setSourceId(-1l);
voiceRecordFileServiceImpl.createWithModel(model);
JSONObject json = new JSONObject();
json.put("code","1001");
json.put("type","addRecord");
try {
emqKeeper.getMqttClient().publish(ctiMessage, json.toJSONString().getBytes(), 2, false);
} catch (MqttException e) {
logger.error("推送失败");
}
}
} }
\ 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