package cn.ksource.web.service.workFlowSupport;
|
|
import java.util.ArrayList;
|
import java.util.HashMap;
|
import java.util.List;
|
import java.util.Map;
|
|
import javax.annotation.Resource;
|
import javax.servlet.http.HttpServletRequest;
|
|
import org.springframework.beans.factory.annotation.Autowired;
|
import org.springframework.stereotype.Service;
|
|
import cn.ksource.beans.GG_MESSAGE;
|
import cn.ksource.beans.WORKFLOW_BASE;
|
import cn.ksource.beans.WORKFLOW_NODE;
|
import cn.ksource.core.dao.BaseDao;
|
import cn.ksource.core.dao.SqlParameter;
|
import cn.ksource.core.util.ConvertUtil;
|
import cn.ksource.core.util.DateUtil;
|
import cn.ksource.core.util.StringUtil;
|
import cn.ksource.core.web.SysInfoMsg;
|
import cn.ksource.core.web.WebUtil;
|
import cn.ksource.core.workflow.NodeAnswerEntity;
|
import cn.ksource.core.workflow.NodeDealEntity;
|
import cn.ksource.core.workflow.NodeFinishEntity;
|
import cn.ksource.core.workflow.WorkflowBusinessService;
|
import cn.ksource.core.workflow.WorkflowCoreService;
|
import cn.ksource.web.Constants;
|
import cn.ksource.web.controller.wechat.util.WechatConstants;
|
import cn.ksource.web.entity.WorkFlowSupportEntity;
|
import cn.ksource.web.facade.message.MessageFacade;
|
@SuppressWarnings("unchecked")
|
@Service
|
public class WorkFlowSupportServiceImpl implements WorkFlowSupportService{
|
|
@Resource
|
private WorkflowBusinessService workflowBusinessService;
|
@Resource
|
private WorkflowCoreService workflowCoreService;
|
@Resource
|
private BaseDao baseDao;
|
@Autowired
|
private MessageFacade messageFacade;
|
|
@Override
|
public SysInfoMsg doOrderFlow(WorkFlowSupportEntity support) {
|
boolean nodeAdmin = true;
|
SysInfoMsg msg = new SysInfoMsg();
|
WORKFLOW_BASE base = new WORKFLOW_BASE();
|
if(StringUtil.isBlank(support.getNodeId())){//若流程未启动,则启动流程
|
if(support.getWorkFlowType().equals(Constants.WORKFLOW_BASE_BUSINESS_TYPE_CI_REMIND)){
|
base = workflowBusinessService.startCIRemindWorkflow(support.getOrderId());
|
}else if(support.getWorkFlowType().equals(Constants.WORKFLOW_BASE_BUSINESS_TYPE_CI_HEALTH)){
|
base = workflowBusinessService.startCIHealthWorkflow(support.getOrderId());
|
}else if(support.getWorkFlowType().equals(Constants.WORKFLOW_BASE_BUSINESS_TYPE_RELEASE)){
|
base = workflowBusinessService.startReleaseWorkflow(support.getOrderId(),support.getNote());
|
}else if(support.getWorkFlowType().equals(Constants.WORKFLOW_BASE_BUSINESS_TYPE_STOCK)){
|
base = workflowBusinessService.startStockWorkflow(support.getOrderId(),support.getNote());
|
}else if(support.getWorkFlowType().equals(Constants.WORKFLOW_BASE_BUSINESS_TYPE_SPARE)){
|
base = workflowBusinessService.startSpareWorkflow(support.getOrderId(),support.getNote());
|
}else if(support.getWorkFlowType().equals(Constants.WORKFLOW_BASE_BUSINESS_TYPE_CKLC)){
|
base = workflowBusinessService.startDeliveryWorkflow(support.getOrderId(),support.getNote());
|
}else if(support.getWorkFlowType().equals(Constants.WORKFLOW_BASE_BUSINESS_TYPE_KCPD)){//库存盘点
|
base = workflowBusinessService.startInventoryWorkflow(support.getOrderId(),support.getNote());
|
}else if(support.getWorkFlowType().equals(Constants.WORKFLOW_BASE_BUSINESS_TYPE_BSBY)){//报损报溢
|
base = workflowBusinessService.startOverageLossWorkflow(support.getOrderId(),support.getNote());
|
}
|
}else{//若流程已启动,则结束当前环节
|
base = new WORKFLOW_BASE(support.getFlowId()).getInstanceById();
|
NodeFinishEntity finishEntity = new NodeFinishEntity();
|
finishEntity.setDeal_result(1);
|
finishEntity.setDeal_note_title(support.getUserName()+"完成了节点");
|
finishEntity.setDeal_note(support.getNote());
|
WORKFLOW_NODE node = new WORKFLOW_NODE(support.getNodeId()).getInstanceById();
|
workflowCoreService.finishNode(base, node, finishEntity);
|
}
|
|
if(support.isFlowEndflag()){//结束环节
|
workflowCoreService.finishWorkFlow(base);
|
return msg;
|
}else{//非结束环节
|
if(StringUtil.isNotBlank(support.getNextNodeTemplateId())){//下一节点不为空
|
NodeDealEntity entity = new NodeDealEntity();
|
if(support.getDealer_type()!=null&&support.getDealer_type().equals("1")){//发送到组
|
entity.setDealer_type(1);
|
entity.setRoleID(support.getRoleId());
|
entity.setRoleName(support.getRoleName());
|
}else{//发送到人
|
//若下环节执行人为空,从配置文件读取执行人列表
|
if(support.getNextUserList()==null||support.getNextUserList().size()==0){
|
if(!support.isEverDealflag()){
|
support.setNextUserList(getNodeExecutor(support.getNextNodeTemplateId()));
|
}else{
|
//根据环节模板id 获取曾经处理人
|
support.setNextUserList(getEverNodeExecutor(support.getFlowId(),support.getEverNodeTemplateId()));
|
}
|
}
|
entity.setDealer_type(2);
|
entity.setDealerList(support.getNextUserList());
|
}
|
|
if(StringUtil.isNotBlank(support.getNodeId())){
|
WORKFLOW_NODE node = new WORKFLOW_NODE(support.getNodeId()).getInstanceById();
|
Integer is_admin = node.getIs_admin();
|
if(is_admin!=null&&is_admin==1){
|
workflowCoreService.toNode(base, support.getNextNodeTemplateId(), entity);
|
}else{
|
nodeAdmin = false;
|
}
|
}else{
|
workflowCoreService.toNode(base, support.getNextNodeTemplateId(), entity);
|
}
|
//发送消息
|
sendMessage(base,support);
|
}
|
}
|
|
//提醒信息
|
if(StringUtil.isNotBlank(support.getNextNodeTemplateId())){
|
//设置环节名称
|
msg.setNodeName(base.getCurrent_node_name());
|
String dealers = "";
|
if(nodeAdmin){
|
if(support.getDealer_type()!=null&&support.getDealer_type().equals("1")){
|
msg.setDealUserType("1");
|
msg.setDealUserName(support.getRoleName());
|
}else{
|
for(Map map:support.getNextUserList()){
|
if(dealers.equals("")){
|
dealers = dealers + map.get("USER_NAME").toString();
|
}else{
|
dealers = dealers + " , " + map.get("USER_NAME").toString();
|
}
|
if(map.get("IS_ADMIN")!=null&&map.get("IS_ADMIN").toString().equals("1")){
|
dealers = dealers + "(主负责人)";
|
}
|
}
|
msg.setDealUserType("2");
|
msg.setDealUserName(dealers);
|
}
|
}else{
|
//发多人环节 非主负责人提交
|
String text = "任务已完成,请等待主负责人【" + base.getCurrent_dealer_name() + "】提交工单";
|
msg.setText(text);
|
}
|
|
}
|
return msg;
|
}
|
|
@Override
|
public SysInfoMsg doOrderSendback(WorkFlowSupportEntity support) {
|
SysInfoMsg msg = new SysInfoMsg();
|
//关闭当前节点
|
WORKFLOW_BASE base = new WORKFLOW_BASE(support.getFlowId()).getInstanceById();
|
NodeFinishEntity finishEntity = new NodeFinishEntity();
|
finishEntity.setDeal_result(3);
|
finishEntity.setDeal_note_title(support.getUserName()+"回退了节点");
|
finishEntity.setDeal_note(support.getNote());
|
WORKFLOW_NODE node = new WORKFLOW_NODE(support.getNodeId()).getInstanceById();
|
workflowCoreService.finishNode(base, node, finishEntity);
|
|
|
//回退到上一节点
|
NodeDealEntity entity = new NodeDealEntity();
|
List<Map> nextUserList = getEverNodeExecutor(support.getFlowId(),support.getEverNodeTemplateId());
|
support.setNextUserList(nextUserList);
|
entity.setBefore_Dealer_type(2);
|
entity.setDealer_type(2);
|
entity.setDealerList(nextUserList);
|
entity.setFlow_type(2);
|
entity.setSource_node_instance_id(node.getId());
|
workflowCoreService.toNode(base, support.getEverNodeTemplateId(), entity);
|
|
//发送消息
|
msg.setNodeName(base.getCurrent_node_name());
|
String dealers = "";
|
for(Map map:support.getNextUserList()){
|
if(dealers.equals("")){
|
dealers = dealers + map.get("USER_NAME").toString();
|
}else{
|
dealers = dealers + " , " + map.get("USER_NAME").toString();
|
}
|
if(map.get("IS_ADMIN")!=null&&map.get("IS_ADMIN").toString().equals("1")){
|
dealers = dealers + "(主负责人)";
|
}
|
}
|
msg.setDealUserType("2");
|
msg.setDealUserName(dealers);
|
sendMessage(base,support);
|
return msg;
|
|
}
|
|
|
public void sendMessage(WORKFLOW_BASE base,WorkFlowSupportEntity support){
|
//发送消息
|
GG_MESSAGE message = new GG_MESSAGE();
|
message.setTitle(base.getWfname())
|
.setContent(base.getWfname())
|
.setSender_id(support.getUserId())
|
.setSender_name(support.getUserName())
|
.setSend_time(DateUtil.getCurrentDate14())
|
.setBusiness_id(base.getBusiness_id());
|
|
|
if(support.getWorkFlowType().equals(Constants.WORKFLOW_BASE_BUSINESS_TYPE_CI_REMIND)){
|
//例行巡检
|
message.setWeb_url(Constants.REMIND_WEB_MSG_URL+"?flowId="+base.getId()+"&orderId="+base.getBusiness_id())
|
.setWx_url(WechatConstants.ORDER_INCIDENT_DETAIL_ADDRESS+"?orderId="+base.getBusiness_id()+"&orderType="+Constants.WORKFLOW_BASE_BUSINESS_TYPE_CI_REMIND)
|
.setType(Constants.GG_MESSAGE_TYPE_LXXJ)
|
.setOrder_code(base.getOrder_code());
|
}else if(support.getWorkFlowType().equals(Constants.WORKFLOW_BASE_BUSINESS_TYPE_CI_HEALTH)){
|
//健康检查
|
message.setWeb_url(Constants.HEALTH_WEB_MSG_URL+"?flowId="+base.getId()+"&orderId="+base.getBusiness_id())
|
.setWx_url(WechatConstants.ORDER_INCIDENT_DETAIL_ADDRESS+"?orderId="+base.getBusiness_id()+"&orderType="+Constants.WORKFLOW_BASE_BUSINESS_TYPE_CI_HEALTH)
|
.setType(Constants.GG_MESSAGE_TYPE_JKJC)
|
.setOrder_code(base.getOrder_code());
|
}
|
//messageFacade.doSendMessage(message, support.getNextUserList());
|
}
|
|
/**
|
* 根据节点模板Id 获取执行人
|
* @param nodeTemplateId
|
* @return
|
*/
|
public List<Map> getNodeExecutor(String nodeTemplateId){
|
String sql = "select u.* from " +
|
"workflow_template_node n inner join WORKFLOW_TEMPLATE_NODE_PARTNER p " +
|
"on n.ID = p.NODE_ID " +
|
"inner join WORKFLOW_TEMPLATE_NODE_USER u " +
|
"on p.ID = u.PARTNER_NODE_ID " +
|
"where n.ID=:nodeTemplateId LIMIT 1 ";
|
Map map = baseDao.queryForMap(sql,new SqlParameter().addValue("nodeTemplateId", nodeTemplateId));
|
map.put("IS_ADMIN", "1");
|
List<Map> list = new ArrayList<Map>();
|
list.add(map);
|
return list;
|
}
|
|
/**
|
* 获取执行过的节点的执行人
|
* @param flowId
|
* @param nodeTemplateId
|
* @return
|
*/
|
public List<Map> getEverNodeExecutor(String flowId,String nodeTemplateId){
|
String sql = "select current_dealer_id USER_ID,current_dealer_name USER_NAME,1 as IS_ADMIN from workflow_node " +
|
"where IS_ADMIN = 1 and flowid = :flowId and node_template_id=:nodeTemplateId order by createtime desc limit 1";
|
|
Map map = baseDao.queryForMap(sql,new SqlParameter().addValue("nodeTemplateId", nodeTemplateId)
|
.addValue("flowId", flowId));
|
List<Map> list = new ArrayList<Map>();
|
list.add(map);
|
return list;
|
|
}
|
|
@Override
|
public List<Map> getNotDealList(String flowId) {
|
StringBuilder sql = new StringBuilder();
|
Map param = new HashMap();
|
param.put("flowId",flowId);
|
sql.append(" select CURRENT_DEALER_NAME name from workflow_node where FLOWID = :flowId and FLOWSTATE!=3 ");
|
sql.append(" and (IS_ADMIN<>1 or IS_ADMIN is null) ");
|
return baseDao.queryForList(sql.toString(),param);
|
}
|
|
@Override
|
public Map getOrderFlowInfo(String flowId) {
|
Map param = new HashMap();
|
param.put("flowId", flowId);
|
String sql = " select b.ORDER_CODE,b.BUSINESSTYPE,b.PROJECT_ID,b.WFNAME,b.CUSTOMER_NAME,b.SUB_CUSTOMER_NAME,b.PROJECT_NAME,n.CURRENT_DEAL_ROLENAME roleName,n.deal_type dealType,g.SJHM telphone,n.FLOWSTATE nodeState,b.WFSTATE flowState,b.CURRENT_NODE_NAME nodeName,b.CURRENT_DEALER_NAME userName "+
|
" from workflow_base b inner join workflow_node n on "+
|
" b.CURRENT_NODE_ID = n.id "+
|
" left join gg_user g on g.ID = b.CURRENT_DEALER_ID "+
|
" where FLOWID = :flowId ";
|
return baseDao.queryForMap(sql,param);
|
}
|
|
|
public List<Map> getProjectManager(String projectId){
|
String sql = "SELECT A.PROJECT_MANAGER_ID USER_ID,A.PROJECT_MANAGER_NAME USER_NAME,1 as IS_ADMIN FROM SC_PARTNER_CUSTOMER_PROJECT A WHERE A.PROJECT_STATE != 2 " +
|
" and id=:projectId ";
|
SqlParameter parameter = new SqlParameter();
|
parameter.addValue("projectId", projectId);
|
return baseDao.queryForList(sql,parameter);
|
}
|
|
|
public List<Map> getAllExecutors() {
|
|
SqlParameter param = new SqlParameter();
|
|
Map<String,Map> rset = new HashMap<String, Map>();
|
List<Map> rlist = new ArrayList<Map>();
|
List<Map> ulist = new ArrayList<Map>();
|
|
StringBuilder sql = new StringBuilder();
|
|
sql.setLength(0);
|
sql.append("SELECT * FROM AC_ROLE WHERE STATE=1 ORDER BY SXH ASC ");
|
rlist=baseDao.queryForList(sql.toString(), param);
|
|
sql.setLength(0);
|
sql.append("SELECT A.ID USER_ID,A.ZSXM USER_NAME,B.JSBH ROLEID FROM GG_USER A, AC_USER_REF_ROLE B WHERE A.ID = B.YHBH AND A.ZT = 1 ");
|
ulist=baseDao.queryForList(sql.toString(), param);
|
|
if(rlist!=null&&rlist.size()>0){
|
for(Map map:rlist ){
|
rset.put(map.get("ID").toString(), map);
|
}
|
if(ulist!=null&&ulist.size()>0){
|
for(Map map:ulist){
|
String key = map.get("ROLEID").toString();
|
Map roleMap = rset.get(key);
|
if(roleMap!=null){
|
if(roleMap.get("children")==null){
|
roleMap.put("children", new ArrayList());
|
}
|
((List)roleMap.get("children")).add(map);
|
}
|
}
|
}
|
}
|
return rlist;
|
}
|
|
|
/**
|
* 关闭工单(orderId,closeNote,nodeId)
|
* @param request
|
*/
|
@Override
|
public void doCloseWrokFlow(HttpServletRequest request){
|
String orderId = request.getParameter("orderId");
|
String closeNote = request.getParameter("closeNote");
|
String nodeId = request.getParameter("nodeId");
|
String flowId = request.getParameter("flowId");
|
String userName = WebUtil.getLoginUser(request).getLoginUser().get("ZSXM").toString();
|
WORKFLOW_BASE base = new WORKFLOW_BASE(flowId).getInstanceById();
|
NodeFinishEntity finishEntity = new NodeFinishEntity();
|
finishEntity.setDeal_result(1);
|
finishEntity.setDeal_note_title(userName+"关闭了工单");
|
finishEntity.setDeal_note(closeNote);
|
WORKFLOW_NODE node = new WORKFLOW_NODE(nodeId).getInstanceById();
|
workflowCoreService.finishNode(base, node, finishEntity);
|
workflowCoreService.closeWorkFlow(base);
|
}
|
|
@Override
|
public boolean nodeAnswer(HttpServletRequest request) {
|
String flowId = request.getParameter("flowId");
|
String nodeId = request.getParameter("nodeId");
|
WORKFLOW_BASE base = new WORKFLOW_BASE(flowId).getInstanceById();
|
WORKFLOW_NODE node = new WORKFLOW_NODE(nodeId).getInstanceById();
|
NodeAnswerEntity entity = new NodeAnswerEntity();
|
Map user = WebUtil.getLoginUser(request).getLoginUser();
|
entity.setUser_id(user.get("ID").toString());
|
entity.setUser_name(user.get("ZSXM").toString());
|
boolean flag = workflowCoreService.answerNode(base, node, entity);
|
return flag;
|
}
|
|
@Override
|
public boolean saveLinkOrders(String flowId, String[] linkOrderIds) {
|
baseDao.execute("DELETE FROM ORDER_REF_ORDER WHERE BUSINESS_ID = :flowId ", new SqlParameter("flowId",flowId));
|
if(null!=linkOrderIds && linkOrderIds.length>0) {
|
List<SqlParameter> paramList = new ArrayList<SqlParameter>();
|
for(String linkOrderId : linkOrderIds) {
|
SqlParameter sqlParameter = new SqlParameter();
|
sqlParameter.put("id", StringUtil.getUUID());
|
sqlParameter.put("businessId", flowId);
|
sqlParameter.put("relateFlowId", linkOrderId);
|
paramList.add(sqlParameter);
|
}
|
String insertSql = "INSERT INTO ORDER_REF_ORDER(ID,BUSINESS_ID,RELATE_FLOW_ID) VALUES (:id,:businessId,:relateFlowId)";
|
baseDao.executeBatch(insertSql, paramList);
|
return true;
|
}
|
return false;
|
}
|
|
@Override
|
public boolean saveLinkDevices(String flowId, String[] linkDeviceIds) {
|
baseDao.execute("DELETE FROM CMDB_CI_REF_ORDER WHERE FLOW_ID = :flowId ", new SqlParameter("flowId",flowId));
|
if(null!=linkDeviceIds && linkDeviceIds.length!=0) {
|
List<SqlParameter> list = new ArrayList<SqlParameter>();
|
for(String linkDeviceId : linkDeviceIds) {
|
SqlParameter sqlParameter = new SqlParameter();
|
sqlParameter.put("id", StringUtil.getUUID());
|
sqlParameter.put("ciId", linkDeviceId);
|
sqlParameter.put("flow_id", flowId);
|
list.add(sqlParameter);
|
}
|
|
String insertCmdb_ci_ref_orderSql = "INSERT CMDB_CI_REF_ORDER(ID,FLOW_ID,CI_ID) VALUES (:id,:flow_id,:ciId)";
|
baseDao.executeBatch(insertCmdb_ci_ref_orderSql,list);
|
return true;
|
}
|
return false;
|
}
|
|
@Override
|
public List getLinkConfigure(String flowId) {
|
String sql = " SELECT B.ID,B.LV3_ID THIRD_CATE_ID,B.CINAME FROM CMDB_CI_REF_ORDER R,CMDB_CI_BASE B " +
|
" WHERE R.CI_ID = B.ID AND R.FLOW_ID = :flowId AND B.STATE = 1 ";
|
return baseDao.queryForList(sql,new SqlParameter("flowId",flowId));
|
}
|
|
@Override
|
public void getMyOrderDateSql(StringBuilder builder, Map paramMap) {
|
builder.append(" select DATE_FORMAT(b.CREATETIME,'%Y-%m-%d') m_date ");
|
builder.append(" from WORKFLOW_BASE B ");
|
builder.append(" inner join ");
|
builder.append(" ( ");
|
builder.append(" select * from ( ");
|
builder.append(" select ID NODEID, CREATETIME NODETIME,FLOWSTATE NODESTATE,FLOWID from WORKFLOW_NODE ");
|
builder.append(" where CURRENT_DEALER_ID = :userId ");
|
builder.append(" order by FLOWSTATE asc ");
|
builder.append(" ) t ");
|
builder.append(" group by FLOWID ");
|
builder.append(" ) n ");
|
builder.append(" on b.ID = n.FLOWID ");
|
//builder.append(" where b.PARTNER_ID =:partnerId ");
|
//工单类型
|
builder.append(" where b.BUSINESSTYPE = :bustype ");
|
//是否选择月份
|
String selMonth = ConvertUtil.obj2StrBlank(paramMap.get("selMonth"));
|
if(StringUtil.isNotBlank(selMonth)){
|
builder.append(" AND DATE_FORMAT(b.CREATETIME,'%Y%m') = :selMonth ");
|
}
|
|
builder.append(" group by DATE_FORMAT(b.CREATETIME,'%Y-%m-%d') ");
|
builder.append(" order by b.CREATETIME asc ");
|
}
|
|
@Override
|
public void getAllOrderDateSql(StringBuilder builder, Map paramMap) {
|
builder.append(" select DATE_FORMAT(b.CREATETIME,'%Y-%m-%d') m_date ");
|
builder.append(" from WORKFLOW_BASE b ");
|
//builder.append(" where b.PARTNER_ID =:partnerId ");
|
builder.append(" where b.BUSINESSTYPE = :bustype");
|
|
String customer_id = ConvertUtil.obj2StrBlank(paramMap.get("customer_id"));
|
|
if(StringUtil.notEmpty(customer_id)) {
|
builder.append(" AND b.CUSTOMER_ID = :customer_id");
|
}
|
//builder = getProjectSql(builder,projects);
|
//是否选择月份
|
String selMonth = ConvertUtil.obj2StrBlank(paramMap.get("selMonth"));
|
if(StringUtil.isNotBlank(selMonth)){
|
builder.append(" AND DATE_FORMAT(b.CREATETIME,'%Y%m') = :selMonth ");
|
}
|
builder.append(" group by DATE_FORMAT(b.CREATETIME,'%Y-%m-%d') ");
|
builder.append(" order by b.CREATETIME asc ");
|
|
|
|
}
|
|
private StringBuilder getProjectSql(StringBuilder buffer, List<Map> projects) {
|
if(null != projects && projects.size()>0) {
|
buffer.append(" AND b.PROJECT_ID IN ( ");
|
for(Map project : projects) {
|
String projectId = ConvertUtil.obj2StrBlank(project.get("PROJECT_ID"));
|
buffer.append("'");
|
buffer.append(projectId);
|
buffer.append("',");
|
}
|
buffer.deleteCharAt(buffer.length()-1);
|
buffer.append(")");
|
} else {
|
buffer.append(" AND b.PROJECT_ID = '' ");
|
}
|
return buffer;
|
}
|
|
@Override
|
public Map getNodeInfoByFlowId(String flowId, String userId) {
|
SqlParameter param = new SqlParameter();
|
param.addValue("flowId", flowId)
|
.addValue("userId", userId);
|
String sql = " select n.* from workflow_base b,workflow_node n where b.id = n.flowid " +
|
"and b.id = :flowId and n.current_dealer_id = :userId and (n.flowstate = 1 or n.flowstate=2 ) ";
|
return baseDao.queryForMap(sql, param);
|
}
|
}
|