ProjectServiceImpl.java 16.9 KB
Newer Older
eddie.woo's avatar
eddie.woo committed
1 2
package pwc.taxtech.atms.service.impl;

3
import com.google.common.collect.Lists;
eddie.woo's avatar
eddie.woo committed
4 5 6
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
7
import org.springframework.beans.factory.annotation.Value;
eddie.woo's avatar
eddie.woo committed
8 9
import org.springframework.stereotype.Service;
import pwc.taxtech.atms.common.CommonUtils;
10
import pwc.taxtech.atms.common.OperateLogType;
eddie.woo's avatar
eddie.woo committed
11
import pwc.taxtech.atms.dao.*;
12
import pwc.taxtech.atms.dpo.ProjectDisplayDto;
13
import pwc.taxtech.atms.dto.FieldsMapper;
eddie.woo's avatar
eddie.woo committed
14 15 16
import pwc.taxtech.atms.dto.ProjectClientDto;
import pwc.taxtech.atms.dto.ServiceTypeDto;
import pwc.taxtech.atms.dto.TemplateGroupDto;
17
import pwc.taxtech.atms.dto.taxadmin.AddProjectResult;
18
import pwc.taxtech.atms.dto.taxadmin.ProjectYearParam;
19 20
import pwc.taxtech.atms.entity.*;
import pwc.taxtech.atms.entity.ProjectClientExample.Criteria;
21

eddie.woo's avatar
eddie.woo committed
22
import java.util.*;
23 24
import java.util.stream.Collectors;

eddie.woo's avatar
eddie.woo committed
25
@Service
26
public class ProjectServiceImpl {
27 28 29
    /**
     */
    private static final int FIRST_OR_DEFAULT = 0;
30
    private static Logger LOGGER = LoggerFactory.getLogger(ProjectServiceImpl.class);
eddie.woo's avatar
eddie.woo committed
31 32 33 34 35 36 37 38 39 40

    @Autowired
    private ServiceTypeMapper serviceTypeMapper;

    @Autowired
    private TemplateGroupMapper templateGroupMapper;

    @Autowired
    private ProjectClientMapper projectClientMapper;

41 42 43
    @Autowired
    private ProjectMapper projectMapper;

44 45 46 47 48 49
    @Autowired
    private OrganizationServiceTemplateGroupMapper organizationServiceTemplateGroupMapper;

    @Autowired
    private ProjectServiceTypeMapper projectServiceTypeMapper;

50 51 52 53

    @Value("${jdbc_admin_db}")
    private String adminDbName;

54
    private final OperateLogType LOG_TYPE = OperateLogType.OperationLogProject;
eddie.woo's avatar
eddie.woo committed
55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76
    private static final Logger logger = LoggerFactory.getLogger(ProjectServiceImpl.class);

    public List<ServiceTypeDto> getServiceList() {

        ServiceTypeExample serviceTypeExample = new ServiceTypeExample();
        serviceTypeExample.createCriteria().andIsActiveEqualTo(true);

        logger.debug("获取ServiceType Start");
        List<ServiceType> serviceTypeList = serviceTypeMapper.selectByExample(serviceTypeExample);

        logger.debug("获取TemplateGroup Start");
        List<TemplateGroup> templateGroupList = templateGroupMapper.selectByExample(new TemplateGroupExample());

        List<ServiceTypeDto> serviceTypeDtoList = serviceTypeList.stream().map(this::rotateServiceType)
                .collect(Collectors.toList());
        List<TemplateGroupDto> templateGroupDtoList = templateGroupList.stream().map(this::rotateTemplateGroup)
                .collect(Collectors.toList());

        for (ServiceTypeDto serviceTypeDto : serviceTypeDtoList) {
            // serviceType 和 templateGroup是上下层级关系,遍历ServiceTypeDto,
            // 并将每个ServiceType下级关联的templateGroup填充进去
            serviceTypeDto.setTemplateGroupList(templateGroupDtoList.stream()
77
                    .filter(templateGroupDto -> (serviceTypeDto.getId().equals(templateGroupDto.getServiceTypeId())))
eddie.woo's avatar
eddie.woo committed
78 79 80 81 82 83 84 85
                    .collect(Collectors.toList()));
        }
        return serviceTypeDtoList;
    }

