|
@@ -0,0 +1,384 @@
|
|
|
|
+package com.dayou.dyoa;
|
|
|
|
+
|
|
|
|
+
|
|
|
|
+import cn.hutool.core.bean.BeanUtil;
|
|
|
|
+import cn.hutool.core.collection.CollectionUtil;
|
|
|
|
+import cn.hutool.core.util.ArrayUtil;
|
|
|
|
+import cn.hutool.core.util.StrUtil;
|
|
|
|
+import com.alibaba.fastjson.JSON;
|
|
|
|
+import com.alibaba.fastjson.JSONArray;
|
|
|
|
+import com.alibaba.fastjson.JSONException;
|
|
|
|
+import com.alibaba.fastjson.JSONObject;
|
|
|
|
+import com.baomidou.dynamic.datasource.annotation.DS;
|
|
|
|
+import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
|
|
|
|
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
|
|
|
|
+import com.dayou.common.BaseEntity;
|
|
|
|
+import com.dayou.dto.history.HisMajorOrder;
|
|
|
|
+import com.dayou.dto.history.HisOrderParam;
|
|
|
|
+import com.dayou.entity.*;
|
|
|
|
+import com.dayou.enums.MainBusinessEnum;
|
|
|
|
+import com.dayou.exception.ErrorCode;
|
|
|
|
+import com.dayou.mapper.DyoaHistoryMapper;
|
|
|
|
+import com.dayou.service.IDepartmentService;
|
|
|
|
+import com.dayou.service.IDyoaRecordService;
|
|
|
|
+import com.dayou.service.IUserService;
|
|
|
|
+import com.dayou.service.impl.MajorServiceImpl;
|
|
|
|
+import com.dayou.service.workflow.*;
|
|
|
|
+import com.dayou.utils.HttpKit;
|
|
|
|
+import com.sun.corba.se.spi.orbutil.threadpool.Work;
|
|
|
|
+import lombok.extern.slf4j.Slf4j;
|
|
|
|
+import org.apache.http.HttpResponse;
|
|
|
|
+import org.apache.http.client.HttpClient;
|
|
|
|
+import org.apache.http.client.methods.HttpPost;
|
|
|
|
+import org.apache.http.impl.client.DefaultHttpClient;
|
|
|
|
+import org.springframework.beans.factory.annotation.Autowired;
|
|
|
|
+import org.springframework.stereotype.Service;
|
|
|
|
+import org.springframework.transaction.annotation.Transactional;
|
|
|
|
+
|
|
|
|
+import java.io.UnsupportedEncodingException;
|
|
|
|
+import java.lang.reflect.Field;
|
|
|
|
+import java.math.BigDecimal;
|
|
|
|
+import java.util.*;
|
|
|
|
+import java.util.regex.Matcher;
|
|
|
|
+import java.util.regex.Pattern;
|
|
|
|
+import java.util.stream.Collectors;
|
|
|
|
+
|
|
|
|
+import static com.dayou.common.Constants.ASSIGN;
|
|
|
|
+import static com.dayou.common.Constants.BY_TURNS;
|
|
|
|
+import static com.dayou.enums.MainBusinessEnum.MAJOR_BUSINESS;
|
|
|
|
+import static com.dayou.enums.workflow.NodeStateEnum.PENDING;
|
|
|
|
+import static com.dayou.enums.workflow.NodeTaskVersion.LATEST;
|
|
|
|
+
|
|
|
|
+@DS("dyoa")
|
|
|
|
+@Service
|
|
|
|
+@Slf4j
|
|
|
|
+public class DyoaHistoryServiceImpl implements IDyoaHistoryService{
|
|
|
|
+
|
|
|
|
+
|
|
|
|
+ private static String COOKIE ;
|
|
|
|
+
|
|
|
|
+
|
|
|
|
+ private static final String HISTORY_LOGIN_URL = "http://noa.scdayou.com/login?loginName=admin&password=ABC666000";
|
|
|
|
+
|
|
|
|
+ private static final String HISTORY_MAJOR_ORDER_URL = "http://noa.scdayou.com/dyoa/order/pageQuery";
|
|
|
|
+
|
|
|
|
+ private Map<String,Long> users = new HashMap<>();
|
|
|
|
+
|
|
|
|
+ private Map<String,Long> departments = new HashMap<>();
|
|
|
|
+
|
|
|
|
+ private Map<String,Long> majorBusinessNodes = new HashMap<>();
|
|
|
|
+
|
|
|
|
+ private Map<String,Long> workFlows = new HashMap<>();
|
|
|
|
+
|
|
|
|
+ private static final Map<String,String> MAJOR_ORDER_COLUM = new HashMap<>();
|
|
|
|
+
|
|
|
|
+
|
|
|
|
+ @Autowired
|
|
|
|
+ private IUserService userService;
|
|
|
|
+
|
|
|
|
+ @Autowired
|
|
|
|
+ private IDepartmentService departmentService;
|
|
|
|
+
|
|
|
|
+ @Autowired
|
|
|
|
+ private DyoaHistoryMapper dyoaHistoryMapper;
|
|
|
|
+
|
|
|
|
+ @Autowired
|
|
|
|
+ private IDyoaRecordService dyoaRecordService;
|
|
|
|
+
|
|
|
|
+ @Autowired
|
|
|
|
+ private IWorkFlowNodeInstanceService workFlowNodeInstanceService;
|
|
|
|
+
|
|
|
|
+ @Autowired
|
|
|
|
+ private IWorkFlowService workFlowService;
|
|
|
|
+
|
|
|
|
+ @Autowired
|
|
|
|
+ private IWorkNodeService workNodeService;
|
|
|
|
+
|
|
|
|
+ @Autowired
|
|
|
|
+ private MajorServiceImpl majorServiceImpl;
|
|
|
|
+
|
|
|
|
+ @Autowired
|
|
|
|
+ private IWorkNodeTaskService workNodeTaskService;
|
|
|
|
+
|
|
|
|
+ @Autowired
|
|
|
|
+ private IWorkTaskRecordService workTaskRecordService;
|
|
|
|
+
|
|
|
|
+ static {
|
|
|
|
+// MAJOR_ORDER_COLUM.put("id","id");
|
|
|
|
+ MAJOR_ORDER_COLUM.put("name","name");
|
|
|
|
+ MAJOR_ORDER_COLUM.put("code","orderId");
|
|
|
|
+ MAJOR_ORDER_COLUM.put("sourceType","financial");
|
|
|
|
+ MAJOR_ORDER_COLUM.put("assign","allotType");
|
|
|
|
+ MAJOR_ORDER_COLUM.put("masterName","clientManagerId");
|
|
|
|
+ MAJOR_ORDER_COLUM.put("managerName","principalId");
|
|
|
|
+ MAJOR_ORDER_COLUM.put("masterOrgName","departmentId");
|
|
|
|
+ MAJOR_ORDER_COLUM.put("businessType","businessObjectType");
|
|
|
|
+ MAJOR_ORDER_COLUM.put("businessType2","businessGener");
|
|
|
|
+ MAJOR_ORDER_COLUM.put("spec","specialType");
|
|
|
|
+ MAJOR_ORDER_COLUM.put("evaluateTarget","evaluateAim");
|
|
|
|
+ MAJOR_ORDER_COLUM.put("repeatOrder","entrustAgain");
|
|
|
|
+ MAJOR_ORDER_COLUM.put("fhbq","multipleRemoval");
|
|
|
|
+ MAJOR_ORDER_COLUM.put("oral","informalEvaluate");
|
|
|
|
+ MAJOR_ORDER_COLUM.put("customerType","clienteleType");
|
|
|
|
+// MAJOR_ORDER_COLUM.put("customerName","clienteleId");
|
|
|
|
+// MAJOR_ORDER_COLUM.put("customerName2","clienteleSubId");
|
|
|
|
+// MAJOR_ORDER_COLUM.put("contactId","clienteleContactId");
|
|
|
|
+ MAJOR_ORDER_COLUM.put("cz","dispenseBenefit");
|
|
|
|
+ MAJOR_ORDER_COLUM.put("locations","nonnative");
|
|
|
|
+ MAJOR_ORDER_COLUM.put("refinance","refinance");
|
|
|
|
+ MAJOR_ORDER_COLUM.put("loanMoney","loanLimit");
|
|
|
|
+ MAJOR_ORDER_COLUM.put("loanLimit","loanPeriod");
|
|
|
|
+ MAJOR_ORDER_COLUM.put("loanProperty","loanNature");
|
|
|
|
+ MAJOR_ORDER_COLUM.put("loanUsage","loanAim");
|
|
|
|
+ MAJOR_ORDER_COLUM.put("loanExpired","loanExpire");
|
|
|
|
+ MAJOR_ORDER_COLUM.put("principal","bailor");
|
|
|
|
+ MAJOR_ORDER_COLUM.put("principalAddress","bailorAddress");
|
|
|
|
+ MAJOR_ORDER_COLUM.put("principalName","bailorContactName");
|
|
|
|
+ MAJOR_ORDER_COLUM.put("principalMobile","bailorContactTel");
|
|
|
|
+ MAJOR_ORDER_COLUM.put("propertyName","owner");
|
|
|
|
+ MAJOR_ORDER_COLUM.put("propertyMobile","ownerTel");
|
|
|
|
+ MAJOR_ORDER_COLUM.put("urgent","urgent");
|
|
|
|
+// MAJOR_ORDER_COLUM.put("terminalName","terminalClienteleId");
|
|
|
|
+ MAJOR_ORDER_COLUM.put("terminalType","terminalClienteleType");
|
|
|
|
+// MAJOR_ORDER_COLUM.put("terminalContactName","terminalClienteleContactId");
|
|
|
|
+ MAJOR_ORDER_COLUM.put("members","members");
|
|
|
|
+ MAJOR_ORDER_COLUM.put("description","remark");
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ @Override
|
|
|
|
+ public Page<HisMajorOrder> hisMajorPage(HisOrderParam param) {
|
|
|
|
+ checkCookie();
|
|
|
|
+ pageSet(param);
|
|
|
|
+ Page<HisMajorOrder> page = new Page<>();
|
|
|
|
+ try {
|
|
|
|
+ Map<String, Object> map = removeMapKey(BeanUtil.beanToMap(param));
|
|
|
|
+ String respond = HttpKit.sendPost(HISTORY_MAJOR_ORDER_URL, map,COOKIE);
|
|
|
|
+ JSONObject jsonObject = JSON.parseObject(respond);
|
|
|
|
+ JSONObject data = jsonObject.getJSONObject("data");
|
|
|
|
+ JSONArray dataArray = data.getJSONArray("data");
|
|
|
|
+ if (CollectionUtil.isNotEmpty(dataArray)){
|
|
|
|
+ List<HisMajorOrder> hisMajorOrders = dataArray.toJavaList(HisMajorOrder.class);
|
|
|
|
+ page.setRecords(hisMajorOrders);
|
|
|
|
+ page.setTotal(Long.valueOf(String.valueOf(data.get("total"))));
|
|
|
|
+ }
|
|
|
|
+ } catch (JSONException e) {
|
|
|
|
+ historySystemLogin();
|
|
|
|
+ ErrorCode.throwBusinessException(ErrorCode.CUSTOM_ERROR,"远程连接超时,请刷新页面。");
|
|
|
|
+ } catch (Exception e) {
|
|
|
|
+ log.error("远程调用失败.");
|
|
|
|
+ e.printStackTrace();
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ return page;
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ @Override
|
|
|
|
+ public String getEverCookie() {
|
|
|
|
+ checkCookie();
|
|
|
|
+ return COOKIE;
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ private void checkCookie(){
|
|
|
|
+ if (StrUtil.isBlank(COOKIE)){
|
|
|
|
+ historySystemLogin();
|
|
|
|
+ }
|
|
|
|
+ }
|
|
|
|
+ /**
|
|
|
|
+ * 登录原系统获取COOKIE
|
|
|
|
+ * @return
|
|
|
|
+ */
|
|
|
|
+ private void historySystemLogin(){
|
|
|
|
+
|
|
|
|
+ try {
|
|
|
|
+ // 创建HttpClient对象
|
|
|
|
+ HttpClient httpClient = new DefaultHttpClient();
|
|
|
|
+
|
|
|
|
+ // 创建HttpGet请求对象
|
|
|
|
+ HttpPost httpPost = new HttpPost(HISTORY_LOGIN_URL);
|
|
|
|
+
|
|
|
|
+ // 发送请求并获取响应
|
|
|
|
+ HttpResponse response = httpClient.execute(httpPost);
|
|
|
|
+
|
|
|
|
+ // 获取cookie
|
|
|
|
+ String cookies = Arrays.toString(response.getHeaders("Set-Cookie"));
|
|
|
|
+ if (cookies != null) {
|
|
|
|
+ String pattern = "(JSESSIONID)(.*?)( )";
|
|
|
|
+ Pattern r = Pattern.compile(pattern);
|
|
|
|
+ Matcher m = r.matcher(cookies);
|
|
|
|
+ if (m.find()) {
|
|
|
|
+ COOKIE = m.group(0).trim().split(";")[0];
|
|
|
|
+ }
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ // 关闭连接
|
|
|
|
+ httpClient.getConnectionManager().shutdown();
|
|
|
|
+ } catch (Exception e) {
|
|
|
|
+ e.printStackTrace();
|
|
|
|
+ }
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ private Map<String, Object> removeMapKey(Map param) {
|
|
|
|
+ Set set = param.keySet();
|
|
|
|
+
|
|
|
|
+ for (Iterator iterator = set.iterator(); iterator.hasNext(); ) {
|
|
|
|
+ Object obj = (Object) iterator.next();
|
|
|
|
+ Object value = (Object) param.get(obj);
|
|
|
|
+ if (value == null || value.equals("") || value.equals("null") || obj.toString().length() == 0) {
|
|
|
|
+ iterator.remove();
|
|
|
|
+ }else {
|
|
|
|
+ if (value instanceof String){
|
|
|
|
+ try {
|
|
|
|
+ String xValue = new String (((String) value).getBytes("ISO8859-1"),"UTF-8");
|
|
|
|
+ param.put(obj,xValue);
|
|
|
|
+ } catch (UnsupportedEncodingException e) {
|
|
|
|
+ throw new RuntimeException(e);
|
|
|
|
+ }
|
|
|
|
+ }
|
|
|
|
+ }
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ return param;
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ private void pageSet(HisOrderParam param){
|
|
|
|
+ param.setLimit(param.getSize());
|
|
|
|
+ param.setStart((param.getCurrent()-1)*param.getLimit());
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+
|
|
|
|
+
|
|
|
|
+ public Map<String,Object> queryMajorOrder(String majorId){
|
|
|
|
+ Map<String, Object> resultMap = dyoaHistoryMapper.queryMajorOrder(majorId);
|
|
|
|
+ return resultMap;
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ @Override
|
|
|
|
+ public Boolean fetchAboutMajor(String id) {
|
|
|
|
+ dyoaRecordService.isExist(MainBusinessEnum.MAJOR_ORDER,id);
|
|
|
|
+ try {
|
|
|
|
+ //1. 获取订单信息,插入major表。
|
|
|
|
+ Map<String, Object> dyoaMajorOrder = dyoaHistoryMapper.queryMajorOrder(id);
|
|
|
|
+ Long mbsId = this.doCreateMajorOrder(dyoaMajorOrder);
|
|
|
|
+ //2. 创建节点
|
|
|
|
+ String dyoaNodeName = (String) dyoaMajorOrder.get("nowNodeName");
|
|
|
|
+ Long instanceNodeId = this.doCreateMajorInstanceNode(mbsId, dyoaNodeName);
|
|
|
|
+ //3. 创建任务
|
|
|
|
+ String dyoaHandlerName = (String) dyoaMajorOrder.get("nowNodeEmpName");
|
|
|
|
+ this.doCreateNodeTask(instanceNodeId,dyoaNodeName,dyoaHandlerName);
|
|
|
|
+ return Boolean.TRUE;
|
|
|
|
+ } catch (NoSuchFieldException e) {
|
|
|
|
+ throw new RuntimeException(e);
|
|
|
|
+ } catch (IllegalAccessException e) {
|
|
|
|
+ throw new RuntimeException(e);
|
|
|
|
+ }
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ public Long doCreateMajorOrder(Map<String,Object> dyMajorOrder) throws NoSuchFieldException, IllegalAccessException {
|
|
|
|
+ Major major = new Major();
|
|
|
|
+ Class<Major> mClass = Major.class;
|
|
|
|
+ for (Map.Entry<String, String> entry : MAJOR_ORDER_COLUM.entrySet()){
|
|
|
|
+ Object columValue = dyMajorOrder.get(entry.getKey());
|
|
|
|
+ if (columValue!=null){
|
|
|
|
+ String mbsColum = entry.getValue();
|
|
|
|
+ Field field = mClass.getDeclaredField(mbsColum);
|
|
|
|
+
|
|
|
|
+ field.setAccessible(true);
|
|
|
|
+ switch (mbsColum){
|
|
|
|
+ case "allotType":
|
|
|
|
+ field.set(major,(Boolean) columValue?ASSIGN:BY_TURNS);break;
|
|
|
|
+ case "financial":
|
|
|
|
+ field.set(major,columValue.equals("FINANCE"));break;
|
|
|
|
+ case "clientManagerId":
|
|
|
|
+ field.set(major,getMbsUserId((String) columValue));break;
|
|
|
|
+ case "principalId":
|
|
|
|
+ field.set(major,getMbsUserId((String) columValue));break;
|
|
|
|
+ case "departmentId":
|
|
|
|
+ field.set(major,getMbsDepartmentId((String) columValue));break;
|
|
|
|
+ case "loanLimit":
|
|
|
|
+ case "loanPeriod":
|
|
|
|
+ field.set(major, BigDecimal.valueOf((Double) columValue));break;
|
|
|
|
+ case "members":
|
|
|
|
+ field.set(major,getMbsUserIds((String) columValue));break;
|
|
|
|
+ default:
|
|
|
|
+ field.set(major,columValue);
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ }
|
|
|
|
+ }
|
|
|
|
+ major.setCreated((Date) dyMajorOrder.get("createdDatetime"));
|
|
|
|
+ majorServiceImpl.save(major);
|
|
|
|
+ //插入同步记录表
|
|
|
|
+ Long mbsId = major.getId();
|
|
|
|
+ dyoaRecordService.insert(MainBusinessEnum.MAJOR_ORDER, mbsId, (String) dyMajorOrder.get("id"));
|
|
|
|
+ return mbsId;
|
|
|
|
+
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ private Long getMbsUserId(String userName){
|
|
|
|
+ if (CollectionUtil.isEmpty(users)){
|
|
|
|
+ List<User> list = userService.list(new LambdaQueryWrapper<User>().select(BaseEntity::getId, User::getName));
|
|
|
|
+ users = list.stream().collect(Collectors.toMap(User::getName, User::getId));
|
|
|
|
+ }
|
|
|
|
+ return users.get(userName);
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ private Long getMbsDepartmentId(String departmentName){
|
|
|
|
+ if (CollectionUtil.isEmpty(departments)){
|
|
|
|
+ List<Department> list = departmentService.list(new LambdaQueryWrapper<Department>().select(BaseEntity::getId, Department::getName));
|
|
|
|
+ departments = list.stream().collect(Collectors.toMap(Department::getName, Department::getId));
|
|
|
|
+ }
|
|
|
|
+ return departments.get(departmentName);
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ private Long getMbsWorkFlows(String flowCode){
|
|
|
|
+ if (CollectionUtil.isEmpty(workFlows)){
|
|
|
|
+ List<WorkFlow> list = workFlowService.list(new LambdaQueryWrapper<WorkFlow>().select(BaseEntity::getId, WorkFlow::getCode));
|
|
|
|
+ workFlows = list.stream().collect(Collectors.toMap(WorkFlow::getCode, WorkFlow::getId));
|
|
|
|
+ }
|
|
|
|
+ return workFlows.get(flowCode);
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ private Long getMbsWorkNodes(String nodeName){
|
|
|
|
+ if (CollectionUtil.isEmpty(majorBusinessNodes)){
|
|
|
|
+ List<WorkNode> list = workNodeService.list(new LambdaQueryWrapper<WorkNode>().select(BaseEntity::getId, WorkNode::getName)
|
|
|
|
+ .eq(WorkNode::getFlowId,getMbsWorkFlows(MAJOR_BUSINESS.name())));
|
|
|
|
+ majorBusinessNodes = list.stream().collect(Collectors.toMap(WorkNode::getName, WorkNode::getId));
|
|
|
|
+ }
|
|
|
|
+ return majorBusinessNodes.get(nodeName);
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ private String getMbsUserIds(String userNames){
|
|
|
|
+ List<Long> userIds = new ArrayList<>();
|
|
|
|
+ Arrays.asList(userNames.split(",")).forEach(userName -> {
|
|
|
|
+ Long mbsUserId = getMbsUserId(userName);
|
|
|
|
+ userIds.add(mbsUserId);
|
|
|
|
+ });
|
|
|
|
+ return JSON.toJSONString(userIds);
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ private Long doCreateMajorInstanceNode(Long businessId,String dyoaNodeName){
|
|
|
|
+ Long nodeId = getMbsWorkNodes(dyoaNodeName);
|
|
|
|
+ Long flowId = getMbsWorkFlows(MAJOR_BUSINESS.name());
|
|
|
|
+ WorkFlowNodeInstance instance = new WorkFlowNodeInstance();
|
|
|
|
+ instance.setFlowId(flowId);
|
|
|
|
+ instance.setBusinessId(businessId);
|
|
|
|
+ instance.setNodeId(nodeId);
|
|
|
|
+ instance.setBusinessType(MAJOR_BUSINESS.name());
|
|
|
|
+ instance.setSequence(0);
|
|
|
|
+ instance.setState(PENDING.name());
|
|
|
|
+ workFlowNodeInstanceService.add(instance);
|
|
|
|
+ return instance.getId();
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ private void doCreateNodeTask(Long instanceNodeId, String dyoaNodeName,String dyoaHandlerName) {
|
|
|
|
+ Long nodeId = getMbsWorkNodes(dyoaNodeName);
|
|
|
|
+ WorkNodeTask task = workNodeTaskService.getOne(new LambdaQueryWrapper<WorkNodeTask>().eq(WorkNodeTask::getNodeId, nodeId)
|
|
|
|
+ .eq(WorkNodeTask::getVersion, LATEST.name()).select(BaseEntity::getId));
|
|
|
|
+ WorkTaskRecord workTaskRecord = new WorkTaskRecord();
|
|
|
|
+ workTaskRecord.setInstanceId(instanceNodeId);
|
|
|
|
+ workTaskRecord.setTaskId(task.getId());
|
|
|
|
+ workTaskRecord.setHandlerId(getMbsUserId(dyoaHandlerName));
|
|
|
|
+ workTaskRecordService.save(workTaskRecord);
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+}
|