Merge branch '0418_小程序开发' of http://182.92.166.109:3000/zhuangyuanke/PostDischargePatientManage into 0418_小程序开发

This commit is contained in:
haown 2024-06-13 16:51:56 +08:00
commit 990c809a2a
9 changed files with 235 additions and 69 deletions

View File

@ -81,11 +81,6 @@ public class ScriptInfoController extends BaseController {
return toAjax(scriptInfoService.insertScriptInfo(scriptInfo)); return toAjax(scriptInfoService.insertScriptInfo(scriptInfo));
} }
@PostMapping("/insertScriptEdgeNode")
public AjaxResult insertScriptEdgeNode(@RequestBody ScriptVO scriptVO) {
return scriptInfoService.insertScriptEdgeNode(scriptVO);
}
/** /**
* 修改话术信息 * 修改话术信息
*/ */
@ -121,4 +116,28 @@ public class ScriptInfoController extends BaseController {
} }
return scriptInfoService.uploadScriptInfo(multipartFile); return scriptInfoService.uploadScriptInfo(multipartFile);
} }
/**
* 查询话术节点
*/
@GetMapping("/selectScriptEdgeNode")
public AjaxResult selectScriptEdgeNode(Long id) {
return scriptInfoService.selectScriptEdgeNode(id);
}
/**
* 新增话术节点
*/
@PostMapping("/insertScriptEdgeNode")
public AjaxResult insertScriptEdgeNode(@RequestBody ScriptVO scriptVO) {
return scriptInfoService.insertScriptEdgeNode(scriptVO);
}
/**
* 修改话术节点
*/
@PostMapping("/updateScriptEdgeNode")
public AjaxResult updateScriptEdgeNode(@RequestBody ScriptVO scriptVO) {
return scriptInfoService.updateScriptEdgeNode(scriptVO);
}
} }

View File

@ -1,6 +1,7 @@
package com.xinelu.manage.mapper.scriptInfo; package com.xinelu.manage.mapper.scriptInfo;
import com.xinelu.manage.domain.scriptInfo.ScriptInfo; import com.xinelu.manage.domain.scriptInfo.ScriptInfo;
import com.xinelu.manage.vo.scriptInfo.ScriptVO;
import org.apache.ibatis.annotations.Param; import org.apache.ibatis.annotations.Param;
import java.util.List; import java.util.List;
@ -69,4 +70,11 @@ public interface ScriptInfoMapper {
* 检查是否存在除当前记录之外的同名记录 * 检查是否存在除当前记录之外的同名记录
*/ */
int countByScriptNameExcludingId(@Param("scriptName") String scriptName, @Param("departmentId") Long departmentId, @Param("id") Long id, @Param("commonScriptName") String commonScriptName); int countByScriptNameExcludingId(@Param("scriptName") String scriptName, @Param("departmentId") Long departmentId, @Param("id") Long id, @Param("commonScriptName") String commonScriptName);
ScriptVO selectScriptEdgeNode(Long id);
List<Long> selectScriptInfoEdgeIds(Long id);
List<Long> selectScriptInfoNodeIds(Long id);
} }

View File

@ -60,4 +60,6 @@ public interface ScriptInfoEdgeMapper {
int deleteScriptInfoEdgeByIds(Long[] ids); int deleteScriptInfoEdgeByIds(Long[] ids);
int insertScriptInfoEdgeList(List<ScriptInfoEdge> scriptInfoEdges); int insertScriptInfoEdgeList(List<ScriptInfoEdge> scriptInfoEdges);
int deleteScriptInfoEdgeByScriptInfoIds(Long[] ids);
} }

View File

@ -60,5 +60,7 @@ public interface ScriptInfoNodeMapper {
*/ */
int deleteScriptInfoNodeByIds(Long[] ids); int deleteScriptInfoNodeByIds(Long[] ids);
int deleteScriptInfoNodeByScriptInfoIds(Long[] ids);
int insertScriptInfoNodeList(List<Node> scriptInfoNodes); int insertScriptInfoNodeList(List<Node> scriptInfoNodes);
} }

View File