    public List<ProjectClientDto> getProjectClientList() {
        logger.debug("获取ProjectClient Start");
        ProjectClientExample example = new ProjectClientExample();
frank.xa.zhang's avatar
frank.xa.zhang committed
86
        example.setOrderByClause("CREATE_TIME desc");
eddie.woo's avatar
eddie.woo committed
87 88 89 90 91 92
        Criteria criteria = example.createCriteria();
        criteria.andIsActiveEqualTo(true);
        List<ProjectClient> projectClientList = projectClientMapper.selectByExample(example);
        return projectClientList.stream().map(this::rotateProjectClient).collect(Collectors.toList());
    }

93 94 95
    /**
     * @TODO: this dmeo only for running,should change to query data from db (neo)
     */
neo's avatar
neo committed
96 97 98 99 100 101 102 103 104 105 106 107 108
    public ProjectDisplayDto getProjectById(String projectId) {
        Project project = projectMapper.selectByPrimaryKey(projectId);
        ProjectDisplayDto dto = new ProjectDisplayDto();
        dto.extractFromProject(project);

        List<ProjectStatusManage> manageStatus = projectMapper.getStatusesByProjectId(projectId);
        Map<Integer, Integer> dic = new HashMap<>();
        manageStatus.forEach(m -> {
            dic.put(m.getPeriodId(), m.getStatus());
        });

        dto.setProjectStatusList(dic);
        return dto;
109 110
    }

111
    public List<ProjectDisplayDto> getAllProjectList(String orgId, String serviceId, Integer projectYear) {
112
        List<ProjectDisplayDto> pList = new ArrayList<>();
113
        List<ProjectDisplayDto> data = projectMapper.getProjectList(orgId, serviceId, projectYear);
114 115
        //获取每个项目的项目状态
        data.forEach(p -> {
116
            List<ProjectStatusManage> manageStatus = projectMapper.getStatusesByProjectId(p.getId());
117 118 119 120
            Map<Integer, Integer> dic = new HashMap<>();
            manageStatus.forEach(m -> {
                dic.put(m.getPeriodId(), m.getStatus());
            });
121 122

            p.setProjectStatusList(dic);
123 124
        });
        //添加账套中需要创建的项目
125
        List<ProjectDisplayDto> orgList = getProjectFromEnterpriseAccountSetOrg(data, orgId, serviceId, projectYear);
126 127 128 129 130
        //修改账套时间变化引起的已建项目的月份更改
        List<ProjectDisplayDto> removeList = new ArrayList<>();

        orgList.forEach(p -> {
            List<ProjectDisplayDto> fixList = data.stream()
eddie.woo's avatar
eddie.woo committed
131
                    .filter(x -> x.getOrganizationId().equals(p.getOrganizationId())
132 133
                            && x.getEnterpriseAccountSetId().equals(p.getEnterpriseAccountSetId())
                            && x.getServiceTypeId().equals(p.getServiceTypeId())
134 135
                            && x.getYear().equals(p.getYear())
                            && (!x.getStartPeriod().equals(p.getStartPeriod()) || x.getEndPeriod().equals(p.getEndPeriod())))
136 137
                    .collect(Collectors.toList());

138 139
            if (fixList != null && !fixList.isEmpty()) {
                ProjectDisplayDto pddFirst = fixList.get(FIRST_OR_DEFAULT);
140 141 142

                //修改数据库对应项目起始月
                Project project = new Project();
143
                project.setId(pddFirst.getId());
144 145 146
                project.setStartPeriod(p.getStartPeriod());
                project.setEndPeriod(p.getEndPeriod());

147
                projectMapper.updateByPrimaryKeySelective(project);
148 149 150 151 152 153 154 155 156

                //修改已取出数据中项目起始月
                pddFirst.setStartPeriod(p.getStartPeriod());
                pddFirst.setEndPeriod(p.getEndPeriod());
                //删除该条为创建项目记录
                removeList.add(p);
            }
        });

157 158 159
        removeList.forEach(r -> {
            orgList.remove(r);
        });
160 161 162 163 164 165

        pList.addAll(data);
        pList.addAll(orgList);
        return pList;
    }

166 167 168 169 170 171 172 173 174 175 176 177 178
    public AddProjectResult addProject(ProjectDisplayDto projectDto, String userName) {
        projectDto.setActive(true);
        projectDto.setRuleType(1);

        Project project = new Project();
        try {
            FieldsMapper.map(projectDto, project);
        } catch (Exception e) {
            LOGGER.warn("map project dto to project may be some error");
            e.printStackTrace();
        }

        try {
179
            project.setId(UUID.randomUUID().toString());
180 181

            OrganizationServiceTemplateGroupExample example = new OrganizationServiceTemplateGroupExample();
182
            example.createCriteria().andOrganizationIdEqualTo(projectDto.getOrganizationId());
183 184
            organizationServiceTemplateGroupMapper.selectByExample(example).forEach(ostg -> {
                ProjectServiceType pst = new ProjectServiceType();
185 186 187 188
                pst.setId(UUID.randomUUID().toString());
                pst.setProjectId(project.getId());
                pst.setServiceTypeId(ostg.getServiceTypeId());
                pst.setTemplateGroupId(ostg.getTemplateGroupId());
189 190

                projectServiceTypeMapper.insert(pst);
191 192
//                operationLogService.addDataAddLog(pst, OperationModule.ProjectServiceType, userName,//TODO add peration log
//                        Message.Project.AddProjectServiceType, pst.getId(), projectDto.getName(), LOG_TYPE);
193 194
            });

195
            project.setUpdateTime(new Date());
196
            projectMapper.insert(project);
197 198
//            operationLogService.addDataAddLog(project, OperationModule.Project, userName, Message.Project.AddProject,
//                    project.getId(), projectDto.getName(), LOG_TYPE);
199 200 201

            AddProjectResult addProjectResult = new AddProjectResult();
            addProjectResult.setResult(true);
neo's avatar
neo committed
202
            addProjectResult.setDbName(project.getDbName());
203
            addProjectResult.setProjectId(project.getId());
204
            return addProjectResult;
205
        } catch (Exception e) {
206 207
//            operationLogService.addDataAddLog(null, OperationModule.Project, userName,
//                    Message.Project.AddProjectFail, e.getMessage(), projectDto.getName(), LOG_TYPE);
208 209 210 211 212 213 214 215 216

            AddProjectResult addProjectResult = new AddProjectResult();
            addProjectResult.setResult(false);
            addProjectResult.setResultMsg(e.getMessage());
            return addProjectResult;
        }

    }

217 218
    public Map<Integer, Integer> getProjectAllStatus(String projectId) {
        List<ProjectStatusManage> psmList = projectMapper.selectProjectAllStatus(projectId);
219 220 221
        Map<Integer, Integer> result = new HashMap<>(psmList.size());
        psmList.forEach(m -> {
            result.put(m.getPeriodId(), m.getStatus());
222 223 224 225 226
        });

        return result;
    }

227

228 229
    private List<ProjectDisplayDto> getProjectFromEnterpriseAccountSetOrg(List<ProjectDisplayDto> pList, String orgId,
                                                                          String serviceId, Integer projectYear) {
230
        List<ProjectDisplayDto> list = new ArrayList<>();
231
        List<ProjectDisplayDto> data = projectMapper.getProjectFromEnterpriseAccountSetOrg(orgId, serviceId);
232 233 234 235 236 237
        Map<String, ProjectDisplayDto> groupMap = new HashMap<>();

        if (data != null && data.size() > 0) {
            //去除project表已经存在的项目 g
            data.forEach(dto -> {
                getOrgProjectYears(dto.getEffectiveDate(), dto.getExpiredDate()).forEach(yDto -> {
238 239 240 241 242 243 244 245 246 247 248 249 250 251 252 253 254 255 256 257 258 259 260 261 262 263 264
                    ProjectDisplayDto orgDto = new ProjectDisplayDto();
                    orgDto.setCreateTime(dto.getCreateTime());
                    orgDto.setActive(dto.getActive());
                    orgDto.setOrganizationId(dto.getOrganizationId());
                    orgDto.setCode(dto.getCode());
                    orgDto.setId(dto.getId());
                    orgDto.setIndustryId(dto.getIndustryId());
                    orgDto.setRegionId(dto.getRegionId());
                    orgDto.setRuleType(dto.getRuleType());
                    orgDto.setServiceTypeId(dto.getServiceTypeId());
                    orgDto.setUpDate(dto.getUpDate());
                    orgDto.setServiceTypeName(dto.getServiceTypeName());
                    orgDto.setOrganizationName(dto.getOrganizationName());
                    orgDto.setIndustryName(dto.getIndustryName());
                    orgDto.setTemplateGroupId(dto.getTemplateGroupId());
                    orgDto.setTemplateGroupName(dto.getTemplateGroupName());
                    orgDto.setClientCode(dto.getClientCode());
                    orgDto.setDbName(dto.getDbName());
                    orgDto.setHaveCreateProject(dto.getHaveCreateProject());
                    orgDto.setEnterpriseAccountSetId(dto.getEnterpriseAccountSetId());
                    orgDto.setEffectiveDate(dto.getEffectiveDate());
                    orgDto.setExpiredDate(dto.getExpiredDate());
                    orgDto.setRegionName(dto.getRegionName());
                    orgDto.setYear(yDto.year);
                    orgDto.setStartPeriod(yDto.startMonth);
                    orgDto.setEndPeriod(yDto.endMonth);
                    orgDto.setName(orgDto.getOrganizationName() + "(" + orgDto.getYear() + ")");
265 266 267

                    //判断是否已经创建过该项目
                    //对于VAT,只创建今年及之后年份的项目(2018.1.2经Michelle确定,已放开vat限制)
268
                    //if ((projectList != null && projectList.Count > 0) || (int.Parse(orgDto.ServiceTypeId) == 2 && orgDto.Year < DateTime.Now.Year))
eddie.woo's avatar
eddie.woo committed
269
                    if (pList.stream().noneMatch(t -> t.getYear().equals(orgDto.getYear())
270 271 272 273 274 275
                            && t.getServiceTypeId().equals(orgDto.getServiceTypeId())
                            && t.getOrganizationId().equals(orgDto.getOrganizationId())
                            && t.getEnterpriseAccountSetId().equals(orgDto.getEnterpriseAccountSetId())
                            && t.getStartPeriod().equals(orgDto.getStartPeriod())
                            && t.getEndPeriod().equals(orgDto.getEndPeriod()))) {
                        list.add(orgDto);
276 277 278 279 280 281
                    }
                });
            });

            if (!list.isEmpty()) {
                list.forEach(m -> {
282 283
                    StringBuilder groupKeyBulder = new StringBuilder(m.getOrganizationId()).append("_")
                            .append(m.getEnterpriseAccountSetId()).append("_")
284
                            .append(m.getYear()).append("_")
285
                            .append(m.getServiceTypeId()).append("_")
286 287 288 289 290 291 292 293 294 295 296 297 298 299 300 301 302 303 304 305 306 307 308 309 310 311 312 313 314 315 316 317 318 319 320 321 322 323 324 325 326 327 328 329 330 331 332 333 334 335 336 337
                            .append(m.getStartPeriod()).append("_")
                            .append(m.getEndPeriod());

                    groupMap.putIfAbsent(groupKeyBulder.toString(), m);
                });
            }
        }

        return Lists.newArrayList(groupMap.values());

    }

