Commit 1e391bc4 by fudahua

同步优化初步3-同步成员

parent 3b89e7a9
package com.gic.haoban.manage.api.dto;
import java.io.Serializable;
import java.util.List;
/**
* Created 2020/4/13.
*
* @author hua
*/
public class SyncCheckDTO implements Serializable {
private Integer syncStatus;
private Integer groupErrCount;
private Integer storeErrCount;
private Integer staffErrCount;
private Integer totalDeal;
private Integer hasDeal;
public Integer getSyncStatus() {
return syncStatus;
}
public void setSyncStatus(Integer syncStatus) {
this.syncStatus = syncStatus;
}
public Integer getGroupErrCount() {
return groupErrCount;
}
public void setGroupErrCount(Integer groupErrCount) {
this.groupErrCount = groupErrCount;
}
public Integer getStoreErrCount() {
return storeErrCount;
}
public void setStoreErrCount(Integer storeErrCount) {
this.storeErrCount = storeErrCount;
}
public Integer getStaffErrCount() {
return staffErrCount;
}
public void setStaffErrCount(Integer staffErrCount) {
this.staffErrCount = staffErrCount;
}
public Integer getTotalDeal() {
return totalDeal;
}
public void setTotalDeal(Integer totalDeal) {
this.totalDeal = totalDeal;
}
public Integer getHasDeal() {
return hasDeal;
}
public void setHasDeal(Integer hasDeal) {
this.hasDeal = hasDeal;
}
}
......@@ -14,6 +14,16 @@ public class SyncSingleDealDTO implements Serializable {
private String relatedId;
private Integer storeFlag;
private String enterpriseId;
//0 管理员 1 分组
private Integer type;
public Integer getType() {
return type;
}
public void setType(Integer type) {
this.type = type;
}
public String getEnterpriseId() {
return enterpriseId;
......
......@@ -8,7 +8,9 @@ public enum SyncTaskStatusEnum {
group_sync(1),
store_sync(2),
clerk_sync(3),
compute(4);
compute(4),
exception_compute(5),
exception_close(6);
private int val;
......
package com.gic.haoban.manage.api.service;
import com.gic.haoban.manage.api.dto.SyncCheckDTO;
import com.gic.haoban.manage.api.dto.SyncSingleDealDTO;
import java.util.List;
......@@ -10,12 +11,6 @@ import java.util.List;
* @author hua
*/
public interface DealSyncOperationApiService {
/**
* 其它处理通过任务
*
* @param params
*/
public void run(String params);
/**
* 部门同步处理
......@@ -46,7 +41,39 @@ public interface DealSyncOperationApiService {
* @param userId
* @param desc
*/
public String createTask(String taskName, String userId, String desc);
public String createTask(String wxEnterpriseId, String taskName, String userId, String desc);
/**
* 关闭任务
*
* @param wxEnterpriseId
* @return
*/
public boolean closeTask(String wxEnterpriseId);
/**
* 解锁
*
* @param taskId
*/
public void unlockTask(String taskId);
/**
* 校验是否锁
*
* @param wxEnterpriseId
* @return
*/
public String getTaskLock(String wxEnterpriseId);
/**
* 校验同步状态
*
* @param wxEnterpriseId
* @return
*/
public SyncCheckDTO getTaskCheck(String wxEnterpriseId);
}
package com.gic.haoban.manage.service.dao.mapper;
import com.gic.haoban.manage.api.dto.SyncCheckDTO;
import com.gic.haoban.manage.service.entity.TabHaobanPreDealLog;
import org.apache.ibatis.annotations.Mapper;
import org.apache.ibatis.annotations.Param;
......@@ -72,4 +73,21 @@ public interface PreDealLogMapper {
public List<TabHaobanPreDealLog> listByTaskId(@Param("taskId") String taskId, @Param("dataType") int dataType, @Param("status") int status);
/**
* 统计任务数量
*
* @param taskId
* @return
*/
public int countByTaskId(@Param("taskId") String taskId, @Param("dataType") int dataType, @Param("status") int status);
/**
* 重试的时候 第一级部门
*
* @param taskId
* @return
*/
public List<TabHaobanPreDealLog> listRebuildDepartByTaskId(@Param("taskId") String taskId);
}
\ No newline at end of file
package com.gic.haoban.manage.service.service;
import com.gic.haoban.manage.api.dto.SyncCheckDTO;
import com.gic.haoban.manage.service.entity.TabHaobanPreDealLog;
import java.util.List;
......@@ -61,4 +62,20 @@ public interface PreDealService {
* @return
*/
public List<TabHaobanPreDealLog> listByTaskId(String taskId, int dataType, int status);
/**
* 获取任务数量
*
* @param status
* @return
*/
public int countByTaskId(String taskId, int dataType, int status);
/**
* 获取重试时 需要处理的数据
*
* @param taskId
* @return
*/
public List<TabHaobanPreDealLog> queryDepartRebuildDealLog(String taskId);
}
package com.gic.haoban.manage.service.service.impl;
import com.gic.haoban.manage.api.dto.SyncCheckDTO;
import com.gic.haoban.manage.api.enums.PreDealStatusEnum;
import com.gic.haoban.manage.api.enums.PreDealTypeEnum;
import com.gic.haoban.manage.service.dao.mapper.PreDealLogMapper;
......@@ -56,4 +57,14 @@ public class PreDealServiceImpl implements PreDealService {
public List<TabHaobanPreDealLog> listByTaskId(String taskId, int dataType, int status) {
return preDealLogMapper.listByTaskId(taskId, dataType, status);
}
@Override
public int countByTaskId(String taskId, int dataType, int status) {
return preDealLogMapper.countByTaskId(taskId, dataType, status);
}
@Override
public List<TabHaobanPreDealLog> queryDepartRebuildDealLog(String taskId) {
return preDealLogMapper.listRebuildDepartByTaskId(taskId);
}
}
......@@ -12,6 +12,7 @@ import com.gic.haoban.base.api.common.ServiceResponse;
import com.gic.haoban.common.utils.EntityUtil;
import com.gic.haoban.manage.api.dto.DealParamMqDTO;
import com.gic.haoban.manage.api.dto.DepartmentDTO;
import com.gic.haoban.manage.api.dto.SyncCheckDTO;
import com.gic.haoban.manage.api.dto.SyncSingleDealDTO;
import com.gic.haoban.manage.api.enums.PreDealStatusEnum;
import com.gic.haoban.manage.api.enums.PreDealTypeEnum;
......@@ -39,6 +40,7 @@ import org.springframework.stereotype.Service;
import java.util.List;
import java.util.Map;
import java.util.Set;
import java.util.concurrent.TimeUnit;
import java.util.stream.Collectors;
/**
......@@ -72,6 +74,8 @@ public class DealSyncOperationApiServiceImpl implements DealSyncOperationApiServ
@Autowired
private Map<String, BaseSyncOperation> operationMap;
private static final String LOCK_KEY = "sync_wx_lock_";
@Override
public void departmentDealMq(String params) {
logger.info("mq处理中:{}", params);
......@@ -124,17 +128,33 @@ public class DealSyncOperationApiServiceImpl implements DealSyncOperationApiServ
@Override
public void reDealDepartment(String taskId, int dataType) {
List<TabHaobanPreDealLog> list = preDealService.listByTaskId(taskId, dataType, PreDealStatusEnum.exception.getVal());
int groupErrCount = preDealService.countByTaskId(taskId, PreDealTypeEnum.group.getVal(), PreDealStatusEnum.exception.getVal());
int storeErrCount = preDealService.countByTaskId(taskId, PreDealTypeEnum.store.getVal(), PreDealStatusEnum.exception.getVal());
List<TabHaobanPreDealLog> list = null;
if (dataType == -1) {
if (groupErrCount > 0) {
dataType = PreDealTypeEnum.group.getVal();
list = preDealService.queryDepartRebuildDealLog(taskId);
} else if (storeErrCount > 0) {
dataType = PreDealTypeEnum.store.getVal();
list = preDealService.listByTaskId(taskId, dataType, PreDealStatusEnum.exception.getVal());
} else {
dataType = PreDealTypeEnum.clerk.getVal();
list = preDealService.listByTaskId(taskId, dataType, PreDealStatusEnum.exception.getVal());
}
}
if (CollectionUtils.isEmpty(list)) {
return;
}
Set<String> midList = list.stream().map(TabHaobanPreDealLog::getDataId).collect(Collectors.toSet());
dealDepartmentToMq(taskId, midList, SyncTaskStatusEnum.clerk_sync);
//根据类型获取状态
SyncTaskStatusEnum syncTaskStatusEnum = (dataType == PreDealTypeEnum.group.getVal() ? SyncTaskStatusEnum.group_sync
: (dataType == PreDealTypeEnum.store.getVal() ? SyncTaskStatusEnum.store_sync : SyncTaskStatusEnum.clerk_sync));
dealDepartmentToMq(taskId, midList, syncTaskStatusEnum);
}
@Override
public String createTask(String taskName, String userId, String desc) {
public String createTask(String wxEnterpriseId, String taskName, String userId, String desc) {
TabHaobanSyncTask tabHaobanSyncTask = new TabHaobanSyncTask();
tabHaobanSyncTask.setAddUser(userId);
tabHaobanSyncTask.setTaskName(taskName);
......@@ -142,10 +162,12 @@ public class DealSyncOperationApiServiceImpl implements DealSyncOperationApiServ
tabHaobanSyncTask.setStatusFlag(SyncTaskStatusEnum.init.getVal());
tabHaobanSyncTask.setTaskId(ToolUtil.randomUUID());
syncTaskService.createTask(tabHaobanSyncTask);
lockTask(wxEnterpriseId, tabHaobanSyncTask.getTaskId());
return tabHaobanSyncTask.getTaskId();
}
/**
* 处理修改数据
*
......@@ -270,8 +292,61 @@ public class DealSyncOperationApiServiceImpl implements DealSyncOperationApiServ
});
}
public String lockTask(String wxEnterpriseId, String taskId) {
String key = LOCK_KEY + wxEnterpriseId;
Object cache = RedisUtil.getCache(key);
if (null == cache) {
RedisUtil.setCache(key, taskId, 5L, TimeUnit.DAYS);
return taskId;
}
return null;
}
@Override
public void run(String params) {
public boolean closeTask(String wxEnterpriseId) {
String taskId = getTaskLock(wxEnterpriseId);
if (taskId != null) {
syncTaskService.updateTaskStatus(taskId, SyncTaskStatusEnum.exception_close.getVal());
unlockTask(wxEnterpriseId);
}
return true;
}
@Override
public void unlockTask(String wxEnterpriseId) {
String key = LOCK_KEY + wxEnterpriseId;
RedisUtil.delCache(key);
}
@Override
public String getTaskLock(String wxEnterpriseId) {
String key = LOCK_KEY + wxEnterpriseId;
return (String) RedisUtil.getCache(key);
}
@Override
public SyncCheckDTO getTaskCheck(String wxEnterpriseId) {
String taskId = getTaskLock(wxEnterpriseId);
if (null == taskId) {
return null;
}
SyncCheckDTO syncCheckDTO = new SyncCheckDTO();
TabHaobanSyncTask syncTask = syncTaskService.getSyncTask(taskId);
syncCheckDTO.setSyncStatus(syncTask.getStatusFlag());
int totalCount = preDealService.countByTaskId(taskId, -1, -1);
int groupErrCount = preDealService.countByTaskId(taskId, PreDealTypeEnum.group.getVal(), PreDealStatusEnum.exception.getVal());
int storeErrCount = preDealService.countByTaskId(taskId, PreDealTypeEnum.store.getVal(), PreDealStatusEnum.exception.getVal());
int clerkErrCount = preDealService.countByTaskId(taskId, PreDealTypeEnum.clerk.getVal(), PreDealStatusEnum.exception.getVal());
int preCount = preDealService.countByTaskId(taskId, -1, PreDealStatusEnum.pre.getVal());
syncCheckDTO.setTotalDeal(totalCount);
syncCheckDTO.setGroupErrCount(groupErrCount);
syncCheckDTO.setStoreErrCount(storeErrCount);
syncCheckDTO.setStaffErrCount(clerkErrCount);
syncCheckDTO.setHasDeal(totalCount - preCount);
return syncCheckDTO;
}
}
......@@ -15,6 +15,7 @@ import com.gic.haoban.manage.api.dto.*;
import com.gic.haoban.manage.api.enums.PreDealStatusEnum;
import com.gic.haoban.manage.api.enums.PreDealTypeEnum;
import com.gic.haoban.manage.api.enums.SyncTaskStatusEnum;
import com.gic.haoban.manage.api.service.DealSyncOperationApiService;
import com.gic.haoban.manage.api.service.DepartmentApiService;
import com.gic.haoban.manage.api.service.StaffApiService;
import com.gic.haoban.manage.service.entity.TabHaobanDepartment;
......@@ -71,6 +72,9 @@ public class ClerkSyncOperation implements BaseSyncOperation {
@Autowired
private StaffApiService staffApiService;
@Autowired
private DealSyncOperationApiService dealSyncOperationApiService;
@Override
public void dealSingleByMq(DealParamMqDTO dealParamMqDTO, TabHaobanPreDealLog dataPre) {
logger.info("成员处理:{}", JSONObject.toJSONString(dealParamMqDTO));
......@@ -135,7 +139,7 @@ public class ClerkSyncOperation implements BaseSyncOperation {
@Override
public void checkDepartmentTask(String taskId) {
boolean b = preDealService.checkTask(taskId, PreDealTypeEnum.store.getVal());
boolean b = preDealService.checkTask(taskId, PreDealTypeEnum.clerk.getVal());
if (!b) {
return;
}
......@@ -145,7 +149,13 @@ public class ClerkSyncOperation implements BaseSyncOperation {
TabHaobanSyncTask syncTask = syncTaskService.getSyncTask(taskId);
//同步成功 进入门店处理
if (syncTask.getStatusFlag().equals(SyncTaskStatusEnum.clerk_sync.getVal())) {
int errCount = preDealService.countByTaskId(taskId, -1, PreDealStatusEnum.exception.getVal());
if (errCount > 0) {
syncTaskService.updateTaskStatus(taskId, SyncTaskStatusEnum.exception_compute.getVal());
} else {
syncTaskService.updateTaskStatus(taskId, SyncTaskStatusEnum.compute.getVal());
dealSyncOperationApiService.unlockTask(taskId);
}
}
RedisUtil.unlock(key);
}
......
......@@ -195,4 +195,39 @@
where task_id = #{taskId} and data_type=#{dataType}
and status_flag=#{status}
</select>
<select id="countByTaskId" resultType="Integer">
select
COUNT(*)
from tab_haoban_pre_deal_log
where task_id = #{taskId}
<if test="dataType!=-1">
and data_type=#{dataType}
</if>
<if test="status!=-1">
and status_flag=#{status}
</if>
</select>
<select id="listRebuildDepartByTaskId" resultMap="BaseResultMap">
SELECT
<include refid="Base_Column_List"/>
FROM
tab_haoban_pre_deal_log a
WHERE
a.task_id = #{taskId}
AND data_type = 0
AND status_flag = 3
AND EXISTS (
SELECT
1
FROM
tab_haoban_pre_deal_log b
WHERE
b.task_id = #{taskId}
AND data_type = 0
AND a.p_data_id = b.data_id
AND b.status_flag = 2
)
</select>
</mapper>
\ No newline at end of file
package com.gic.haoban.manage.web.controller;
import com.gic.clerk.api.service.ClerkService;
import com.gic.enterprise.api.service.EnterpriseService;
import com.gic.enterprise.api.service.StoreGroupService;
import com.gic.enterprise.api.service.StoreService;
import com.gic.haoban.common.utils.HaobanResponse;
import com.gic.haoban.manage.api.enums.PreDealTypeEnum;
import com.gic.haoban.manage.api.dto.SyncCheckDTO;
import com.gic.haoban.manage.api.service.DealSyncOperationApiService;
import com.gic.haoban.manage.api.service.DepartmentApiService;
import com.gic.haoban.manage.api.service.StaffApiService;
import com.gic.haoban.manage.api.service.StaffDepartmentRelatedApiService;
import com.gic.haoban.manage.web.auth.AuthRequestUtil;
import com.gic.haoban.manage.web.errCode.HaoBanErrCode;
import com.gic.haoban.manage.web.qo.SyncDealQO;
......@@ -57,35 +50,49 @@ public class SyncDealContoller extends WebBaseController {
@RequestMapping("/department-sync")
@ResponseBody
public HaobanResponse departmentBatchSync(@RequestBody SyncDealQO qo, String wxEid) {
public HaobanResponse departmentBatchSync(@RequestBody SyncDealQO qo) {
String task = null;
if (StringUtils.isNotBlank(wxEid)) {
task = dealSyncOperationApiService.createTask("门店同步", "11111", "部门同步");
dealSyncOperationApiService.dealDepartment(task, wxEid, qo.getAddDepartment(), qo.getEditDepartment());
} else {
LoginVO login = (LoginVO) AuthRequestUtil.getSessionUser();
String wxEnterpriseId = login.getWxEnterpriseId();
String key = "haoban-sync-department-" + wxEnterpriseId;
if (RedisUtil.getCache(key) != null) {
String taskLock = dealSyncOperationApiService.getTaskLock(wxEnterpriseId);
if (null != taskLock) {
return resultResponse(HaoBanErrCode.ERR_10011);
}
task = dealSyncOperationApiService.createTask("门店同步", login.getStaffDTO().getStaffId(), "部门同步");
dealSyncOperationApiService.dealDepartment(task, login.getWxEnterpriseId(), qo.getAddDepartment(), qo.getEditDepartment());
}
return resultResponse(HaoBanErrCode.ERR_1, task);
}
@RequestMapping("/clerk-re-sync")
/**
* 同步状态校验
*
* @param syncKey
* @return
*/
@RequestMapping("department-sync-check")
public HaobanResponse syncSuccess(String wxEnterpriseId) {
if (StringUtils.isBlank(wxEnterpriseId)) {
LoginVO login = (LoginVO) AuthRequestUtil.getSessionUser();
wxEnterpriseId = login.getWxEnterpriseId();
}
SyncCheckDTO taskCheck = dealSyncOperationApiService.getTaskCheck(wxEnterpriseId);
return resultResponse(HaoBanErrCode.ERR_1, taskCheck);
}
@RequestMapping("/re-sync")
@ResponseBody
public HaobanResponse clerkReSync(String taskId) {
String task = null;
if (StringUtils.isNotBlank(taskId)) {
dealSyncOperationApiService.reDealDepartment(taskId, PreDealTypeEnum.clerk.getVal());
if (StringUtils.isBlank(taskId)) {
LoginVO login = (LoginVO) AuthRequestUtil.getSessionUser();
String wxEnterpriseId = login.getWxEnterpriseId();
taskId = dealSyncOperationApiService.getTaskLock(wxEnterpriseId);
}
return resultResponse(HaoBanErrCode.ERR_1, task);
dealSyncOperationApiService.reDealDepartment(taskId, -1);
return resultResponse(HaoBanErrCode.ERR_1);
}
......
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