@ -38,8 +38,6 @@ public interface IScriptInfoService {
*/ */
public int insertScriptInfo(ScriptInfo scriptInfo); public int insertScriptInfo(ScriptInfo scriptInfo);
AjaxResult insertScriptEdgeNode(ScriptVO scriptVO);
/** /**
* 修改话术信息 * 修改话术信息
* *
@ -68,4 +66,16 @@ public interface IScriptInfoService {
* 话术图片上传 * 话术图片上传
*/ */
AjaxResult uploadScriptInfo(MultipartFile multipartFile) throws Exception; AjaxResult uploadScriptInfo(MultipartFile multipartFile) throws Exception;
AjaxResult selectScriptEdgeNode(Long id);
/**
* 新增话术节点
*/
AjaxResult insertScriptEdgeNode(ScriptVO scriptVO);
/**
* 新增话术节点
*/
AjaxResult updateScriptEdgeNode(ScriptVO scriptVO);
} }

View File

@ -17,6 +17,7 @@ import com.xinelu.manage.service.scriptInfo.IScriptInfoService;
import com.xinelu.manage.vo.scriptInfo.Edge; import com.xinelu.manage.vo.scriptInfo.Edge;
import com.xinelu.manage.vo.scriptInfo.Node; import com.xinelu.manage.vo.scriptInfo.Node;
import com.xinelu.manage.vo.scriptInfo.ScriptVO; import com.xinelu.manage.vo.scriptInfo.ScriptVO;
import org.apache.commons.collections4.CollectionUtils;
import org.apache.commons.lang3.StringUtils; import org.apache.commons.lang3.StringUtils;
import org.springframework.stereotype.Service; import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional; import org.springframework.transaction.annotation.Transactional;
@ -92,6 +93,81 @@ public class ScriptInfoServiceImpl implements IScriptInfoService {
return scriptInfoMapper.insertScriptInfo(scriptInfo); return scriptInfoMapper.insertScriptInfo(scriptInfo);
} }
/**
* 修改话术信息
*
* @param scriptInfo 话术信息
* @return 结果
*/
@Override
@Transactional(rollbackFor = Exception.class)
public int updateScriptInfo(ScriptInfo scriptInfo) {
// 检查除当前记录之外是否存在同名的话术名称
if (scriptInfoMapper.countByScriptNameExcludingId(scriptInfo.getScriptName(), scriptInfo.getDepartmentId(), scriptInfo.getId(), scriptInfo.getCommonScriptName()) > 0) {
// 存在同名的通用话术名称不能进行更新
throw new ServiceException("通用话术名称已存在,请使用其他名称。");
}
// 不存在同名的话术名称或者名称未改变设置修改人和修改时间
scriptInfo.setUpdateBy(SecurityUtils.getUsername());
scriptInfo.setUpdateTime(LocalDateTime.now());
// 进行更新操作
return scriptInfoMapper.updateScriptInfo(scriptInfo);
}
/**
* 批量删除话术信息
*
* @param ids 需要删除的话术信息主键
* @return 结果
*/
@Override
@Transactional(rollbackFor = Exception.class)
public int deleteScriptInfoByIds(Long[] ids) {
scriptInfoEdgeMapper.deleteScriptInfoEdgeByScriptInfoIds(ids);
scriptInfoNodeMapper.deleteScriptInfoNodeByScriptInfoIds(ids);
return scriptInfoMapper.deleteScriptInfoByIds(ids);
}
/**
* 删除话术信息信息
*
* @param id 话术信息主键
* @return 结果
*/
@Override
public int deleteScriptInfoById(Long id) {
return scriptInfoMapper.deleteScriptInfoById(id);
}
/**
* 话术图片上传
*/
@Override
public AjaxResult uploadScriptInfo(MultipartFile multipartFile) throws Exception {
// 获取文件路径
String uploadPathUrl = SystemBusinessConfig.getProfile() + systemBusinessConfig.getScriptFileUrl();
if (StringUtils.isBlank(uploadPathUrl)) {
return AjaxResult.success();
}
// 上传
String scriptFilePath = FileUploadUtils.upload(uploadPathUrl, multipartFile, MimeTypeUtils.IMAGE_EXTENSION);
if (StringUtils.isBlank(scriptFilePath)) {
throw new ServiceException("图片上传失败,请联系管理员!");
}
// 上传成功返回话术图片url
AjaxResult ajax = AjaxResult.success("上传成功!");
ajax.put("imgUrl", scriptFilePath);
return ajax;
}
@Override
public AjaxResult selectScriptEdgeNode(Long id) {
return AjaxResult.success(scriptInfoMapper.selectScriptEdgeNode(id));
}
/**
* 新增话术节点
*/
@Transactional(rollbackFor = Exception.class) @Transactional(rollbackFor = Exception.class)
@Override @Override
public AjaxResult insertScriptEdgeNode(ScriptVO scriptVO) { public AjaxResult insertScriptEdgeNode(ScriptVO scriptVO) {
@ -100,10 +176,13 @@ public class ScriptInfoServiceImpl implements IScriptInfoService {
scriptInfo.setFlowScheme(scriptVO.getFlowScheme()); scriptInfo.setFlowScheme(scriptVO.getFlowScheme());
scriptInfo.setUpdateBy(SecurityUtils.getUsername()); scriptInfo.setUpdateBy(SecurityUtils.getUsername());
scriptInfo.setUpdateTime(LocalDateTime.now()); scriptInfo.setUpdateTime(LocalDateTime.now());
int i = scriptInfoMapper.updateScriptInfo(scriptInfo); int updateScriptInfo = scriptInfoMapper.updateScriptInfo(scriptInfo);
if (i <= 0) { if (updateScriptInfo <= 0) {
return AjaxResult.error("新增话术图失败!"); return AjaxResult.error("新增话术图失败!");
} }
if (CollectionUtils.isEmpty(scriptVO.getNodes()) || CollectionUtils.isEmpty(scriptVO.getEdges())) {
return AjaxResult.success();
}
List<Node> scriptInfoNodes = scriptVO.getNodes(); List<Node> scriptInfoNodes = scriptVO.getNodes();
List<ScriptInfoEdge> scriptInfoEdges = new ArrayList<>(); List<ScriptInfoEdge> scriptInfoEdges = new ArrayList<>();
for (Node node : scriptVO.getNodes()) { for (Node node : scriptVO.getNodes()) {
@ -138,68 +217,65 @@ public class ScriptInfoServiceImpl implements IScriptInfoService {
return AjaxResult.success(); return AjaxResult.success();
} }
/**
* 修改话术信息
*
* @param scriptInfo 话术信息
* @return 结果
*/
@Override
@Transactional(rollbackFor = Exception.class) @Transactional(rollbackFor = Exception.class)
public int updateScriptInfo(ScriptInfo scriptInfo) { @Override
// 检查除当前记录之外是否存在同名的话术名称 public AjaxResult updateScriptEdgeNode(ScriptVO scriptVO) {
if (scriptInfoMapper.countByScriptNameExcludingId(scriptInfo.getScriptName(), scriptInfo.getDepartmentId(), scriptInfo.getId(), scriptInfo.getCommonScriptName()) > 0) { List<Long> scriptInfoEdgeIds = scriptInfoMapper.selectScriptInfoEdgeIds(scriptVO.getScriptInfoId());
// 存在同名的通用话术名称不能进行更新 List<Long> scriptInfoNodeIds = scriptInfoMapper.selectScriptInfoNodeIds(scriptVO.getScriptInfoId());
throw new ServiceException("通用话术名称已存在,请使用其他名称。"); ScriptInfo scriptInfo = new ScriptInfo();
} scriptInfo.setId(scriptVO.getScriptInfoId());
// 不存在同名的话术名称或者名称未改变设置修改人和修改时间 scriptInfo.setFlowScheme(scriptVO.getFlowScheme());
scriptInfo.setUpdateBy(SecurityUtils.getUsername()); scriptInfo.setUpdateBy(SecurityUtils.getUsername());
scriptInfo.setUpdateTime(LocalDateTime.now()); scriptInfo.setUpdateTime(LocalDateTime.now());
// 进行更新操作 int updateScriptInfo = scriptInfoMapper.updateScriptInfo(scriptInfo);
return scriptInfoMapper.updateScriptInfo(scriptInfo); if (updateScriptInfo <= 0) {
return AjaxResult.error("修改话术图失败!");
} }
List<Node> scriptInfoNodes = scriptVO.getNodes();
/** List<ScriptInfoEdge> scriptInfoEdges = new ArrayList<>();
* 批量删除话术信息 int i = 0;
* for (Node node : scriptVO.getNodes()) {
* @param ids 需要删除的话术信息主键 node.setScriptInfoId(scriptVO.getScriptInfoId());
* @return 结果 String[] split = node.getLabel().split("\\n");
*/ node.setScriptNodeName(StringUtils.isBlank(split[0]) ? "" : split[0]);
@Override node.setScriptContent(StringUtils.isBlank(split[1]) ? "" : split[0]);
@Transactional(rollbackFor = Exception.class) node.setScriptNodeType(node.getType());
public int deleteScriptInfoByIds(Long[] ids) { node.setCreateBy(SecurityUtils.getUsername());
return scriptInfoMapper.deleteScriptInfoByIds(ids); node.setCreateTime(LocalDateTime.now());
if (CollectionUtils.isNotEmpty(scriptInfoNodeIds) && (i < scriptInfoNodeIds.size()) && Objects.nonNull(scriptInfoNodeIds.get(i))) {
node.setId(scriptInfoNodeIds.get(i));
i++;
} }
/**
* 删除话术信息信息
*
* @param id 话术信息主键
* @return 结果
*/
@Override
public int deleteScriptInfoById(Long id) {
return scriptInfoMapper.deleteScriptInfoById(id);
} }
int i1 = scriptInfoNodeMapper.insertScriptInfoNodeList(scriptInfoNodes);
/** if (i1 <= 0) {
* 话术图片上传 return AjaxResult.error("修改话术图失败!");
*/ }
@Override if (CollectionUtils.isEmpty(scriptVO.getNodes()) || CollectionUtils.isEmpty(scriptVO.getEdges())) {
public AjaxResult uploadScriptInfo(MultipartFile multipartFile) throws Exception {
// 获取文件路径
String uploadPathUrl = SystemBusinessConfig.getProfile() + systemBusinessConfig.getScriptFileUrl();
if (StringUtils.isBlank(uploadPathUrl)) {
return AjaxResult.success(); return AjaxResult.success();
} }
// 上传 int num = 0;
String scriptFilePath = FileUploadUtils.upload(uploadPathUrl, multipartFile, MimeTypeUtils.IMAGE_EXTENSION); for (Edge edge : scriptVO.getEdges()) {
if (StringUtils.isBlank(scriptFilePath)) { ScriptInfoEdge scriptInfoEdge = new ScriptInfoEdge();
throw new ServiceException("图片上传失败,请联系管理员!"); scriptInfoEdge.setKeywords(edge.getKeyword());
Node startNode = scriptInfoNodes.stream().filter(Objects::nonNull).filter(item -> Objects.nonNull(item.getCode()) && edge.getSource().equals(item.getCode())).findFirst().orElse(new Node());
scriptInfoEdge.setStartNodeId(startNode.getId());
scriptInfoEdge.setStartNodeName(startNode.getLabel());
Node endNode = scriptInfoNodes.stream().filter(Objects::nonNull).filter(item -> Objects.nonNull(item.getCode()) && edge.getTarget().equals(item.getCode())).findFirst().orElse(new Node());
scriptInfoEdge.setEndNodeId(endNode.getId());
scriptInfoEdge.setEndNodeName(endNode.getLabel());
scriptInfoEdge.setScriptInfoId(scriptVO.getScriptInfoId());
scriptInfoEdge.setScriptEdgeName(edge.getLabel());
scriptInfoEdges.add(scriptInfoEdge);
if (CollectionUtils.isNotEmpty(scriptInfoEdgeIds) && (num < scriptInfoEdgeIds.size()) && Objects.nonNull(scriptInfoEdgeIds.get(num))) {
scriptInfoEdge.setId(scriptInfoEdgeIds.get(num));
num++;
} }
// 上传成功返回话术图片url }
AjaxResult ajax = AjaxResult.success("上传成功!"); int i2 = scriptInfoEdgeMapper.insertScriptInfoEdgeList(scriptInfoEdges);
ajax.put("imgUrl", scriptFilePath); if (i2 <= 0) {
return ajax; return AjaxResult.error("修改话术图失败!");
}
return AjaxResult.success();
} }
} }