    private List<ProjectYearParam> getOrgProjectYears(Date startDate, Date endDate) {
        List<ProjectYearParam> pList = new ArrayList<>();

        ProjectYearParam pYear = new ProjectYearParam();
        Calendar nowCal = Calendar.getInstance();
        Date nowDate = new Date();
        nowCal.setTime(nowDate);

        Calendar startCal = Calendar.getInstance();
        startCal.setTime(startDate);

        Calendar endCal = Calendar.getInstance();
        endCal.setTime(endDate);
        if (startDate == null && endDate == null) {
            pYear.year = nowCal.get(Calendar.YEAR);
            pYear.startMonth = 1;
            pYear.endMonth = 12;

            pList.add(pYear);
        } else if (startDate == null && endDate != null && endCal.after(nowCal)) {
            pList.addAll(getProjectYears(nowDate, endDate));
        } else if (startDate != null && endDate == null && startCal.before(nowCal)) {
            pList.addAll(getProjectYears(startDate, nowDate));
        } else if (startDate != null && endDate != null && startCal.get(Calendar.YEAR) <= endCal.get(Calendar.YEAR)) {
            pList.addAll(getProjectYears(startDate, endDate));
        }
        return pList;
    }

    private List<ProjectYearParam> getProjectYears(Date startDate, Date endDate) {
        List<ProjectYearParam> pList = new ArrayList<>();

        Calendar start = Calendar.getInstance();
        start.setTime(startDate);
        int startYear = start.get(Calendar.YEAR);

        Calendar end = Calendar.getInstance();
        end.setTime(endDate);
        int endYear = end.get(Calendar.YEAR);

338
        if (startDate != null && endDate != null && startYear <= endYear) {
339 340 341 342
            for (int i = startYear; i <= endYear; i++) {
                ProjectYearParam pYear = new ProjectYearParam();
                pYear.year = i;
                if (startYear == endYear) {
343 344
                    pYear.startMonth = start.get(Calendar.MONTH)+1;
                    pYear.endMonth = end.get(Calendar.MONTH)+1;
345
                } else if (i == startYear && i < endYear) {
346
                    pYear.startMonth = start.get(Calendar.MONTH)+1;
347 348 349 350 351 352
                    pYear.endMonth = 12;
                } else if (i > startYear && i < endYear) {
                    pYear.startMonth = 1;
                    pYear.endMonth = 12;
                } else if (i > startYear && i == endYear) {
                    pYear.startMonth = 1;
353
                    pYear.endMonth = end.get(Calendar.MONTH)+1;
354 355 356 357 358 359 360 361 362 363
                }
                pList.add(pYear);
            }
        }
        return pList;
    }

    /**
     * @TODO: change the return part after copyProperties function updated
     */
eddie.woo's avatar
eddie.woo committed
364 365 366 367 368
    private ServiceTypeDto rotateServiceType(ServiceType serviceType) {
        ServiceTypeDto serviceTypeDto = new ServiceTypeDto();
        return CommonUtils.copyProperties(serviceType, serviceTypeDto);
    }

369 370 371
    /**
     * @TODO: change the return part after copyProperties function updated
     */
eddie.woo's avatar
eddie.woo committed
372 373 374 375 376
    private TemplateGroupDto rotateTemplateGroup(TemplateGroup templateGroup) {
        TemplateGroupDto templateGroupDto = new TemplateGroupDto();
        return CommonUtils.copyProperties(templateGroup, templateGroupDto);
    }

377 378 379
    /**
     * @TODO: change the return part after copyProperties function updated
     */
eddie.woo's avatar
eddie.woo committed
380 381 382 383 384 385
    private ProjectClientDto rotateProjectClient(ProjectClient projectClient) {
        ProjectClientDto projectClientDto = new ProjectClientDto();
        return CommonUtils.copyProperties(projectClient, projectClientDto);
    }

}