View File

@ -19,12 +19,19 @@
<result property="scriptSort" column="script_sort"/> <result property="scriptSort" column="script_sort"/>
<result property="scriptRemark" column="script_remark"/> <result property="scriptRemark" column="script_remark"/>
<result property="scriptFilePath" column="script_file_path"/> <result property="scriptFilePath" column="script_file_path"/>
<result property="flowScheme" column="flow_scheme"/>
<result property="createBy" column="create_by"/> <result property="createBy" column="create_by"/>
<result property="createTime" column="create_time"/> <result property="createTime" column="create_time"/>
<result property="updateBy" column="update_by"/> <result property="updateBy" column="update_by"/>
<result property="updateTime" column="update_time"/> <result property="updateTime" column="update_time"/>
</resultMap> </resultMap>
<resultMap type="com.xinelu.manage.vo.scriptInfo.ScriptVO" id="ScriptVOResult">
<result property="scriptInfoId" column="scriptInfoId"/>
<result property="flowScheme" column="flow_scheme"/>
</resultMap>
<sql id="selectScriptInfoVo"> <sql id="selectScriptInfoVo">
select id, select id,
department_id, department_id,
@ -40,6 +47,7 @@
script_sort, script_sort,
script_remark, script_remark,
script_file_path, script_file_path,
flow_scheme,
create_by, create_by,
create_time, create_time,
update_by, update_by,
@ -62,6 +70,7 @@
si.script_sort, si.script_sort,
si.script_remark, si.script_remark,
si.script_file_path, si.script_file_path,
si.flow_scheme,
si.create_by, si.create_by,
si.create_time, si.create_time,
si.update_by, si.update_by,
@ -168,6 +177,8 @@
</if> </if>
<if test="scriptFilePath != null">script_file_path, <if test="scriptFilePath != null">script_file_path,
</if> </if>
<if test="flowScheme != null">flow_scheme,
</if>
<if test="createBy != null">create_by, <if test="createBy != null">create_by,
</if> </if>
<if test="createTime != null">create_time, <if test="createTime != null">create_time,
@ -204,6 +215,8 @@
</if> </if>
<if test="scriptFilePath != null">#{scriptFilePath}, <if test="scriptFilePath != null">#{scriptFilePath},
</if> </if>
<if test="flowScheme != null">#{flowScheme},
</if>
<if test="createBy != null">#{createBy}, <if test="createBy != null">#{createBy},
</if> </if>
<if test="createTime != null">#{createTime}, <if test="createTime != null">#{createTime},
@ -253,6 +266,9 @@
<if test="scriptFilePath != null">script_file_path= <if test="scriptFilePath != null">script_file_path=
#{scriptFilePath}, #{scriptFilePath},
</if> </if>
<if test="flowScheme != null">flow_scheme =
#{flowScheme},
</if>
<if test="createBy != null">create_by = <if test="createBy != null">create_by =
#{createBy}, #{createBy},
</if> </if>
@ -281,4 +297,23 @@
#{id} #{id}
</foreach> </foreach>
</delete> </delete>
<select id="selectScriptEdgeNode" resultType="com.xinelu.manage.vo.scriptInfo.ScriptVO">
select id scriptInfoId,
flow_scheme
from script_info
where id = #{id}
</select>
<select id="selectScriptInfoEdgeIds" resultType="java.lang.Long">
select id
from script_info_edge
where script_info_id = #{id}
</select>
<select id="selectScriptInfoNodeIds" resultType="java.lang.Long">
select id
from script_info_node
where script_info_id = #{id}
</select>
</mapper> </mapper>

View File

@ -195,15 +195,22 @@
</foreach> </foreach>
</delete> </delete>
<insert id="insertScriptInfoEdgeList" parameterType="java.util.List"> <delete id="deleteScriptInfoEdgeByScriptInfoIds">
insert into script_info_edge( delete from script_info_edge where script_info_id in
<foreach item="id" collection="array" open="(" separator="," close=")">
#{id}
</foreach>
</delete>
<insert id="insertScriptInfoEdgeList" parameterType="java.util.List" useGeneratedKeys="true" keyProperty="id">
insert into script_info_edge (
script_info_id, script_info_id,
script_edge_name, script_edge_name,
start_node_id, start_node_id,
start_node_name, start_node_name,
end_node_id, end_node_id,
end_node_name, end_node_name,
condition, `condition`,
keywords, keywords,
remark, remark,
create_by, create_by,

View File

@ -147,6 +147,13 @@
</foreach> </foreach>
</delete> </delete>
<delete id="deleteScriptInfoNodeByScriptInfoIds">
delete from script_info_node where script_info_id in
<foreach item="id" collection="array" open="(" separator="," close=")">
#{id}
</foreach>
</delete>
<insert id="insertScriptInfoNodeList" parameterType="java.util.List" useGeneratedKeys="true" keyProperty="id"> <insert id="insertScriptInfoNodeList" parameterType="java.util.List" useGeneratedKeys="true" keyProperty="id">
insert into script_info_node( insert into script_info_node(
script_info_id, script_info_id,